Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '代码语义搜索模块(支持函数/类/导入/文档搜索)'\n - pattern: 'qa\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '智能问答模块(意图分类 + 结构化回答生成)'\n - pattern: 'query\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '查询构建器(生成结构化查询语句)'\n - pattern: 'parser\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '解析器(文本/代码/数据解析)'\n - pattern: 'analyzer\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '分析器(代码/数据/性能分析)'\n - pattern: 'architecture\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '架构分析器(目录结构/模块划分/设计模式检测)'\n - pattern: 'quality\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '代码质量分析器(注释覆盖率/技术债务/潜在问题检测)'\n - pattern: 'utils\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '通用工具函数库'\n - pattern: 'helpers\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '辅助函数(特定场景的便捷方法)'\n - pattern: 'common\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '公共模块(共享常量和函数)'\n - pattern: 'config\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '配置管理模块(加载/解析/验证配置)'\n - pattern: 'models\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '数据模型定义(ORM/Schema/Entity)'\n - pattern: 'types\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '类型定义(Type Hints/Interfaces)'\n - pattern: 'constants\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '常量定义(枚举/配置值/魔法数字)'\n - pattern: 'schemas\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '数据 Schema 定义(验证规则/序列化)'\n - pattern: 'exceptions\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '自定义异常类(错误码/错误消息)'\n - pattern: 'validators\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '数据验证器(输入校验/格式检查)'\n - pattern: 'converters?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '数据转换器(格式转换/编码转换)'\n - pattern: 'formatters?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '格式化器(输出美化/模板渲染)'\n - pattern: 'renderers?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '渲染器(HTML/PDF/图片生成)'\n - pattern: 'generators?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '生成器(代码/文档/数据生成)'\n - pattern: 'extractors?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '提取器(从文本/网页/文件提取信息)'\n - pattern: 'transformers?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '数据转换管道(ETL/清洗/标准化)'\n - pattern: 'loaders?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '加载器(文件/网络/数据库加载)'\n - pattern: 'savers?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '保存器(持久化/导出/备份)'\n - pattern: 'storage\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '存储层抽象(本地/云存储/缓存)'\n - pattern: 'handlers?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '事件处理器(HTTP/WebSocket/信号处理)'\n - pattern: 'managers?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '资源管理器(生命周期/连接池/状态)'\n - pattern: 'services?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '业务服务层(核心业务逻辑)'\n - pattern: 'processors?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '数据处理器(批处理/流处理/异步处理)'\n - pattern: 'clients?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: 'API 客户端(HTTP/RPC/GraphQL)'\n - pattern: 'servers?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '服务端实现(路由/中间件/错误处理)'\n - pattern: 'api\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: 'API 接口定义(端点/参数/响应)'\n - pattern: 'routes?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '路由配置(URL 映射/参数提取)'\n - pattern: 'views?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '视图层(页面渲染/模板上下文)'\n - pattern: 'controllers?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '控制器(请求处理/响应封装)'\n - pattern: 'middleware\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '中间件(请求/响应拦截器)'\n - pattern: 'auth\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '认证模块(登录/登出/Token 管理)'\n - pattern: 'permissions?\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '权限控制(角色/资源/操作检查)'\n - pattern: 'security\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '安全模块(加密/签名/防护)'\n - pattern: 'database\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '数据库连接管理(连接池/事务/会话)'\n - pattern: 'db\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '数据库操作层(CRUD/查询构建)'\n - pattern: 'cache\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '缓存层(Redis/Memcached/内存缓存)'\n - pattern: 'repository\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '仓储层(数据访问抽象)'\n - pattern: 'logger\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '日志模块(格式化/分级/输出)'\n - pattern: 'monitoring\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '监控模块(指标收集/告警)'\n - pattern: 'metrics\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '指标定义(计数器/仪表/直方图)'\n - pattern: 'test.*\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '单元测试/集成测试'\n - pattern: 'conftest\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: 'Pytest 配置与 Fixtures'\n - pattern: 'mock.*\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: 'Mock 对象与测试替身'\n - pattern: '\\.tsx?

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: 'TypeScript/React 前端组件'\n - pattern: '\\.vue

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: 'Vue.js 组件(模板/脚本/样式)'\n - pattern: '\\.svelte

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: 'Svelte 组件(编译时优化)'\n - pattern: '__init__\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: 'Python 模块初始化(导出/版本)'\n - pattern: '__main__\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '命令行入口(python -m module)'\n - pattern: 'SKILL\\.md

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: 'Claude Code 技能定义文件'\n - pattern: 'CHANGELOG\\.md

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '版本变更日志'\n - pattern: 'README\\.md

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

