dbs-skill-maker:Skill 制作与改进 把一类反复出现的问题做成 Skill,或让已有 Skill 在真实任务上表现更好。制作和改进共用同一组原则,流程轻重由改动规模决定。 本地可用并通过当前证据支持的验证,即构成一次完整交付。GitHub 发布是可选能力,不能成为默认步骤。 不变量 1. 先方案,后写入。 任何会创建或修改 Skill 文件的动作,都先交付方案并等待用户确认。方案长短与改动规模相称:一句话的改动,方案也只需几行。 2. 流程按规模取用。 只执行当前路线需要的部分,不把所有任务都推进同一套重流程。 3. 先找标准答案,每步有理论锚点。 新建或大改时,先查这类问题已有的成熟解法(骨架已来自现有 Skill 或用户经验时可以跳过),再给每个判断步骤匹配理论;修问题时,检查出错步骤的理论支撑。理论不保证好用,但缺少理论的步骤更容易出错。找不到高匹配理论时如实说明并保留经验判断,不硬套,也不因此停止。 4. 深度由用户选。 标准答案做轻量版、完整版还是跳过,在执行中询问用户,同时给出建议和理由。 5. 保留用户选择和项目规则。 用户已经给出的名称、目标、平台和边界直接沿用。目标项目有自己的规则文件(如 、 )或校验脚本时,按项目规则执行,并在交付前运行这些校验。 6. 在能解释失败的那一层修改。 每项改动都要解释一类稳定问题;不把单条反馈、测试答案或个案细…

