spec-init 概览 用于在本仓库里创建一个新的需求级 Spec Pack:自动递增三位编号、创建并切换到 分支、生成 目录结构,并把原始需求写入 (UTF-8 with BOM)。 约束:即使仓库包含 , 也只初始化 根项目 的 Spec 分支与 Spec Pack;子仓分支不在本阶段批量创建。 何时使用 / 不使用 - 使用时机 - 用户要开始一个"新需求"的 Spec(还没有 分支与 目录)。 - 用户只给了中文需求文本(不方便先手动建文件),担心参数编码导致乱码。 - 需要确保分支命名、编号来源、目录结构符合仓库约定。 - 不要用在 - 已经在一个合法的 spec 分支上,且 已存在并结构完整(这时直接进入后续命令)。 快速参考 - 分支命名 : ( 为三位数字; 为 kebab-case,小写字母/数字/连字符) - 统一输出位置 : - 必备子目录 : 、 、 、 、 - 初始文件 : (内容=原始需求;编码=UTF-8 with BOM) - 脚本位置 : - 脚本入口(PowerShell) : ( 直接执行,需 PowerShell 5.0+) - 脚本入口(Bash) : (命令行参数见 ;stdout 输出 JSON) - 关键副作用 :脚本执行成功后会删除传入的源文件(无论是原始文件还是临时文件)。 - 与子仓的边界 :若后续实现涉及 submodul…

\\xEF\\xBB\\xBF' ]]; then\n # 跳过 BOM\n tail -c +4 \"$source_file\" >\"$tmp_content\"\n else\n cat \"$source_file\" >\"$tmp_content\"\n fi\n\n # 写入 BOM + 内容\n : >\"$target_file\"\n printf '\\xEF\\xBB\\xBF' >\"$target_file\"\n cat \"$tmp_content\" >>\"$target_file\"\n\n rm -f \"$tmp_content\"\n}\n\njson_escape() {\n # 极简 JSON string escape(覆盖 \\ \" 与控制字符的常见情况)\n local s=\"$1\"\n s=\"${s//\\\\/\\\\\\\\}\"\n s=\"${s//\\\"/\\\\\\\"}\"\n s=\"${s//

spec-init 概览 用于在本仓库里创建一个新的需求级 Spec Pack:自动递增三位编号、创建并切换到 分支、生成 目录结构,并把原始需求写入 (UTF-8 with BOM)。 约束:即使仓库包含 , 也只初始化 根项目 的 Spec 分支与 Spec Pack;子仓分支不在本阶段批量创建。 何时使用 / 不使用 - 使用时机 - 用户要开始一个"新需求"的 Spec(还没有 分支与 目录)。 - 用户只给了中文需求文本(不方便先手动建文件),担心参数编码导致乱码。 - 需要确保分支命名、编号来源、目录结构符合仓库约定。 - 不要用在 - 已经在一个合法的 spec 分支上,且 已存在并结构完整(这时直接进入后续命令)。 快速参考 - 分支命名 : ( 为三位数字; 为 kebab-case,小写字母/数字/连字符) - 统一输出位置 : - 必备子目录 : 、 、 、 、 - 初始文件 : (内容=原始需求;编码=UTF-8 with BOM) - 脚本位置 : - 脚本入口(PowerShell) : ( 直接执行,需 PowerShell 5.0+) - 脚本入口(Bash) : (命令行参数见 ;stdout 输出 JSON) - 关键副作用 :脚本执行成功后会删除传入的源文件(无论是原始文件还是临时文件)。 - 与子仓的边界 :若后续实现涉及 submodul…

\\n'/\\\\n}\"\n s=\"${s//

