Read OSS

规格驱动工作流:模板如何指导 AI 智能体

中级

前置知识

  • 第 1 篇:架构与项目导航
  • 第 3 篇:集成系统(了解模板的处理方式)
  • YAML frontmatter 基础知识
  • 熟悉至少一种 AI 编程助手

规格驱动工作流:模板如何指导 AI 智能体

Spec Kit 真正的创新之处不在于 Python CLI,而在于 CLI 生成的那些 Markdown 文件。这 9 个命令模板是专门写给 AI 智能体的结构化指令。它们通过 YAML frontmatter 将完整的开发工作流编码为有向无环图(DAG),嵌入 shell 脚本调用来处理 AI 无法独立完成的文件系统操作,并设置钩子检查点供扩展注入额外行为。AI 智能体既是这些文档的读者,也是执行者。本文将带你深入了解这些文件的内部构造。

9 个斜杠命令与工作流 DAG

templates/commands/ 目录下共有 9 个 Markdown 文件,每个文件对应一个斜杠命令:

命令 用途 移交至
specify 根据描述创建功能规格 plan, clarify
plan 生成技术实现计划 tasks, checklist
tasks 将计划拆解为有序任务列表 analyze, implement
implement 执行任务列表中的任务
clarify 对模糊需求进行结构化澄清
analyze 跨制品一致性分析
constitution 创建或更新项目治理原则
checklist 生成质量验证检查清单
taskstoissues 将 tasks.md 转换为 GitHub Issues

YAML frontmatter 中的 handoffs 字段构建了一张 DAG:

flowchart TD
    specify["speckit.specify"] -->|"Build Technical Plan"| plan["speckit.plan"]
    specify -->|"Clarify Requirements"| clarify["speckit.clarify"]
    plan -->|"Create Tasks"| tasks["speckit.tasks"]
    plan -->|"Create Checklist"| checklist["speckit.checklist"]
    tasks -->|"Analyze Consistency"| analyze["speckit.analyze"]
    tasks -->|"Implement"| implement["speckit.implement"]

    constitution["speckit.constitution"]
    taskstoissues["speckit.taskstoissues"]

handoffs 不只是文档说明,它们是元数据。部分 AI 助手会将其渲染为可操作的按钮或建议。以 templates/commands/specify.md 中的 frontmatter 为例:

handoffs:
  - label: Build Technical Plan
    agent: speckit.plan
    prompt: Create a plan for the spec. I am building with...
  - label: Clarify Spec Requirements
    agent: speckit.clarify
    prompt: Clarify specification requirements
    send: true

send: true 字段表示该移交应自动触发,无需等待用户确认。这样一来,完成规格编写后可以直接进入规划阶段,流程自然流畅。

命令模板的结构解析

所有命令模板遵循相同的结构。下面以 templates/commands/plan.md 为例逐一说明:

flowchart TD
    subgraph "YAML Frontmatter"
        A["description: one-line summary"]
        B["handoffs: next-step commands"]
        C["scripts:<br/>  sh: scripts/bash/setup-plan.sh --json<br/>  ps: scripts/powershell/setup-plan.ps1 -Json"]
        D["agent_scripts:<br/>  sh: scripts/bash/update-agent-context.sh __AGENT__"]
    end
    subgraph "Body"
        E["## User Input<br/>{ARGS} placeholder"]
        F["## Pre-Execution Checks<br/>Hook system checkpoint"]
        G["## Outline<br/>Step-by-step instructions for the AI"]
        H["## Guidelines<br/>Quality constraints"]
    end
    A --> E
    C --> E

