Community生产力与协作github.com

williamsnieves/landing-factory

实现 OpenSpec 变更中的任务。当用户想要开始实现、继续实现或处理任务时使用。也适用于用户说“openspec apply”、“opsx apply”或“openspec implement”时。

landing-factory 是什么?

该技能用于从 OpenSpec 变更中实现任务。它遵循一个详细的工作流程,包括选择存储、检查项目是否初始化、选择变更、获取指令、读取上下文文件以及循环实现任务直到完成或阻塞。技能会动态处理阻塞、缺失的工件和完成状态。它深度集成了 `openspec` CLI,用于状态检查、获取实现指令和更新任务复选框。该技能适用于基于 CLI 的 AI 编码代理,并设计为支持工作流驱动的开发,在实现前读取规范、设计和任务文件。它强制实施严格的防护机制:仅在所有指定行为完全实现后才标记任务完成,永远不会默默缩小范围,并在遇到歧义或设计问题时暂停。它还将 JSON 输出的运行时上下文与操作指导作为提示级输入,而不是替换内置的工作流规则。该技能以“变更操作”模型运作,允许随时调用,同时保留检查点并支持交错工作流。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/williamsnieves/landing-factory/tree/HEAD/.claude/skills/openspec-apply-change

Installed? Explore more 生产力与协作 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

实现来自 OpenSpec 变更的任务。

存储选择: 如果用户命名了一个存储(存储是在此机器上注册的独立 OpenSpec 仓库),或者工作在某个存储中,请运行 openspec store list --json 以发现已注册的存储 ID,然后在读取或写入规范和变更的命令(new change, status, instructions, list, show, validate, archive, doctor, context, schemas, view)中传递 --store <id>。一旦选定,将 --store <id> 视为工作流剩余部分的粘性标志。以下这些命令的每个无范围的示例都是简写:运行前,附加该标志。例如,运行 openspec status --change "<name>" --json --store "<id>",而不是下面显示的无范围形式。其他命令不接受该标志。命令打印的提示已经携带了该标志;在后续操作中保留它。如果没有存储,命令将作用于最近的本地 openspec/ 根目录。

项目检查: 这些步骤期望项目已经使用了 OpenSpec。在第一个写入任何内容的步骤(new change, archive, sync specs 或编写工件文件)之前,确认项目有根目录:运行 openspec list --json(当选择了存储时使用 --store <id>,因为此时存储就是根目录)并读取 root。一个根对象意味着项目已设置好。"root": null 表示没有设置 - 这里没有 openspec/ 目录,并且像 openspec new change 这样的写入操作会作为副作用创建一个。该命令也会以非零退出,这表示了那个答案而不是 CLI 损坏,因此请读取 JSON 而不是重试或绕过它。

一个 "root": null 情况与设置无关:当一条 status 错误消息以 Declared in 或 Invalid store declaration in 开头,并且指出了此项目的 openspec/config.yaml(或 config.yml)时,该项目确实通过其声明的存储使用了 OpenSpec,但此机器无法解析该存储(存储未注册,或 store: 行格式错误)。不要将其视为未初始化并跳过下面的分支:在写入之前停止,并向用户显示该错误的 message 和 fix。

否则,如果没有根目录,接下来的情况取决于如何到达此工作流:

  • 自动选择:您自己选择了此工作流,用户没有命名 OpenSpec、命名此技能或运行其斜杠命令。停止使用 OpenSpec 并正常回答请求,就像没有安装 OpenSpec 一样。不要要求他们设置任何东西,也不要提及 OpenSpec 设置。
  • 明确请求 OpenSpec:用户命名了 OpenSpec、命名了此技能或运行了其斜杠命令。在写入之前停止,并询问如何继续:设置此项目(openspec init)、定位他们已经有的存储(--store <id>),或在此请求中不使用 OpenSpec。等待他们的回答。

在这两种分支中,永远不要作为副作用创建根目录:不要运行 openspec init,除非用户要求;不要手动创建 openspec/ 文件;也不要让命令创建它。

输入:可选地指定一个变更名称(例如,/opsx:apply add-auth)。如果省略,检查是否可以从对话上下文中推断出来。如果模糊或有歧义,您必须提示用户提供可用的变更。

