--- slug: fmode-skill-core-guide displayName: skill-core-guide version: 1.0.3 summary: Fmode Harness 平台母技能标准指南 —— 平台端点真值表、ESM-first 四端标准、元数据规范、四渠道分发、六项自动质检、一键凭证供给、新技能脚手架。 description: "Fmode 技能生态的宪法级规范文档。定义平台端点真值表(live/planned/deprecated 三态)、ESM-first 四端等价打包标准、元数据与标签规范、Gogs/GitHub/npm/skillhub 四渠道分发、六项自动质检(skip≠pass)、5 级诚实凭据链与新技能脚手架。读它不需要先读任何别的文档。The constitution of the Fmode skill ecosystem — platform endpoint truth table, ESM-first packaging standard, metadata spec, four-channel distribution, six-point quality gate." platform: HermesAgent level: 系统级 category: 平台基础设施 icon: "emoji: 📐" homepage: https://git.fmode.cn/fmode/skill-core-guide license: MIT author: Yuyang001 (FmodeAgent) tags: [HermesAgent, FmodeAgent, 系统级, 平台基础设施, 规范, standard, spec, meta, scaffold, harness, esm, quality-check] --- # skill-core-guide · Fmode Harness 平台母技能标准指南 > 一份**可独立阅读**的技能开发规范。读它不需要先读任何别的文档。 > 它是 Fmode 技能生态的「宪法」——定义平台真值、包结构、分发渠道、质检标准。 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) **技能名**:`skill-core-guide` | **npm**:`skill-core-guide` | **skillhub**:`fmode-skill-core-guide` --- ## 目录 - [零、给 Agent 的 60 秒速览](#零给-agent-的-60-秒速览) - [一、Fmode Harness 平台基础设施规范](#一fmode-harness-平台基础设施规范) - [二、技能分类体系](#二技能分类体系) - [三、元数据规范](#三元数据规范) - [四、ESM-first 多端可用打包标准](#四esm-first-多端可用打包标准) - [五、多渠道分发机制](#五多渠道分发机制) - [六、自动质检与看板机制](#六自动质检与看板机制) - [七、一键凭证供给机制](#七一键凭证供给机制) - [八、新技能开发 SOP](#八新技能开发-sop) - [九、事故复盘:本规范为什么这么写](#九事故复盘本规范为什么这么写) - [十、附录](#十附录) --- ## 零、给 Agent 的 60 秒速览 你要开发一个新技能?按这个顺序做,不要跳步: ```bash # 1. 脚手架 npx --yes skill-core-guide@latest init my-skill --name skill-my-skill cd skill-my-skill # 2. 写三处:技能契约 / SDK 接口 / CLI 入口 # skills/skill-my-skill/SKILL.md ← 何时触发、怎么用 # lib/index.mjs ← export 公共接口 # bin/my-skill.mjs ← CLI 命令 # 3. 跑通 npm test # 4. 六项质检(必须全绿或显式解释每个 skip) npx --yes skill-core-guide@latest check . # 5. 四渠道发布 npx --yes skill-core-guide@latest publish . --apply ``` **三条铁律**(违反其中任何一条,技能不算交付): 1. **零密钥入库** —— 凭据只从环境变量/用户目录解析,仓库里永远不出现真实密钥。 2. **不伪造成功** —— 拿不到结果就显式报错并给出修复指引,绝不假装跑通。 3. **端点先探测再调用** —— 标注 `planned` 的端点调用前必须探测,404 时显式回落。 --- ## 一、Fmode Harness 平台基础设施规范 ### 1.1 平台基址 | 用途 | 基址 | 鉴权方式 | |------|------|----------| | **API 网关**(LLM / 图像) | `https://api.fmode.cn` | `Authorization: Bearer sk-...` | | **业务网关**(转写 / 凭据自举 / deploy STS) | `https://server.fmode.cn` | `x-parse-session-token: r:...` 或 Bearer | | **CDN**(OBS → fmode.cn 回源) | `https://fmode.cn` | 公开读 | | **OBS 直链**(CDN 未生效时的降级通道) | `https://fmode-s3.obs.cn-north-4.myhuaweicloud.com` | 公开读 / AK-SK 写 | | **主 Gogs**(内网日常迭代) | `https://git.fmode.cn/fmode/` | URL 携带凭据 | | **GitHub 镜像**(公开发布) | `https://github.com/fmodecn/` | SSH key / PAT | | **npm** | `https://registry.npmjs.org` | `~/.npmrc` token | | **skillhub.cn** | `https://api.skillhub.cn` | `sk-ent-...`(团队 fmode / `org-m8z913un`) | ### 1.2 `.fmode/` 目录机制 ``` ~/.fmode/ ├── config.json # 全局配置(600 权限) │ # 非敏感:profiles / projects / obsBucket / storageProjectId │ # 敏感:sessionToken / fmodeApiToken / githubToken ├── credentials/ # 敏感凭据文件(700 目录 / 600 文件) │ └── academic-identity.txt └── projects/ # 项目认知文件映射 ``` **项目级覆盖**:`/.fmode/config.json` 优先级高于用户级(用于项目专属配置)。 **环境变量覆盖**: - `FMODE_HOME` —— 覆盖 `~/.fmode` 根目录(测试/多身份隔离用) - `FMODE_API_TOKEN` —— 直接指定 API token - `FMODE_SESSION_TOKEN` —— 指定 sessionToken(触发自举) - `FMODE_API_BASE` —— 覆盖业务网关基址 > ⚠️ **BOM 陷阱**:用户手工保存的 `config.json` 常带 UTF-8 BOM(`EF BB BF`), > `JSON.parse` 会直接抛错。**解析前必须剥 BOM**: > `JSON.parse(raw.replace(/^/, ''))`。这是多个技能踩过的真实坑。 ### 1.3 统一 API 接入 所有技能通过 Fmode 网关调用 LLM / 存储 / 图像 / 转写 / 视觉,**不在客户端直连第三方**。 #### 端点真值表(实测于 2026-09-22) 状态语义: - **`live`** —— 实测返回 200 或 401(401 = 端点存在、需鉴权),可直接使用 - **`planned`** —— 实测 404,设计文档存在但服务端未上线;**调用前必须探测并回落** - **`deprecated`** —— 曾经被文档描述、实测 404 且已确认不再维护;**不要使用** | # | 端点 | 方法 | 状态 | 鉴权 | 用途 | |---|------|------|------|------|------| | 1 | `api.fmode.cn/v1/chat/completions` | POST | ✅ **live** | Bearer `sk-` | LLM 对话补全(OpenAI 兼容)——所有技能的统一模型出口 | | 2 | `api.fmode.cn/v1/images/generations` | POST | ✅ **live** | Bearer `sk-` | 图像生成(fmode-image) | | 3 | `server.fmode.cn/api/listen/transcribe` | POST | ✅ **live** | Bearer `sk-` | 录音转写(讯飞 LFASR) | | 4 | `server.fmode.cn/api/fmode/voc-skill/install-prompt` | POST | ✅ **live** | `x-parse-session-token` | **凭据自举唯一通道**:sessionToken → API token | | 5 | `server.fmode.cn/api/apig/deploy/huaweicloud` | POST | ✅ **live** | Bearer sessionToken | 签发项目隔离 OBS STS | | 6 | `server.fmode.cn/api/storage/upload` | POST | 🕓 planned | Bearer `sk-` | 对象存储上传(未上线,走 obsutil 直传) | | 7 | `server.fmode.cn/api/storage/credentials` | POST | ✗ **deprecated** | Bearer sessionToken | 从未上线(恒 404),见 §9.1 事故复盘 | | 8 | `server.fmode.cn/api/image/generate` | POST | 🕓 planned | Bearer `sk-` | 网关侧图像生成(未上线,用 #2 代替) | | 9 | `server.fmode.cn/api/vision/analyze` | POST | 🕓 planned | Bearer `sk-` | 网关侧视觉识别(未上线,用 #1 多模态代替) | | 10 | `server.fmode.cn/api/fmode/verifycode` | POST | 🕓 planned | 无 | 手机号验证码(未上线,见 §7) | **统计**:5 live / 4 planned / 1 deprecated。 > 📌 **真值源**:上表由 `lib/platform.mjs` 的 `ENDPOINTS` 常量驱动。 > 代码里请**引用 `ENDPOINTS.llmChat.url` 而不是硬编码 URL**—— > 平台迁移时只改一处。可用 `skill-core endpoints` 随时打印最新真值表。 #### 调用示例 ```javascript // LLM 调用 const res = await fetch('https://api.fmode.cn/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify({ model: 'glm-5.3-flash', messages: [...] }), }); // 图像生成 await fetch('https://api.fmode.cn/v1/images/generations', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ model: '...', prompt: '...' }), }); // 录音转写 await fetch('https://server.fmode.cn/api/listen/transcribe', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ url: 'https://.../meeting.mp3', ... }), }); ``` #### 视觉识别:宿主优先策略 `skill-vision` 定义的**成本最优**策略,所有视觉类技能应遵循: ``` 1. 探测宿主 Agent 配置的模型是否支持视觉(Claude Code / Codex settings) → 支持则直接用宿主模型读图(零额外成本、零网络往返) 2. 否则回落 Fmode API 的 /v1/chat/completions(多模态 messages),模型 glm-5.3-flash ``` #### 存储:4 级诚实凭据链 `skill-storage` 的凭据链是平台存储接入的权威参考: ``` 第1级 环境变量 OBS_AK / OBS_SK(可选 OBS_ENDPOINT / OBS_BUCKET) 第2级 obsutil config 文件(OBSUTIL_CONFIG 或 ~/.obsutilconfig) 第3级 sessionToken + storageProjectId → POST /api/apig/deploy/huaweicloud → 项目隔离 STS (obsPath = obs://nova-cloud/dev//,key 强制限定前缀) STS 仅内存持有,用完即删 第4级 项目级 ./.fmode/config.json(obsBucket / obsEndpoint / cdnDomain) ``` **全失败时必须打印初始化向导并退出码 2,绝不伪装成功。** --- ## 二、技能分类体系 技能按**职责边界**分三层。分层决定了它的发布渠道、依赖关系与质检重点。 ### 2.1 系统层 / Infrastructure 平台基础设施与 Agent 运行时治理。**不依赖任何业务场景**,是其他技能的地基。 | 技能 | 作用 | 平台 | |------|------|------| | `skill-heterarchy` | 内异层认知协同范式(单主体内多心智分化) | Gogs/GitHub/npm/skillhub | | `skill-multi-branch` | 沟通/执行分层编排(Hermes → CC/Codex) | GitHub | | `skill-bypass-permission` | YOLO 模式权限自检(免确认自主执行) | GitHub | | `skill-task-progress` | 4 态任务进度跟踪(ack/running/done/failed) | GitHub | | `plugin-wecom-fix` | 企微通道自检修复(plugin 形态) | Hermes plugin | | `skill-agent-clone` | 数字生命克隆(配置/SOUL/记忆/会话) | GitHub | | **`skill-core-guide`** | **平台母技能标准指南(本技能)** | Gogs/GitHub/npm/skillhub | ### 2.2 服务层 / Platform Services Fmode 基础服务的客户端封装。**一个技能封装一个平台能力**,接口稳定、无业务假设。 | 技能 | 作用 | npm 包 | 平台 | |------|------|--------|------| | `skill-storage` | OBS 对象存储与公开分享 | — | GitHub | | `skill-image` | Fmode API 图像生成(白底 PNG,¥0.3-0.5/张) | `fmode-image@0.2.0` | GitHub/npm | | `skill-vision` | 宿主多模态优先 + Fmode API 回落视觉识别 | `fmode-vision@0.1.1` | npm | | `skill-listen` | 讯飞 LFASR × Fmode 网关录音转写 | `fmode-listen@0.1.2` | npm | | `fmode-ffmpeg` | FFmpeg 音视频处理封装 | `fmode-ffmpeg@0.1.1` | npm | | `fmode-qiwei` | 企微网关 SDK | `fmode-qiwei@0.5.2` | npm | ### 2.3 应用层 / Business Applications 面向具体业务场景的端到端技能。**可以依赖服务层**,但不应被服务层依赖。 | 技能 | 作用 | 平台 | |------|------|------| | `skill-study-report` | 学习复盘报告(多 Agent 采集 + PPT 级 HTML) | GitHub | | `skill-present` | 课程课件/报告 HTML 演讲系统(含 43 条 Claude 规则) | Gogs | | `fmode-product-lab` | 新品研发(VOC + KANO + 市场 + 定位分析) | npm | > 📊 **完整清单(含标签、版本、渠道、状态)见 [`inventory.md`](inventory.md)**, > 机器可读真值在 `lib/inventory.mjs`。用 `skill-core inventory` 随时查看。 ### 2.4 命名规则 | 形态 | 规则 | 示例 | |------|------|------| | 仓库名 / Hermes 技能名 | `skill-` | `skill-my-thing` | | npm 包名(部分历史技能) | `fmode-` | `fmode-image` | | skillhub slug | `fmode-skill-` | `fmode-skill-my-thing` | | CLI 命令名 | 去前缀的 kebab-case | `my-thing` | 正则:`/^(skill|fmode)-[a-z0-9]+(-[a-z0-9]+)*$/` --- ## 三、元数据规范 技能元数据是**分发渠道的检索面**:skillhub.cn / npm / GitHub 的搜索排名、 Agent 的技能选择、看板页面的渲染,全部读同一份字段。字段缺失或写法随意, 技能就等于「发布即隐身」。 > 本规范是**母技能自持**的:本章定义的字段,`skill-core-guide` 自己必须满足。 > 全生态 17 个技能的当前取值见 [`inventory.md`](inventory.md) 与 > [`awesome.md`](awesome.md)。 ### 3.1 每个技能的元数据字段 | 字段 | 必填 | 说明 | 举例 | |------|------|------|------| | **slug** | ✅ | 全网唯一标识(skillhub 主键) | `fmode-skill-heterarchy` | | **displayName** | ✅ | 对外展示名(= 仓库名) | `skill-heterarchy` | | **version** | ✅ | 语义化版本(小步迭代) | `0.0.11` | | **summary** | ✅ | 一句话简介(中英文双语) | `内异层认知协同 — 单一Agent主体内部分化多心智并行…` | | **description** | ✅ | 详细描述(3-5 句) | 讲清「是什么 / 解决什么问题 / 怎么用」 | | **tags** | ✅ | 关键词标签数组 | `[HermesAgent, FmodeAgent, 系统级, cognition, parallel]` | | **platform** | ✅ | 目标平台 | `HermesAgent` | `FmodeCode/ClaudeCode` | `Both` | | **level** | ✅ | 能力层级 | `系统级` | `服务级` | `应用级` | | **category** | ✅ | 应用类别 / 行业 | `工具效率` | `内容创作` | `图像视觉` | `音频处理` | `平台基础设施` | | **icon** | ✅ | 图标标识 | `emoji: 🤖` | | **homepage** | 可选 | 项目主页 | `https://git.fmode.cn/fmode/skill-xxx` | | **license** | ✅ | 开源协议 | `MIT` | | **author** | ✅ | 维护者 | `Yuyang001 (FmodeAgent)` | | **changelog** | ✅ | 变更说明 | 每次发布必须更新 | **与 §3.5 frontmatter 的关系**:上表是**逻辑字段全集**,§3.5 的三种 frontmatter 是它在各渠道的**物理落位**——Hermes 本地技能用 `name/description/version/tags`, 仓库根 `SKILL.md` 用 `slug/displayName/version/summary/license`, 看板/清单用 `level/category/icon/platform`。字段名可随渠道变化,**语义不可变**。 ### 3.2 标签分类体系 `tags` 不是自由发挥的关键词堆,而是**三个正交维度**的组合。任意技能的 tags 都应能拆成「平台 + 层级 + 行业/类别」三类。 #### 平台标签 | 标签 | 含义 | |------|------| | `HermesAgent` | 运行在 Hermes Agent 上,利用其工具 / 通道 / 记忆 / 技能体系 | | `FmodeAgent` | Fmode 品牌通用标签 | | `FmodeCode` | 为 Claude Code / FmodeCode CLI 设计 | | `ClaudeCode` | 兼容 Claude Code 执行端 | #### 层级标签 | 标签 | 含义 | 代表技能 | |------|------|----------| | `系统级` | 底层运行、消息机制、基础功能 | `skill-heterarchy`、`skill-core-guide` | | `服务级` | 云资源、模型、拓展能力 | `skill-vision`、`skill-image`、`skill-storage` | | `应用级` | 具体业务场景、SOP、行业应用 | `skill-product-lab`、`skill-study-report` | #### 行业 / 类别标签 `工具效率`、`内容创作`、`图像视觉`、`音频处理`、`平台基础设施`、 `数据管理`、`学习复盘`、`新品研发` > 📌 层级标签与 §2 的三层分类体系(`system` / `service` / `application`) > 是同一件事的两种写法:中文标签给人看,英文 `tier` 给机器读 > (见 `lib/inventory.mjs` 的 `TIERS`)。 ### 3.3 SEO 优化原则(用于 skillhub.cn 等平台搜索排名) 平台搜索按「标题 / summary 命中 + 标签匹配 + 更新活跃度」排序。四条硬规则: 1. **summary 前 15 个字必须包含核心关键词** —— 搜索结果只截前 15 字, 把「做什么」写在最前面,不要写「一款…」「基于…」这类铺垫。 2. **中英文双语描述** —— 中文为主体,英文辅助检索 (`summary` 中文 + `description` 内附英文段落)。 3. **tags 至少包含三类各一个** —— 一个分类标签 + 一个平台标签 + 一个层级标签。 4. **每次发布必须更新 `version` + `changelog`** —— 活跃度是排名因子, 版本不动的技能会持续掉权。 > ⚠️ **反面案例**:`summary: 一款基于大模型的技能` —— 前 15 字无关键词、 > 无平台、无层级、无行业标签,在 skillhub 搜索里等同于不存在。 --- ## 四、ESM-first 多端可用打包标准 ### 3.1 包结构模板 ``` / ├── package.json # type: module; exports: "." → lib/index.mjs ├── lib/ │ ├── index.mjs # ESM 入口,export 所有公共接口 │ ├── platform.mjs # (可选)平台常量与端点真值表 │ ├── check.mjs # (可选)质检引擎 │ └── bootstrap.mjs # (可选)凭证供给 ├── bin/ │ └── .mjs # CLI 入口(#!/usr/bin/env node) ├── browser/ │ └── index.mjs # 浏览器 bundle(无 Node 依赖) ├── skills/ │ └── / │ └── SKILL.md # 技能定义文档(Agent 读这个) ├── templates/ # (可选)脚手架模板 ├── test/ │ └── smoke.mjs # 冒烟测试 ├── README.md # GitHub/Gogs 首页 ├── LICENSE # MIT └── skill-package-manifest.json # 元数据清单(看板数据源) ``` ### 3.2 package.json 关键字段 ```json { "name": "skill-my-thing", "version": "1.0.0", "description": "一句话描述", "type": "module", "main": "./lib/index.mjs", "exports": { ".": { "import": "./lib/index.mjs", "default": "./lib/index.mjs" } }, "bin": { "my-thing": "./bin/my-thing.mjs" }, "files": [ "lib/", "bin/", "browser/", "skills/", "README.md", "LICENSE", "skill-package-manifest.json" ], "engines": { "node": ">=18" }, "scripts": { "test": "node test/smoke.mjs" }, "license": "MIT", "dependencies": {} } ``` **硬性约束**(`validatePackageJson()` 会逐条检查): | 字段 | 要求 | 原因 | |------|------|------| | `type` | 必须 `"module"` | ESM only | | `main` | 必须 `"./lib/index.mjs"` | 统一入口 | | `exports["."]` | 必须同时有 `import` 与 `default` | 多端解析一致 | | `bin` | 对象形式,指向 `.mjs` | CLI 端 | | `files` | 白名单必须覆盖 `lib/ bin/ skills/ README.md LICENSE manifest` | 避免发布缺文件 | | `license` | 必须(平台统一 MIT) | 合规 | | `require` | **禁止出现** | 不提供 CJS 入口 | | `dependencies` | 强烈建议为空 | 母技能/服务技能应零依赖 | > 💡 **零依赖原则**:服务层技能应尽量零依赖。平台已有 `fetch`(Node ≥18 内置)、 > `AbortSignal.timeout`、`node:test`,绝大多数需求不需要第三方包。 > 零依赖 = 安装快 + 供应链风险低 + 不会因上游破坏性升级而挂掉。 ### 3.3 四端等价性原则 | 端 | 入口 | 用法 | 状态 | |----|------|------|------| | **CLI** | `bin/.mjs` | `npx --yes @latest ` | ✅ 必须可用 | | **SDK** | `lib/index.mjs` | `import { ... } from ''` | ✅ 必须可用 | | **Browser** | `browser/index.mjs` | `