三种占位符各有其用途:

  • {SCRIPT} — 替换为 scripts.<type> 中的 shell 命令,供 AI 执行文件系统初始化操作
  • {ARGS} — 替换为各智能体对应的参数占位符(大多数用 $ARGUMENTS,Gemini 用 {{args}}
  • __AGENT__ — 替换为当前智能体名称,用于需要感知活跃智能体的脚本

正如第 3 篇所述,process_template() 流水线在初始化阶段会解析上述三种占位符,并从 frontmatter 中移除 scripts:agent_scripts: 块,确保最终输出整洁干净。

Shell 脚本:操作层的核心

AI 智能体能够读取文件、编写代码,但无法可靠地执行"扫描现有规格目录并确定下一个序号"这类结构化文件系统操作。这正是 shell 脚本存在的意义。

scripts/bash/create-new-feature.sh 是其中最关键的一个——它由 before_specify 钩子(通过 git 扩展)调用,用于创建带有序号的功能分支。它支持 --json 参数,输出机器可解析的结果:

JSON_MODE=false
# ... argument parsing ...
if [ "$JSON_MODE" = true ]; then
    echo "{\"BRANCH_NAME\":\"$BRANCH_NAME\",\"FEATURE_NUM\":\"$FEATURE_NUM\"}"
fi

--json 参数是所有脚本中反复出现的模式。命令模板会指示 AI 执行脚本、解析 JSON 输出,并将结果用于后续步骤。例如,check-prerequisites.sh 的输出如下:

{"FEATURE_DIR": "specs/003-user-auth", "AVAILABLE_DOCS": ["spec.md", "plan.md"]}
sequenceDiagram
    participant AI as AI Agent
    participant CMD as Command Template
    participant SH as Shell Script

    AI->>CMD: Read /speckit.tasks
    CMD->>AI: "Run: .specify/scripts/bash/check-prerequisites.sh --json"
    AI->>SH: Execute script
    SH->>AI: {"FEATURE_DIR": "...", "AVAILABLE_DOCS": [...]}
    AI->>AI: Parse JSON, locate spec artifacts
    AI->>AI: Generate tasks.md

所有脚本都同时提供 bash/powershell/ 两个版本。specify init 时通过 --script 参数决定将哪个版本安装到 .specify/scripts/。跨平台支持做到了彻底——每个 .sh 脚本都有行为完全一致的 .ps1 对应版本。

提示: --json 输出模式是将 AI 智能体与 shell 脚本结合使用的关键洞察。人类可读的输出便于调试,但 JSON 输出能让 AI 可靠地提取结构化数据,无需依赖正则解析。如果你正在构建类似的 AI 智能体工具,务必提供机器可解析的输出模式。

钩子系统:每个命令中的扩展点

每个命令模板都包含两个钩子检查点——一个在执行前,一个在执行后。以下是 specify.md 中的执行前检查:

## Pre-Execution Checks

**Check for extension hooks (before specification)**:
- Check if `.specify/extensions.yml` exists in the project root.
- If it exists, read it and look for entries under the `hooks.before_specify` key
- Filter out hooks where `enabled` is explicitly `false`
- For each executable hook, output based on its `optional` flag:
  - **Optional hook**: Present to user with prompt
  - **Mandatory hook**: Execute immediately via `EXECUTE_COMMAND: {command}`

这是一套以 AI 智能体为运行时的声明式插件系统。模板告诉 AI:"读取这个 YAML 文件,检查钩子,执行强制钩子,建议可选钩子。"实际的钩子逻辑定义在扩展清单中(如 git 扩展),并在安装扩展时合并到 .specify/extensions.yml

flowchart TD
    A["AI reads command template"] --> B{"extensions.yml exists?"}
    B -->|No| C["Skip hooks silently"]
    B -->|Yes| D["Parse hooks.before_{stage}"]
    D --> E{"Hook optional?"}
    E -->|Yes| F["Present to user:<br/>'Run /speckit.git.commit?'"]
    E -->|No| G["Execute immediately:<br/>EXECUTE_COMMAND: speckit.git.feature"]
    F --> H["User decides"]
    G --> I["Wait for result"]
    H --> J["Continue to main logic"]
    I --> J

钩子系统将在第 5 篇中详细介绍。这里需要关注的是:每个命令模板都包含 before_after_ 两个检查点,9 个命令共计 18 个潜在钩子点。git 扩展一项就使用了全部 18 个。

文档模板:约束 AI 输出的结构框架

除命令模板外,Spec Kit 还提供了文档模板,用于约束 AI 智能体的输出结构templates/spec-template.md 是其中最重要的一个,它定义了功能规格的结构:

# Feature Specification: [FEATURE NAME]

## User Scenarios & Testing *(mandatory)*

<!--
  IMPORTANT: User stories should be PRIORITIZED as user journeys ordered by importance.
  Each user story/journey must be INDEPENDENTLY TESTABLE
-->

### User Story 1 - [Brief Title] (Priority: P1)

该模板对 AI 施加了多项约束:

  1. 用户故事优先级排序 — 每个故事标注 P1/P2/P3 优先级,避免生成"一切都同等重要"的扁平列表
  2. [NEEDS CLARIFICATION] 标记 — 命令模板将其数量上限设为 3,迫使 AI 主动给出合理的默认值,而不是提出数十个问题
  3. 与技术无关的成功标准 — 例如"用户能在 3 分钟内完成结账",而非"API 响应时间低于 200ms"
  4. 必填与选填章节 — 部分章节必须填写,其余章节若不适用应直接删除,而非填写"N/A"

templates/plan-template.md 包含引用治理原则的"Phase -1 门控":

## Constitution Check

Language/Version: [e.g., Python 3.11]
Primary Dependencies: [e.g., FastAPI]

templates/constitution-template.md 则定义了治理框架的骨架——包括 Library-First、CLI Interface Mandate、Test-First Imperative 等核心原则,这些原则对所有生成的实现计划起到约束作用。

这些模板本质上是规模化的 prompt 工程。与其为每次交互精心设计提示词,不如将结构性约束直接嵌入模板,从而引导 AI 产出更高质量的结果,且这一效果与底层模型无关。正如 spec-driven.md 理念文档所言:这些模板"将 LLM 从一个自由创作者,转变为一名严谨的规格工程师。"

下一步

命令与模板定义了 AI 做什么。但如何新增命令?生命周期钩子又是如何接入工作流的?第 5 篇将深入介绍 Spec Kit 的两种可扩展机制:扩展(自定义命令 + 钩子)与预设(模板覆盖),并详细拆解内置 git 扩展与多目录发现系统的实现原理。