\n description: '项目说明文档'\n\nmessage_templates:\n deps:\n patterns:\n - pattern: 'package\\.json'\n message: '更新 JavaScript 依赖'\n - pattern: 'requirements\\.txt'\n message: '更新 Python 依赖'\n - pattern: 'go\\.(mod|sum)'\n message: '更新 Go 依赖'\n - pattern: 'Gemfile'\n message: '更新 Ruby 依赖'\n - pattern: 'Cargo\\.toml'\n message: '更新 Rust 依赖'\n - pattern: 'pyproject\\.toml'\n message: '更新 Python 项目配置'\n default: '更新依赖'\n docs:\n patterns:\n - pattern: 'README'\n message: '更新 README 文档'\n - pattern: 'CHANGELOG'\n message: '更新变更日志'\n - pattern: 'CONTRIBUTING'\n message: '更新贡献指南'\n - pattern: 'ARCHITECTURE'\n message: '更新架构文档'\n - pattern: 'AGENTS\\.md'\n message: '更新协作规范文档'\n - pattern: 'SKILL-GUIDE\\.md'\n message: '更新 Skill 开发指南'\n - pattern: 'skills/([^/]+)/SKILL\\.md'\n message: '添加 \\1 技能文档'\n default: '更新文档'\n license:\n default: '更新许可证文件'\n config:\n patterns:\n - pattern: '\\.env\\.example'\n message: '更新环境变量示例'\n - pattern: '\\.yaml|\\.yml'\n message: '更新 YAML 配置'\n - pattern: 'toml'\n message: '更新 TOML 配置'\n default: '更新配置'\n test:\n default: '更新测试'\n chore:\n patterns:\n - pattern: '\\.gitignore'\n message: '更新 gitignore 忽略规则'\n - pattern: 'Dockerfile'\n message: '更新 Docker 配置'\n - pattern: '\\.github/'\n message: '更新 GitHub 工作流'\n - pattern: 'Makefile'\n message: '更新 Makefile'\n default: '更新工具配置'\n feat:\n patterns:\n - pattern: 'scripts/([^/]+)'\n message: '添加 \\1 脚本'\n - pattern: 'test/([^/]+)'\n message: '添加 \\1 测试'\n default: '添加新功能'\n fix:\n default: '修复 Bug'\n refactor:\n default: '重构代码'\n style:\n default: '调整代码风格'\n\nfunction_prefix_actions:\n detect_: '检测'\n analyze_: '分析'\n parse_: '解析'\n extract_: '提取'\n identify_: '识别'\n infer_: '推断'\n generate_: '生成'\n create_: '创建'\n build_: '构建'\n make_: '制作'\n process_: '处理'\n convert_: '转换'\n transform_: '转换'\n handle_: '处理'\n format_: '格式化'\n get_: '获取'\n fetch_: '获取'\n load_: '加载'\n read_: '读取'\n update_: '更新'\n modify_: '修改'\n edit_: '编辑'\n delete_: '删除'\n remove_: '移除'\n validate_: '验证'\n check_: '检查'\n verify_: '验证'\n is_: '验证'\n optimize_: '优化'\n improve_: '改进'\n enhance_: '增强'\n fix_: '修复'\n\nconfig_key_meanings:\n space_before: '段前间距'\n space_after: '段后间距'\n margin: '边距'\n padding: '内边距'\n gap: '间隙'\n line_height: '行高'\n spacing: '间距'\n font: '字体'\n font_size: '字号'\n font_family: '字体族'\n bold: '加粗'\n italic: '斜体'\n size: '尺寸'\n align: '对齐方式'\n indent: '缩进'\n color: '颜色'\n background: '背景色'\n fill: '填充色'\n width: '宽度'\n height: '高度'\n layout: '布局'\n content: '内容'\n text: '文本'\n title: '标题'\n value: '值'\n","content_type":"application/yaml; charset=utf-8","language":"yaml","size":8616,"content_sha256":"7accdc53925c7273ad82c9001828c155b3e7021e9fa752802318032de16df90e"},{"filename":"references/subtree-push-check.md","content":"# Subtree 推送检查(工作流第6步)\n\n> **核心规则:仅当项目目录下存在 `skills/subtree-publish/config/subtree-skills.json` 时才执行——不存在则静默跳过,不输出任何提示。**\n\n完成 Git 提交后,检查本次提交是否涉及已注册的 subtree 子项目。\n\n## 触发条件\n\n1. **配置文件存在**\n - 检查 `skills/subtree-publish/config/subtree-skills.json` 是否存在\n - **不存在则静默跳过,不提示用户**\n\n2. **提交涉及已注册的子目录**\n - 读取 `skills/subtree-publish/config/subtree-skills.json` 中的 `prefix` 和 `skills` 列表\n - 获取本次提交涉及的文件列表(`git diff --name-only HEAD~1 HEAD`,或批量提交时使用最后一次 commit)\n - 检查是否有文件路径以 `\u003cprefix>/\u003cskill-name>/` 开头\n - 如果命中,收集所有命中的 skill 名称\n\n3. **remote 已配置**\n - 检查是否存在对应的 `\u003cname>-standalone` remote\n - 如果 remote 不存在,说明该子项目尚未完成首次注册,跳过\n\n## 提示与执行\n\n满足触发条件时,向用户提示:\n\n```\n本次提交涉及已注册的 subtree 子项目:\u003cname1>, \u003cname2>\n是否推送到独立仓库?\n\n选项:\n y - 推送所有命中的子项目\n n - 跳过,暂不推送\n s - 选择性推送\n```\n\n用户选择 `y` 时,对每个命中的子项目执行:\n\n```bash\ngit subtree push --prefix=\u003cprefix>/\u003cname> \u003cname>-standalone main\n```\n\n用户选择 `s` 时,逐个询问是否推送。\n\n## 失败处理\n\n- 推送失败时仅显示警告信息\n- 不影响 Git 提交结果\n- 继续处理其他子项目\n\n## 示例场景\n\n| 场景 | 配置文件 | 提交涉及子目录 | remote 存在 | 结果 |\n|------|----------|---------------|-------------|------|\n| 正常推送 | 存在 | 是 | 是 | ✅ 提示用户推送 |\n| 未涉及子目录 | 存在 | 否 | - | ❌ 静默跳过 |\n| 配置文件不存在 | 不存在 | - | - | ❌ 静默跳过 |\n| 首次注册未完成 | 存在 | 是 | 否 | ❌ 跳过(提示用户先完成首次注册) |\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":2057,"content_sha256":"079920c2e0a91449649d368cd7ee74661b11e4627b866ed816e61a5f8045a94e"},{"filename":"scripts/categorize_changes.py","content":"#!/usr/bin/env python3\n\"\"\"\nCategorize Git changes by type for batch committing.\n\nAnalyzes git diff to group modifications by logical categories:\n- deps: Dependency management (package.json, requirements.txt, go.mod, etc.)\n- docs: Documentation changes\n- license: LICENSE file updates\n- config: Configuration files\n- test: Test files\n- chore: Build scripts, tooling\n- feat: New features in source code\n- fix: Bug fixes in source code\n- refactor: Code refactoring\n- style: Code style changes\n\"\"\"\n\nimport subprocess\nimport json\nimport os\nimport re\nfrom pathlib import Path\nfrom typing import Dict, List, Tuple\n\n\n# File pattern to category mapping\nFILE_PATTERNS = {\n 'deps': [\n r'package\\.json',\n r'package-lock\\.json',\n r'yarn\\.lock',\n r'pnpm-lock\\.yaml',\n r'requirements\\.txt',\n r'poetry\\.lock',\n r'Pipfile',\n r'pyproject\\.toml',\n r'go\\.mod',\n r'go\\.sum',\n r'Gemfile',\n r'Gemfile\\.lock',\n r'Cargo\\.toml',\n r'Cargo\\.lock',\n r'composer\\.json',\n r'composer\\.lock',\n r'\\.gradle',\n ],\n 'license': [\n r'LICENSE',\n r'LICENSE\\.txt',\n r'LICENSE\\.md',\n r'COPYING',\n ],\n 'docs': [\n r'\\.md

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.rst

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.txt

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'docs/.*',\n r'DOC.*',\n r'README.*',\n r'CHANGELOG.*',\n r'CONTRIBUTING.*',\n ],\n 'config': [\n r'\\.env\\.',\n r'\\.conf',\n r'\\.config',\n r'\\.yaml

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.yml

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.toml

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.json

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.xml

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.ini

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'config/.*',\n ],\n 'test': [\n r'test_.*\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'.*_test\\.go

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'.*\\.test\\.ts

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'.*\\.test\\.js

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'.*\\.spec\\.ts

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'.*\\.spec\\.js

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'tests?/.*',\n r'__tests?__/.*',\n r'test/.*',\n ],\n 'chore': [\n r'Makefile',\n r'Dockerfile',\n r'\\.dockerignore',\n r'\\.gitignore',\n r'\\.gitattributes',\n r'\\.github/.*',\n r'\\.gitlab-ci\\.yml',\n r'\\travis\\.yml',\n r'jenkinsfile',\n r'\\.editorconfig',\n ],\n}\n\n# Skill core files that should be treated as code, not docs\n# These define behavior/functionality, not just documentation\nSKILL_CORE_FILES = [\n r'SKILL\\.md

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, # Skill definition file (defines behavior)\n r'skills/.*/SKILL\\.md

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, # Skill files in skills directory\n]\n\n# Files that should ALWAYS be categorized separately, even inside skills/\n# These are cross-cutting concerns that apply to the whole project\nALWAYS_SEPARATE_CATEGORIES = {\n 'license': [\n r'LICENSE',\n r'LICENSE\\.txt',\n r'LICENSE\\.md',\n r'COPYING',\n ],\n}\n\n# Source code extensions\nSOURCE_EXTENSIONS = [\n r'\\.py

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.js

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.ts

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.tsx

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.jsx

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.go

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.rs

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.java

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.kt

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.swift

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.c

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.cpp

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.h

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.hpp

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n r'\\.cs

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.php

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.rb

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

, r'\\.scala

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…