spec-init 概览 用于在本仓库里创建一个新的需求级 Spec Pack:自动递增三位编号、创建并切换到 分支、生成 目录结构,并把原始需求写入 (UTF-8 with BOM)。 约束:即使仓库包含 , 也只初始化 根项目 的 Spec 分支与 Spec Pack;子仓分支不在本阶段批量创建。 何时使用 / 不使用 - 使用时机 - 用户要开始一个"新需求"的 Spec(还没有 分支与 目录)。 - 用户只给了中文需求文本(不方便先手动建文件),担心参数编码导致乱码。 - 需要确保分支命名、编号来源、目录结构符合仓库约定。 - 不要用在 - 已经在一个合法的 spec 分支上,且 已存在并结构完整(这时直接进入后续命令)。 快速参考 - 分支命名 : ( 为三位数字; 为 kebab-case,小写字母/数字/连字符) - 统一输出位置 : - 必备子目录 : 、 、 、 、 - 初始文件 : (内容=原始需求;编码=UTF-8 with BOM) - 脚本位置 : - 脚本入口(PowerShell) : ( 直接执行,需 PowerShell 5.0+) - 脚本入口(Bash) : (命令行参数见 ;stdout 输出 JSON) - 关键副作用 :脚本执行成功后会删除传入的源文件(无论是原始文件还是临时文件)。 - 与子仓的边界 :若后续实现涉及 submodul…

\\r'/\\\\r}\"\n s=\"${s//

spec-init 概览 用于在本仓库里创建一个新的需求级 Spec Pack:自动递增三位编号、创建并切换到 分支、生成 目录结构,并把原始需求写入 (UTF-8 with BOM)。 约束:即使仓库包含 , 也只初始化 根项目 的 Spec 分支与 Spec Pack;子仓分支不在本阶段批量创建。 何时使用 / 不使用 - 使用时机 - 用户要开始一个"新需求"的 Spec(还没有 分支与 目录)。 - 用户只给了中文需求文本(不方便先手动建文件),担心参数编码导致乱码。 - 需要确保分支命名、编号来源、目录结构符合仓库约定。 - 不要用在 - 已经在一个合法的 spec 分支上,且 已存在并结构完整(这时直接进入后续命令)。 快速参考 - 分支命名 : ( 为三位数字; 为 kebab-case,小写字母/数字/连字符) - 统一输出位置 : - 必备子目录 : 、 、 、 、 - 初始文件 : (内容=原始需求;编码=UTF-8 with BOM) - 脚本位置 : - 脚本入口(PowerShell) : ( 直接执行,需 PowerShell 5.0+) - 脚本入口(Bash) : (命令行参数见 ;stdout 输出 JSON) - 关键副作用 :脚本执行成功后会删除传入的源文件(无论是原始文件还是临时文件)。 - 与子仓的边界 :若后续实现涉及 submodul…