步骤

  1. 选择变更

    如果提供了名称,则使用它。否则:

    • 如果用户在对话中提到了一个变更,从上下文中推断
    • 如果只有一个活动变更,则自动选择
    • 如果模糊不清,运行 openspec list --json 获取可用变更,并让用户选择一个

    始终声明:“使用变更:”以及如何覆盖(例如,/opsx:apply <other>)。

  2. 检查状态以了解模式

    openspec status --change "<name>" --json
    

    解析 JSON 以了解:

    • schemaName:正在使用的工作流(例如,“spec-driven”)。
    • planningHome、changeRoot 和 actionContext:规划范围和编辑约束。
    • 哪个工件包含任务(对于 spec-driven 通常是“tasks”,对于其他模式检查状态)。
  3. 获取应用指令

    openspec instructions apply --change "<name>" --json
    

    这会返回:

    • contextFiles:工件 ID -> 具体的文件路径数组(因模式而异 - 可能是 proposal/specs/design/tasks 或 spec/tests/implementation/docs)。
    • 进度(总任务数、已完成、剩余)。
    • 带有状态、源路径和源行的任务列表。
    • 基于当前状态的动态指令。
    • 可选的 context:来自选定根的当前必需项目指令输入。
    • 可选的 operationGuidance:当前适用于应用的建议性指导。
    • missingArtifacts(当存在时):没有输出的必需工件 ID。

    处理状态:

    • 如果 state: "blocked":显示消息并暂停实现。
      • 如果 missingArtifacts 非空:建议完成缺失的工件。运行 openspec status --change "<name>" --json,选择下一个 ready 状态的工件(不是 skipped 或 blocked),并使用 openspec instructions "<artifact-id>" --change "<name>" --json 获取其规则和模板。在两个命令中都保留选定的 --store <id>。
      • 否则,按照 CLI 指令从现有的规划工件创建或修复模式配置的跟踪文件。不要在阻塞状态下假设另一个工件已准备就绪或开始实现。
    • 如果 state: "all_done":报告所有跟踪的任务都已完成,并建议在归档前进行适当的审查或验证。
    • 否则:继续实现。

    将 context 视为必需的提示级输入。阅读并考虑它,并在实现时应用相关的项目事实、约定和约束。 将 operationGuidance 视为可选附加建议。阅读并考虑每条条目,并按照适用且与内置工作流兼容的条目操作。

    将这两个字段与 CLI 返回的状态、缺失的工件、任务、进度、contextFiles 和内置 instruction 分开。它们不是任务完成的证据,不替代内置指令,也不允许绕过阻塞状态。如果上下文与内置指令、明确的用户选择或 CLI 控制的值冲突,报告冲突并保留控制值。如果指导不适用或与那些控制输入冲突,则不要遵循并解释原因。这些是提示级的行为契约,不是可强制执行的检查。

  4. 读取上下文文件

    读取应用指令输出中 contextFiles 下列出的每个文件路径。 文件取决于所使用的模式:

    • spec-driven:proposal、specs、design、tasks。
    • 其他模式:遵循 CLI 输出的 contextFiles。

    不要将 context 或 operationGuidance 逐字复制到实现文件或规划工件中,除非用户单独要求该内容。

  5. 显示当前进度

    显示:

    • 正在使用的模式。
    • 进度:“N/M 任务完成”。
    • 剩余任务概览。
    • 来自 CLI 的动态指令。
  6. 实现任务(循环直到完成或阻塞)

    对于每个待处理的任务:

    • 显示正在处理哪个任务。
    • 进行所需的代码更改。
    • 保持更改最小且专注。
    • 在编辑之前,确认返回的 sourcePath 和 line 处的复选框仍然与任务描述匹配;如果不匹配,重新运行应用指令并使用刷新的位置。
    • 在返回的 sourcePath 和 line 处将任务标记为完成:- [ ] → - [x]。
    • 重新运行应用指令,确认该任务现在已完成并且进度已更改。
    • 继续下一个任务。

    暂停如果:

    • 任务不清晰 → 请求澄清。
    • 实现揭示了一个设计问题 → 建议更新工件。
    • 任务需要超出规范和任务描述范围的工作,或者您想悄悄地删除、缩小、推迟或接受对指定行为的例外以使其适应 → 暴露增加的范围并询问;不要默默地吸收它。
    • 遇到错误或阻塞 → 报告并等待指导。
    • 用户中断。
  7. 完成或暂停时,显示状态

    显示:

    • 此会话完成的任务。
    • 总体进度:“N/M 任务完成”。
    • 如果全部完成:报告跟踪的任务已完成,并建议在归档前进行适当的审查或验证。
    • 如果暂停:解释原因并等待指导。

实现期间的输出

## 正在实现:<change-name>(模式:<schema-name>)