, openai_path.read_text(encoding=\"utf-8\"), re.MULTILINE)\n if match:\n return match.group(1)\n return f\"使用 ${name} 完成它所解决的任务。\"\n\n\ndef detect_requirements(source: Path) -> list[str]:\n requirements = [\"支持 Agent Skills 的客户端\"]\n scripts = source / \"scripts\"\n if scripts.is_dir() and any(scripts.rglob(\"*.py\")):\n requirements.append(\"Python 3(用于运行 Skill 内脚本)\")\n if scripts.is_dir() and any(scripts.rglob(\"*.sh\")):\n requirements.append(\"Bash(用于运行 Skill 内脚本)\")\n openai_path = source / \"agents\" / \"openai.yaml\"\n if openai_path.is_file():\n text = openai_path.read_text(encoding=\"utf-8\")\n for value in re.findall(r'^\\s+value:\\s*[\"\\']?([^\"\\'\\s]+)', text, re.MULTILINE):\n requirements.append(f\"工具依赖:{value}\")\n return requirements\n\n\ndef main() -> int:\n parser = argparse.ArgumentParser(description=\"准备单 Skill GitHub 仓库的本地 staging 目录\")\n parser.add_argument(\"skill_directory\")\n parser.add_argument(\"staging_directory\")\n parser.add_argument(\"--owner\", required=True)\n parser.add_argument(\"--repo\", required=True)\n args = parser.parse_args()\n\n source = Path(args.skill_directory).expanduser().resolve()\n staging = Path(args.staging_directory).expanduser().resolve()\n owner = args.owner.strip()\n repo = args.repo.strip()\n if not source.is_dir():\n raise SystemExit(f\"源 Skill 目录不存在:{source}\")\n if not OWNER_PATTERN.fullmatch(owner):\n raise SystemExit(\"GitHub owner 格式无效\")\n if not REPO_PATTERN.fullmatch(repo) or repo in {\".\", \"..\"}:\n raise SystemExit(\"GitHub repo 格式无效\")\n skill_path = source / \"SKILL.md\"\n if not skill_path.is_file():\n raise SystemExit(f\"源目录缺少 SKILL.md:{source}\")\n if staging.exists():\n if not staging.is_dir():\n raise SystemExit(f\"staging 路径已存在且不是目录:{staging}\")\n if any(staging.iterdir()):\n raise SystemExit(f\"staging 目录非空,未覆盖:{staging}\")\n\n text = skill_path.read_text(encoding=\"utf-8\")\n match = FRONTMATTER_PATTERN.match(text)\n if match is None:\n raise SystemExit(\"SKILL.md 缺少合法 frontmatter\")\n name = read_scalar(match.group(1), \"name\")\n description = \" \".join(read_scalar(match.group(1), \"description\").split())\n if not name or not description:\n raise SystemExit(\"SKILL.md 缺少 name 或 description\")\n\n target_skill = staging / \"skills\" / name\n source_files = public_files(source)\n staging.mkdir(parents=True, exist_ok=True)\n for entry_name in ALLOWED_ENTRIES:\n entry = source / entry_name\n if entry.exists():\n copy_public_tree(entry, target_skill / entry_name)\n\n copied_files = public_files(target_skill)\n if set(source_files) != set(copied_files):\n missing = sorted(str(path) for path in set(source_files) - set(copied_files))\n extra = sorted(str(path) for path in set(copied_files) - set(source_files))\n raise SystemExit(f\"打包资源清单不一致;缺少:{missing};多出:{extra}\")\n for relative, source_file in source_files.items():\n if not filecmp.cmp(source_file, copied_files[relative], shallow=False):\n raise SystemExit(f\"打包后文件内容不一致:{relative}\")\n\n locator = f\"{owner}/{repo}\"\n usage = read_default_prompt(source, name)\n requirement_lines = \"\\n\".join(f\"- {item}\" for item in detect_requirements(source))\n readme = f\"\"\"# {name}\n\n{description}\n\n## 安装\n\n```bash\nnpx -y skills add {locator} -g --all\n```\n\n## 使用\n\n安装后,可以这样开始:\n\n> {usage}\n\n## 运行依赖\n\n{requirement_lines}\n\n## 内容\n\n本仓库只发布运行这个 Skill 所需的文件。本地评测样本、预期答案和运行记录不包含在公开包中。\n\"\"\"\n (staging / \"README.md\").write_text(readme, encoding=\"utf-8\")\n (staging / \".gitignore\").write_text(\n \".DS_Store\\n__pycache__/\\n*.pyc\\nevals/\\n\",\n encoding=\"utf-8\",\n )\n\n print(f\"已准备:{staging}\")\n print(f\"安装命令:npx -y skills add {locator} -g --all\")\n print(\"尚未创建远端仓库,也没有执行 git push。\")\n return 0\n\n\nif __name__ == \"__main__\":\n raise SystemExit(main())\n","content_type":"text/x-python; charset=utf-8","language":"python","size":7186,"content_sha256":"44f155e994024acf9393ea1547d370d51ccc587bb4f81d386589d7ecdffd8e3f"},{"filename":"scripts/validate_skill_project.py","content":"#!/usr/bin/env python3\n\"\"\"Validate observable structure and references for one Skill directory.\"\"\"\n\nfrom __future__ import annotations\n\nimport argparse\nimport re\nimport subprocess\nfrom pathlib import Path\n\n\nASCII_NAME_PATTERN = re.compile(r\"^[a-z0-9]+(?:-[a-z0-9]+)*$\")\nFRONTMATTER_PATTERN = re.compile(r\"\\A---\\s*\\n(.*?)\\n---(?:\\s*\\n|\\Z)\", re.DOTALL)\nLINK_PATTERN = re.compile(r\"\\[[^\\]]+\\]\\(([^)]+)\\)\")\nTEXT_SUFFIXES = {\".md\", \".json\", \".yaml\", \".yml\", \".py\", \".sh\", \".txt\"}\nUNFINISHED_MARKERS = (\"[TODO\", \"TODO:\", \"FIXME\", \"{说明\", \"{写入\", \"{可观察\", \"\u003c待填写>\")\nLOCAL_PATH_PATTERN = re.compile(r\"(?:/Users/[^/\\s]+/|/home/[^/\\s]+/|[A-Za-z]:\\\\\\\\Users\\\\\\\\[^\\\\\\s]+\\\\\\\\)\")\nSECRET_PATTERN = re.compile(\n r\"(?i)(?:api[_-]?key|access[_-]?token|secret|password)\\s*[:=]\\s*['\\\"]?([A-Za-z0-9_\\-]{16,})\"\n)\nALLOWED_ROOT_ENTRIES = {\"SKILL.md\", \"agents\", \"references\", \"scripts\", \"assets\", \"evals\"}\n\n\ndef is_cjk(character: str) -> bool:\n codepoint = ord(character)\n return (\n 0x3400 \u003c= codepoint \u003c= 0x4DBF\n or 0x4E00 \u003c= codepoint \u003c= 0x9FFF\n or 0xF900 \u003c= codepoint \u003c= 0xFAFF\n )\n\n\ndef valid_skill_name(name: str) -> bool:\n if not 1 \u003c= len(name) \u003c 64:\n return False\n if ASCII_NAME_PATTERN.fullmatch(name):\n return True\n if not any(is_cjk(character) for character in name):\n return False\n return all(\n character.isalnum() or character in \"-_::()()\"\n for character in name\n )\n\n\ndef read_scalar(frontmatter: str, field: str) -> str:\n lines = frontmatter.splitlines()\n prefix = f\"{field}:\"\n for index, line in enumerate(lines):\n if not line.startswith(prefix):\n continue\n value = line[len(prefix) :].strip()\n if value not in {\"|\", \">\"}:\n return value.strip(\"\\\"'\")\n content: list[str] = []\n for continuation in lines[index + 1 :]:\n if continuation and not continuation[0].isspace():\n break\n content.append(continuation[2:] if continuation.startswith(\" \") else continuation)\n return (\"\\n\" if value == \"|\" else \" \").join(content).strip()\n return \"\"\n\n\ndef read_text(path: Path, errors: list[str]) -> str | None:\n try:\n return path.read_text(encoding=\"utf-8\")\n except UnicodeDecodeError:\n errors.append(f\"文本文件不是 UTF-8:{path}\")\n return None\n\n\ndef check_markdown_links(root: Path, path: Path, text: str, errors: list[str]) -> None:\n for link in LINK_PATTERN.findall(text):\n target = link.split(\"#\", 1)[0].strip().strip(\"\u003c>\")\n if not target or target.startswith((\"http://\", \"https://\", \"mailto:\", \"#\")):\n continue\n if target.startswith(\"/\"):\n errors.append(f\"引用使用了绝对路径:{path.relative_to(root)} -> {target}\")\n continue\n resolved = (path.parent / target).resolve()\n if root not in resolved.parents and resolved != root:\n errors.append(f\"引用越出 Skill 目录:{path.relative_to(root)} -> {target}\")\n elif not resolved.exists():\n errors.append(f\"引用不存在:{path.relative_to(root)} -> {target}\")\n\n\ndef main() -> int:\n parser = argparse.ArgumentParser(description=\"校验单个 Skill 项目\")\n parser.add_argument(\"skill_directory\")\n args = parser.parse_args()\n\n root = Path(args.skill_directory).expanduser().resolve()\n errors: list[str] = []\n warnings: list[str] = []\n skill_path = root / \"SKILL.md\"\n\n if not root.is_dir():\n print(f\"ERROR:目录不存在:{root}\")\n return 1\n if not skill_path.is_file():\n print(f\"ERROR:缺少 {skill_path}\")\n return 1\n\n text = skill_path.read_text(encoding=\"utf-8\")\n match = FRONTMATTER_PATTERN.match(text)\n if match is None:\n errors.append(\"SKILL.md 缺少合法的 YAML frontmatter\")\n frontmatter = \"\"\n else:\n frontmatter = match.group(1)\n\n name = read_scalar(frontmatter, \"name\")\n description = read_scalar(frontmatter, \"description\")\n if not valid_skill_name(name):\n errors.append(\n \"name 必须少于 64 个字符;纯英文名只使用小写英文、数字和连字符,\"\n \"中文名可使用中文、字母、数字、连字符、下划线、冒号和括号\"\n )\n if name and name != root.name:\n errors.append(f\"目录名 {root.name!r} 与 name {name!r} 不一致\")\n if not 1 \u003c= len(description) \u003c= 1024:\n errors.append(f\"description 长度为 {len(description)},规范范围是 1~1,024\")\n elif len(description) > 300:\n warnings.append(f\"description 长度为 {len(description)},建议检查是否可以收紧\")\n if description and not any(token in description.lower() for token in (\"时使用\", \"用户\", \"当\", \"when\", \"use for\", \"used for\")):\n warnings.append(\"description 可能只说明了能力,建议补充使用条件\")\n\n for path in sorted(root.rglob(\"*\")):\n relative = path.relative_to(root)\n if path.is_symlink():\n errors.append(f\"不允许悬空或外部软链接:{relative}\")\n continue\n if path.is_dir():\n if not any(path.iterdir()):\n warnings.append(f\"空目录没有产生功能:{relative}\")\n continue\n if path.suffix.lower() not in TEXT_SUFFIXES:\n continue\n file_text = read_text(path, errors)\n if file_text is None:\n continue\n is_validator_source = path.resolve() == Path(__file__).resolve()\n if not is_validator_source:\n for marker in UNFINISHED_MARKERS:\n if marker in file_text:\n errors.append(f\"仍有未完成占位符:{relative} -> {marker}\")\n if LOCAL_PATH_PATTERN.search(file_text):\n errors.append(f\"包含本机用户绝对路径:{relative}\")\n if SECRET_PATTERN.search(file_text):\n errors.append(f\"包含疑似密钥或密码:{relative}\")\n if path.suffix.lower() == \".md\":\n check_markdown_links(root, path, file_text, errors)\n\n for entry in sorted(root.iterdir()):\n if entry.name not in ALLOWED_ROOT_ENTRIES:\n warnings.append(f\"Skill 根目录存在非标准条目:{entry.name}\")\n\n line_count = len(text.splitlines())\n if line_count > 300:\n warnings.append(f\"SKILL.md 共 {line_count} 行,建议检查渐进式披露\")\n\n openai_path = root / \"agents\" / \"openai.yaml\"\n if openai_path.is_file():\n openai_text = openai_path.read_text(encoding=\"utf-8\")\n if name and f\"${name}\" not in openai_text:\n errors.append(\"agents/openai.yaml 的 default_prompt 未显式包含 Skill 名\")\n short_match = re.search(r'^\\s+short_description:\\s*[\"\\'](.*)[\"\\']\\s*

dbs-skill-maker:Skill 制作与改进 把一类反复出现的问题做成 Skill,或让已有 Skill 在真实任务上表现更好。制作和改进共用同一组原则,流程轻重由改动规模决定。 本地可用并通过当前证据支持的验证,即构成一次完整交付。GitHub 发布是可选能力,不能成为默认步骤。 不变量 1. 先方案,后写入。 任何会创建或修改 Skill 文件的动作,都先交付方案并等待用户确认。方案长短与改动规模相称:一句话的改动,方案也只需几行。 2. 流程按规模取用。 只执行当前路线需要的部分,不把所有任务都推进同一套重流程。 3. 先找标准答案,每步有理论锚点。 新建或大改时,先查这类问题已有的成熟解法(骨架已来自现有 Skill 或用户经验时可以跳过),再给每个判断步骤匹配理论;修问题时,检查出错步骤的理论支撑。理论不保证好用,但缺少理论的步骤更容易出错。找不到高匹配理论时如实说明并保留经验判断,不硬套,也不因此停止。 4. 深度由用户选。 标准答案做轻量版、完整版还是跳过,在执行中询问用户,同时给出建议和理由。 5. 保留用户选择和项目规则。 用户已经给出的名称、目标、平台和边界直接沿用。目标项目有自己的规则文件(如 、 )或校验脚本时,按项目规则执行,并在交付前运行这些校验。 6. 在能解释失败的那一层修改。 每项改动都要解释一类稳定问题;不把单条反馈、测试答案或个案细…

, openai_text, re.MULTILINE)\n if short_match and not 25 \u003c= len(short_match.group(1)) \u003c= 64:\n errors.append(\"agents/openai.yaml 的 short_description 应为 25~64 个字符\")\n display_match = re.search(r'^\\s+display_name:\\s*[\"\\'](.*)[\"\\']\\s*

dbs-skill-maker:Skill 制作与改进 把一类反复出现的问题做成 Skill,或让已有 Skill 在真实任务上表现更好。制作和改进共用同一组原则,流程轻重由改动规模决定。 本地可用并通过当前证据支持的验证,即构成一次完整交付。GitHub 发布是可选能力,不能成为默认步骤。 不变量 1. 先方案,后写入。 任何会创建或修改 Skill 文件的动作,都先交付方案并等待用户确认。方案长短与改动规模相称:一句话的改动,方案也只需几行。 2. 流程按规模取用。 只执行当前路线需要的部分,不把所有任务都推进同一套重流程。 3. 先找标准答案,每步有理论锚点。 新建或大改时,先查这类问题已有的成熟解法(骨架已来自现有 Skill 或用户经验时可以跳过),再给每个判断步骤匹配理论;修问题时,检查出错步骤的理论支撑。理论不保证好用,但缺少理论的步骤更容易出错。找不到高匹配理论时如实说明并保留经验判断,不硬套,也不因此停止。 4. 深度由用户选。 标准答案做轻量版、完整版还是跳过,在执行中询问用户,同时给出建议和理由。 5. 保留用户选择和项目规则。 用户已经给出的名称、目标、平台和边界直接沿用。目标项目有自己的规则文件(如 、 )或校验脚本时,按项目规则执行,并在交付前运行这些校验。 6. 在能解释失败的那一层修改。 每项改动都要解释一类稳定问题;不把单条反馈、测试答案或个案细…

, openai_text, re.MULTILINE)\n display_name = display_match.group(1) if display_match else \"\"\n # 允许 `name` 或 `name(附加名称)` 两种写法。\n if display_match and name and not re.fullmatch(\n re.escape(name) + r\"(?:\\s*[((][^))]+[))])?\", display_name\n ):\n errors.append(\"agents/openai.yaml 的 display_name 应为 name 或「name(附加名称)」\")\n\n scripts_dir = root / \"scripts\"\n if scripts_dir.is_dir():\n for script in sorted(scripts_dir.rglob(\"*.py\")):\n try:\n compile(script.read_text(encoding=\"utf-8\"), str(script), \"exec\")\n except SyntaxError as error:\n errors.append(f\"Python 语法错误:{script.relative_to(root)}:{error}\")\n for script in sorted(scripts_dir.rglob(\"*.sh\")):\n result = subprocess.run(\n [\"bash\", \"-n\", str(script)],\n capture_output=True,\n text=True,\n check=False,\n )\n if result.returncode:\n detail = result.stderr.strip() or \"bash -n 失败\"\n errors.append(f\"Shell 语法错误:{script.relative_to(root)}:{detail}\")\n\n for warning in warnings:\n print(f\"WARNING:{warning}\")\n for error in errors:\n print(f\"ERROR:{error}\")\n\n if errors:\n print(f\"校验失败:{len(errors)} 个错误,{len(warnings)} 个提醒。\")\n return 1\n print(f\"校验通过:{root}({len(warnings)} 个提醒)\")\n return 0\n\n\nif __name__ == \"__main__\":\n raise SystemExit(main())\n","content_type":"text/x-python; charset=utf-8","language":"python","size":8666,"content_sha256":"eb16d49d2efe608f73de0128cbbb62661fbf4b3b9f2c2c3ccfcdf508e78118c5"},{"filename":"scripts/verify_npx_install.sh","content":"#!/usr/bin/env bash\nset -euo pipefail\n\nif [[ $# -ne 3 ]]; then\n echo \"用法:$0 \u003cowner/repo-or-local-path> \u003cskill-name> \u003csource-skill-directory>\" >&2\n exit 2\nfi\n\nsource_locator=\"$1\"\nskill_name=\"$2\"\nsource_skill_directory=\"$3\"\nskill_maker_npx=\"${SKILL_MAKER_NPX:-npx}\"\ntemporary_root=\"$(mktemp -d)\"\ntemporary_home=\"$temporary_root/home\"\n\nif [[ ! \"$skill_name\" =~ ^[a-z0-9]+(-[a-z0-9]+)*$ ]]; then\n echo \"安装验证失败:Skill 名称格式无效\" >&2\n exit 2\nfi\n\nif [[ ! -f \"$source_skill_directory/SKILL.md\" ]]; then\n echo \"安装验证失败:源目录缺少 SKILL.md\" >&2\n exit 2\nfi\n\nif find \"$source_skill_directory\" -type l -print -quit | grep -q .; then\n echo \"安装验证失败:源 Skill 包含软链接\" >&2\n exit 2\nfi\n\ncleanup() {\n rm -rf \"$temporary_root\"\n}\ntrap cleanup EXIT\n\nmkdir -p \"$temporary_home\"\n\nHOME=\"$temporary_home\" \"$skill_maker_npx\" -y skills add \"$source_locator\" -g --all\n\ninstalled_skill=\"\"\nwhile IFS= read -r candidate; do\n installed_skill=\"$candidate\"\n break\ndone \u003c \u003c(find \"$temporary_home\" -type f -path \"*/skills/$skill_name/SKILL.md\" -print)\n\nif [[ -z \"$installed_skill\" ]]; then\n echo \"安装验证失败:未找到 $skill_name/SKILL.md\" >&2\n exit 1\nfi\n\nif ! grep -Eq \"^name:[[:space:]]*['\\\"]?$skill_name['\\\"]?[[:space:]]*$\" \"$installed_skill\"; then\n echo \"安装验证失败:frontmatter name 与 $skill_name 不一致\" >&2\n exit 1\nfi\n\ninstalled_root=\"$(dirname \"$installed_skill\")\"\nchecked_count=0\nfor entry in SKILL.md agents references scripts assets; do\n source_entry=\"$source_skill_directory/$entry\"\n [[ -e \"$source_entry\" ]] || continue\n if [[ -f \"$source_entry\" ]]; then\n source_files=(\"$source_entry\")\n else\n source_files=()\n while IFS= read -r source_file; do\n source_files+=(\"$source_file\")\n done \u003c \u003c(find \"$source_entry\" -type f ! -name '.DS_Store' ! -name '*.pyc' -print)\n fi\n for source_file in \"${source_files[@]}\"; do\n relative_path=\"${source_file#\"$source_skill_directory/\"}\"\n installed_file=\"$installed_root/$relative_path\"\n if [[ ! -f \"$installed_file\" ]]; then\n echo \"安装验证失败:缺少资源 $relative_path\" >&2\n exit 1\n fi\n if ! cmp -s \"$source_file\" \"$installed_file\"; then\n echo \"安装验证失败:资源内容不一致 $relative_path\" >&2\n exit 1\n fi\n checked_count=$((checked_count + 1))\n done\ndone\n\necho \"安装验证通过:${installed_skill}(已核对 ${checked_count} 个文件)\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":2451,"content_sha256":"6fccf01d611df34075db47e5a936e81249e469da01c83e4a590f4199f7097947"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"dbs-skill-maker:Skill 制作与改进","type":"text"}]},{"type":"paragraph","content":[{"text":"把一类反复出现的问题做成 Skill,或让已有 Skill 在真实任务上表现更好。制作和改进共用同一组原则,流程轻重由改动规模决定。","type":"text"}]},{"type":"paragraph","content":[{"text":"本地可用并通过当前证据支持的验证,即构成一次完整交付。GitHub 发布是可选能力,不能成为默认步骤。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"不变量","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"先方案,后写入。","type":"text","marks":[{"type":"strong"}]},{"text":" 任何会创建或修改 Skill 文件的动作,都先交付方案并等待用户确认。方案长短与改动规模相称:一句话的改动,方案也只需几行。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"流程按规模取用。","type":"text","marks":[{"type":"strong"}]},{"text":" 只执行当前路线需要的部分,不把所有任务都推进同一套重流程。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"先找标准答案,每步有理论锚点。","type":"text","marks":[{"type":"strong"}]},{"text":" 新建或大改时,先查这类问题已有的成熟解法(骨架已来自现有 Skill 或用户经验时可以跳过),再给每个判断步骤匹配理论;修问题时,检查出错步骤的理论支撑。理论不保证好用,但缺少理论的步骤更容易出错。找不到高匹配理论时如实说明并保留经验判断,不硬套,也不因此停止。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"深度由用户选。","type":"text","marks":[{"type":"strong"}]},{"text":" 标准答案做轻量版、完整版还是跳过,在执行中询问用户,同时给出建议和理由。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"保留用户选择和项目规则。","type":"text","marks":[{"type":"strong"}]},{"text":" 用户已经给出的名称、目标、平台和边界直接沿用。目标项目有自己的规则文件(如 ","type":"text"},{"text":"AGENTS.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"CLAUDE.md","type":"text","marks":[{"type":"code_inline"}]},{"text":")或校验脚本时,按项目规则执行,并在交付前运行这些校验。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"在能解释失败的那一层修改。","type":"text","marks":[{"type":"strong"}]},{"text":" 每项改动都要解释一类稳定问题;不把单条反馈、测试答案或个案细节写成通用规则。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用行为验证。","type":"text","marks":[{"type":"strong"}]},{"text":" 测试可观察输出、工具动作和边界,不要求模型展示隐藏推理。没有实际运行过的任务,不宣称变好。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"保护现场。","type":"text","marks":[{"type":"strong"}]},{"text":" 不覆盖用户未提交的改动和现有同名目录;写入前确认改动可以回退。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"外部动作单独授权。","type":"text","marks":[{"type":"strong"}]},{"text":" 创建远端仓库、push、tag、Release 和公开测试材料,都需要用户明确要求。","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"第 0 步:选择路线","type":"text"}]},{"type":"paragraph","content":[{"text":"读取当前对话、用户提供的文件和目标目录,选择路线。规模拿不准时按较大的一档处理,并在方案里说明;用户可以要求降档。","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用户请求","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"路线","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"做新 Skill;改定位、改名、拆分合并、重写多个文件","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"A:新建或大改","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"给出失败案例、反馈或模糊目标,例如“它总是假设观众知道背景”“帮我优化一下”","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"B:修问题","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说清了改哪里、改成什么,例如“把第 3 步的提问上限改成 2 个”","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"C:小改","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"只要求诊断、检查或测试,不要求修改","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"D:只读,直接交付结果,不需要确认","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"明确要求发布、分享或生成 ","type":"text"},{"text":"npx","type":"text","marks":[{"type":"code_inline"}]},{"text":" 安装命令","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"E:读取 ","type":"text"},{"text":"references/github-publishing.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/github-publishing.md","title":null}}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"路线 A:新建或大改","type":"text"}]},{"type":"paragraph","content":[{"text":"A1 读取现场。","type":"text","marks":[{"type":"strong"}]},{"text":" 读取用户材料、目标目录和项目规则;确认目标目录没有同名 Skill。大改时再读取原 Skill 及其引用资源、现有 ","type":"text"},{"text":"evals/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 和工作区状态,列出原来已经做对、改动后需要保持的能力。","type":"text"}]},{"type":"paragraph","content":[{"text":"A2 需求分析,并请用户选择标准答案深度。","type":"text","marks":[{"type":"strong"}]},{"text":" 按 ","type":"text"},{"text":"references/problem-and-goal.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/problem-and-goal.md","title":null}}]},{"text":" 先根据现有材料写出问题契约,再把缺口合并成一组问题一次问完。同一条消息里请用户选择标准答案深度:","type":"text"}]},{"type":"blockquote","content":[{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"轻量版","type":"text","marks":[{"type":"strong"}]},{"text":":找 2~3 个已知的成熟做法,加 1 个失败做法或反例。适合一般 Skill,耗时短。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"完整版","type":"text","marks":[{"type":"strong"}]},{"text":":把问题抽象成结构,找 4~6 个历史同构案例(成功、失败、反例),做类比矩阵。适合高风险或需要深挖的任务,耗时明显更长。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"跳过","type":"text","marks":[{"type":"strong"}]},{"text":":判断骨架已经来自现有 Skill 或用户经验,直接做每步理论锚定。适合合并、重写已有 Skill,或用户已经说清关键步骤的任务。","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"我的建议:{根据任务给出建议和一句理由}","type":"text"}]}]},{"type":"paragraph","content":[{"text":"发出问题后结束本轮,等待用户回复。","type":"text"}]},{"type":"paragraph","content":[{"text":"A3 找标准答案。","type":"text","marks":[{"type":"strong"}]},{"text":" 用户选择跳过时,把现有 Skill 的步骤和用户补充的关键步骤整理成判断骨架,直接进入 A4。否则按用户选择的深度执行 ","type":"text"},{"text":"references/standard-answer.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/standard-answer.md","title":null}}]},{"text":",得出结论等级和 Skill 的判断骨架。轻量版的结论是「尚无统一答案」或几种做法互相冲突时,告诉用户,并询问是否升级到完整版。","type":"text"}]},{"type":"paragraph","content":[{"text":"A4 每步理论锚定。","type":"text","marks":[{"type":"strong"}]},{"text":" 按 ","type":"text"},{"text":"references/theory-grounding.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/theory-grounding.md","title":null}}]},{"text":" 为骨架中的每个判断步骤审查规则、匹配主理论、写出边界和核实状态。默认离线完成;外部事实会改变结论或用户要求核实时才联网。","type":"text"}]},{"type":"paragraph","content":[{"text":"A5 交付方案并停止。","type":"text","marks":[{"type":"strong"}]},{"text":" 按 ","type":"text"},{"text":"references/skill-construction.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/skill-construction.md","title":null}}]},{"text":" 确定文件结构,方案包含:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"# {新建/大改} {skill-name} 方案\n\n## 问题契约摘要\n## 标准答案:{成熟共识/条件性答案/尚无统一答案/已跳过,骨架来自 …}\n\n## 步骤与理论\n\n| Skill 步骤 | 理论锚点 | 解决什么判断 | 失效边界 | 核实状态 |\n| --- | --- | --- | --- | --- |\n\n## 文件结构\n## 验证计划(3~6 个样本)\n## 回退\n\n请确认全部方案,或回复要执行的部分和限制。","type":"text"}]},{"type":"paragraph","content":[{"text":"A6 写入。","type":"text","marks":[{"type":"strong"}]},{"text":" 见下文「写入」。Skill 正文只写由理论推出的判断步骤和边界,每步最多一行依据;理论卡和评分过程只留在方案中。","type":"text"}]},{"type":"paragraph","content":[{"text":"A7 验证与报告。","type":"text","marks":[{"type":"strong"}]},{"text":" 见下文「验证与报告」。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"路线 B:修问题","type":"text"}]},{"type":"paragraph","content":[{"text":"B1 读取现场。","type":"text","marks":[{"type":"strong"}]},{"text":" 读取目标 ","type":"text"},{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"、直接引用的资源、现有 ","type":"text"},{"text":"evals/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、相关脚本、项目规则和工作区状态,列出当前已经做对的能力。无法分离用户已有改动与待改基线时,在方案中说明阻塞原因,不进入写入。","type":"text"}]},{"type":"paragraph","content":[{"text":"B2 复现、定位与归因。","type":"text","marks":[{"type":"strong"}]},{"text":" 按 ","type":"text"},{"text":"references/improvement.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/improvement.md","title":null}}]},{"text":" 取得真实失败,找到从哪一步开始偏离,判断失败来源,并判断错在规则层、方法层还是骨架层。","type":"text"}]},{"type":"paragraph","content":[{"text":"B3 出错步骤的理论检查。","type":"text","marks":[{"type":"strong"}]},{"text":" 只对出错的步骤执行 ","type":"text"},{"text":"references/theory-grounding.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/theory-grounding.md","title":null}}]},{"text":":这一步有没有理论支撑,理论是否用错。问题出在整个 Skill 的解法骨架时,向用户说明,并建议升级到路线 A,由用户决定。","type":"text"}]},{"type":"paragraph","content":[{"text":"B4 交付方案并停止。","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"# 修改 {skill-name} 方案\n\n## 问题与证据\n\n| 证据 | 实际行为 | 预期行为 | 来源与层级 |\n| --- | --- | --- | --- |\n\n## 改动\n\n| 编号 | 文件与位置 | 怎么改 | 理论依据 | 解决什么 | 可能影响 |\n| --- | --- | --- | --- | --- | --- |\n\n## 不改动\n## 验证(1~3 个真实任务,至少 1 个是原来做对的任务)\n## 回退\n\n请确认全部方案,或回复要执行的编号和限制。","type":"text"}]},{"type":"paragraph","content":[{"text":"B5 写入。","type":"text","marks":[{"type":"strong"}]},{"text":" 见下文「写入」。","type":"text"}]},{"type":"paragraph","content":[{"text":"B6 对比验证。","type":"text","marks":[{"type":"strong"}]},{"text":" 同一组任务分别运行改动前后的版本,按 ","type":"text"},{"text":"references/evaluation.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/evaluation.md","title":null}}]},{"text":" 判断,结论为保留、继续试验或回退。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"路线 C:小改","type":"text"}]},{"type":"paragraph","content":[{"text":"交付几行方案:目标文件、具体改动、不改什么、回退方式,然后等待确认。确认后修改,运行结构校验;改动影响行为时,再跑 1 个真实任务。不做理论检查。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"确认规则","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"「确认」「按这个方案做」「只做 1、3」「可以改流程,但不要动 description」等回复,能对应当前对话里唯一、明确的方案时,构成确认;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"最初的「帮我改进」「直接优化」「你看着改」只表示用户希望获得服务,不构成对方案的确认;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户在确认时自己写清的追加改动视为已确认;需要你判断怎么改的追加项,先补进方案再确认;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户只讨论方案、提出疑问或没有回复时,继续保持只读。","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"交付方案后结束本轮,不在同一轮里连续完成“提出方案”和“写入文件”。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"写入","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"复述获准执行的内容、目标文件和限制;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"确认改动可以回退:目标位于 Git 仓库且相关文件没有未提交改动时,以当前提交为回退点;否则先把相关文件复制到临时目录作为快照;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"只执行获准的改动,保持 Skill 名称和原有职责,除非方案里已获准改名或改定位;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"新建 Skill 时可以运行 ","type":"text"},{"text":"scripts/init_skill_project.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 生成带真实内容的初稿,再补完判断条件、边界和停止条件;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"完成后运行结构校验和目标项目自己的校验:","type":"text"}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/validate_skill_project.py \u003cskill-directory>","type":"text"}]},{"type":"paragraph","content":[{"text":"不得把初始骨架或未完成占位符交给用户。","type":"text"}]},{"type":"paragraph","content":[{"text":"目标项目要求在 frontmatter 维护 description 以外的摘要字段(例如供调度使用的接手字段)时,按「正文 → 摘要字段 → description」的顺序同步更新,摘要不写正文没有的规则,并运行项目对应的校验。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"验证与报告","type":"text"}]},{"type":"paragraph","content":[{"text":"默认使用 ","type":"text"},{"text":"references/evaluation.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/evaluation.md","title":null}}]},{"text":" 的轻量对比。出现以下任一情况时加码到完整评测:用户要求盲测、留出样本或回归测试;改动涉及安全、权限、事实边界,或改变了 ","type":"text"},{"text":"description","type":"text","marks":[{"type":"code_inline"}]},{"text":" 的触发范围;Skill 准备公开发布;轻量对比的结果无法判断好坏。","type":"text"}]},{"type":"paragraph","content":[{"text":"按实际完成的最高等级报告:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"等级","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"证据","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"允许的表述","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.结构校验","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"frontmatter、引用、资源、脚本和项目校验通过","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"“结构校验通过”","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2.行为对比","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"至少 1 个真实任务的实际输出通过;改进时与改动前输出对比","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"“真实任务测试通过”","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"3.留出/回归","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"执行者未看预期答案,留出样本通过且无关键回归","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"“当前留出与回归样本通过”","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4.安装交付","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"GitHub 来源可用 ","type":"text"},{"text":"npx skills add","type":"text","marks":[{"type":"code_inline"}]},{"text":" 安装,并逐项核对资源","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"“GitHub ","type":"text"},{"text":"npx","type":"text","marks":[{"type":"code_inline"}]},{"text":" 安装与资源校验通过”","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"未实际运行行为任务时,只能报告第 1 级。","type":"text"}]},{"type":"paragraph","content":[{"text":"改进已有 Skill 后,报告:","type":"text","marks":[{"type":"strong"}]},{"text":" 实际修改的文件和位置;验证等级与每个样本改动前后的表现;结论(保留/继续试验/回退)及依据;仍未验证的风险。候选整体变差时按回退方式恢复,并说明失败发生在哪里。","type":"text"}]},{"type":"paragraph","content":[{"text":"制作新 Skill 后,报告:","type":"text","marks":[{"type":"strong"}]},{"text":" Skill 名称和绝对路径;解决的问题与主要边界;标准答案等级与仍未找到理论锚点的步骤;实际生成的文件;验证等级与仍未验证的风险;本地安装或调用方式。","type":"text"}]},{"type":"paragraph","content":[{"text":"如果当前环境能使用 ","type":"text"},{"text":"$dbs-install-skill","type":"text","marks":[{"type":"code_inline"}]},{"text":",在用户要求安装或当前交付需要安装时,使用它安装已生成的 Skill,不在本 Skill 内重写多端安装逻辑。如果检测不到 dbskill 或 ","type":"text"},{"text":"$dbs-install-skill","type":"text","marks":[{"type":"code_inline"}]},{"text":",先说明使用 dbskill 可以完成多端安装和去重,并引导用户运行:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"npx -y skills add dontbesilent2025/dbskill -g --all","type":"text"}]},{"type":"paragraph","content":[{"text":"新 Skill 交付后固定提醒一次:","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Skill 已完成,当前最高验证等级是「{1/2/3/4}」,可以在本地使用。如果你希望分享给别人,我还可以帮你发布到 GitHub,并验证 ","type":"text"},{"text":"npx skills add","type":"text","marks":[{"type":"code_inline"}]},{"text":" 安装命令。","type":"text"}]}]},{"type":"paragraph","content":[{"text":"用户没有要求发布时直接结束,不继续追问,也不创建 GitHub 配置。准备仓库不等于获得远端写入授权;执行 ","type":"text"},{"text":"gh repo create","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"git push","type":"text","marks":[{"type":"code_inline"}]},{"text":"、创建 tag 或 Release 前,确认用户的明确要求能够覆盖该动作。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"改进本 Skill 自身","type":"text"}]},{"type":"paragraph","content":[{"text":"目标是 ","type":"text"},{"text":"dbs-skill-maker","type":"text","marks":[{"type":"code_inline"}]},{"text":" 本身时,用改动前的文件快照运行基线,并在验证中检查两条不变量没有被削弱:“先方案,后写入”和“执行者看不到预期答案”。无法保留快照时,只交付方案和测试设计。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"停止条件","type":"text"}]},{"type":"paragraph","content":[{"text":"出现以下情况时结束当前轮次:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"方案或需求问题已交付,正在等待用户回复;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"改动已完成并通过当前可执行的验证;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"缺少一个会改变方案的用户决定;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"理论或现实事实连续 2 次核实失败,继续搜索不会改变方案;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"修改开始依赖单个案例补丁,或连续两轮没有可区分的改善;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户只要求方案、诊断,或明确要求停止;","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"GitHub 相关动作尚未获得授权。","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"语言与安全","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"中文遵循《中文文案排版指北》。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不使用空洞的二元反转句式。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不读取、复制或发布用户未授权的私密材料。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不使用 ","type":"text"},{"text":"git add .","type":"text","marks":[{"type":"code_inline"}]},{"text":" 或 ","type":"text"},{"text":"git add -A","type":"text","marks":[{"type":"code_inline"}]},{"text":";发布时只暂存明确文件。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不把本地绝对路径、测试答案、密钥或内部记录写进公开仓库。","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"完成当前任务后直接结束。用户的请求超出本 Skill 的范围、任务完成后用户的材料里出现明确的后续需求,或用户询问下一步时,用一句话说明还需要哪种能力,不点名其他 Skill;当前环境已经安装 ","type":"text"},{"text":"/dbs","type":"text","marks":[{"type":"code_inline"}]},{"text":" 时,补一句「可以输入 ","type":"text"},{"text":"/dbs","type":"text","marks":[{"type":"code_inline"}]},{"text":",由它匹配对应的 Skill」。","type":"text"}]}]},"metadata":{"date":"2026-11-02","name":"dbs-skill-maker","author":"@skillopedia","source":{"stars":11084,"repo_name":"dbskill","origin_url":"https://github.com/dontbesilent2025/dbskill/blob/HEAD/skills/dbs-skill-maker/SKILL.md","repo_owner":"dontbesilent2025","body_sha256":"84b2ceeda3257b266e8c53dc008539ba9877e3a7438d4fe9d1e0c3ba034a8c79","cluster_key":"55fc9b23b5d958a39222bc1b9d9a6a4efb77ba7307ac275837d707d75a9c7cbe","clean_bundle":{"format":"clean-skill-bundle-v1","source":"dontbesilent2025/dbskill/skills/dbs-skill-maker/SKILL.md","text_bytes":49974,"source_commit":"0033b362fc0f8d00d69e10fd9e79270b3a53352e","skills_sh_rank":2906,"attachment_count":12,"text_attachments":12,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"skills/dbs-skill-maker/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"general","category_label":"General"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"general","metadata":{"dbs-handoff":"- 一个反复出现的问题要做成新 Skill,或已有 Skill 要改定位、改名、拆分合并、重写多个文件 → 问题契约和一组需求问题,同时请用户选标准答案深度(轻量版、完整版、跳过),停下等回答;再交出方案:标准答案、步骤与理论、文件结构、验证计划、回退,停下等确认;确认后写入并报告验证等级\n- 已有 Skill,带着失败案例、反馈或模糊的改进目标 → 修改方案:问题与证据、改动、验证、回退,停下等确认;确认后写入,用同一组任务对比改动前后,结论为保留、继续试验或回退\n- 已有 Skill,写清了改哪里、改成什么 → 几行方案,停下等确认;确认后修改并跑结构校验\n- 已有 Skill,只要求诊断、检查或测试 → 诊断或测试结果,不改文件\n- 本地已完成的 Skill,用户明确要求发布或分享 → GitHub 发布准备;push、tag、Release 前确认授权,发布后验证 npx skills add 安装\n- 不交出:未经确认的文件写入、用户没要求的 GitHub 发布、多端安装逻辑\n"},"import_tag":"skills-sh-top20k-2026-11","description":"制作新 Skill,或改进已有 Skill。先按改动规模给出方案并等待确认,再生成或修改文件,并用真实任务对比改动前后的表现。用户要求做 Skill、把反复出现的问题沉淀成 Skill、修改或修复 Skill、根据失败案例改进 Skill、检查或测试 Skill 时使用;只有用户明确要求分享或发布时,才准备 GitHub 仓库并验证 `npx skills add`。"}},"renderedAt":1793661474550}

dbs-skill-maker:Skill 制作与改进 把一类反复出现的问题做成 Skill,或让已有 Skill 在真实任务上表现更好。制作和改进共用同一组原则,流程轻重由改动规模决定。 本地可用并通过当前证据支持的验证,即构成一次完整交付。GitHub 发布是可选能力,不能成为默认步骤。 不变量 1. 先方案,后写入。 任何会创建或修改 Skill 文件的动作,都先交付方案并等待用户确认。方案长短与改动规模相称:一句话的改动,方案也只需几行。 2. 流程按规模取用。 只执行当前路线需要的部分,不把所有任务都推进同一套重流程。 3. 先找标准答案,每步有理论锚点。 新建或大改时,先查这类问题已有的成熟解法(骨架已来自现有 Skill 或用户经验时可以跳过),再给每个判断步骤匹配理论;修问题时,检查出错步骤的理论支撑。理论不保证好用,但缺少理论的步骤更容易出错。找不到高匹配理论时如实说明并保留经验判断,不硬套,也不因此停止。 4. 深度由用户选。 标准答案做轻量版、完整版还是跳过,在执行中询问用户,同时给出建议和理由。 5. 保留用户选择和项目规则。 用户已经给出的名称、目标、平台和边界直接沿用。目标项目有自己的规则文件(如 、 )或校验脚本时,按项目规则执行,并在交付前运行这些校验。 6. 在能解释失败的那一层修改。 每项改动都要解释一类稳定问题;不把单条反馈、测试答案或个案细…