关于 speckit-constitution
speckit-constitution 是用于创建或更新项目章程的 Spec Kit 技能,并保留仍适用的现有规范。它将修改限制在章程文件,并列出延后的非治理请求。
主要功能
- 01解析当前生效的章程模板
- 02保留仍适用的现有原则
- 03更新治理与版本信息
- 04验证日期、占位符和结构
- 05延后无关的实现请求
适用场景
- 01为项目创建章程
- 02修订项目原则或治理规则
- 03将章程变更与功能请求分开处理
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dceoy/ speckit-agent-skills --skill speckit-constitution安装后在 Claude Code 中输入/speckit-constitution确认已加载。
详细介绍
用户输入
$ARGUMENTS
如果用户输入不为空,必须先考虑用户输入,再继续操作。
范围限制
此命令的工作仅限于更新项目章程本身。依赖的模板和命令会在运行时读取章程,不在此处修改。
- 将用户输入的每一部分归类为章程内容或独立的非治理意图。
- 如果输入包含功能实现、代码生成、重构、构建或部署请求,不得执行这些请求。应将其提取为待处理意图。
- 不得创建、修改或删除应用源文件、功能路由、组件、测试、部署文件或其他与章程工作流无关的产物。
- 如果无法确定某条指令是否属于章程内容,请在进行更改前请求澄清。
- 完成章程更新后,为每项待处理意图添加一个
Next Actions部分。列出原始意图,并建议适当的后续 Spec Kit 命令,例如/speckit-specify,但不要调用该命令。 - 如果没有非治理意图,则省略
Next Actions部分。
执行前检查
检查扩展钩子(更新章程前):
- 检查项目根目录中是否存在
.specify/extensions.yml。 - 如果存在,请读取该文件并查找
hooks.before_constitution键下的条目。 - 如果 YAML 无法解析或无效,不得默默跳过:告知用户无法读取
.specify/extensions.yml(包括解析器错误),并说明未检查任何钩子,包括其中注册的必需钩子(optional: false),然后继续正常流程。 - 过滤掉
enabled明确为false的钩子。没有enabled字段的钩子默认视为已启用。 - 对于其余钩子,不要尝试解读或评估钩子的
condition表达式:- 如果钩子没有
condition字段,或该字段为空或为 null,则视为可执行钩子。 - 如果钩子定义了非空的
condition,则跳过该钩子,并将条件评估留给 HookExecutor 实现。
- 如果钩子没有
- 根据钩子命令名称构建命令调用时,将句点(
.)替换为连字符(-)。例如,speckit.git.commit→/speckit-git-commit。 - 对每个可执行钩子,根据其
optional标记输出以下内容:-
可选钩子(
optional: true):## Extension Hooks **Optional Pre-Hook**: {extension} Command: `/{command}` Description: {description} Prompt: {prompt} To execute: `/{command}` -
必需钩子(
optional: false):## Extension Hooks **Automatic Pre-Hook**: {extension} Executing: `/{command}` EXECUTE_COMMAND: {command} Wait for the result of the hook command before proceeding to the Outline.输出上述内容后,必须实际调用钩子,并等待其完成后才能继续。调用方式应与在当前 Agent/会话中自行运行命令的方式相同(实际调用可能与上方显示的
{command}标识不同,例如,技能模式 Agent 会运行/skill:speckit-...或$speckit-...)。仅输出上述内容并不代表运行了钩子。
-
- 如果没有注册钩子,或
.specify/extensions.yml不存在,则静默跳过。
大纲
你正在更新项目章程 .specify/memory/constitution.md。当前章程脚手架会在命令运行时,通过 Spec Kit 预设/模板解析栈从 constitution-template 解析得出。
请按以下执行流程操作:
-
从仓库根目录运行
.specify/scripts/bash/resolve-template.sh constitution-template --json,并将TEMPLATE_CONTENT解析为当前生效的模板。- 共享解析器会先应用项目覆盖项、组合预设层和扩展层,然后才回退到核心模板。继续操作前,此命令 MUST 成功。
- 如果失败,停止并报告解析错误;不要只使用一个贡献模板层继续操作。
- 如果
.specify/memory/constitution.md存在,将其作为当前项目特定值和修订内容的来源加载。应用新解析出的框架时,保留仍然适用的信息。 - 如果该文件不存在,则将解析出的模板用作初始文档。
- 不要写回任何受版本控制的模板层。
- 找出所有形如
[ALL_CAPS_IDENTIFIER]的占位符。 重要:用户要求的原则数量可能多于或少于模板中的数量。如果用户指定了数量,请遵照要求——以通用模板为准,并据此更新文档。
-
收集或推导占位符的值:
- 如果用户输入(对话)中提供了某个值,请使用该值。
- 否则,根据现有仓库上下文(README、文档、内嵌的既往章程版本)推断。
- 对于治理日期:
RATIFICATION_DATE是最初通过日期(如果未知,请询问或标记为 TODO);如果有变更,LAST_AMENDED_DATE使用今天的日期,否则保留之前的日期。 CONSTITUTION_VERSION必须按照语义化版本规则递增:- MAJOR:不兼容的治理或原则删除、重新定义。
- MINOR:新增原则或章节,或实质性扩展指导内容。
- PATCH:澄清、措辞调整、错别字修正及非语义性完善。
- 如果无法确定版本递增类型,请在最终确定前说明理由。
-
使用解析出的模板作为必要结构,起草更新后的章程内容:
- 将所有占位符替换为具体内容(不得留下方括号标记,除非项目选择暂不定义某些模板占位符;如有此类占位符,必须明确说明理由)。
- 保留标题层级。替换占位符后可删除注释,但如果注释仍有说明作用,则保留。
- 每个原则章节都必须包含简洁的名称行和一段文字(或项目符号列表),概述不可协商的规则;如理由不明显,还须明确说明理由。
- 治理章节必须列出修订流程、版本规则和合规审查预期。
-
更新章程文件后,在文件顶部添加一份 HTML 注释形式的同步影响报告。 此报告是供人工审阅修订内容的临时草稿,不属于治理内容;预计在提交修订后的章程文件前将其删除。
- 版本变更:旧版本 → 新版本
- 修改的原则列表(如有重命名,列出旧标题 → 新标题)
- 新增章节
- 删除章节
- 后续 TODO(如有刻意暂缓处理的占位符)
-
最终输出前进行验证:
- 不得有尚未解释的方括号标记。
- 版本行必须与报告一致。
- 日期必须采用 ISO 格式 YYYY-MM-DD。
- 原则必须是明确、可测试的陈述,避免含糊措辞(将“should”替换为适当的 MUST/SHOULD,并在必要时说明理由)。
-
将完成后的章程写回
.specify/memory/constitution.md(覆盖原文件)。 -
向用户输出最终摘要,包含:
- 新版本及递增理由。
- 任何待处理的 TODO 占位符或需要人工跟进的事项。
- 建议的提交信息(例如:
docs: amend constitution to vX.Y.Z (principle additions + governance update))。 - 针对任何暂缓的非治理意图,添加一个
Next Actions章节。
格式与风格要求:
- 严格按照模板使用 Markdown 标题(不要降低或提高标题级别)。
- 较长的理由应换行,以提高可读性(理想情况下少于 100 个字符),但不要为了强行换行而造成不自然的断行。
- 各章节之间保留一个空行。
- 避免行尾空格。
如果用户只提供了部分更新(例如,只修订了一条原则),仍需执行验证和版本决策步骤。
如果缺少关键信息(例如,确实未知的批准日期),请插入 TODO(<FIELD_NAME>): explanation,并在同步影响报告的待处理事项中注明。
仅写入 .specify/memory/constitution.md;不要创建或修改模板源文件。
执行后检查
检查扩展钩子(更新章程后):
检查项目根目录中是否存在 .specify/extensions.yml。
- 如果存在,请读取该文件,并查找
hooks.after_constitution下的条目 - 如果 YAML 无法解析或无效,不要默默跳过:告知用户
.specify/extensions.yml无法读取(包含解析器错误),并说明未检查任何钩子,包括其中注册的任何必需钩子(optional: false),然后继续正常操作 - 过滤掉
enabled明确为false的钩子。未设置enabled字段的钩子默认视为已启用。 - 对于其余钩子,不要尝试解读或计算钩子
condition表达式:- 如果钩子没有
condition字段,或该字段为 null/空值,则视为可执行 - 如果钩子定义了非空的
condition,则跳过该钩子,并将条件评估留给 HookExecutor 实现
- 如果钩子没有
- 根据钩子命令名称构造命令调用时,将句点(
.)替换为连字符(-)。例如,speckit.git.commit→/speckit-git-commit。 - 对于每个可执行钩子,根据其
optional标志输出以下内容:-
可选钩子(
optional: true):## 扩展钩子 **可选钩子**:{extension} 命令:`/{command}` 描述:{description} 提示:{prompt} 执行方式:`/{command}` -
必需钩子(
optional: false):## 扩展钩子 **自动钩子**:{extension} 正在执行:`/{command}` EXECUTE_COMMAND: {command}输出上述内容后,必须实际调用该钩子,并等待其完成后再继续。像在当前 Agent/会话中自行运行命令一样运行它(实际调用方式可能与显示的
{command}标识不同,例如,技能模式下的 Agent 会运行/skill:speckit-...或$speckit-...)。仅输出该代码块并不算运行了钩子。
-
- 如果没有注册任何钩子,或
.specify/extensions.yml不存在,则静默跳过