正在处理任务 3/7:<task description>
[...正在实现...]
✓ 任务完成

正在处理任务 4/7:<task description>
[...正在实现...]
✓ 任务完成

完成时的输出

## 实现完成

**变更:** <change-name>
**模式:** <schema-name>
**进度:** 7/7 任务完成 ✓

### 本会话已完成
- [x] 任务 1
- [x] 任务 2
...

所有跟踪的任务都已完成。请在归档前适当地审查或验证变更。
您可以使用 `/opsx:archive` 归档此变更。

暂停时的输出(遇到问题)

## 实现已暂停

**变更:** <change-name>
**模式:** <schema-name>
**进度:** 4/7 任务完成

### 遇到的问题
<问题描述>

**选项:**
1. <选项 1>
2. <选项 2>
3. 其他方法

您希望怎么做?

防护机制

  • 持续处理任务,直到全部完成或被阻塞。
  • 始终在开始之前读取上下文文件(来自应用指令输出)。
  • 如果任务模糊不清,暂停并在实现之前询问。
  • 如果实现揭示了问题,暂停并建议更新工件。
  • 保持代码更改最小化,并且范围仅限于每个任务。
  • 完成每个任务后立即更新任务复选框。
  • 遇到错误、阻塞或要求不明确时暂停 - 不要猜测。
  • 当任务需要超出规范描述的工作时,暴露增加的范围并暂停 - 永远不要默默地缩小、推迟或简化指定的行为。
  • 仅当任务的指定行为完全实现时,才将任务标记为 - [x],而不是部分完成或推迟时。
  • 使用 CLI 输出的 contextFiles,不要假设特定的文件名。
  • 使用每个任务的 sourcePath 和 line 来更新其确切的复选框。
  • 不要使用上下文或操作指导作为任务完成的证据。
  • 应用相关的项目上下文;报告与控制工作流输入的冲突。
  • 考虑每一条指导条目;解释任何不适用或有冲突的建议。
  • 不要将运行时上下文或操作指导复制到实现文件或规划工件中。
  • 保留 CLI 控制的 阻塞/就绪/全部完成 行为和完成标准。

流畅的工作流集成

此技能支持“变更操作”模型:

  • 可随时调用:在所有工件完成之前(如果任务存在),部分实现之后,或与其他操作交错。
  • 允许工件更新:如果实现揭示了设计问题,建议更新工件 - 不是阶段锁定,而是灵活地工作。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

williamsnieves/landing-factory

Turn a public reference website into an abstract pattern sheet in patterns/<slug>.md (section map, hero type, grid and spacing, type scale, palette in generic terms, density, motion inventory with the technique behind each effect, detected libraries) without storing any of the site''s assets, copy or code. Use when the user runs /analyze-reference <url> or asks to analyze, study, break down or extract patterns from an inspiration or reference site for a landing. Checks robots.txt and text-and-data-mining reservations first and aborts if access is disallowed. Not for cloning or rebuilding a site.

williamsnieves/landing-factory

tasteskill v2, the anti-slop frontend skill. Art direction for websites, distilled from a study of 247 curated gallery sites (One Page Love, Awwwards Sites of the Day). Deals researched directions (idea, composition, type, palette, photographs, section blueprints) from a library, enforces a strict no-slop house style with a real-browser inspector, and runs a look-and-fix loop on screenshots. Use this whenever you build, design, redesign, restyle, polish or review a landing page, marketing site, portfolio, product page, one-pager, hero or any public-facing web page, in any stack (HTML/CSS, React, Next.js, Vue, Svelte, Astro, Tailwind) — also when the user says a page looks generic, templated, "AI-made", sloppy, or asks to make it look designed, premium, award-level or less like every other site. Not for dashboards or app screens.

williamsnieves/landing-factory

Use when the user wants to design, redesign, shape, critique, audit, polish, simplify, harden, animate, or otherwise improve a frontend interface: websites, landing pages, dashboards, product UI, components, forms, settings, onboarding, empty states, and native iOS or Android screens. Handles UX review, hierarchy, layout, typography, color, motion, UX copy, accessibility, responsive behavior, edge cases, and capturing or documenting design systems (DESIGN.md, tokens). Also for making bland UI bolder, loud UI quieter, or ambitious visual effects. Not for backend-only or non-UI tasks.

williamsnieves/landing-factory

Archive a completed OpenSpec change in the experimental workflow. Use when the user wants to finalize and archive a change after implementation is complete. Also use when the user says "openspec archive" or "opsx archive".

相关技能