,\n]\n\n\ndef get_staged_files() -> List[str]:\n \"\"\"Get list of staged files using git diff --cached --name-only.\"\"\"\n result = subprocess.run(\n ['git', 'diff', '--cached', '--name-only'],\n capture_output=True,\n text=True,\n check=True\n )\n files = result.stdout.strip().split('\\n')\n return [f for f in files if f]\n\n\ndef get_unstaged_files() -> List[str]:\n \"\"\"Get list of unstaged modified files using git diff --name-only.\"\"\"\n result = subprocess.run(\n ['git', 'diff', '--name-only'],\n capture_output=True,\n text=True,\n check=True\n )\n files = result.stdout.strip().split('\\n')\n return [f for f in files if f]\n\n\ndef categorize_file(filepath: str) -> str:\n \"\"\"Categorize a file based on its path and patterns.\"\"\"\n # Special handling for skill core files\n # SKILL.md defines behavior/functionality, should be treated as code, not docs\n for pattern in SKILL_CORE_FILES:\n if re.search(pattern, filepath):\n return 'code'\n\n # Check each category's patterns\n for category, patterns in FILE_PATTERNS.items():\n for pattern in patterns:\n if re.search(pattern, filepath):\n return category\n\n # Check if it's a source file\n for ext_pattern in SOURCE_EXTENSIONS:\n if re.search(ext_pattern, filepath):\n return 'code'\n\n # Default to 'other'\n return 'other'\n\n\ndef detect_code_change_type(filepath: str) -> str:\n \"\"\"\n Detect if a source code change is feat, fix, refactor, or style.\n This analyzes the git diff content.\n \"\"\"\n try:\n result = subprocess.run(\n ['git', 'diff', '--cached', filepath],\n capture_output=True,\n text=True,\n check=True\n )\n diff_content = result.stdout\n\n # Simple heuristic based on diff patterns\n added_lines = len([l for l in diff_content.split('\\n') if l.startswith('+')])\n removed_lines = len([l for l in diff_content.split('\\n') if l.startswith('-')])\n\n # IMPORTANT: Check for fix-related keywords FIRST\n # Even if adding new functions, fix keywords indicate a bug fix\n # English + Chinese fix keywords\n fix_keywords = ['fix', 'bug', 'issue', 'error', 'patch', 'hotfix',\n '修复', '错误', '问题', '补丁']\n if any(keyword in diff_content.lower() for keyword in fix_keywords):\n return 'fix'\n\n # Check for new function definitions (strong indicator of new feature)\n # Match patterns like: +def function_name(\n new_func_pattern = r'^\\+def\\s+\\w+'\n new_funcs = re.findall(new_func_pattern, diff_content, re.MULTILINE)\n if new_funcs:\n return 'feat'\n\n # Check for feature-related keywords (English + Chinese)\n feat_keywords = ['add', 'new', 'implement', 'feature', 'support',\n '添加', '新增', '实现', '功能', '支持', '增加']\n if any(keyword in diff_content.lower() for keyword in feat_keywords):\n return 'feat'\n\n # Based on line changes\n if added_lines > removed_lines * 1.5:\n return 'feat'\n elif removed_lines > added_lines * 1.5:\n return 'refactor'\n else:\n return 'style'\n\n except Exception:\n return 'style'\n\n\ndef extract_skill_name(filepath: str) -> str:\n \"\"\"\n Extract skill name from a file path if it's under skills/ directory.\n\n Returns skill name if found, None otherwise.\n \"\"\"\n match = re.match(r'skills/([^/]+)/', filepath)\n if match:\n return match.group(1)\n return None\n\n\ndef check_always_separate(filepath: str) -> str:\n \"\"\"\n Check if file should always be categorized separately, even inside skills/.\n\n Returns the category if matched, None otherwise.\n \"\"\"\n for category, patterns in ALWAYS_SEPARATE_CATEGORIES.items():\n for pattern in patterns:\n if re.search(pattern, filepath):\n return category\n return None\n\n\ndef group_changes(files: List[str], staged: bool = True) -> Dict[str, List[str]]:\n \"\"\"\n Group files by category.\n\n Special handling for skill directories: all files under the same skill\n directory are grouped together as they represent a single logical change.\n\n IMPORTANT: Some files (like LICENSE) are ALWAYS categorized separately,\n even if they are inside a skill directory. This ensures that cross-cutting\n concerns like licensing changes get their own focused commits.\n\n Args:\n files: List of file paths\n staged: Whether files are staged (True) or unstaged (False)\n\n Returns:\n Dictionary mapping category to list of files\n \"\"\"\n groups = {}\n skill_groups = {} # Temporary storage for skill-based grouping\n\n # First pass: separate skill files from others\n for filepath in files:\n # Check if file should ALWAYS be separate (e.g., LICENSE)\n separate_category = check_always_separate(filepath)\n if separate_category:\n if separate_category not in groups:\n groups[separate_category] = []\n groups[separate_category].append(filepath)\n continue\n\n skill_name = extract_skill_name(filepath)\n if skill_name:\n if skill_name not in skill_groups:\n skill_groups[skill_name] = []\n skill_groups[skill_name].append(filepath)\n else:\n # Non-skill files: categorize normally\n category = categorize_file(filepath)\n\n # For source code, further categorize\n if category == 'code' and staged:\n subcategory = detect_code_change_type(filepath)\n category = subcategory\n\n if category not in groups:\n groups[category] = []\n groups[category].append(filepath)\n\n # Second pass: process skill groups\n for skill_name, skill_files in skill_groups.items():\n # Determine the change type based on the most significant change\n # If any file has 'feat' keywords, use 'feat'\n # Else if any file has 'fix' keywords, use 'fix'\n # Else use 'style'\n change_type = 'style'\n\n for filepath in skill_files:\n if staged:\n file_type = detect_code_change_type(filepath)\n if file_type == 'feat':\n change_type = 'feat'\n break\n elif file_type == 'fix' and change_type != 'feat':\n change_type = 'fix'\n\n # Use skill:\u003cname> as the category key\n category_key = f'skill:{skill_name}:{change_type}'\n groups[category_key] = skill_files\n\n return groups\n\n\ndef main():\n \"\"\"Main entry point for command-line usage.\"\"\"\n import argparse\n\n parser = argparse.ArgumentParser(\n description='Categorize Git changes for batch committing'\n )\n parser.add_argument(\n '--unstaged',\n action='store_true',\n help='Analyze unstaged changes instead of staged'\n )\n parser.add_argument(\n '--json',\n action='store_true',\n help='Output as JSON'\n )\n\n args = parser.parse_args()\n\n # Get files\n if args.unstaged:\n files = get_unstaged_files()\n else:\n files = get_staged_files()\n\n if not files:\n print(\"No changes found.\")\n return\n\n # Group files\n groups = group_changes(files, staged=not args.unstaged)\n\n if args.json:\n print(json.dumps(groups, indent=2))\n else:\n print(\"Categorized changes:\")\n print(\"-\" * 40)\n for category, file_list in sorted(groups.items()):\n print(f\"\\n{category.upper()}:\")\n for f in file_list:\n print(f\" - {f}\")\n\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":10777,"content_sha256":"88a8143d190f7eae2b19ace529dc0290c971c755942210e993043eb7fad65661"},{"filename":"scripts/generate_commit_message.py","content":"#!/usr/bin/env python3\n\"\"\"\nGenerate conventional commit messages based on change type and content.\n\n使用小写英文前缀 + 中文冒号 + 中文描述的格式:\n- docs:文档变更\n- feat:新功能\n- fix:Bug 修复\n- refactor:代码重构\n- style:代码风格调整\n- chore:构建工具、依赖更新\n- test:测试变更\n- config:配置变更\n- license:许可证文件更新\n\n注意:实际输出使用英文冒号 (:) 以支持 GitHub 彩色标签\n\"\"\"\n\nimport subprocess\nimport re\nimport argparse\nimport yaml\nfrom pathlib import Path\nfrom typing import List, Dict\n\n\n# Category to commit type mapping (小写英文)\nCATEGORY_TO_TYPE = {\n 'deps': 'chore',\n 'docs': 'docs',\n 'license': 'license',\n 'config': 'config',\n 'test': 'test',\n 'chore': 'chore',\n 'feat': 'feat',\n 'fix': 'fix',\n 'refactor': 'refactor',\n 'style': 'style',\n 'code': 'style', # Default for uncategorized code\n 'other': 'chore',\n}\n\n# Load configuration from YAML\n_DATA_PATH = Path(__file__).parent.parent / 'references' / 'message-data.yaml'\nwith open(_DATA_PATH, encoding='utf-8') as _f:\n _DATA = yaml.safe_load(_f)\n\n# Build FILE_TO_FUNCTION_MAP from YAML (list of {pattern, description})\nFILE_TO_FUNCTION_MAP = _DATA['file_to_function_map']\n\n# Build MESSAGE_TEMPLATES from YAML (convert patterns from list to tuple format)\nMESSAGE_TEMPLATES = {}\nfor _cat, _tpl in _DATA['message_templates'].items():\n if 'patterns' in _tpl:\n MESSAGE_TEMPLATES[_cat] = {\n 'patterns': [(p['pattern'], p['message']) for p in _tpl['patterns']],\n 'default': _tpl['default'],\n }\n else:\n MESSAGE_TEMPLATES[_cat] = {'default': _tpl['default']}\n\nFUNCTION_PREFIX_ACTIONS = _DATA['function_prefix_actions']\nCONFIG_KEY_MEANINGS = _DATA['config_key_meanings']\n\n\ndef parse_skill_category(category: str):\n \"\"\"\n Parse skill:\u003cname>:\u003ctype> format.\n\n Returns (skill_name, commit_type) if skill category, else (None, None).\n \"\"\"\n if category.startswith('skill:'):\n parts = category.split(':')\n if len(parts) == 3:\n return parts[1], parts[2] # (skill_name, commit_type)\n return None, None\n\n\ndef detect_skill_name(files: List[str]) -> str | None:\n \"\"\"\n 检测文件是否属于某个技能,返回技能名称。\n\n Args:\n files: 文件列表\n\n Returns:\n 技能名称,如果不属于任何技能则返回 None\n \"\"\"\n if not files:\n return None\n\n for filepath in files:\n # Check if this is a skill file (skills/\u003cskill-name>/...)\n if '/skills/' in filepath:\n parts = filepath.split('/skills/')\n if len(parts) > 1:\n skill_path = parts[1]\n skill_name = skill_path.split('/')[0]\n if skill_name and skill_name != 'skills':\n return skill_name\n\n return None\n\n\ndef is_new_skill_being_added(skill_name: str, files: List[str]) -> bool:\n \"\"\"\n 检测是否正在添加新技能(而非更新现有技能)。\n\n 判断逻辑:\n 1. 检查 SKILL.md 文件是否已存在于 HEAD 提交中\n 2. 如果不存在 → 新技能\n 3. 否则 → 更新现有技能\n\n Args:\n skill_name: 技能名称\n files: 本次提交涉及的文件列表\n\n Returns:\n True 表示新技能,False 表示更新现有技能\n \"\"\"\n # 检查 SKILL.md 是否是新文件(不存在于 HEAD 提交中)\n for filepath in files:\n if filepath.endswith('SKILL.md'):\n try:\n # 使用 git cat-file 检查文件是否在 HEAD 中存在\n result = subprocess.run(\n ['git', 'cat-file', '-e', f'HEAD:{filepath}'],\n capture_output=True,\n text=True,\n )\n # 如果返回码非 0,说明文件不在 HEAD 中,是新技能\n if result.returncode != 0:\n return True\n except Exception:\n # 出错时保守处理,视为更新\n pass\n\n return False\n\n\ndef analyze_changes(files: List[str], category: str) -> str:\n \"\"\"\n 分析文件变更以生成具体的描述信息。\n\n 返回变更的具体描述。\n \"\"\"\n if not files:\n return \"\"\n\n # Handle skill:\u003cname>:\u003ctype> format - extract the actual type\n skill_name_parsed, actual_category = parse_skill_category(category)\n is_skill_format = skill_name_parsed is not None\n if not is_skill_format:\n actual_category = category\n\n # 优先处理技能文件(跳过通用 patterns 匹配)\n # 技能文件需要特殊处理,不能被 scripts/、test/ 等通用模式提前匹配\n if len(files) == 1:\n filepath = files[0]\n if 'skills/' in filepath:\n filename = filepath.split('/')[-1]\n skill_name_from_path = filepath.split('skills/')[1].split('/')[0]\n # 检测是否为新技能(SKILL.md 未被 git 跟踪)\n if is_new_skill_being_added(skill_name_from_path, files):\n return f'添加 {skill_name_from_path} 技能'\n else:\n # 分析具体变更内容,生成有意义的描述\n diff = get_file_diff(filepath)\n specific_change = analyze_diff_content(diff, filename)\n return specific_change\n\n # Try to match patterns\n if actual_category in MESSAGE_TEMPLATES:\n templates = MESSAGE_TEMPLATES[actual_category]\n if 'patterns' in templates:\n for pattern, message in templates['patterns']:\n for filepath in files:\n if re.search(pattern, filepath):\n # If message contains regex group reference, substitute it\n if r'\\1' in message or r'\\2' in message:\n match = re.search(pattern, filepath)\n if match:\n try:\n result = message\n for i in range(1, len(match.groups()) + 1):\n result = result.replace(f'\\\\{i}', match.group(i))\n return result\n except IndexError:\n pass\n return message\n\n # Use default template\n if 'default' in templates:\n base_msg = templates['default']\n\n # Enhance with file-specific info\n if len(files) == 1:\n filepath = files[0]\n filename = filepath.split('/')[-1]\n\n # For markdown docs, extract doc name\n if actual_category == 'docs' and filename.endswith('.md'):\n doc_name = filename.replace('.md', '')\n # Handle special cases\n if doc_name == 'README':\n return '更新 README 文档'\n elif doc_name == 'CHANGELOG':\n return '更新变更日志'\n elif doc_name == 'AGENTS':\n return '更新协作规范文档'\n elif doc_name == 'SKILL-GUIDE':\n return '更新 Skill 开发指南'\n else:\n return f'更新 {doc_name} 文档'\n\n # For config files, mention specific config\n if actual_category == 'config':\n if filename.endswith(('.yaml', '.yml')):\n return f'更新 {filename} 配置'\n elif filename.endswith('.toml'):\n return f'更新 {filename} 配置'\n\n # Multiple files: mention count\n return f'{base_msg}({len(files)} 个文件)'\n\n # Fallback: generic message based on actual_category\n return f'更新 {actual_category} 文件'\n\n\ndef generate_commit_message(category: str, files: List[str]) -> str:\n \"\"\"\n 生成约定式提交信息,包含详细信息。\n\n 格式:\n \u003ctype>(\u003c技能名>): \u003c描述>\n\n - 详细变更说明1\n - 详细变更说明2\n\n Args:\n category: 变更类别 (deps, docs, feat 等,或 skill:\u003cname>:\u003ctype>)\n files: 该类别中的变更文件列表\n\n Returns:\n 格式化的提交信息(包含详细信息)\n \"\"\"\n # Check if this is a skill category\n skill_name, skill_type = parse_skill_category(category)\n\n if skill_name:\n # Skill-based commit: 使用 analyze_changes 生成具体描述\n commit_type = skill_type\n description = analyze_changes(files, category)\n else:\n # Regular category\n commit_type = CATEGORY_TO_TYPE.get(category, 'chore')\n description = analyze_changes(files, category)\n\n # Detect skill name from files for automatic formatting\n detected_skill = detect_skill_name(files)\n\n # Generate detailed body based on files\n detail_lines = generate_detail_lines(files, category)\n\n # Format: type(skill-name): description (使用英文冒号以支持 GitHub 彩色标签)\n # 如果已有 skill_name 或从文件中检测到技能名,则使用括号格式\n if skill_name:\n message = f\"{commit_type}({skill_name}): {description}\"\n elif detected_skill:\n message = f\"{commit_type}({detected_skill}): {description}\"\n else:\n message = f\"{commit_type}: {description}\"\n\n # Add detail lines if available\n if detail_lines:\n message += \"\\n\\n\" + detail_lines\n\n return message\n\n\n_diff_cache: dict = {}\n\ndef get_file_diff(filepath: str) -> str:\n \"\"\"Get git diff for a specific file (cached).\"\"\"\n if filepath in _diff_cache:\n return _diff_cache[filepath]\n try:\n result = subprocess.run(\n ['git', 'diff', '--cached', filepath],\n capture_output=True,\n text=True,\n )\n _diff_cache[filepath] = result.stdout\n return result.stdout\n except Exception:\n return \"\"\n\n\ndef analyze_diff_content(diff: str, filename: str) -> str:\n \"\"\"\n 分析 diff 内容,生成具体的变更描述。\n\n Args:\n diff: git diff 内容\n filename: 文件名\n\n Returns:\n 具体的变更描述\n \"\"\"\n if not diff:\n return f\"更新 {filename}\"\n\n lines = diff.split('\\n')\n added_lines = []\n removed_lines = []\n\n for line in lines:\n if line.startswith('+') and not line.startswith('+++'):\n content = line[1:].strip()\n if content and not content.startswith('\\\\'):\n added_lines.append(content)\n elif line.startswith('-') and not line.startswith('---'):\n content = line[1:].strip()\n if content and not content.startswith('\\\\'):\n removed_lines.append(content)\n\n # Analyze based on file type\n if filename.endswith('.md'):\n return analyze_markdown_changes(added_lines, removed_lines, filename)\n elif filename.endswith('.py'):\n return analyze_code_changes(added_lines, removed_lines, filename)\n elif '.gitignore' in filename:\n return analyze_gitignore_changes(added_lines, removed_lines)\n elif filename.endswith(('.yaml', '.yml', '.json', '.toml')):\n return analyze_config_changes(added_lines, removed_lines, filename)\n else:\n return analyze_generic_changes(added_lines, removed_lines, filename)\n\n\ndef analyze_markdown_changes(added: List[str], removed: List[str], filename: str) -> str:\n \"\"\"分析 Markdown 文件变更。\"\"\"\n # Check for new sections/headers - collect all headers for better context\n added_headers = [l.lstrip('#').strip() for l in added if l.startswith('#')]\n\n # SKILL.md is a skill core file, treat differently from regular docs\n if filename == 'SKILL.md' or 'SKILL.md' in filename:\n # Extract skill name from path if available\n skill_name = \"\"\n if 'skills/' in filename:\n parts = filename.split('skills/')\n if len(parts) > 1:\n skill_name = parts[1].split('/')[0]\n\n # If we found added headers, generate specific description\n if added_headers:\n # Get the most important header (first h1 or h2)\n header_text = added_headers[0]\n if skill_name:\n return f\"{skill_name} 技能 - 添加 {header_text} 部分\"\n return f\"添加 {header_text} 部分\"\n\n # Check for bullet points or list items (often contain具体的变更内容)\n added_items = [l.strip() for l in added if l.strip().startswith('- ') or l.strip().startswith('* ')]\n if added_items:\n # Use first meaningful item as description\n item_text = added_items[0][2:].strip()[:50] # Limit length\n if skill_name:\n return f\"{skill_name} 技能 - {item_text}\"\n return f\"更新 {filename} - {item_text}\"\n\n if skill_name:\n return f\"更新 {skill_name} 技能\"\n return f\"更新技能定义文件\"\n\n # For regular markdown files with headers\n if added_headers:\n header_text = added_headers[0]\n return f\"更新 {filename} - 添加 {header_text} 部分\"\n\n # Check for doc updates\n if added:\n return f\"更新 {filename} 文档内容\"\n elif removed:\n return f\"修改 {filename} 文档内容\"\n\n return f\"更新 {filename}\"\n\n\ndef get_function_description(filename: str) -> str | None:\n \"\"\"\n 根据文件名获取功能描述。\n\n 优先使用预定义的映射,如果没有匹配则返回 None。\n \"\"\"\n for entry in FILE_TO_FUNCTION_MAP:\n if re.search(entry['pattern'], filename, re.IGNORECASE):\n return entry['description']\n return None\n\n\ndef extract_class_names(added: List[str]) -> List[str]:\n \"\"\"提取新增的类名。\"\"\"\n class_names = []\n for line in added:\n # Python/JavaScript/TypeScript: class ClassName\n match = re.search(r'class\\s+(\\w+)', line)\n if match:\n class_names.append(match.group(1))\n return class_names\n\n\ndef extract_function_names(added: List[str]) -> List[str]:\n \"\"\"提取新增的函数名。\"\"\"\n func_names = []\n for line in added:\n # Python: def function_name(\n match = re.search(r'def\\s+(\\w+)\\s*\\(', line)\n if match:\n func_names.append(match.group(1))\n return func_names\n\n\ndef infer_intent_from_function_name(func_name: str) -> str | None:\n \"\"\"根据函数名前缀推断意图。\n\n 示例:\n - detect_skill_name -> 检测技能名\n - infer_intent -> 推断意图\n - analyze_code_changes -> 分析代码变更\n - extract_function_names -> 提取函数名\n - detect_modified_functions -> 检测被修改的函数\n \"\"\"\n for prefix, action in FUNCTION_PREFIX_ACTIONS.items():\n if func_name.startswith(prefix):\n # 提取函数名中剩余的部分\n rest = func_name[len(prefix):]\n\n # 如果剩余部分很短(如单个词),直接返回动作描述\n if len(rest) \u003c 4:\n return action\n\n # 常见的\"新功能\"类词组,这些情况下直接返回简洁动作\n simple_suffixes = ('new', 'test', 'feature', 'item')\n if rest.lower().endswith(simple_suffixes) or rest.lower() in simple_suffixes:\n return action\n\n # 按下划线分割\n parts = rest.split('_')\n # 过滤掉常见词,保留核心名词\n filtered = [p for p in parts\n if p.lower() not in ('name', 'file', 'path', 'content',\n 'data', 'message', 'lines', 'from',\n 'function', 'the', 'a', 'an', 'list',\n 'new', 'test', 'feature', 'removed',\n 'changes', 'added', 'modified', 'items')]\n\n # 如果过滤后只剩通用词(names, functions),使用函数名本身\n generic_terms = ('names', 'functions', 'data', 'items', 'values')\n if not filtered or all(f.lower() in generic_terms for f in filtered):\n # 返回函数名的后半部分(去掉前缀后的部分),用更友好的格式\n return rest.replace('_', ' ')\n\n readable = '_'.join(filtered) # 保留完整的剩余部分\n return f\"{action}({readable})\"\n\n return None\n\n\ndef extract_removed_function_names(removed: List[str]) -> List[str]:\n \"\"\"提取被删除的函数名。\"\"\"\n func_names = []\n for line in removed:\n match = re.search(r'def\\s+(\\w+)\\s*\\(', line)\n if match:\n func_names.append(match.group(1))\n return func_names\n\n\ndef detect_modified_functions(added_funcs: List[str], removed_funcs: List[str]) -> List[str]:\n \"\"\"检测被修改的函数(既被删除又新增的同名函数)。\"\"\"\n modified = []\n for func in added_funcs:\n if func in removed_funcs:\n modified.append(func)\n return modified\n\n\ndef analyze_code_changes(added: List[str], removed: List[str], filename: str) -> str:\n \"\"\"分析代码文件变更,生成有意义的描述。\"\"\"\n # 先尝试获取功能描述\n func_desc = get_function_description(filename)\n\n # 提取新增和删除的类名和函数名\n added_classes = extract_class_names(added)\n removed_classes = extract_class_names(removed)\n added_funcs = extract_function_names(added)\n removed_funcs = extract_removed_function_names(removed)\n added_imports = [l for l in added if 'import ' in l or 'from ' in l]\n\n # 判断是否为修改(既有删除又有新增)\n is_modification = len(removed) > 0 and len(added) > 0\n has_new_funcs = len(added_funcs) > 0\n has_new_classes = len(added_classes) > 0\n\n # 检测被修改的函数\n modified_funcs = detect_modified_functions(added_funcs, removed_funcs)\n\n # 构建描述\n # 优先处理修改场景(既有新增又有删除)\n if is_modification:\n if modified_funcs:\n # 有函数被修改\n intent = infer_intent_from_function_name(modified_funcs[0])\n if intent:\n return f\"改进 {modified_funcs[0]}() - {intent}\"\n return f\"改进 {modified_funcs[0]}() 函数\"\n\n if has_new_funcs:\n # 新增了函数\n intent = infer_intent_from_function_name(added_funcs[0])\n if intent:\n return f\"改进 {filename} - 新增 {intent}\"\n return f\"改进 {filename} - 新增 {added_funcs[0]}() 函数\"\n\n if func_desc:\n return f\"改进 {func_desc}\"\n\n return f\"改进 {filename} 代码\"\n\n # 新增函数场景\n if has_new_funcs:\n intent = infer_intent_from_function_name(added_funcs[0])\n if intent:\n if len(added_funcs) == 1:\n return f\"新增 {intent}\"\n else:\n return f\"新增 {len(added_funcs)} 个函数 - {intent}\"\n return f\"新增 {added_funcs[0]}() 函数\"\n\n if has_new_classes:\n if func_desc:\n return f\"新增 {added_classes[0]} 类到 {func_desc}\"\n return f\"新增 {added_classes[0]} 类\"\n\n # 检查关键词 - 生成更具体的描述\n fix_keywords = ['fix', 'bug', '修复', '错误', '问题']\n if any(any(kw in l.lower() for kw in fix_keywords) for l in added + removed):\n if func_desc:\n return f\"修复 {func_desc} 中的问题\"\n return \"修复代码问题\"\n\n refactor_keywords = ['refactor', '重构', '优化', 'improve', 'optimize']\n if any(any(kw in l.lower() for kw in refactor_keywords) for l in added + removed):\n if func_desc:\n return f\"重构 {func_desc}\"\n return \"重构代码\"\n\n update_keywords = ['update', '改进', 'enhance', 'modify']\n if any(any(kw in l.lower() for kw in update_keywords) for l in added + removed):\n if func_desc:\n return f\"改进 {func_desc}\"\n return f\"改进 {filename}\"\n\n if added_imports and func_desc:\n return f\"改进 {func_desc} - 新增导入\"\n\n if func_desc:\n return f\"改进 {func_desc}\"\n\n return f\"改进 {filename} 代码\"\n\n\ndef analyze_gitignore_changes(added: List[str], removed: List[str]) -> str:\n \"\"\"分析 .gitignore 变更。\"\"\"\n if added:\n # Extract patterns that were added\n patterns = [l.lstrip('#').strip() for l in added if l and not l.startswith('#')]\n if patterns:\n # Summarize the types of patterns\n summary = []\n for p in patterns[:3]: # Show up to 3 patterns\n if '__pycache__' in p or '.pyc' in p:\n summary.append('Python缓存')\n elif '.log' in p:\n summary.append('日志文件')\n elif '.db' in p or 'sqlite' in p:\n summary.append('数据库文件')\n elif 'node_modules' in p:\n summary.append('Node依赖')\n elif 'logs' in p:\n summary.append('日志目录')\n elif '.playwright' in p:\n summary.append('Playwright数据')\n else:\n summary.append(p)\n\n if summary:\n return f\"更新 gitignore 忽略规则 - 添加 {', '.join(summary)}\"\n\n return \"更新 gitignore 忽略规则\"\n\n\ndef analyze_config_changes(added: List[str], removed: List[str], filename: str) -> str:\n \"\"\"分析配置文件变更,生成具体的描述。\"\"\"\n if not added:\n if removed:\n removed_keys = [l.split(':')[0].strip() for l in removed if ':' in l]\n if removed_keys:\n return f\"更新 {filename} - 移除 {', '.join(removed_keys[:2])} 配置\"\n return f\"更新 {filename} 配置\"\n\n # 分析添加的配置项\n added_keys = []\n semantic_descriptions = []\n\n for line in added:\n if ':' in line:\n key = line.split(':')[0].strip()\n added_keys.append(key)\n\n # 查找语义描述\n key_lower = key.lower()\n for config_key, meaning in CONFIG_KEY_MEANINGS.items():\n if config_key in key_lower:\n if meaning not in semantic_descriptions:\n semantic_descriptions.append(meaning)\n break\n\n # 分析上下文:查找配置所属的分组(如 level3, level4)\n context_info = []\n for line in added:\n line_stripped = line.strip()\n # 检测 YAML 层级标识(如 \"level3:\", \"level4:\")\n if line_stripped and not line_stripped.startswith('#'):\n # 检测缩进级别,判断是否是子配置\n indent = len(line) - len(line.lstrip())\n if indent == 0 and line_stripped.endswith(':'):\n # 顶级配置项\n section_name = line_stripped[:-1]\n context_info.append(section_name)\n\n # 构建描述\n if semantic_descriptions:\n # 有语义描述\n desc = '、'.join(semantic_descriptions[:3])\n\n # 如果有上下文信息,添加到描述中\n if context_info:\n context = context_info[0]\n # 将 level3 转换为更友好的描述\n context_map = {\n 'level1': '一级标题',\n 'level2': '二级标题',\n 'level3': '三级标题',\n 'level4': '四级标题',\n 'level5': '五级标题',\n 'level6': '六级标题',\n }\n context_desc = context_map.get(context, context)\n return f\"更新 {filename} - 为 {context_desc} 添加 {desc} 配置\"\n\n return f\"更新 {filename} - 添加 {desc} 配置\"\n\n if added_keys:\n # 没有语义匹配,使用原始 key\n return f\"更新 {filename} - 添加 {', '.join(added_keys[:3])} 配置\"\n\n return f\"更新 {filename} 配置\"\n\n\ndef analyze_generic_changes(added: List[str], removed: List[str], filename: str) -> str:\n \"\"\"分析通用文件变更。\"\"\"\n if added:\n return f\"更新 {filename}\"\n elif removed:\n return f\"删除 {filename} 中的内容\"\n\n return f\"修改 {filename}\"\n\n\ndef generate_detail_lines(files: List[str], category: str) -> str:\n \"\"\"\n 根据变更文件生成详细信息行。\n\n Args:\n files: 变更文件列表\n category: 变更类别\n\n Returns:\n 详细信息字符串\n \"\"\"\n lines = []\n\n for filepath in files:\n filename = filepath.split('/')[-1]\n\n # Get diff content for analysis\n diff = get_file_diff(filepath)\n\n # Analyze and generate description\n description = analyze_diff_content(diff, filename)\n lines.append(f\"- {description}\")\n\n return \"\\n\".join(lines)\n\n\ndef generate_commit_messages(groups: Dict[str, List[str]]) -> Dict[str, str]:\n \"\"\"\n 为所有分组生成提交信息。\n\n Args:\n groups: 变更类别到文件列表的映射\n\n Returns:\n 类别到提交信息的映射\n \"\"\"\n messages = {}\n for category, files in groups.items():\n messages[category] = generate_commit_message(category, files)\n return messages\n\n\ndef add_issue_reference(\n message: str,\n github_issue: str | None = None,\n local_ref: str | None = None,\n) -> str:\n \"\"\"\n Add issue/task traceability to a generated commit message.\n\n GitHub issues use a subject suffix like \"(#13)\" so git log can show the\n source issue at a glance. This helper only writes references. Closing\n semantics such as \"Closes #13\" belong to git-workflow, not this shortcut.\n \"\"\"\n if not github_issue and not local_ref:\n return message\n\n lines = message.split('\\n')\n subject = lines[0]\n body = '\\n'.join(lines[1:]).strip()\n\n reference = \"\"\n if github_issue:\n issue_num = github_issue.strip().lstrip('#')\n suffix = f\"(#{issue_num})\"\n if suffix not in subject:\n subject = f\"{subject} {suffix}\"\n reference = f\"Refs #{issue_num}\"\n elif local_ref:\n reference = f\"Refs: {local_ref.strip()}\"\n\n if reference and reference not in body:\n body = f\"{reference}\\n\\n{body}\".strip()\n\n if body:\n return f\"{subject}\\n\\n{body}\"\n return subject\n\n\ndef main():\n \"\"\"命令行使用的主入口。\"\"\"\n parser = argparse.ArgumentParser(\n description='生成约定式提交信息'\n )\n parser.add_argument(\n '--category',\n type=str,\n help='变更类别 (deps, docs, feat 等)'\n )\n parser.add_argument(\n '--files',\n nargs='+',\n help='变更文件列表'\n )\n parser.add_argument(\n '--issue',\n type=str,\n help='关联的 GitHub Issue 编号,例如 13 或 #13;标题会追加 (#13)'\n )\n parser.add_argument(\n '--local-ref',\n type=str,\n help='关联的本地任务引用,例如 \"project-task Issue #13\",不会关闭 GitHub Issue'\n )\n\n args = parser.parse_args()\n\n if args.category and args.files:\n msg = generate_commit_message(args.category, args.files)\n msg = add_issue_reference(\n msg,\n github_issue=args.issue,\n local_ref=args.local_ref,\n )\n print(msg)\n else:\n print(\"用法: generate_commit_message.py --category \u003c类型> --files \u003c文件1> [文件2...]\")\n\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":27532,"content_sha256":"64d64e4d1957989625dcdb0df6dcb98d38e77b2d50ed03d445a6a46b4588ab01"},{"filename":"scripts/interactive_commit.py","content":"#!/usr/bin/env python3\n\"\"\"\nInteractive batch commit tool for Git.\n\nGroups changes by type and helps create multiple focused commits\ninstead of one large mixed commit.\n\"\"\"\n\nimport subprocess\nimport sys\nimport json\nfrom pathlib import Path\nfrom typing import Dict, List\n\n# Import sibling scripts\nsys.path.insert(0, str(Path(__file__).parent))\nfrom categorize_changes import get_staged_files, group_changes\nfrom generate_commit_message import add_issue_reference, generate_commit_messages\n\n\ndef stage_files(files: List[str]) -> bool:\n \"\"\"Stage files for commit.\"\"\"\n if not files:\n return True\n try:\n subprocess.run(\n ['git', 'add'] + files,\n capture_output=True,\n check=True\n )\n return True\n except subprocess.CalledProcessError as e:\n print(f\"暂存文件时出错: {e}\", file=sys.stderr)\n return False\n\n\ndef unstage_files(files: List[str]) -> bool:\n \"\"\"Unstage files to reorganize commits.\"\"\"\n if not files:\n return True\n try:\n subprocess.run(\n ['git', 'reset', 'HEAD'] + files,\n capture_output=True,\n check=True\n )\n return True\n except subprocess.CalledProcessError as e:\n print(f\"取消暂存文件时出错: {e}\", file=sys.stderr)\n return False\n\n\ndef create_commit(message: str) -> bool:\n \"\"\"Create a git commit with the given message (supports multi-line).\"\"\"\n try:\n # Use -m multiple times for multi-line commit message\n # First line is the subject, subsequent lines are the body\n lines = message.split('\\n')\n cmd = ['git', 'commit']\n for line in lines:\n cmd.extend(['-m', line])\n subprocess.run(\n cmd,\n capture_output=True,\n check=True\n )\n return True\n except subprocess.CalledProcessError as e:\n print(f\"创建提交时出错: {e}\", file=sys.stderr)\n print(f\"stderr: {e.stderr.decode()}\", file=sys.stderr)\n return False\n\n\ndef display_groups(groups: Dict[str, List[str]], messages: Dict[str, str]):\n \"\"\"Display grouped changes with proposed commit messages.\"\"\"\n print(\"\\n\" + \"=\" * 60)\n print(\"提议的提交分组\")\n print(\"=\" * 60)\n\n for i, (category, files) in enumerate(sorted(groups.items()), 1):\n msg = messages.get(category, f\"{category.title()}: 更新文件\")\n print(f\"\\n[分组 {i}] {msg}\")\n print(f\"类别: {category}\")\n print(f\"文件 ({len(files)} 个):\")\n for f in sorted(files):\n print(f\" - {f}\")\n\n print(\"\\n\" + \"=\" * 60)\n\n\ndef is_interactive() -> bool:\n \"\"\"Check if running in an interactive terminal.\"\"\"\n return sys.stdin.isatty()\n\n\ndef confirm_groups(skip_confirm: bool = False) -> bool:\n \"\"\"Ask user to confirm the proposed grouping.\n\n Args:\n skip_confirm: If True, skip confirmation and proceed automatically\n \"\"\"\n if skip_confirm:\n return True\n\n print(\"\\n选项:\")\n print(\" y - 是,创建这些提交\")\n print(\" n - 否,取消\")\n\n while True:\n try:\n response = input(\"\\n是否继续创建这些提交? [y/n]: \").strip().lower()\n except (EOFError, OSError):\n print(\"\\n检测到非交互式环境,已取消操作。\")\n print(\"提示:使用 --yes 参数跳过确认,或使用 --dry-run 仅查看分组\")\n return False\n\n if response in ['y', 'yes', '是']:\n return True\n elif response in ['n', 'no', '否']:\n return False\n else:\n print(\"请输入 'y' 或 'n'。\")\n\n\ndef decorate_messages(\n groups: Dict[str, List[str]],\n messages: Dict[str, str],\n issue: str | None = None,\n local_ref: str | None = None,\n) -> Dict[str, str]:\n \"\"\"Add issue/task references to generated commit messages.\"\"\"\n if not issue and not local_ref:\n return messages\n\n decorated = {}\n for category, message in messages.items():\n decorated[category] = add_issue_reference(\n message,\n github_issue=issue,\n local_ref=local_ref,\n )\n return decorated\n\n\ndef batch_commit(\n skip_confirm: bool = False,\n issue: str | None = None,\n local_ref: str | None = None,\n):\n \"\"\"Main function to perform batch commit.\n\n Args:\n skip_confirm: If True, skip confirmation and proceed automatically\n \"\"\"\n print(\"Git 批量提交工具\")\n print(\"=\" * 60)\n\n # Get currently staged files\n staged = get_staged_files()\n\n if not staged:\n print(\"未发现已暂存的变更。\")\n print(\"请先使用 git add \u003cfiles> 暂存一些变更\")\n return 1\n\n print(f\"发现 {len(staged)} 个已暂存文件\")\n\n # Group changes by category (using already staged files)\n groups = group_changes(staged, staged=True)\n\n # Generate commit messages for each group (files are already staged)\n messages = generate_commit_messages(groups)\n messages = decorate_messages(\n groups,\n messages,\n issue=issue,\n local_ref=local_ref,\n )\n\n # Display proposed groups\n display_groups(groups, messages)\n\n # Confirm with user\n if not confirm_groups(skip_confirm=skip_confirm):\n print(\"\\n已取消。\")\n return 0\n\n # Unstage everything first to regroup\n if not unstage_files(staged):\n print(\"错误:无法取消暂存文件。\")\n return 1\n\n # Create commits for each group\n print(\"\\n正在创建提交...\")\n success_count = 0\n total_count = len(groups)\n\n for category, files in sorted(groups.items()):\n msg = messages.get(category, f\"{category.title()}: 更新文件\")\n\n # Stage files for this commit\n print(f\"\\n → {msg}\")\n if not stage_files(files):\n print(f\" 无法为 {category} 暂存文件\")\n continue\n\n # Create commit\n if create_commit(msg):\n print(f\" ✓ 已提交 {len(files)} 个文件\")\n success_count += 1\n else:\n print(f\" ✗ 提交失败\")\n\n # Summary\n print(\"\\n\" + \"=\" * 60)\n print(f\"批量提交完成:{success_count}/{total_count} 个提交已创建\")\n print(\"=\" * 60)\n\n return 0 if success_count == total_count else 1\n\n\ndef main():\n \"\"\"Entry point.\"\"\"\n import argparse\n\n parser = argparse.ArgumentParser(\n description='Interactive batch commit tool for Git',\n epilog='示例: %(prog)s --yes # 自动确认并创建提交'\n )\n parser.add_argument(\n '--dry-run',\n action='store_true',\n help='显示将要提交的内容而不实际提交'\n )\n parser.add_argument(\n '--yes', '-y',\n action='store_true',\n help='跳过交互式确认,自动创建提交(适用于 CI/CD 或非交互式环境)'\n )\n parser.add_argument(\n '--issue',\n type=str,\n help='关联的 GitHub Issue 编号,例如 13 或 #13;每个提交标题会追加 (#13)'\n )\n parser.add_argument(\n '--local-ref',\n type=str,\n help='关联的本地任务引用,例如 \"project-task Issue #13\",不会关闭 GitHub Issue'\n )\n\n args = parser.parse_args()\n\n if args.dry_run:\n # Just show grouping without committing\n staged = get_staged_files()\n if not staged:\n print(\"未发现已暂存的变更。\")\n return 0\n\n groups = group_changes(staged, staged=True)\n messages = generate_commit_messages(groups)\n messages = decorate_messages(\n groups,\n messages,\n issue=args.issue,\n local_ref=args.local_ref,\n )\n display_groups(groups, messages)\n return 0\n else:\n return batch_commit(\n skip_confirm=args.yes,\n issue=args.issue,\n local_ref=args.local_ref,\n )\n\n\nif __name__ == '__main__':\n sys.exit(main())\n","content_type":"text/x-python; charset=utf-8","language":"python","size":7956,"content_sha256":"cdf77919128ac72f1689409312d82dd22b5900eb5399d1c6203046027ef0540d"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Git 批量提交工具","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"概述","type":"text"}]},{"type":"paragraph","content":[{"text":"将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含\"更新各种文件\"的大提交,而是创建多个清晰的提交,如\"docs: 更新 README\"、\"chore: 更新依赖\"、\"license: 更新 license 文件\"。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"与 git-workflow 的职责边界","type":"text"}]},{"type":"paragraph","content":[{"text":"git-batch-commit","type":"text","marks":[{"type":"code_inline"}]},{"text":" 是提交拆分工具,不是完整 Git 工作流控制器。","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":"使用哪个 Skill","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":"将已暂存的混合变更拆成多个 commit","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git-batch-commit","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"本 Skill 的核心职责","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"判断是否能 merge / push / close PR","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git-workflow","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"本 Skill 不做合并门禁","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PR 合入 main 的 commit 标题是否带 ","type":"text"},{"text":"(#N)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git-workflow","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"本 Skill 只在生成普通 commit 时保留 Issue/Task 引用","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"直接解决 GitHub Issue 是否应写 ","type":"text"},{"text":"Closes #N","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"git-workflow","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"本 Skill 只写 ","type":"text"},{"text":"Refs #N","type":"text","marks":[{"type":"code_inline"}]},{"text":",不关闭 Issue","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":"cross-agent-collab","type":"text","marks":[{"type":"code_inline"}]},{"text":" 定任务来源,","type":"text"},{"text":"git-batch-commit","type":"text","marks":[{"type":"code_inline"}]},{"text":" 写引用","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"使用 ","type":"text"},{"text":"--local-ref \"project-task Issue #13\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 ","type":"text"},{"text":"git-workflow","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"}]}]},{"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":"heading","attrs":{"level":2},"content":[{"text":"快速开始","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"方式一:使用交互式脚本","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 首先暂存你的文件\ngit add file1.py file2.md package.json\n\n# 运行交互式批量提交工具(需要确认)\npython3 skills/git-batch-commit/scripts/interactive_commit.py\n\n# 或使用 --yes 参数自动确认(适用于非交互式环境)\npython3 skills/git-batch-commit/scripts/interactive_commit.py --yes\n\n# 使用 --dry-run 仅查看分组,不实际提交\npython3 skills/git-batch-commit/scripts/interactive_commit.py --dry-run\n\n# 这组提交关联 GitHub Issue #13:每个标题追加 (#13),正文写 Refs #13\npython3 skills/git-batch-commit/scripts/interactive_commit.py --issue 13\n\n# 这组提交关联项目本地任务,不误关 GitHub Issue\npython3 skills/git-batch-commit/scripts/interactive_commit.py --local-ref \"project-task Issue #13\"","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":"--yes","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"-y","type":"text","marks":[{"type":"code_inline"}]},{"text":":跳过交互式确认,自动创建提交","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--dry-run","type":"text","marks":[{"type":"code_inline"}]},{"text":":仅显示分组建议,不实际创建提交","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--issue N","type":"text","marks":[{"type":"code_inline"}]},{"text":":关联 GitHub Issue,提交标题追加 ","type":"text"},{"text":"(#N)","type":"text","marks":[{"type":"code_inline"}]},{"text":",正文写 ","type":"text"},{"text":"Refs #N","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--local-ref \"...\"","type":"text","marks":[{"type":"code_inline"}]},{"text":":关联项目本地任务,如 ","type":"text"},{"text":"project-task Issue #13","type":"text","marks":[{"type":"code_inline"}]},{"text":",只写 ","type":"text"},{"text":"Refs: ...","type":"text","marks":[{"type":"code_inline"}]},{"text":",不会关闭 GitHub Issue","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"方式二:手动分类","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 skills/git-batch-commit/scripts/categorize_changes.py\npython3 skills/git-batch-commit/scripts/categorize_changes.py --json","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"提交分类","type":"text"}]},{"type":"paragraph","content":[{"text":"支持类型:","type":"text"},{"text":"docs","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"feat","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"fix","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"refactor","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"style","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"chore","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"license","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"config","type":"text","marks":[{"type":"strong"}]},{"text":", ","type":"text"},{"text":"test","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"完整定义和检测逻辑详见 ","type":"text"},{"text":"references/commit-types.md","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"技能核心文件的特殊处理","type":"text"}]},{"type":"paragraph","content":[{"text":"重要规则","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" 虽然是 Markdown 格式,但它是","type":"text"},{"text":"技能的核心功能文件","type":"text","marks":[{"type":"strong"}]},{"text":",不应归类为 ","type":"text"},{"text":"docs","type":"text","marks":[{"type":"code_inline"}]},{"text":" 类型。","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"文件类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"正确分类","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"理由","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"feat","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"style","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"fix","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"技能核心文件,修改它相当于修改功能/代码","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"AGENTS.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"docs","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"项目协作规范,属于文档","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"DECISIONS.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"docs","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"决策记录,属于文档","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"CHANGELOG.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"docs","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"变更日志,属于文档","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"TASKS.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"docs","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"left"},"content":[{"type":"paragraph","content":[{"text":"任务列表,属于文档","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"},{"text":"定义行为/功能","type":"text","marks":[{"type":"strong"}]},{"text":"的文件(如 ","type":"text"},{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":".py","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":".ts","type":"text","marks":[{"type":"code_inline"}]},{"text":"),视为代码变更","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"如果修改的是","type":"text"},{"text":"记录/说明","type":"text","marks":[{"type":"strong"}]},{"text":"性质的文件(如 ","type":"text"},{"text":"README.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"CHANGELOG.md","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":"code_block","attrs":{"wrap":false,"language":"text"},"content":[{"text":"\u003c类型>: \u003c标题>\n\n\u003c正文描述>","type":"text"}]},{"type":"paragraph","content":[{"text":"重要规则:每个提交必须包含正文(body),不能只有标题。","type":"text","marks":[{"type":"strong"}]},{"text":" 正文用于补充变更的具体内容和原因,方便后续追溯。","type":"text"}]},{"type":"paragraph","content":[{"text":"使用英文前缀加中文内容,确保 GitHub 能识别并显示彩色标签。完整示例见 ","type":"text"},{"text":"references/conventional-commits.md","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"Multi-Module/Multi-Skill 仓库规则","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"描述中应包含模块名称:","type":"text"},{"text":"docs: course-generator 更新 CHANGELOG","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"如果一次修改涉及多个模块,","type":"text"},{"text":"必须按模块分别提交","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"描述中的模块名称使用原始英文名称,不要翻译","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Issue / Task 引用规则","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若一组批量提交关联 GitHub Issue,使用 ","type":"text"},{"text":"--issue N","type":"text","marks":[{"type":"code_inline"}]},{"text":"。每个提交标题会包含 ","type":"text"},{"text":"(#N)","type":"text","marks":[{"type":"code_inline"}]},{"text":",正文写 ","type":"text"},{"text":"Refs #N","type":"text","marks":[{"type":"code_inline"}]},{"text":"。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"本 Skill 不生成 ","type":"text"},{"text":"Closes #N","type":"text","marks":[{"type":"code_inline"}]},{"text":"。是否关闭 GitHub Issue 属于 ","type":"text"},{"text":"git-workflow","type":"text","marks":[{"type":"code_inline"}]},{"text":" 的判断范围。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"若编号来自项目本地任务源而非 GitHub Issue,使用 ","type":"text"},{"text":"--local-ref \"project-task Issue #N\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" 或项目约定的等价引用,不要写 ","type":"text"},{"text":"Closes #N","type":"text","marks":[{"type":"code_inline"}]},{"text":"。","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"PR 合并提交的 ","type":"text"},{"text":"(#PR编号)","type":"text","marks":[{"type":"code_inline"}]},{"text":" 规则不由本 Skill 决定,遵循 ","type":"text"},{"text":"git-workflow","type":"text","marks":[{"type":"code_inline"}]},{"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","marks":[{"type":"strong"}]},{"text":" - 使用 ","type":"text"},{"text":"git add","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":"ClawHub 同步检查","type":"text","marks":[{"type":"strong"}]},{"text":" - 仅当 ","type":"text"},{"text":"skills/clawhub-sync/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 存在时执行,详见 ","type":"text"},{"text":"references/clawhub-sync-check.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"。不存在则静默跳过","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Subtree 推送检查","type":"text","marks":[{"type":"strong"}]},{"text":" - 仅当 ","type":"text"},{"text":"skills/subtree-publish/config/subtree-skills.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 存在时执行,详见 ","type":"text"},{"text":"references/subtree-push-check.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":"heading","attrs":{"level":2},"content":[{"text":"资源文件","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"scripts/","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"categorize_changes.py","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - 分析 git diff 并按类别分组文件","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"generate_commit_message.py","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - 生成约定式提交信息","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"interactive_commit.py","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - 批量提交的主交互式工具","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"references/","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"commit-types.md","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - 详细的类别定义和检测逻辑","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"conventional-commits.md","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - 提交信息规范","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"clawhub-sync-check.md","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - ClawHub 同步检查详细流程(工作流第5步)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"subtree-push-check.md","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" - Subtree 推送检查详细流程(工作流第6步)","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"git-batch-commit","author":"@skillopedia","source":{"stars":281,"repo_name":"legal-skills","origin_url":"https://github.com/cat-xierluo/legal-skills/blob/HEAD/skills/git-batch-commit/SKILL.md","repo_owner":"cat-xierluo","body_sha256":"054a644cd86c0bd029cc6cfbc314c8d7a871e99b640d437ad247a9e0e4b05fce","cluster_key":"3732b284d416aea0a5b9b6901b3037541e52bc66da3d9f5a8ba3112317974eb6","clean_bundle":{"format":"clean-skill-bundle-v1","source":"cat-xierluo/legal-skills/skills/git-batch-commit/SKILL.md","attachments":[{"id":"1338d893-f2d8-5e12-8297-2cc8e3b074b7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1338d893-f2d8-5e12-8297-2cc8e3b074b7/attachment.md","path":"CHANGELOG.md","size":3806,"sha256":"688b4e04ada69145bda9e1777896085a34c066d9f8c9034a55f86bb6c4b6b6c1","contentType":"text/markdown; charset=utf-8"},{"id":"8c7ea439-e272-5842-84e7-f142002a5dba","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8c7ea439-e272-5842-84e7-f142002a5dba/attachment.md","path":"references/clawhub-sync-check.md","size":4971,"sha256":"52e88326c68c080ecb218eb1592430e551cb82b759a09c02ae8d93acc76ba4a2","contentType":"text/markdown; charset=utf-8"},{"id":"72a8629e-2834-53b3-80b7-6a063721dead","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/72a8629e-2834-53b3-80b7-6a063721dead/attachment.md","path":"references/commit-types.md","size":3078,"sha256":"2711b885b5f2746284b063d8077119c62e15321384c684cf0ce6fbd9a3ee002d","contentType":"text/markdown; charset=utf-8"},{"id":"677cd600-36da-5fd8-9ab8-1712f4fc92c1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/677cd600-36da-5fd8-9ab8-1712f4fc92c1/attachment.md","path":"references/conventional-commits.md","size":1808,"sha256":"12670ccb00d66f9206533682ea4029286bec043c723f86af889e0a76361d9df4","contentType":"text/markdown; charset=utf-8"},{"id":"cac465c8-5e80-5e21-b710-9fc85aa07e94","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cac465c8-5e80-5e21-b710-9fc85aa07e94/attachment.yaml","path":"references/message-data.yaml","size":8616,"sha256":"7accdc53925c7273ad82c9001828c155b3e7021e9fa752802318032de16df90e","contentType":"application/yaml; charset=utf-8"},{"id":"eff8b4f9-0117-5a8f-9349-2956fab7f673","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/eff8b4f9-0117-5a8f-9349-2956fab7f673/attachment.md","path":"references/subtree-push-check.md","size":2057,"sha256":"079920c2e0a91449649d368cd7ee74661b11e4627b866ed816e61a5f8045a94e","contentType":"text/markdown; charset=utf-8"},{"id":"a03f7196-e16a-5b6d-8b38-e1c3aab0714c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a03f7196-e16a-5b6d-8b38-e1c3aab0714c/attachment.py","path":"scripts/categorize_changes.py","size":10777,"sha256":"88a8143d190f7eae2b19ace529dc0290c971c755942210e993043eb7fad65661","contentType":"text/x-python; charset=utf-8"},{"id":"39273392-4cf2-57c8-926d-09b21ea44b62","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/39273392-4cf2-57c8-926d-09b21ea44b62/attachment.py","path":"scripts/generate_commit_message.py","size":27532,"sha256":"64d64e4d1957989625dcdb0df6dcb98d38e77b2d50ed03d445a6a46b4588ab01","contentType":"text/x-python; charset=utf-8"},{"id":"ec50f5c1-8983-5acf-a259-f8a4e22ab382","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ec50f5c1-8983-5acf-a259-f8a4e22ab382/attachment.py","path":"scripts/interactive_commit.py","size":7956,"sha256":"cdf77919128ac72f1689409312d82dd22b5900eb5399d1c6203046027ef0540d","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"db74ec010be2cc01b0870c68ac78c90fbb28de2c1b40ab8ba1393aed73aa0066","attachment_count":9,"text_attachments":9,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/git-batch-commit/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"productivity-workflow","category_label":"Productivity"},"exact_dupes_collapsed_into_this":0},"license":"MIT","version":"v1","category":"productivity-workflow","homepage":"https://github.com/cat-xierluo/legal-skills","import_tag":"clean-skills-v1","description":"智能 Git 批量提交快捷按钮。触发词:\"git 提交\"、\"批量提交\"、\"拆分提交\"、\"整理提交\",或用户明确要把已暂存变更拆成多个聚焦 commit 时使用。只负责 commit 拆分和提交信息生成;分支、PR、push、merge、Issue 关闭语义以 git-workflow 为准。"}},"renderedAt":1782979244181}

Git 批量提交工具 概述 将混合的修改自动拆分为多个聚焦的、逻辑清晰的提交。而不是创建一个包含"更新各种文件"的大提交,而是创建多个清晰的提交,如"docs: 更新 README"、"chore: 更新依赖"、"license: 更新 license 文件"。 与 git-workflow 的职责边界 是提交拆分工具,不是完整 Git 工作流控制器。 | 场景 | 使用哪个 Skill | 说明 | |------|---------------|------| | 将已暂存的混合变更拆成多个 commit | | 本 Skill 的核心职责 | | 判断是否能 merge / push / close PR | | 本 Skill 不做合并门禁 | | PR 合入 main 的 commit 标题是否带 | | 本 Skill 只在生成普通 commit 时保留 Issue/Task 引用 | | 直接解决 GitHub Issue 是否应写 | | 本 Skill 只写 ,不关闭 Issue | | 项目本地任务引用 | 定任务来源, 写引用 | 使用 | 当用户只是说“把这些改动提交一下 / 拆分提交”,使用本 Skill;当用户说“合并 PR / 拉 PR 到 main / 推送 / 关闭 issue”,同时遵循 。 使用场景 - 用户暂存的文件来自多个类别(文档 +…