\\t'/\\\\t}\"\n echo \"$s\"\n}\n\nshort_name=\"\"\nsource_file=\"\"\ntitle=\"\"\n\nwhile [[ $# -gt 0 ]]; do\n case \"$1\" in\n --short-name)\n short_name=\"${2:-}\"; shift 2;;\n --source-file|--source-file-path)\n source_file=\"${2:-}\"; shift 2;;\n --title)\n title=\"${2:-}\"; shift 2;;\n -h|--help)\n usage; exit 0;;\n *)\n die \"未知参数: $1(可用 --help 查看用法)\";;\n esac\ndone\n\n[[ -n \"$short_name\" ]] || die \"--short-name 必填\"\n[[ -n \"$source_file\" ]] || die \"--source-file 必填\"\n[[ -f \"$source_file\" ]] || die \"需求文件不存在: $source_file\"\n\nis_valid_short_name \"$short_name\" || die \"short-name 不合法(需 kebab-case,小写字母/数字/连字符): $short_name\"\n\nrequire_cmd git\nrequire_cmd head\nrequire_cmd tail\nrequire_cmd mktemp\n\nscript_dir=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nrepo_root=\"$(resolve_repo_root \"$script_dir\")\"\n\nlog \"\"\nlog \"==========================================\"\nlog \"创建 Spec 工作分支和目录\"\nlog \"==========================================\"\nlog \"短名称: $short_name\"\nlog \"仓库根目录: $repo_root\"\nlog_cyan \"当前工作目录: $(pwd)\"\nlog_cyan \"脚本根目录: $script_dir\"\nlog_yellow \"说明: spec-init 只初始化根项目 Spec Pack;若后续需求涉及子仓,子仓分支应在 I1 -> I2 之间按计划创建并校验。\"\nlog \"\"\n\nlog \"步骤 1: 查找最大编号\"\nlog \"------------------------------------------\"\nmax_number=\"$(find_max_number \"$repo_root\")\"\nnext_number=$((max_number + 1))\nformatted_number=\"$(printf \"%03d\" \"$next_number\")\"\nlog \"下一个编号: $formatted_number\"\nlog \"\"\n\nlog \"步骤 2: 创建分支\"\nlog \"------------------------------------------\"\nbranch_name=\"${formatted_number}-${short_name}\"\nensure_branch_not_exists \"$repo_root\" \"$branch_name\"\nlog \"正在创建分支: $branch_name\"\ngit_in_dir \"$repo_root\" checkout -b \"$branch_name\" 2>/dev/null || die \"创建分支失败: git checkout -b $branch_name\"\nlog \"分支创建成功: $branch_name\"\nlog \"\"\n\nlog \"步骤 3: 创建目录结构\"\nlog \"------------------------------------------\"\nspec_dir=\"$repo_root/.aisdlc/specs/$branch_name\"\n[[ -e \"$spec_dir\" ]] && die \"目录已存在: $spec_dir\"\nlog \"正在创建目录结构: $spec_dir\"\nmkdir -p \"$spec_dir\"\nmkdir -p \"$spec_dir/requirements\" \"$spec_dir/design\" \"$spec_dir/implementation\" \"$spec_dir/verification\" \"$spec_dir/release\"\nlog \"目录结构创建成功\"\nlog \"\"\n\nlog \"步骤 4: 写入原始需求\"\nlog \"------------------------------------------\"\nraw_file=\"$spec_dir/requirements/raw.md\"\nlog \"正在写入原始需求到: $raw_file\"\nwrite_raw_requirement_utf8_bom \"$source_file\" \"$raw_file\"\nlog \"原始需求已写入\"\nlog \"\"\n\nlog \"步骤 5: 删除原始文件\"\nlog \"------------------------------------------\"\nlog \"正在删除原始文件: $source_file\"\nrm -f \"$source_file\"\nlog \"原始文件已删除\"\nlog \"\"\n\nlog \"==========================================\"\nlog \"完成!\"\nlog \"==========================================\"\n\n# 输出环境变量(供其他脚本解析)\necho \"REPO_ROOT=$repo_root\"\necho \"CURRENT_BRANCH=$branch_name\"\necho \"FEATURE_DIR=$spec_dir\"\necho \"SPEC_NUMBER=$formatted_number\"\necho \"SHORT_NAME=$short_name\"\necho \"\"\n\n# 输出 JSON(供结构化解析)\nesc_title=\"$(json_escape \"$title\")\"\nprintf '{'\nprintf '\"number\":\"%s\",' \"$(json_escape \"$formatted_number\")\"\nprintf '\"shortName\":\"%s\",' \"$(json_escape \"$short_name\")\"\nprintf '\"branchName\":\"%s\",' \"$(json_escape \"$branch_name\")\"\nprintf '\"specDir\":\"%s\",' \"$(json_escape \"$spec_dir\")\"\nprintf '\"title\":\"%s\"' \"$esc_title\"\nprintf '}\\n'\n\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":9142,"content_sha256":"5f7a5b9fd5a5d632ef24234c5919d713c3a60dff04f8eefc8147273fafef0612"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"spec-init","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"概览","type":"text"}]},{"type":"paragraph","content":[{"text":"spec-init","type":"text","marks":[{"type":"code_inline"}]},{"text":" 用于在本仓库里创建一个新的需求级 Spec Pack:自动递增三位编号、创建并切换到 ","type":"text"},{"text":"{num}-{short-name}","type":"text","marks":[{"type":"code_inline"}]},{"text":" 分支、生成 ","type":"text"},{"text":".aisdlc/specs/{num}-{short-name}/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 目录结构,并把原始需求写入 ","type":"text"},{"text":"requirements/raw.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"(UTF-8 with BOM)。","type":"text"}]},{"type":"paragraph","content":[{"text":"约束:即使仓库包含 ","type":"text"},{"text":".gitmodules","type":"text","marks":[{"type":"code_inline"}]},{"text":",","type":"text"},{"text":"spec-init","type":"text","marks":[{"type":"code_inline"}]},{"text":" 也只初始化","type":"text"},{"text":"根项目","type":"text","marks":[{"type":"strong"}]},{"text":"的 Spec 分支与 Spec Pack;子仓分支不在本阶段批量创建。","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","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户要开始一个\"新需求\"的 Spec(还没有 ","type":"text"},{"text":"{num}-{short-name}","type":"text","marks":[{"type":"code_inline"}]},{"text":" 分支与 ","type":"text"},{"text":".aisdlc/specs/...","type":"text","marks":[{"type":"code_inline"}]},{"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","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"已经在一个合法的 ","type":"text"},{"text":"{num}-{short-name}","type":"text","marks":[{"type":"code_inline"}]},{"text":" spec 分支上,且 ","type":"text"},{"text":".aisdlc/specs/{num}-{short-name}/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 已存在并结构完整(这时直接进入后续命令)。","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","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"{num}-{short-name}","type":"text","marks":[{"type":"code_inline"}]},{"text":"(","type":"text"},{"text":"num","type":"text","marks":[{"type":"code_inline"}]},{"text":" 为三位数字;","type":"text"},{"text":"short-name","type":"text","marks":[{"type":"code_inline"}]},{"text":" 为 kebab-case,小写字母/数字/连字符)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"统一输出位置","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":".aisdlc/specs/{num}-{short-name}/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"必备子目录","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"requirements/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"design/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"implementation/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"verification/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"release/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"初始文件","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"requirements/raw.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"(内容=原始需求;编码=UTF-8 with BOM)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"脚本位置","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"\u003c本SKILL.md目录>/scripts/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"脚本入口(PowerShell)","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"spec-create-branch.ps1","type":"text","marks":[{"type":"code_inline"}]},{"text":"(","type":"text"},{"text":"-File","type":"text","marks":[{"type":"code_inline"}]},{"text":" 直接执行,需 PowerShell 5.0+)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"脚本入口(Bash)","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"spec-create-branch.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":"(命令行参数见 ","type":"text"},{"text":"--help","type":"text","marks":[{"type":"code_inline"}]},{"text":";stdout 输出 JSON)","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":":若后续实现涉及 submodule,原则上由实现计划在 ","type":"text"},{"text":"I1 -> I2","type":"text","marks":[{"type":"code_inline"}]},{"text":" 之间创建并校验与根项目同名的 Spec 分支","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"实施步骤(Agent 行为规范)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1) 解析用户输入 → 一律落到文件路径","type":"text"}]},{"type":"paragraph","content":[{"text":"强制规则:始终以文件路径方式传入需求内容","type":"text","marks":[{"type":"strong"}]},{"text":"(避免中文内容在参数传递/编码上出问题)。","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"输入是文件路径","type":"text","marks":[{"type":"strong"}]},{"text":":直接用该路径作为 ","type":"text"},{"text":"$sourceFilePath","type":"text","marks":[{"type":"code_inline"}]},{"text":"(但要提示\"会被删除\")。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"输入是文本","type":"text","marks":[{"type":"strong"}]},{"text":":用 Agent 的 ","type":"text"},{"text":"Write 工具","type":"text","marks":[{"type":"strong"}]},{"text":" 将文本直接写入仓库根目录下的临时文件 ","type":"text"},{"text":"_sdlc-raw-temp.md","type":"text","marks":[{"type":"code_inline"}]},{"text":",然后用该路径作为 ","type":"text"},{"text":"$sourceFilePath","type":"text","marks":[{"type":"code_inline"}]},{"text":"。","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"无需担心残留","type":"text","marks":[{"type":"strong"}]},{"text":":脚本执行成功后会自动删除该源文件。","type":"text"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"示例(Agent 操作):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"1. Write 工具 → 路径: {REPO_ROOT}/_sdlc-raw-temp.md,内容: 用户提供的原始需求文本\n2. 将 {REPO_ROOT}/_sdlc-raw-temp.md 作为 $sourceFilePath / --source-file 传入脚本","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2) 生成 ","type":"text"},{"text":"short-name","type":"text","marks":[{"type":"code_inline"}]},{"text":"(2-4 词,kebab-case)","type":"text"}]},{"type":"paragraph","content":[{"text":"从原始需求提炼 2-4 个词的短名称,优先\"动词-名词\",保留常见技术缩写(如 ","type":"text"},{"text":"oauth2","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"jwt","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"api","type":"text","marks":[{"type":"code_inline"}]},{"text":"):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"示例:批量导出订单 + 异步任务 → ","type":"text"},{"text":"export-orders-batch","type":"text","marks":[{"type":"code_inline"}]},{"text":" 或 ","type":"text"},{"text":"add-order-export","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若不确定,宁可更通用、更短:","type":"text"},{"text":"export-orders","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3) 调用脚本创建分支与 Spec Pack","type":"text"}]},{"type":"paragraph","content":[{"text":"按操作系统自动选择脚本实现(不要硬跑\"另一种\")。","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Windows / PowerShell:用 ","type":"text"},{"text":"powershell -NoProfile -ExecutionPolicy Bypass -File \"\u003c脚本路径>\" ...","type":"text","marks":[{"type":"code_inline"}]},{"text":" 调用","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"macOS/Linux / Bash:直接执行 ","type":"text"},{"text":"spec-create-branch.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":"(stdout 输出 JSON)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"执行参数(只填参数即可)","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"PowerShell(","type":"text"},{"text":"Main","type":"text","marks":[{"type":"code_inline"}]},{"text":"):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"-ShortName \u003ckebab-case>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"-SourceFilePath \u003c需求文件路径>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"-Title \u003c可选>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"调用形态:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"powershell"},"content":[{"text":"powershell -NoProfile -ExecutionPolicy Bypass -File \"\u003c本SKILL.md目录>/scripts/spec-create-branch.ps1\" -ShortName \"\u003ckebab-case>\" -SourceFilePath \"\u003c需求文件路径>\" [-Title \"\u003c标题>\"]","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Bash(","type":"text"},{"text":"spec-create-branch.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":"):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--short-name \u003ckebab-case>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--source-file \u003c需求文件路径>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--title \u003c可选>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"调用形态:","type":"text"},{"text":"spec-create-branch.sh --short-name \u003c...> --source-file \u003c...> [--title \u003c...>]","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]}]},{"type":"paragraph","content":[{"text":"脚本职责边界:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若当前目录位于 submodule 内,脚本应先回溯到根项目,再在根项目创建 Spec 分支与 ","type":"text"},{"text":".aisdlc/specs/...","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不在此阶段创建 submodule 分支,也不生成额外的 repo 清单文件","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4) 验收(DoD)","type":"text"}]},{"type":"paragraph","content":[{"text":"检查以下事实是否同时成立(缺一不可):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"当前分支名(","type":"text"},{"text":"git branch --show-current","type":"text","marks":[{"type":"code_inline"}]},{"text":")符合 ","type":"text"},{"text":"{num}-{short-name}","type":"text","marks":[{"type":"code_inline"}]},{"text":"。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":".aisdlc/specs/\u003cbranchName>/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 存在,且包含 5 个必需子目录(","type":"text"},{"text":"requirements/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"design/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"implementation/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"verification/","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"release/","type":"text","marks":[{"type":"code_inline"}]},{"text":")。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":".aisdlc/specs/\u003cbranchName>/requirements/raw.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" 存在,内容等于原始需求(注意文件头有 UTF-8 BOM)。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"传入的源文件已被删除(这不是 bug;若用户需要保留,应在步骤 1 之前自行备份)。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若仓库包含 ","type":"text"},{"text":".gitmodules","type":"text","marks":[{"type":"code_inline"}]},{"text":":本阶段不要求任何子仓已创建分支;后续应由 I1/I2 门禁处理","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"5) 完成后:立即交回 ","type":"text"},{"text":"using-aisdlc","type":"text","marks":[{"type":"code_inline"}]},{"text":" 继续自动推进","type":"text"}]},{"type":"paragraph","content":[{"text":"spec-init","type":"text","marks":[{"type":"code_inline"}]},{"text":" 的 DoD 通过后,本技能不做\"下一步分流\"判定(避免出现第二个路由源)。统一做法:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"输出 ","type":"text"},{"text":"ROUTER_SUMMARY","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"},{"text":"using-aisdlc","type":"text","marks":[{"type":"code_inline"}]},{"text":" 路由下一步(Router 默认自动续跑;进入 R1:","type":"text"},{"text":"spec-product-clarify","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"完成后输出与自动路由(必须执行)","type":"text"}]},{"type":"paragraph","content":[{"text":"Spec Pack 初始化完成后(无论成功或失败),","type":"text"},{"text":"必须","type":"text","marks":[{"type":"strong"}]},{"text":"完成以下动作(按顺序,不可省略):","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"输出 ROUTER_SUMMARY","type":"text","marks":[{"type":"strong"}]},{"text":"(YAML 形态,供 Router 决策;按实际结果填写):","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"创建成功时:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"yaml"},"content":[{"text":"ROUTER_SUMMARY:\n stage: R0\n artifacts:\n - \"{FEATURE_DIR}/requirements/raw.md\"\n needs_human_review: false\n blocked: false\n block_reason: \"\"\n notes: \"Spec Pack 已初始化完成;建议 Router 进入 R1(spec-product-clarify)\"","type":"text"}]},{"type":"paragraph","content":[{"text":"任一 DoD 未满足并停止时:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"yaml"},"content":[{"text":"ROUTER_SUMMARY:\n stage: R0\n artifacts: []\n needs_human_review: true\n blocked: true\n block_reason: \"\u003c填写失败点与最小修复动作>\"\n notes: \"未完成初始化,需先修复再继续\"","type":"text"}]},{"type":"ordered_list","attrs":{"order":2,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"立即执行 ","type":"text","marks":[{"type":"strong"}]},{"text":"using-aisdlc","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":":将上述 ","type":"text"},{"text":"ROUTER_SUMMARY","type":"text","marks":[{"type":"code_inline"}]},{"text":" 作为路由输入传递给 using-aisdlc,由 Router 判定下一步并","type":"text"},{"text":"自动推进","type":"text","marks":[{"type":"strong"}]},{"text":"(无需等待用户说「继续」)。","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若 Router 判定可自动续跑:在同一轮对话内继续执行下一步 worker skill(如 R1 等)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若 Router 触发硬中断:停下并输出阻断原因、需要的输入、候选下一步","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"对话输出","type":"text","marks":[{"type":"strong"}]},{"text":":在调用 using-aisdlc 前,可简短说明「本阶段产物已落盘,正在调用 using-aisdlc 路由下一步。」","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","marks":[{"type":"strong"}]},{"text":":不要用 ","type":"text"},{"text":"spec/\u003cslug>","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"feature/\u003cslug>","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"features/\u003cslug>","type":"text","marks":[{"type":"code_inline"}]},{"text":";本仓库规范是 ","type":"text"},{"text":"{num}-{short-name}","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":".aisdlc/specs/...","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"},{"text":"SourceFilePath","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"},{"text":"--","type":"text","marks":[{"type":"code_inline"}]},{"text":";尽量 2-4 词。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"把 submodule 当作 Spec 根目录","type":"text","marks":[{"type":"strong"}]},{"text":":即使从子仓目录触发,也必须回到根项目创建 ","type":"text"},{"text":".aisdlc/specs/...","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"spec-init","author":"@skillopedia","source":{"stars":8,"repo_name":"aisdlc","origin_url":"https://github.com/zixun-github/aisdlc/blob/HEAD/skills/spec-init/SKILL.md","repo_owner":"zixun-github","body_sha256":"342b40f43119c4c193b65a5524ff02b0cbe4782c0f7efd7375bf66f95c570ca9","cluster_key":"8eb9ff1b06b313f16a15cf5582afc06072090e70317801d543c63d5e2e9d009c","clean_bundle":{"format":"clean-skill-bundle-v1","source":"zixun-github/aisdlc/skills/spec-init/SKILL.md","attachments":[{"id":"ef2ac721-fe60-537d-8553-8c1977a08b3c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ef2ac721-fe60-537d-8553-8c1977a08b3c/attachment.ps1","path":"scripts/spec-create-branch.ps1","size":11702,"sha256":"80882ead4712077cbfe6499e445843cf0fada79f35941c1bd745c48ea8b1cf38","contentType":"text/plain; charset=utf-8"},{"id":"3666c35f-735d-5733-803d-457efb791f7c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3666c35f-735d-5733-803d-457efb791f7c/attachment.sh","path":"scripts/spec-create-branch.sh","size":9142,"sha256":"5f7a5b9fd5a5d632ef24234c5919d713c3a60dff04f8eefc8147273fafef0612","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"e46412c27d22b1ed3ab2beaf67280bc0509d0b1a2bb06b55a3c3bee221aaf1e6","attachment_count":2,"text_attachments":1,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":1,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/spec-init/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"integrations-apis","category_label":"Integrations"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"integrations-apis","import_tag":"clean-skills-v1","description":"Use when 需要在本仓库的 AI SDLC 流程中初始化新的 Spec Pack(创建三位编号分支与 `.aisdlc/specs/{num}-{short-name}` 目录),或在执行 `spec-init` 时不确定输入解析、短名称规则、UTF-8 BOM 文件路径传参、脚本调用方式与输出物。"}},"renderedAt":1782980674404}

spec-init 概览 用于在本仓库里创建一个新的需求级 Spec Pack:自动递增三位编号、创建并切换到 分支、生成 目录结构,并把原始需求写入 (UTF-8 with BOM)。 约束:即使仓库包含 , 也只初始化 根项目 的 Spec 分支与 Spec Pack;子仓分支不在本阶段批量创建。 何时使用 / 不使用 - 使用时机 - 用户要开始一个"新需求"的 Spec(还没有 分支与 目录)。 - 用户只给了中文需求文本(不方便先手动建文件),担心参数编码导致乱码。 - 需要确保分支命名、编号来源、目录结构符合仓库约定。 - 不要用在 - 已经在一个合法的 spec 分支上,且 已存在并结构完整(这时直接进入后续命令)。 快速参考 - 分支命名 : ( 为三位数字; 为 kebab-case,小写字母/数字/连字符) - 统一输出位置 : - 必备子目录 : 、 、 、 、 - 初始文件 : (内容=原始需求;编码=UTF-8 with BOM) - 脚本位置 : - 脚本入口(PowerShell) : ( 直接执行,需 PowerShell 5.0+) - 脚本入口(Bash) : (命令行参数见 ;stdout 输出 JSON) - 关键副作用 :脚本执行成功后会删除传入的源文件(无论是原始文件还是临时文件)。 - 与子仓的边界 :若后续实现涉及 submodul…