@openprd/cli 0.1.11 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.openprd/changes/adaptive-project-framing/.openprd.yaml +2 -0
- package/.openprd/changes/adaptive-project-framing/design.md +47 -0
- package/.openprd/changes/adaptive-project-framing/proposal.md +35 -0
- package/.openprd/changes/adaptive-project-framing/specs/agent-requirements/spec.md +16 -0
- package/.openprd/changes/adaptive-project-framing/task-events.jsonl +20 -0
- package/.openprd/changes/adaptive-project-framing/tasks.md +340 -0
- package/.openprd/changes/docs-anti-pollution-and-design-direction-review/.openprd.yaml +2 -0
- package/.openprd/changes/docs-anti-pollution-and-design-direction-review/design.md +34 -0
- package/.openprd/changes/docs-anti-pollution-and-design-direction-review/proposal.md +23 -0
- package/.openprd/changes/docs-anti-pollution-and-design-direction-review/specs/agent-requirements/spec.md +16 -0
- package/.openprd/changes/docs-anti-pollution-and-design-direction-review/task-events.jsonl +14 -0
- package/.openprd/changes/docs-anti-pollution-and-design-direction-review/tasks.md +238 -0
- package/.openprd/changes/loop-isolated-worktree-commit/.openprd.yaml +2 -0
- package/.openprd/changes/loop-isolated-worktree-commit/design.md +53 -0
- package/.openprd/changes/loop-isolated-worktree-commit/proposal.md +38 -0
- package/.openprd/changes/loop-isolated-worktree-commit/specs/agent-requirements/spec.md +16 -0
- package/.openprd/changes/loop-isolated-worktree-commit/task-events.jsonl +22 -0
- package/.openprd/changes/loop-isolated-worktree-commit/tasks.md +357 -0
- package/.openprd/changes/openprd/.openprd.yaml +2 -0
- package/.openprd/changes/openprd/design.md +46 -0
- package/.openprd/changes/openprd/proposal.md +36 -0
- package/.openprd/changes/openprd/specs/agent-requirements/spec.md +16 -0
- package/.openprd/changes/openprd/task-events.jsonl +23 -0
- package/.openprd/changes/openprd/tasks.md +242 -0
- package/.openprd/changes/pm-human-in-the-loop/.openprd.yaml +2 -0
- package/.openprd/changes/pm-human-in-the-loop/design.md +38 -0
- package/.openprd/changes/pm-human-in-the-loop/proposal.md +29 -0
- package/.openprd/changes/pm-human-in-the-loop/specs/agent-requirements/spec.md +16 -0
- package/.openprd/changes/pm-human-in-the-loop/task-events.jsonl +18 -0
- package/.openprd/changes/pm-human-in-the-loop/tasks.md +306 -0
- package/.openprd/changes/test-strategy-router/.openprd.yaml +2 -0
- package/.openprd/changes/test-strategy-router/design.md +65 -0
- package/.openprd/changes/test-strategy-router/proposal.md +45 -0
- package/.openprd/changes/test-strategy-router/specs/agent-requirements/spec.md +16 -0
- package/.openprd/changes/test-strategy-router/task-events.jsonl +1 -0
- package/.openprd/changes/test-strategy-router/tasks.md +132 -0
- package/.openprd/changes/verify-boundaries-and-historical-refresh/.openprd.yaml +2 -0
- package/.openprd/changes/verify-boundaries-and-historical-refresh/design.md +28 -0
- package/.openprd/changes/verify-boundaries-and-historical-refresh/proposal.md +23 -0
- package/.openprd/changes/verify-boundaries-and-historical-refresh/specs/agent-requirements/spec.md +16 -0
- package/.openprd/changes/verify-boundaries-and-historical-refresh/task-events.jsonl +11 -0
- package/.openprd/changes/verify-boundaries-and-historical-refresh/tasks.md +66 -0
- package/.openprd/changes/vibe-coding-dev-check/.openprd.yaml +2 -0
- package/.openprd/changes/vibe-coding-dev-check/design.md +37 -0
- package/.openprd/changes/vibe-coding-dev-check/proposal.md +28 -0
- package/.openprd/changes/vibe-coding-dev-check/specs/agent-requirements/spec.md +16 -0
- package/.openprd/changes/vibe-coding-dev-check/task-events.jsonl +18 -0
- package/.openprd/changes/vibe-coding-dev-check/tasks.md +306 -0
- package/.openprd/design/README.md +11 -6
- package/.openprd/design/README_EN.md +4 -1
- package/.openprd/design/active/asset-spec.md +6 -0
- package/.openprd/design/active/direction-plan.md +5 -5
- package/.openprd/design/active/selected-direction.md +2 -0
- package/.openprd/design/anti-slop.md +26 -1
- package/.openprd/design/assets/surface-presets.md +6 -0
- package/.openprd/design/checklists/ui-quality-gate.md +7 -0
- package/.openprd/design/lenses/frontend-lenses.md +28 -0
- package/.openprd/design/recipes/content-experience.md +8 -1
- package/.openprd/design/recipes/operational-tool.md +7 -0
- package/.openprd/design/recipes/product-launch.md +8 -1
- package/.openprd/design/templates/README.md +6 -3
- package/.openprd/design/templates/README_EN.md +6 -3
- package/.openprd/design/templates/ops-dashboard.html +8 -1
- package/.openprd/design/templates/product-launch.html +2 -1
- package/.openprd/design/themes/theme-catalog.json +23 -5
- package/.openprd/engagements/active/prd.md +103 -100
- package/.openprd/standards/config.json +7 -1
- package/AGENTS.md +13 -3
- package/README.md +107 -14
- package/README_EN.md +131 -13
- package/package.json +1 -1
- package/scripts/dev-check-wrapup-copy.mjs +46 -21
- package/skills/openprd-diagram-review/SKILL.md +27 -2
- package/skills/openprd-diagram-review/references/explanation-svg-patterns.md +131 -0
- package/skills/openprd-discovery-loop/SKILL.md +2 -2
- package/skills/openprd-frontend-design/SKILL.md +44 -20
- package/skills/openprd-frontend-design/references/design-asset-contract.md +6 -0
- package/skills/openprd-frontend-design/references/direction-engine.md +29 -4
- package/skills/openprd-harness/SKILL.md +22 -16
- package/skills/openprd-quality/SKILL.md +10 -8
- package/skills/openprd-requirement-intake/SKILL.md +2 -0
- package/skills/openprd-router/SKILL.md +2 -1
- package/skills/openprd-shared/SKILL.md +26 -16
- package/skills/openprd-standards/SKILL.md +4 -2
- package/src/agent-canonical-content.js +808 -0
- package/src/agent-integration.js +258 -777
- package/src/canvas-app.html.js +2910 -0
- package/src/canvas-i18n.js +274 -0
- package/src/canvas-workspace.js +2271 -0
- package/src/cli/args.js +72 -4
- package/src/cli/basic-print.js +3 -0
- package/src/cli/canvas-print.js +106 -0
- package/src/cli/doctor-print.js +20 -0
- package/src/cli/print.js +2 -0
- package/src/cli/quality-commands.js +222 -0
- package/src/cli/quality-print.js +28 -2
- package/src/cli/run-print.js +5 -0
- package/src/cli/workflow-print.js +3 -0
- package/src/codex-app-server-relay.js +251 -0
- package/src/codex-hook-runner-template.mjs +957 -59
- package/src/design-starter-support.js +2 -2
- package/src/design-starter.js +39 -3
- package/src/dev-standards.js +125 -10
- package/src/diagram-core.js +6 -20
- package/src/discovery.js +2 -8
- package/src/docs-compact.js +125 -0
- package/src/execution-strategy.js +1 -1
- package/src/fleet.js +9 -3
- package/src/guide.js +227 -0
- package/src/html-artifacts.js +428 -7
- package/src/knowledge.js +45 -11
- package/src/language-policy.js +63 -3
- package/src/learning-review.js +1 -1
- package/src/loop.js +1 -1
- package/src/openprd.js +68 -131
- package/src/openspec/change-validate.js +2 -2
- package/src/openspec/constants.js +6 -7
- package/src/openspec/execute.js +2 -2
- package/src/openspec/generate.js +318 -102
- package/src/openspec/migration.js +168 -0
- package/src/openspec/paths.js +1 -22
- package/src/prd-core.js +1 -1
- package/src/quality-visual-review.js +257 -14
- package/src/quality.js +46 -8
- package/src/review-presentation.js +60 -0
- package/src/run-harness.js +41 -3
- package/src/session-evidence.js +363 -0
- package/src/standards.js +64 -0
- package/src/test-strategy.js +7 -4
- package/src/visual-compare-centering.js +622 -0
- package/src/visual-compare-core.js +1123 -0
- package/src/visual-compare.js +620 -698
- package/src/workspace-core.js +94 -4
- package/src/workspace-workflow.js +46 -1
package/src/agent-integration.js
CHANGED
|
@@ -5,9 +5,11 @@ import crypto from 'node:crypto';
|
|
|
5
5
|
import os from 'node:os';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
import { spawnSync } from 'node:child_process';
|
|
8
|
+
import { CANONICAL_COMMANDS, CANONICAL_SKILLS, renderCommandCatalog } from './agent-canonical-content.js';
|
|
8
9
|
import { renderApprovedBenchmarkRegistrySection } from './benchmark.js';
|
|
9
10
|
import { timestamp } from './time.js';
|
|
10
11
|
import { upsertWorkspaceRegistryEntry } from './workspace-registry.js';
|
|
12
|
+
import { readOperationalGitignoreStatus } from './workspace-core.js';
|
|
11
13
|
|
|
12
14
|
const PACKAGE_ROOT = path.resolve(fileURLToPath(new URL('..', import.meta.url)));
|
|
13
15
|
const OPENPRD_AGENT_TOOLS = ['codex', 'claude', 'cursor'];
|
|
@@ -25,6 +27,7 @@ const OPENPRD_HARNESS_DIR = cjoin('.openprd', 'harness');
|
|
|
25
27
|
const OPENPRD_HARNESS_EVENTS = cjoin(OPENPRD_HARNESS_DIR, 'events.jsonl');
|
|
26
28
|
const OPENPRD_HARNESS_HOOK_STATE = cjoin(OPENPRD_HARNESS_DIR, 'hook-state.json');
|
|
27
29
|
const OPENPRD_HARNESS_MANIFEST = cjoin(OPENPRD_HARNESS_DIR, 'install-manifest.json');
|
|
30
|
+
const OPENPRD_HARNESS_RUNTIME_ENVIRONMENT = cjoin(OPENPRD_HARNESS_DIR, 'runtime-environment.json');
|
|
28
31
|
const OPENPRD_HARNESS_DRIFT = cjoin(OPENPRD_HARNESS_DIR, 'drift-report.json');
|
|
29
32
|
const LEGACY_CODEX_HOOK_OUTPUT_FIELDS = ['should_stop', 'additional_contexts', 'should_block', 'block_reason'];
|
|
30
33
|
const OPENPRD_GENERATED_MARKER = 'OPENPRD:GENERATED';
|
|
@@ -51,790 +54,184 @@ const OPTIONAL_CAPABILITY_REGISTRY = [
|
|
|
51
54
|
},
|
|
52
55
|
];
|
|
53
56
|
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
'',
|
|
61
|
-
'
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
'',
|
|
65
|
-
|
|
66
|
-
'
|
|
67
|
-
'
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
'
|
|
71
|
-
'
|
|
72
|
-
'',
|
|
73
|
-
'
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
'-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
'
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
'-
|
|
83
|
-
'-
|
|
84
|
-
'
|
|
85
|
-
'',
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
'-
|
|
89
|
-
|
|
90
|
-
'
|
|
91
|
-
'-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
'',
|
|
105
|
-
'## 核心判断',
|
|
106
|
-
'',
|
|
107
|
-
'- 先接住 `$openprd-requirement-intake` 的需求类型,再按风险、触达面、失败后果和证据成本选择测试组合。',
|
|
108
|
-
'- 不把“小需求=单测、中需求=集成、大需求=端到端”写成硬规则;它只是默认起点。',
|
|
109
|
-
'- 70/20/10 只作为健康形状参考,不作为 OpenPrd 的硬性比例门禁。',
|
|
110
|
-
'- 脚本存在只能说明项目具备能力,不能替代本次执行证据。',
|
|
111
|
-
'',
|
|
112
|
-
'## 默认分流',
|
|
113
|
-
'',
|
|
114
|
-
'- 局部纯逻辑、格式化、解析、规则函数:优先 `test-layer: unit`,`test-size: small`,`test-scope: isolated`。',
|
|
115
|
-
'- 触达 CLI/API/Agent 契约、生成物、跨模块状态、任务推进、quality/run/loop:使用 `unit, integration`,`test-size: medium`,`test-scope: cli-contract|api-contract|module`。',
|
|
116
|
-
'- 触达用户主路径、页面、发布链路、真实浏览器、登录权限或第三方依赖:升级到 `integration, e2e`,`test-size: large`,`test-scope: user-flow`。',
|
|
117
|
-
'- 触达视觉还原:补 `visual` 或 `visual-flow`;已有参考图时用 `openprd visual-compare --reference/--actual` 留证据;没有参考图时先判断新建界面还是修改既有界面,新建界面先按用户目标、信息架构和视觉决策成本判断是否需要 3 方向方案评审,修改既有界面用 `openprd visual-compare --before/--after` 留修改前后自检证据;局部细节优先补“局部焦点证据板”,多方向实验优先补“并行实验证据板”。',
|
|
118
|
-
'- 明确要求微信小程序运行态证据,或改动高风险且只能靠真实运行态确认时:补 `weapp` 和 `weapp-runtime`,并使用当前环境已配置的本地小程序验证能力;默认沿用当前小程序运行态或开发者工具会话连续验证,不要为了验证自动重开应用;普通小改默认先选更轻的验证,不要自动升级到小程序运行态验证。',
|
|
119
|
-
'- 触达性能、成本、额度、并发、滥用、安全、敏感信息:增加 `performance` 或 `security` 专项验证和负向场景。',
|
|
120
|
-
'- 纯文档或治理任务:使用 `manual`,并记录标准校验、review、change validate 或人工审查证据。',
|
|
121
|
-
'',
|
|
122
|
-
'## 任务元数据',
|
|
123
|
-
'',
|
|
124
|
-
'OpenSpec 任务可以显式写入:',
|
|
125
|
-
'',
|
|
126
|
-
'```md',
|
|
127
|
-
'- test-layer: unit|integration|e2e|manual|smoke|visual|performance|security|weapp|none',
|
|
128
|
-
'- test-size: small|medium|large|manual|advisory|none',
|
|
129
|
-
'- test-scope: isolated|module|contract|cli-contract|api-contract|user-flow|visual-flow|weapp-runtime|performance|security|governance|docs|none',
|
|
130
|
-
'- evidence-plan: 说明本任务准备留下什么验证证据',
|
|
131
|
-
'- evidence: 本次已经产生的证据路径或摘要',
|
|
132
|
-
'- waiver-reason: 不做某层测试时的原因和剩余风险',
|
|
133
|
-
'```',
|
|
134
|
-
'',
|
|
135
|
-
'## 收尾要求',
|
|
136
|
-
'',
|
|
137
|
-
'- loop 单任务完成时,阶段性测试报告必须包含测试策略、执行命令、结果和证据路径。',
|
|
138
|
-
'- `openprd quality . --verify` 应能看到分层测试策略矩阵;缺少本次证据时只能写需补证据,不能宣称已验证。',
|
|
139
|
-
'- 如果策略被升级或豁免,把原因写进 `upgrade-reason` 或 `waiver-reason`,方便后续 review。',
|
|
140
|
-
'',
|
|
141
|
-
].join('\n'),
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
id: 'openprd-requirement-intake',
|
|
145
|
-
sourceSkill: 'openprd-requirement-intake',
|
|
146
|
-
description: 'OpenPrd 需求入口与 PRD 分流 skill:判断用户可见需求类型和内部 L0/L1/L2 路由码,决定直接澄清、mini-plan 或正式 PRD,并选择通用 / 面向个人消费者场景 / 面向企业服务场景 / 以 Agent 为主要使用场景的 PRD 视角。对用户复述时不要直接把 consumer / b2b / agent 当展示词;这些枚举值只用于内部记录和命令。',
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
id: 'openprd-frontend-design',
|
|
150
|
-
sourceSkill: 'openprd-frontend-design',
|
|
151
|
-
description: 'OpenPrd 前端设计框架 skill:为界面、页面、视觉、样式和前端体验任务提供设计资产框架、前置门禁和实现前方向评审规则。',
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
id: 'openprd-shared',
|
|
155
|
-
description: 'OpenPrd 工作区、语言规则、门禁和 workspace-first 推理的共用守则。',
|
|
156
|
-
body: [
|
|
157
|
-
'# OpenPrd Shared',
|
|
158
|
-
'',
|
|
159
|
-
'这份规则集适用于所有 OpenPrd 工作。',
|
|
160
|
-
'',
|
|
161
|
-
'## 优先读取',
|
|
162
|
-
'',
|
|
163
|
-
'- `.openprd/state/current.json`',
|
|
164
|
-
'- `.openprd/state/task-graph.json`',
|
|
165
|
-
'- `.openprd/harness/install-manifest.json`',
|
|
166
|
-
'- `.openprd/harness/hook-state.json`',
|
|
167
|
-
'- `docs/basic/`',
|
|
168
|
-
'',
|
|
169
|
-
'## 运行规则',
|
|
170
|
-
'',
|
|
171
|
-
'- 动手前先从 `.openprd/` 重建上下文。',
|
|
172
|
-
'- 选择写入命令前,优先运行 `openprd status .` 和 `openprd next .`。',
|
|
173
|
-
'- 用户可见文档、进度日志、proposal、prompt、报告,以及 Agent 产出的 spec 和 tasks 默认使用简体中文;只保留必要专有名词、品牌名、命令名、路径、字段名和 API 术语。',
|
|
174
|
-
'- OpenPrd 自身及随包 workspace / template / skill README 默认把简体中文放在 `README.md`,英文放在 `README_EN.md`;如需兼容旧链接,可保留 `README_CN.md` 作为跳转入口。',
|
|
175
|
-
'- 当 `locale` 为 `zh-CN` 时,diagram contract 中所有可见字段都必须使用简体中文;面向用户的 review.html 或 diagram HTML 文案不要使用 `freeze` 这类内部流程词,改写为“需求定稿前”“进入实现前确认”等业务可理解表达。',
|
|
176
|
-
'- OpenPrd 用户默认懂业务和产品,但不想读技术黑话;对外输出先给结论和下一步,能一句讲清楚就不要拆成两步。',
|
|
177
|
-
'- 主动替用户补全范围边界、失败路径、恢复路径、实现成本、维护成本、滥用风险和第三方依赖;默认按性价比选方案。',
|
|
178
|
-
'- 涉及第三方 API、模型、云服务或付费工具时,用表格比较效果、价格、接入成本、限制、风险和推荐理由;用户明确质量优先时,提高质量和稳定性权重。',
|
|
179
|
-
'- 当用户的问题包含多个对象、方案、文件、场景、风险、验证项、素材或任务,并且需要同时呈现状态、证据、影响、动作或推荐时,Agent 应主动使用 Markdown 表格,不等用户要求。先用一句话给结论,再给表格。',
|
|
180
|
-
'- 表格优先用于方案对比、状态盘点、问题排查、风险审查、多对象 QA、文件/命令清单、需求场景覆盖和内容/素材规划;单一结论、单一动作、代码示例、命令示例和叙事型说明不要强行表格化。',
|
|
181
|
-
'- 面向用户的时间统一使用上海时区 `YYYY-MM-DD HH:mm:ss` 格式,不带 `T`、`Z` 或毫秒。',
|
|
182
|
-
'- 保持未解决假设可见,不要悄悄补脑。',
|
|
183
|
-
'- 对于 L2、脑暴或仍在判断值不值得做的 0 到 1 需求,默认再补一层“创业验证闭环”:第一批最容易触达的人群/社区、你为什么算这个社区里的自己人、当前替代方案和痛点证据、先不做完整产品时的手工路径、能否先用 spreadsheet / 表单 / no-code 跑起来、如果必须开始做产品也只自动化最重复的一步并先压成 forms / lists / CRUD 骨架、什么真实承诺才算真需求、有没有 10 个样本和更强付费信号、最低成本验证动作、达到什么条件才允许产品化,以及验证阶段怎样先活下来、增长阶段守什么纪律,以及这是不是你愿意长期住进去、不会反过来绑住自己的业务形态。',
|
|
184
|
-
'- 项目基线文档路径只能是 `docs/basic/`。',
|
|
185
|
-
'- 声称就绪前,至少通过 `openprd validate .` 和 `openprd standards . --verify`。',
|
|
186
|
-
'- 实现就绪还要运行 `openprd quality . --verify`,并审阅 HTML 质量评估报告中的场景标签、必需 EVO 门禁、可观测性、业务护栏、评估执行环境、性能和知识缺口。L2 或跨页面实现的最终回复必须带上最新 HTML 质量报告和 task-scoped 测试报告路径;缺失时只能说“实现完成但项目级收口未完成”。',
|
|
187
|
-
'- 用户要求生成图片、封面图、配图、海报、插画、图标、贴纸、头像、banner、主视觉/KV、运营图、效果图、视觉稿、mockup、先看样子或先确认设计方向时,默认直接调用 `imagegen`,也就是 Codex 原生 Image 2,产出图片;对 logo、icon、avatar、badge 等开发素材,如果用户未明确要求 mockup、场景图、设备框、卡片承载、名片/包装展示或参考界面复刻,默认按独立素材输出(standalone asset)处理:使用全画布单主体,不额外添加 UI frame、卡片、设备壳、名片、桌面陈列、手持实拍或其他展示容器。只有当用户明确要求 mockup、场景化效果图、容器化呈现,或参考图本身包含这些结构时,才生成对应容器或场景;除非用户明确指定 HTML、SVG、CSS、Canvas、代码稿或可编辑矢量/source artifact,不要改用临时 HTML/SVG/CSS 再截图。只有实际发生 `imagegen` 调用后,才能汇报生图结果、失败或限流。生图结果先当候选效果图,不要默认登记到 `.openprd/harness/visual-reviews/`;如果用户还要继续做实现,主动确认是否符合预期、是否纳入后续效果图/实现截图对比、以及是否按此继续实现。',
|
|
188
|
-
'- OpenPrd 的 `review.html` 用于需求评审,不能替代图片或效果图生成;`visual-compare` 只用于实现阶段视觉证据:已有确认参考图时对比“效果图 / 实现截图”;没有参考图时先判断新建界面还是修改既有界面,新建界面回到实现前 3 方向方案评审,修改既有界面再对比“修改前 / 修改后”;当局部细节更重要时,优先改用 `--board` 生成“局部焦点证据板”;当并行跑了多个优化方向时,优先改用 `--board` 生成“并行实验证据板”。当参考图是一张整板、网格图、多对象或多子图组合时,先运行 `openprd visual-prepare` 生成 reference-set、contact sheet 和 board 模板,再进入实现对比。',
|
|
189
|
-
'- 大界面改动在需求分流后、PRD 定稿或实现开工前先做视觉方案评审。先判断这是不是会决定首屏、核心布局、信息架构、主视觉或关键路径的场景,而不是按关键词触发;已有界面时用 Codex Computer Use 进入产品内对应功能并截当前真实界面,冷启动没有现有界面时基于已确认 PRD、用户群体、第一版切片和视觉目标生成设计 brief。再调用 `imagegen`(Codex 原生 Image 2)生成至少 3 个不同设计思想方向;把效果图横向拼成一张带 1/2/3 序号的大图,先作为候选效果图展示给用户。只有用户确认纳入后续对比或继续实现后,才把选定方向、整张图或其中子图整理到 `.openprd/harness/visual-reviews/` 并进入实现。',
|
|
190
|
-
'- 界面、页面、视觉、样式或前端体验开发中,只要已经有效果图、设计稿、图片资产或用户给图并进入实现阶段,阶段性完成后必须先截实现图,再运行 `openprd visual-compare . --reference <效果图> --actual <实现截图>` 生成左右对比 JPG。左侧标注“效果图”,右侧标注“实现截图”;如果这次要审局部细节,就补一份 `--board <focus-board.json>` 的局部焦点证据板。如果一张参考图里有多个子图、网格或对象,先运行 `openprd visual-prepare . --reference <效果图> --grid <列>x<行>` 或 `--boxes <plan.json>`,确认 contact sheet 后再逐项对比。Agent 必须查看合成图并继续对标,直到没有明显视觉差异;如果用户后续说“跟效果图”“不一致”“好丑”“复刻”,至少先产出一份视觉证据图,不能只凭主观判断宣称完成。',
|
|
191
|
-
'- 界面、页面、视觉、样式或前端体验开发中,如果没有明确效果图、设计稿、图片资产或用户给图,要先判断这是新建界面还是修改既有界面:新建界面走实现前 3 方向方案评审;修改既有界面则动手前必须先用 Computer Use、Browser、Playwright 或项目现有工具截取修改前截图。完成后用同一入口、视口、账号和数据状态截取修改后截图,再运行 `openprd visual-compare . --before <修改前截图> --after <修改后截图>`。如果这次并行试了多条优化方向,再补一份 `--board <parallel-board.json>` 的并行实验证据板。Agent 必须查看合成图,确认预期变化出现且未改区域没有明显漂移。',
|
|
192
|
-
'- 界面任务进入实现前,先用 `.openprd/design/` 锁定设计框架:页面涉及具体产品事实、版本、发布时间、规格、价格、引用数据或地点事实时,先补 `.openprd/design/active/facts-sheet.md`;页面依赖 logo、产品图、UI 图、摄影图、插图、图表或品牌色字体时,先补 `.openprd/design/active/asset-spec.md`;旅游、展览、内容、案例、发布、品牌故事等内容型页面,要先判断真实图片是不是页面成立前提,必要时先补 `.openprd/design/active/image-preflight.md`;没有明确参考方向时,先补 `.openprd/design/active/direction-plan.md`,并确保 3 个方向来自不同生成逻辑;用户选定方向后,再补 `.openprd/design/active/selected-direction.md`,把选中的 lens、theme、layout、组件和风险锁定。如果用户已经给了效果图、设计稿、参考截图或其他明确参考图,先把它当成主参考源:只有现有 starter、theme、layout 足够接近时才复用,不接近就允许偏离默认组合,以参考图为准。空白工作区的静态原型优先从 `.openprd/design/templates/` 里挑最近模板;如果当前轮用户已经把页面主题、模块范围或“直接实现”的意图说清,优先运行 `openprd run . --context --message <用户原话>`。如果页面主题和模块范围已经明确,优先运行 `openprd design-starter . --starter <starter-id> --out index.html --brief "<页面主题>" --sections "<模块1|模块2|模块3>"`,让 starter 一次写实 active design artifacts 和第一版真实页面。只有像个人博客、工具台、纯结构化产品页这类确认不靠真实图片成立的页面,才在 active design artifacts 写清无依赖并补 `--no-external-facts --no-brand-assets --no-real-images`;若题目更像旅游、导览、展览、博物馆、城市、自然观察或案例内容页,先不要带 `--no-real-images`,让 starter 先尝试补首批真实图片;若这类冷启动即使带 message 仍短暂返回 `clarify-user`,把它当成摘要级提醒,先用 3 到 5 行 mini-plan 收口,再继续。starter 落地后默认进入 `Patch Mode`:必须直接在生成的入口文件上补丁修改;即使结构要大改,也是在同一路径内覆盖,不做 delete-first,更不要删除 `index.html` 后另起新稿。如果确实要整页重写,先把完整新稿写到 sibling draft,例如 `index.next.html`,确认内容成形后再覆盖回 `index.html`,不要让正式入口出现空窗。starter 一落地后,只允许做一轮就地对焦:快速读一次生成的入口文件和必要的 active design artifacts;这轮对焦结束后,下一步就必须是真实写入口,不要再回头搜网页、翻 `docs/basic/` 或继续模板漫游。把最后一批必要的查事实、查图、读模板动作放在口头宣布之前做完;一旦已经说“开始覆盖入口文件”或“开始整页重写”,下一步必须出现真实写文件动作,而不是继续只读浏览、压图或停在口头承诺;必要时 hook 会把这类非写入动作挡回去。`Patch Mode` 完成不等于只补合同、只下载素材或只写计划;至少要把入口文件本体改完、主要占位清掉,并把已准备好的真实图片或参考约束真正落进页面。',
|
|
193
|
-
'- 看到生成文件疑似过期时,先运行 `openprd doctor .`。',
|
|
194
|
-
'- `.openprd/harness/install-manifest.json` 里的 `optionalCapabilities` 用来记录非阻断式增强建议:如果当前任务明显受益但状态还是 `recommended`,在后续建议里说明它能帮什么、给出文档和 GitHub 链接,并可顺手提出“如果你愿意,我可以按当前客户端帮你补配置”;不要因为它未配置就阻断当前任务。',
|
|
195
|
-
'- 前端体验任务进入实现前,优先读取 `$openprd-frontend-design` 与 `.openprd/design/`,先锁定 lens、theme、layout 和组件,再决定是否实现。',
|
|
196
|
-
'- `openprd run . --context` 只是建议。规划、分析、review、影响范围说明等请求保持只读,除非当前用户消息明确要求开发、实现、继续任务、深度调研、对标复刻或 commit/push。',
|
|
197
|
-
'- 用户给出会话 ID 并要求继续时,按工具无关的历史会话精确续接;不要要求或使用工具专属 ID;当前 active change、相似历史或 requirement gate 只能作为背景,不能替代该会话 ID。',
|
|
198
|
-
'- 代码修改完成后、最终回复前,针对本轮实际 touched code files 运行 `openprd dev-check . <file...>` 或 `node scripts/openprd-dev-check.mjs . <file...>`;700 行以内正常,701-1500 行需注意,超过 1500 行警告。若出现需要关注的文件,最终回复必须以 **后续建议** 为标题,直接复用 dev-check 生成的 Markdown 表格,列出影响对象、关注程度、规模信号、预警原因、本次处理结果和后续建议,并按 🔴 → 🟠 → 🟡 排序;不要把“关注程度”列改写成纯 emoji,必须保留例如 `🟠 中风险|建议优先关注` 这类完整标签;如果你改写了“预警原因 / 本次处理结果 / 后续建议”,先用 `node scripts/dev-check-wrapup-copy.mjs --validate` 校验每格不超过 20 字;若报错,按提示缩短后重试。',
|
|
199
|
-
'- 执行中发现可沉淀项时,不要中途打断当前任务:代码扩展识别这类白名单工具补全会自动应用并记录;用户偏好、项目协作规矩和 OpenPrd 默认行为先沉淀为 `.openprd/growth` 候选,收工时再集中运行 `openprd grow . --review` 请用户确认。',
|
|
200
|
-
'- 维护 OpenPrd 本身时,只要新增或修改配置类能力(阈值、规则、识别、豁免、命令别名、环境差异、用户偏好或策略开关),都要做 grow-aware 自检:高置信应可成长时默认纳入 `openprd grow`;不确定时主动问用户;明确一次性或固定规则时才保持静态配置。',
|
|
201
|
-
'- 只要实现新增或修改文件,就做文档影响检查;缺失的 `docs/basic/`、文件说明书和文件夹 README 要补齐,已有文档受影响时要更新。',
|
|
202
|
-
'- 涉及后端、脚本、Agent、工具链、服务或数据处理变更时,把 CLI 与 API 视为同级接入面:检查命令入口、参数、输出契约、`help`、`doctor`、`dry-run`、`status` 与接口协议、返回结构、身份边界是否受影响,并同步更新 `docs/basic/backend-structure.md`;若某一面不适用也要明确写原因。',
|
|
203
|
-
'- Codex hooks 默认使用 `lite`:`UserPromptSubmit` 注入上下文、轻量 `PreToolUse` 写入门禁,以及 `Stop` 本轮收工回顾。若发现可复用的项目经验,`Stop` 会要求 Agent 在最终回复结尾用人话说明“本次观察到的情况 / 计划保留的项目经验 / 以后怎么复用 / 只保留在当前项目里”,再询问用户是否保留;只有项目明确需要更重的工具级遥测时,才切到 `full`。',
|
|
204
|
-
'- 需求分流优先使用 `$openprd-requirement-intake`,不要按固定关键词判断。用户可见需求类型和内部路由码的固定对照为:直接处理=L0、现有功能优化=L1、新功能/新流程方案=L2。用户审查默认把路由码并进“需求类型:直接处理(L0)”这类标签里;只有内部排障确实受益时,才额外附“内部路由码”。L0 可直接处理并事后说明,不打开正式 PRD/review/change/tasks;L1 先给对话内 mini-plan,默认不生成正式 PRD/change/tasks;只有 L2 才进入 requirement intake 与 PRD/review/change/tasks。L2 的对话内 requirement 摘要默认按“需求判断 / 需求理解 / 功能范围 / 技术方案”四段来写,其中“功能范围”和“技术方案”优先用 Markdown 表格,帮助用户先总后分地看清范围和实现方向;`需求判断` 和 `需求理解` 先用 1 到 2 句轻量主句说清这次是什么、核心问题和第一版目标,边界、风险、异常例子和技术细节下沉到后面的分项或表格,不要把它们都塞进一整段长话里,也不要把某条示例文案写成固定模板。若当前仍是 0 到 1 探索、脑暴或值不值得做的判断,摘要里还要主动补上“验证与创业闭环”:第一批最容易触达的社区或种子用户、你为什么算这个社区里的自己人、当前替代方案和痛点证据、先怎么手工交付、手工作战卡怎么写、能不能先用 spreadsheet / 表单 / no-code 跑起来、如果必须开始做产品也只自动化最重复的一步并先压成 forms / lists / CRUD 骨架、第一版只做哪一件事、能不能压成周末级 MVP、第一批客户路径、从第一个客户开始怎么收费、客户 1 如何打平成本、有没有 10 个样本和更强付费信号、达到什么条件才允许产品化、增长阶段守什么纪律、这条路是否可逆、是否真在解决客户问题、以及是否符合团队价值观、是不是你愿意长期住进去的业务形态。如果用户刚刚已经确认了现有功能优化(L1)的 mini-plan、范围边界或正式产品边界,后续承接要明确写成“已确认,我按这个继续/收口/落地”,不要用“确认,我们就按这个……”这类像再次索取确认的句子。单纯的“请帮我实现/继续实现”不等于跳过 requirement 摘要确认、`capture/classify/synthesize` 写入路径或 review;只有用户明确表示“不需要进行任何确认”时,才允许静默走完整 requirement write path。若当前仍在 L2 的首轮澄清或 requirement 摘要确认阶段,不要写成“你回我一句我就开始实现”;只能承诺“我先整理需求摘要给你确认,确认后再进入 PRD / review 流程”。如果用户的下一条回复只是承接上一轮 requirement 摘要的短跟进,而不是提出新范围、改目标或重新发起分析请求,就把它当成对上一轮摘要、默认方向或选项的继续确认,不要重新开一轮泛化 clarify;应直接按当前对话上下文把已确认事实用 canonical capture 路径、`user-confirmed` 来源写回,而不是继续写 `agent-inferred/project-derived` 的用户澄清字段。若用户原始意图已经明确要求实现,review 已确认且 tasks 就绪后可直接进入执行;否则在请求执行授权前,先输出执行确认清单,列出本轮目标、将执行内容、不做事项、验证方式和已知风险,不能只要求用户回复一句确认。',
|
|
205
|
-
'- 涉及最佳实践、benchmark、对标、参考产品、prompt engineering、Agent harness、context engineering、图标资源、CLI 或 skill 体系设计时,先使用 `$openprd-benchmark-router` 选择证据源,再进入 Context7、DeepWiki 或官方资料调研。',
|
|
206
|
-
'- 入口路由优先看 `$openprd-router`;具体命令速查优先看 `.openprd/harness/command-catalog.md`。',
|
|
207
|
-
'- `AGENTS.md` 只保留轻量合同;详细执行细则优先沉淀到 repo-local skills、command catalog 和 hooks。',
|
|
208
|
-
'- 任务需要 API key、token、账号信息、第三方服务凭证或个人信息时,先使用 `secrets-vault` skill,且不要直接读取原始 vault 文件。',
|
|
209
|
-
'- 修改 skill、`SKILL.md`、`AGENTS.md` 或相关 workflow 前,先读取现状、输出彩色 Mermaid 方案图,并等待用户确认后再编辑相关文件。',
|
|
210
|
-
'- 涉及微信小程序测试、验证、截图、日志、网络请求、开发者工具自动化或运行态相关改动时,先判断是否真的需要运行态证据:只有用户明确要求小程序实测、复现、截图、抓日志/网络、从 0 到 1 走流程,或当前改动高风险到无法靠静态检查、单测、代码审查或现有证据确认时,才升级到本地小程序运行态验证;低风险小改、纯文案、局部样式或可由更轻验证覆盖的改动,默认不要自动触发小程序运行态验证。',
|
|
211
|
-
'- 一旦进入小程序运行态验证,默认沿用当前小程序运行态或开发者工具会话连续验证,不要为了验证自动重开应用;只有用户明确要求从 0 到 1、冷启动、重开或重新打开时,才从头启动。',
|
|
212
|
-
'- 一旦进入小程序运行态验证,优先使用当前环境已配置的小程序本地验证能力;如果当前客户端没有相应工具,不要假定已经安装,也不要把缺少工具本身当成任务失败。未拿到本地运行态证据前,不要宣称“小程序已验证”。',
|
|
213
|
-
'- 用户明确要求 Computer Use 时优先使用 Computer Use,并尽量在 Codex-owned browser window 中操作;对提交、删除、发送、切换账号、退出登录、支付、关闭标签页等高风险网页动作先确认窗口归属。',
|
|
214
|
-
'- 修改用户可见文案前,先检查 `i18n`、`locales`、`translations`、`Localizable` 或其他语言资源;若项目已有多语言结构,用户可见文案要同步维护到所有已支持语言,并避免暴露 API、SDK、模型、数据库、缓存或错误码等实现细节。',
|
|
215
|
-
'',
|
|
216
|
-
'## 写入纪律',
|
|
217
|
-
'',
|
|
218
|
-
'- 只读命令优先:`status`、`next`、`validate`、`standards --verify`、`doctor`。',
|
|
219
|
-
'- 下一道门禁没看清之前,不要贸然执行写入命令。',
|
|
220
|
-
'- 面对规划、分析、审查类请求,不要运行 `openprd loop --run`、`openprd tasks --advance`、`openprd discovery --advance`、`openprd loop --finish --commit`、git commit 或 git push。',
|
|
221
|
-
'- 代码改动完成后,要回顾 `openprd dev-check` 输出;若出现需要关注的文件,直接复用 dev-check 生成的 **后续建议** 表格,并保留“关注程度”列里的完整风险标签,不要缩成纯 emoji。',
|
|
222
|
-
'- 代码改动完成后,要回顾自我成长项:已自动补齐的低风险工具识别项简短说明;仍待确认的偏好、项目规矩或 OpenPrd 默认行为再用 `openprd grow . --review` 集中呈现;若 `Stop` 提醒本轮有可沉淀的项目经验,结尾要先用人话说明“这次情况 / 计划保留的经验 / 以后怎么复用 / 只保留在当前项目里”,再问用户要不要保留。',
|
|
223
|
-
'- 代码改动完成后,要说明 `docs/basic/`、文件说明书和文件夹 README 是新增、更新还是有意不变。',
|
|
224
|
-
'- 用户要求生成图片、封面图、配图、海报、插画、图标、贴纸、头像、banner、主视觉/KV、运营图、效果图、视觉稿、mockup、先看样子或先确认设计方向时,最终回复应给出 `imagegen` 生成的图片结果;只有实际发生 `imagegen` 调用后,才能汇报生图结果、失败或限流。大界面改动进入实现前先按用户目标、信息架构变化、视觉决策成本和验证风险判断是否需要 3 方向横向效果图大图;需要时等待用户选择方向后再实现。如果是 logo、icon、avatar、badge 等开发素材且用户未明确要求 mockup 或场景化呈现,默认给出独立素材输出结果。进入实现阶段后,已有参考图才给出 `openprd visual-compare --reference/--actual` 生成的 JPG 路径;没有参考图时先判断新建界面还是修改既有界面:新建界面回到实现前 3 方向方案评审,修改既有界面给出 `openprd visual-compare --before/--after` 生成的 JPG 路径;局部细节重点则补 `openprd visual-compare --board <focus-board.json>`,并行实验则补 `openprd visual-compare --board <parallel-board.json>`,并说明是否仍有差异或漂移。',
|
|
225
|
-
'- `freeze`、`handoff`、`change --apply`、`change --archive`、commit、push、release、publish 等高风险动作都要求前置门禁全绿。',
|
|
226
|
-
'',
|
|
227
|
-
'## 修复路径',
|
|
228
|
-
'',
|
|
229
|
-
'1. 运行 `openprd doctor .`。',
|
|
230
|
-
'2. 如果生成引导或 hooks 漂移,运行 `openprd update .`。',
|
|
231
|
-
'3. 运行 `openprd standards . --verify` 并修复文档标准。',
|
|
232
|
-
'4. 运行 `openprd quality . --verify` 并审阅 HTML 质量评估报告;若 `productionReady=false`,最终回复必须先区分 `taskReady` 与 `workspaceReady`,再列出缺证据或需关注的必需 EVO 门禁;如果只剩 `feature-coverage`,说明是任务账本或覆盖证据未收口,不要把本次功能说成失败。',
|
|
233
|
-
'5. 报告就绪前运行 `openprd validate .`。',
|
|
234
|
-
'',
|
|
235
|
-
].join('\n'),
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
id: 'openprd-benchmark-router',
|
|
239
|
-
description: '为 OpenPrd 产品、CLI、Agent harness、AI code review / PR review harness、上下文工程、提示词优化和图标资源选择对标来源与调研路径。',
|
|
240
|
-
body: [
|
|
241
|
-
'# OpenPrd Benchmark Router',
|
|
242
|
-
'',
|
|
243
|
-
'当用户要求最佳实践、benchmark、对标、参考设计、产品优化、CLI 优化、Agent harness 优化、AI code review / PR review harness、上下文工程、提示词工程或图标资源时,先使用这份 skill。',
|
|
244
|
-
'',
|
|
245
|
-
'## 核心原则',
|
|
246
|
-
'',
|
|
247
|
-
'- 不把对标当成固定关键词匹配。结合用户目标判断参考源是否真的能提升设计、实现、排查、评审、规划或文档质量。',
|
|
248
|
-
'- 不强行对标。环境、权限、账号、普通脚本报错、一次性短问答或与产品/领域设计无关的问题,继续当前任务即可。',
|
|
249
|
-
'- 不默认下载全文、仓库或整站。先保留轻量链接、来源 ID 和适用边界;真正需要事实时再读取。',
|
|
250
|
-
'- 通常只选 1-3 个最相关来源;不要为了显得全面而扩大上下文。',
|
|
251
|
-
'- 不把索引、来源目录或记忆当事实来源;未经核验的外部内容不能作为已确认事实输出。',
|
|
252
|
-
'',
|
|
253
|
-
'## 触发信号',
|
|
254
|
-
'',
|
|
255
|
-
'- 用户提到 OpenPrd、OpenSpec、Superpowers、Anthropic Skills、Lark CLI、Agent harness、AI code review、PR review、review lane、long-running agents、context engineering、prompt engineering、最佳实践、对标、参考、复刻或优化设计。',
|
|
256
|
-
'- 用户提到图标、icon、图标站、图标库、图标资源、UI 图标、AI 图标、技术图标、3D 图标、功能图标、iconfont 或视觉资产参考。',
|
|
257
|
-
'- 用户提到界面审美、设计框架、主题库、模板库、组件骨架、视觉资产库、前端体验风格或页面参考方法。',
|
|
258
|
-
'- 用户要求解释某个 Codex / Claude / Cursor agent 为什么没有发现 skill,或希望提升 skill 自动识别、路由、生成、安装和持续执行能力。',
|
|
259
|
-
'- 用户没有显式说 skill 名也要触发;不要要求用户记住 `$openprd-benchmark-router`。',
|
|
260
|
-
'',
|
|
261
|
-
'## 路由流程',
|
|
262
|
-
'',
|
|
263
|
-
'1. 先识别优化对象:OpenPrd 产品/PRD 流程、CLI、skill 体系、长程任务、通用 harness、AI code review / PR review harness、context engineering、prompt engineering、图标资源或图标实现库。',
|
|
264
|
-
'2. 读取当前工作区证据:`.openprd/`、`.openprd/benchmarks/index.md`、`.openprd/benchmarks/sources.yaml`、`AGENTS.md`、repo-local skills、生成的 `.codex/.claude/.cursor` 引导和相关源码。',
|
|
265
|
-
'3. 选择最小足够的外部证据源:公开 GitHub 仓库走 DeepWiki;第三方工具、SDK、CLI 或官方 API 用 Context7;产品官方文档、工程博客和一手资料用官方来源。',
|
|
266
|
-
'4. 形成 OpenPrd 设计判断时,明确区分已证实事实、从来源归纳出的设计原则,以及对本项目的推断。',
|
|
267
|
-
'5. 用分析维度提炼可迁移原则,避免照搬表面功能。',
|
|
268
|
-
'6. 如果任务变成大量参考项目行为挖掘、长时间覆盖或需求补全,再路由到 `$openprd-discovery-loop` 承接持续调研。',
|
|
269
|
-
'',
|
|
270
|
-
'## Project Registry',
|
|
271
|
-
'',
|
|
272
|
-
'- 项目自己的 `.openprd/benchmarks/` 优先于 OpenPrd 内置 Source Map。',
|
|
273
|
-
'- `sources.yaml` 里的 approved source 是长期可复用参考;`inbox/` 里的 candidate 只表示待确认线索。',
|
|
274
|
-
'- 用 `openprd benchmark add <url|repo|file>` 写入 candidate,用 `openprd benchmark approve <id>` 纳入 approved registry。',
|
|
275
|
-
'- 执行或复盘中发现被用户采纳的优质信源时,用 `openprd benchmark observe <url|repo|file> --notes <text>` 累计 evidence;达到阈值后只推荐 approve,不自动晋级。',
|
|
276
|
-
'- 用 `openprd benchmark verify` 检查重复来源、失效链接、缺失本地文件和过宽触发规则。',
|
|
277
|
-
'',
|
|
278
|
-
'## Source Policy',
|
|
279
|
-
'',
|
|
280
|
-
'- GitHub 仓库:需要理解架构、核心模块、关键流程或对标结论时,先用 DeepWiki。默认顺序是 `read_wiki_structure` 1 次,再 `ask_question` 1-2 次;只有在本地源码和已有结论仍不足时才追加。DeepWiki 不可用或覆盖不足时,再回退到 GitHub README、源码和官方文档。',
|
|
281
|
-
'- 官方技术文档:涉及第三方库、框架、API、SDK、MCP、CLI 工具的用法、配置、限制、版本差异或迁移路径时,先检查本地代码、锁文件、README、类型定义;本地不足时再用 Context7,默认顺序是 `resolve_library_id` 1 次,再 `query_docs` 1-2 次。Context7 不足时说明缺口,再补官方文档、源码或其他一手资料。',
|
|
282
|
-
'- 工程文章和产品文档:优先读取当前线上一手页面,只抽取和当前任务相关的观点与设计原则,不复制长文;如果内容可能过时,要说明时效风险。',
|
|
283
|
-
'- 视觉与设计参考:优先吸收结构、节奏、信息组织、资产策略和质量门,不照搬品牌表层风格。需要官方品牌或产品事实时,优先官方站点、官方媒体包、官方设计系统和项目自身 approved benchmark。',
|
|
284
|
-
'- 本地源码优先:当前工作区已经有相关源码时,常规修 bug、查实现、改功能优先读本地代码;DeepWiki 主要用于外部仓库架构理解和对标分析。',
|
|
285
|
-
'- 停止调研:找到足以支持当前决策的 1-3 个高相关来源后停止扩展;候选来源重复时保留更权威、更新或更贴近当前任务的来源。',
|
|
286
|
-
'- 追加调用前先写清“已确认什么、还缺什么”;不要为了同一问题只换个说法反复查询。',
|
|
287
|
-
'',
|
|
288
|
-
'## Source Map',
|
|
289
|
-
'',
|
|
290
|
-
'- `Fission-AI/OpenSpec`:适合对标 spec 驱动变更流程、change lifecycle、spec 与 execution artifact 分层、动态 agent 指令组装和验证门禁。',
|
|
291
|
-
'- `obra/superpowers`:适合对标 mandatory skill routing、多平台适配、轻量 bootstrap、worktree/subagent 协作和 skill 深浅分层。',
|
|
292
|
-
'- `slavingia/skills`:适合对标 0 到 1 验证、community-first、10 specific people、current workaround、manual-first delivery、Magic Piece of Paper、spreadsheet / no-code first、automate-one-step-at-a-time、forms and lists / CRUD first、build for today\'s customers not hypothetical future ones、avoid irreversible decisions、one-thing MVP、weekend test、3-of-10 payment proof、10+ paying before productize、first-customer circles、100 paying before launch、charge-from-day-one、customer-1 profitability、spend time before money、minimalist review 和 default alive 思路,并把这些原则回写到 requirement-intake、brainstorm 和 PRD 结构。',
|
|
293
|
-
'- CLI 与 skill 体系对标:`larksuite/cli`、`anthropics/skills`、Claude Skills 官方文档、Claude Code Skills 官方文档。',
|
|
294
|
-
'- 长程 Agent 任务:Anthropic long-running agents harness 工程文章。',
|
|
295
|
-
'- 通用 harness:OpenAI harness engineering、LangChain agent harness anatomy。',
|
|
296
|
-
'- AI code review / PR review harness:Nolan Lawson 的 “Using AI to write better code more slowly”、Milvus 关于多模型代码审查辩论/交叉验证的实验文章。',
|
|
297
|
-
'- Context engineering:Manus context engineering、Anthropic context engineering。',
|
|
298
|
-
'- Prompt engineering:OpenAI prompt engineering / prompt guidance、Claude prompt engineering、Gemini prompting strategies。',
|
|
299
|
-
'- 图标资源站一级最佳实践:UI 图标优先看 Phosphor Icons(https://phosphoricons.com/);AI 公司与产品图标看 LobeHub Icons(https://lobehub.com/icons);技术栈图标看 Tech Icons(https://techicons.dev/);透明底 3D 图标看 Thiings(https://www.thiings.co/things);功能图标、矢量插画、3D 插画和字体资源看 iconfont(https://www.iconfont.cn/)。',
|
|
300
|
-
'- 图标实现库二级最佳实践:Lucide、Tabler、React Icons。需要落到前端代码时,再结合当前项目框架、包管理器、bundle 体积和导入方式选择具体库。',
|
|
301
|
-
'',
|
|
302
|
-
'## Evaluation Lenses',
|
|
303
|
-
'',
|
|
304
|
-
'- 产品与工作流:用户从哪里开始、如何知道下一步、模糊输入如何变成结构化产物、哪些步骤要保存/展示/恢复、哪些步骤必须保留用户确认。',
|
|
305
|
-
'- Agent 与 Harness:目标、边界、停止条件、工具选择、进度记录、证据、验证结果、失败恢复和人工接管点是否清楚。',
|
|
306
|
-
'- PR 审查 lane:reviewer 是否独立审查、主代理是否先汇总再验证、是否有误报过滤、agreement matrix、严重级别和 merge recommendation。',
|
|
307
|
-
'- 上下文工程:哪些信息常驻、哪些按需检索,是否使用稳定路径、链接和来源 ID 支持 just-in-time 检索,如何处理过期、冲突和可信度。',
|
|
308
|
-
'- 提示词与 Skill 设计:触发描述是否具体但不过度强制,主说明是否短,细节是否按需放到 reference,是否明确不要硬套参考源。',
|
|
309
|
-
'- 图标与视觉资产:先判断用途是 UI、AI 品牌、技术栈、3D 物件还是功能图标;优先选最贴近用途的资源站,再在实现阶段选择合适的代码图标库。',
|
|
310
|
-
'- 前端设计框架:先判断要借的是主题锁定、布局骨架、组件清单、事实前置、素材前置、图片前置还是质量门;把可迁移原则落回 `.openprd/design/`、repo-local skill、hooks 或测试,不要停留在“参考了几个好看页面”。',
|
|
311
|
-
'- CLI 与开发者体验:命令是否可发现、可组合、可预测;错误信息是否说明发生了什么、影响是什么、下一步怎么做;危险操作是否有确认。',
|
|
312
|
-
'',
|
|
313
|
-
'## 设计输出',
|
|
314
|
-
'',
|
|
315
|
-
'- 给出 OpenPrd 应该内置什么、生成什么、路由什么、保留什么门禁。',
|
|
316
|
-
'- 如果来源本质上在讲 0 到 1 验证或创业判断,优先把“社区契合 -> 当前替代与痛点证据 -> 手工/表单/no-code 桥接 -> 付费验证 -> 产品化门槛 -> 增长纪律”落到 requirement-intake、brainstorm、PRD 模板和 hook 提示里,而不是只加一条灵感备注。',
|
|
317
|
-
'- 优先把结论落到 `CANONICAL_SKILLS`、repo-local skills、AGENTS/CLAUDE/Cursor 生成规则、hooks 或测试,而不是停留在口头建议。',
|
|
318
|
-
'- 不把外部项目整包复制进 OpenPrd;只吸收可验证的路由、生成、门禁、状态承接和用户体验原则。',
|
|
319
|
-
'- 需要显式说明时,简短写出参考了哪个来源、借鉴点、适用原因、不照搬边界,以及落到当前任务的具体决策。',
|
|
320
|
-
'',
|
|
321
|
-
'## Stop Rule',
|
|
322
|
-
'',
|
|
323
|
-
'- 同一来源默认只做一次结构理解和一到两次聚焦问题;证据足够支撑当前决策后立即停止调研。',
|
|
324
|
-
'- 如果 DeepWiki、Context7 或官方资料覆盖不足,明确说明缺口,再把后续结论标为推断。',
|
|
325
|
-
'',
|
|
326
|
-
].join('\n'),
|
|
327
|
-
},
|
|
328
|
-
{
|
|
329
|
-
id: 'openprd-harness',
|
|
330
|
-
description: '驱动 OpenPrd 工作区完成 clarify、synthesize、diagram、freeze、handoff、change、tasks 和验证。',
|
|
331
|
-
body: [
|
|
332
|
-
'# OpenPrd Harness',
|
|
333
|
-
'',
|
|
334
|
-
'当用户要求产品规划、需求细化、实现准备或执行就绪时,使用这份 skill。',
|
|
335
|
-
'',
|
|
336
|
-
'## 默认流程',
|
|
337
|
-
'',
|
|
338
|
-
'1. 先运行 `openprd run . --context`,获取 hook-stable 执行视图。',
|
|
339
|
-
'2. 先判断当前用户意图,再决定是否跟随建议。',
|
|
340
|
-
'- 会话 ID 续接:用户给出会话 ID 并要求继续时,把它当成工具无关的历史会话续接请求;先精确恢复该会话历史,不要把当前 active change、相似历史或当前 requirement gate 当成替代目标,也不要把它称为工具专属 ID。',
|
|
341
|
-
'3. 面对规划、分析、架构评审、“怎么改”或“会动哪些文件”类请求,保持只读并基于代码、文档和状态回答。',
|
|
342
|
-
'4. 需要完整工作流细节时,运行 `openprd status .` 和 `openprd next .`。',
|
|
343
|
-
'4a. `openprd init/setup/update/doctor` 可能会把 Context7、DeepWiki 这类非阻断式增强能力写进 `.openprd/harness/install-manifest.json` 的 `optionalCapabilities`。把它当成软建议:初始化、诊断和当前任务都不因它失败;只有当当前任务会明显受益时,才在后续建议里解释能力价值、附官方文档 / GitHub 链接,并视情况提出可代为补配置。',
|
|
344
|
-
'5. 涉及最佳实践、benchmark、对标、参考产品、prompt engineering、Agent harness、context engineering、图标资源、CLI 或 skill 体系设计时,先使用 `$openprd-benchmark-router`。',
|
|
345
|
-
'6. 先用 `$openprd-requirement-intake` 做需求类型语义分流:直接处理(L0)可直接处理并事后说明,不打开正式 PRD/review/change/tasks;现有功能优化(L1)给对话内 mini-plan 后执行,默认不生成正式 PRD/change/tasks;只有新功能/新流程方案(L2)在改代码前必须先走需求入口:`openprd clarify .` 会生成需求入口自省,并只在对话内输出澄清摘要或简短清单;正式 HTML 评审留给后续 review。若当前问题本质上还在判断值不值得做、先找谁验证、能不能先手工交付,就先补“创业验证透镜”,不要急着把方案写成既定需求。',
|
|
346
|
-
'6a. 任何界面、页面、视觉、样式或前端体验任务在进入实现前,都要额外读取 `$openprd-frontend-design`,并优先检查 `.openprd/design/active/` 下是否已经补齐 `facts-sheet / asset-spec / image-preflight / direction-plan / selected-direction`。',
|
|
347
|
-
'7. 事实缺失时,先用 `openprd clarify .` 生成需求入口自省,并在对话里先按“需求判断 / 需求理解 / 功能范围 / 技术方案”给 requirement 摘要;其中“功能范围”和“技术方案”优先用 Markdown 表格,分别写清 `功能模块 | 这次先做什么 | 这次先不做什么` 与 `技术部分 | 初步方案 | 主要负责什么`。`需求判断` 和 `需求理解` 先用 1 到 2 句轻量主句说清这次是什么、核心问题和第一版目标;边界、风险、异常例子和技术细节下沉到后续分项或表格,不要揉成一大段长话,也不要把某条示例文案写成固定模板。若当前更像 0 到 1 验证,摘要里还要主动抬出:第一批最容易触达的社区或种子用户、你为什么算这个社区里的自己人、当前替代方案和痛点证据、先怎么手工交付、手工作战卡怎么写、第一版只做哪一件事、能不能压成周末级 MVP、能不能先用 spreadsheet / 表单 / no-code 跑起来、第一批客户路径、从第一个客户开始怎么收费、客户 1 如何打平成本、有没有 10 个样本和更强付费信号、达到什么条件才允许产品化、增长阶段守什么纪律、这条路是否可逆、是否真在解决客户问题、是否符合团队价值观、是不是你愿意长期住进去的业务形态,以及最低成本先验证什么和验证阶段怎样先活下来。确认该 requirement 摘要后,再用 `openprd capture .` 写回已确认事实,并继续 classify/synthesize/review、生成或检查 change、拆任务。如果用户的下一条回复只是承接上一轮 requirement 摘要的短跟进,而不是提出新范围、改目标或重新发起分析请求,就把它当成对上一轮摘要、默认方向或选项的继续确认,不要重新开一轮泛化 clarify;应直接按当前对话上下文把已确认事实用 canonical capture 路径、`user-confirmed` 来源写回,而不是继续写 `agent-inferred/project-derived` 的用户澄清字段。`clarifyPresentation.mode` 为 `inline` 或 `inline-with-checklist`,直接在对话中先整理首轮项目画像:用户群体、产品形态、第一版切片、暂不处理、不能破坏和风险探针,再压缩成用户容易看懂的总分结构,不打开澄清 HTML。L2 的首轮澄清只能承诺“我先整理需求摘要给你确认,确认后再进入 PRD / review 流程”;不要写成“你回我一句我就开始实现”,也不要把 requirement 摘要确认、review 和实现合成一步。review 重点摘要胶囊应控制在 15 个字以内,作为扫读标签,不写成长句;对用户给稳定 artifact 路径,确认命令使用页面复制出的 `--version`、`--digest` 和 `--work-unit`,不要把可被其他对话覆盖的 active review 当成唯一确认入口,也不要把“可以开做”“继续实现”、单纯的“请帮我实现”,或单独一句“不要评审”当成 `review --mark confirmed` 或 requirement 写入路径的依据。生成 spec 和 tasks 时默认使用简体中文,但必要专有名词、品牌名、命令名、路径、字段名和 API 术语可以保留原文;如果只是纯内部措辞整理,可用 `openprd capture . --source agent-normalized` 写回,这类非语义规范化不应重开用户 review。默认 approval policy 是 decision-points:需要时保留稳定 `review.html`,但只有用户明确表示不需要进行任何确认时,才允许跳过 requirement 摘要确认并按当前稳定 artifact 的精确 `version + digest + work-unit` 静默记录 review;单纯的“请帮我实现/继续实现”不触发这个豁免。若用户刚刚已经确认了现有功能优化(L1)的 mini-plan、范围边界或正式产品边界,后续承接要写成“已确认,我按这个继续”,不要写成“确认,我们就按这个……”这类像再次索取确认的句子。若用户原始意图已明确要求实现,则在当前 approval policy 满足且 tasks 就绪后直接进入执行;否则先输出执行确认清单,列出本轮目标、将执行内容、不做事项、验证方式和已知风险,再请求明确执行授权,不能只要求用户回复一句确认。',
|
|
348
|
-
'8. 评审页里的需求关系图、需求流程图和重点摘要不要靠 HTML 截断;`openprd synthesize` 生成版本快照后,不要直接让用户确认 review。必须先用 `openprd review-presentation . --template` 查看展示文案契约,让 Agent 按 reviewPresentation 写短文案,再用 `openprd review-presentation . --presentation <json> --write --fail-on-violation` 校验并写回;脚本会在通过后写入校验元信息并重渲染可确认 review.html。超限时按脚本返回的 jsonPath 和字数限制重新提炼,不手工改快照、不裁剪原文。',
|
|
349
|
-
'8a. 界面、页面、视觉、样式或前端体验需求要额外判断 UI 影响面:若会明显改变信息架构、核心布局、主视觉、关键路径、组件层级/密度,或用户需要先选设计方向,先做“大界面改动视觉方案评审”。在 PRD 定稿或实现开工前,已有界面时用 Codex Computer Use 截取产品内对应功能当前界面,冷启动没有现有界面时基于已确认 PRD、用户群体、第一版切片和视觉目标生成设计 brief;再用 `imagegen`(Codex 原生 Image 2)生成至少 3 个不同设计思想方向,横向拼接为一张左上角标注 1/2/3 的大图作为候选效果图展示。主动确认是否符合预期、是否纳入后续效果图/实现截图对比、以及是否按此继续实现;只有确认后才把选定方向、整张图或其中子图整理到 `.openprd/harness/visual-reviews/`。',
|
|
350
|
-
'8b. 3 个方向不能只是同一种安全解的轻微变化。至少要在 `.openprd/design/active/direction-plan.md` 里区分不同生成逻辑、适用场景和主要风险;一旦用户确认方向,先在 `.openprd/design/active/selected-direction.md` 锁定选中的 lens、theme、layout 和组件,再进入编码。',
|
|
351
|
-
'9. 对外说明默认用业务和产品语言,先给结论和下一步;涉及第三方 API、模型、云服务或付费工具时,用表格比较多家方案的效果、价格、接入成本、限制、风险和推荐理由,默认选择性价比最优;当用户的问题包含多个对象、方案、文件、场景、风险、验证项、素材或任务,并且需要同时呈现状态、证据、影响、动作或推荐时,主动使用 Markdown 表格,单一结论、代码示例、命令示例和叙事型说明不要强行表格化。',
|
|
352
|
-
'10. 当 PRD 需要进入实现准备时,再运行 `openprd change . --generate --change <id>`。',
|
|
353
|
-
'11. change/tasks 就绪后,用 `$openprd-test-strategy` 为每个任务确认 test-layer、test-size、test-scope、evidence-plan、升级原因或豁免原因;小改动从单测开始,触达契约、用户主路径、视觉、小程序、性能、安全或成本风险时升级验证层级。并且同步按 execution strategy 标注 `serial / parallel-workers / parallel-workers-isolated`、`write-scope`、`owner-role`、`local-verify` 和 `integration-owner`,让主 Agent 可以做 worker 分片和最终审查。',
|
|
354
|
-
'12. 长程实现使用 `openprd loop . --plan --change <id>`,并且只有用户明确要求开发、继续任务、深度调研、对标复刻或 commit 时才执行单任务 fresh session。中等规模 L1/L2 任务可先用 `parallel-workers` 让主 Agent 分配多个 worker shard;达到长程阈值后再升级到隔离 loop 会话。',
|
|
355
|
-
'13. 代码修改完成后、最终回复前,针对本轮实际 touched code files 运行 `openprd dev-check . <file...>` 或 `node scripts/openprd-dev-check.mjs . <file...>` 回顾行数状态:700 行以内正常,701-1500 行需注意,超过 1500 行警告。若出现需要关注的文件,最终回复必须以 **后续建议** 为标题,直接复用 dev-check 生成的 Markdown 表格,列出影响对象、关注程度、规模信号、预警原因、本次处理结果和后续建议,并按 🔴 → 🟠 → 🟡 排序;不要把“关注程度”列改写成纯 emoji,必须保留例如 `🟠 中风险|建议优先关注` 这类完整标签;如果你改写了“预警原因 / 本次处理结果 / 后续建议”,先用 `node scripts/dev-check-wrapup-copy.mjs --validate` 校验每格不超过 20 字;若报错,按提示缩短后重试;若只是窄 bugfix 或小修暂不拆,在表格里说明本次处理结果和后续建议。',
|
|
356
|
-
'14. 如果执行中发现新代码后缀、豁免路径、命令别名、项目约定或用户偏好,不要中途打断任务。代码扩展识别这类白名单工具补全会自动应用并记录;用户偏好、项目协作规矩和 OpenPrd 默认行为形成 growth candidate,收工时用 `openprd grow . --review` 集中确认。',
|
|
357
|
-
'15. 维护 OpenPrd 本身时,只要新增或修改配置类能力(阈值、规则、识别、豁免、命令别名、环境差异、用户偏好或策略开关),默认先做 grow-aware 自检:高置信应可成长时直接纳入 `openprd grow` 体系;不确定时主动询问用户是否做成可成长配置。',
|
|
358
|
-
'16. 实现过程中,每次新增或修改文件都做文档影响检查,补齐缺失的 `docs/basic/`、文件说明书和文件夹 README,并更新受影响文档;涉及后端、脚本、Agent、工具链、服务或数据处理变更时,把 CLI 与 API 视为同级接入面:同步检查命令入口、参数、输出契约、`help`、`doctor`、`dry-run`、`status` 与接口协议、返回结构、身份边界是否受影响,并更新 `docs/basic/backend-structure.md` 或明确写不适用原因。',
|
|
359
|
-
'16a. 如果这轮实现补充了新的前端设计主题、布局骨架、组件 recipe 或 anti-slop 规则,同步更新 `.openprd/design/` 与 `docs/basic/frontend-guidelines.md`,不要只留在代码里。',
|
|
360
|
-
'17. 用户要求生成图片、封面图、配图、海报、插画、图标、贴纸、头像、banner、主视觉/KV、运营图、效果图、视觉稿、mockup、先看样子或先确认设计方向时,默认直接调用 `imagegen`,也就是 Codex 原生 Image 2,产出图片;对 logo、icon、avatar、badge 等开发素材,如果用户未明确要求 mockup、场景图、设备框、卡片承载、名片/包装展示或参考界面复刻,默认按独立素材输出(standalone asset)处理:使用全画布单主体,不额外添加 UI frame、卡片、设备壳、名片、桌面陈列、手持实拍或其他展示容器。只有当用户明确要求 mockup、场景化效果图、容器化呈现,或参考图本身包含这些结构时,才生成对应容器或场景;除非用户明确指定 HTML、SVG、CSS、Canvas、代码稿或可编辑矢量/source artifact,不要改用临时 HTML/SVG/CSS 再截图。只有实际发生 `imagegen` 调用后,才能汇报生图结果、失败或限流。OpenPrd 的 `review.html` 只用于需求评审,不能替代图片或效果图生成。若用户目标是把本次工作转成可学习、可复用、可回看或可教学的材料,先按产物形态判断是否需要 `openprd learn .` 的学习包和阅读器;不要用关键词表触发,普通 Markdown 只能作为辅助讲义。',
|
|
361
|
-
'18. 用户要求界面更好看、更稳定、有一致审美、能复用视觉资产或内置模板时,先路由到 `$openprd-frontend-design`。',
|
|
362
|
-
'18. 大界面改动进入实现前,先把 3 方向效果图当候选效果图展示给用户,并主动确认是否符合预期、是否纳入后续效果图/实现截图对比、以及是否按此继续实现;只有确认后才把选定方向、整张图或其中子图整理成 reference-set 并写入 `.openprd/harness/visual-reviews/`。冷启动没有现有界面、新建首屏、首页、控制台或核心页面时,即使没有修改前截图,也要基于 PRD 和用户画像先出 3 个方向。进入实现后,如果已经有确认参考图、设计稿、图片资产或用户给图,阶段性完成后先截实现图,再运行 `openprd visual-compare . --reference <效果图> --actual <实现截图>`。如果一张参考图里包含多个子图、网格或对象,先运行 `openprd visual-prepare` 生成 reference-set、contact sheet 和模板,再逐项对比。如果没有明确参考图,先判断新建界面还是修改既有界面:新建界面先完成 3 方向方案评审,修改既有界面动手前先截修改前截图,完成后用同一入口、视口、账号和数据状态截修改后截图,再运行 `openprd visual-compare . --before <修改前截图> --after <修改后截图>`。如果重点在局部变化,或局部细节需要放到同一张证据板里审阅,默认再补一份 `openprd visual-compare . --board <focus-board.json>` 的局部焦点证据板,把局部变化组合到同一张证据板里统一验收。默认输出 JPG 到 `.openprd/harness/visual-reviews/`;查看合成图后继续复核,直到预期变化出现且未改区域没有明显漂移。用户后续如果说“跟效果图”“不一致”“好丑”“复刻”,不能只口头说对比过了,至少产出一份视觉证据图。',
|
|
363
|
-
'19. 声称单个 task 完成前,运行本任务 verify/dev-check/必要界面验证,并通过 `--evidence`、测试报告或任务 metadata 留下 task-scoped evidence;不要把全局 `openprd run . --verify` 当作 per-task 默认。',
|
|
364
|
-
'20. 阶段收口、全部实现完成、handoff/commit/release/publish 前,运行 `openprd standards . --verify`、`openprd quality . --verify` 和 `openprd run . --verify`,把 HTML 质量评估报告当作整体 EVO 门禁、日志、业务成本与滥用护栏、测试策略矩阵、冒烟覆盖、性能、极端场景和项目知识的评审产物;L2 或跨页面实现的最终回复必须列出最新 HTML 质量报告和 task-scoped Markdown/HTML 测试报告路径。最终回复优先复用 `run . --verify` 的 `taskReady/workspaceReady` 拆分,不要把任务通过和工作区欠账混成一句泛化尾巴。',
|
|
365
|
-
'21. `AGENTS.md` 只保留轻量合同;入口路由看 `$openprd-router`,具体命令速查看 `.openprd/harness/command-catalog.md`,更细的工作流步骤、路由边界和 hook 门禁以这份 skill、`$openprd-shared`、`$openprd-test-strategy` 和 `$openprd-benchmark-router` 为准。',
|
|
366
|
-
'22. hook 会强制阻断几类场景:需求入口未完成就写实现、外部证据不足就直接改第三方集成、skill/AGENTS 变更未先可视化确认、以及敏感信息场景下直接读原始 vault 文件。',
|
|
367
|
-
'',
|
|
368
|
-
'## 门禁协议',
|
|
369
|
-
'',
|
|
370
|
-
'- 不要跳过 `openprd run . --context`;它是最适合 hooks 的控制面。',
|
|
371
|
-
'- 不要把 `run --context` 里的建议当成直接用户命令。',
|
|
372
|
-
'- 面对“看看、规划、梳理、分析、评估、怎么改、预计动哪些文件、review、explain”等只读意图,不运行 OpenPrd 写入命令。',
|
|
373
|
-
'- 现有项目需求仍模糊时,优先 discovery,再考虑 synthesize。',
|
|
374
|
-
'- 进入定稿或交接前,运行 `openprd run . --verify` 并确认 review blocker 已关闭。',
|
|
375
|
-
'- 声称实现就绪前,审阅最新 `.openprd/quality/reports/*.html` HTML 质量评估报告;若 `taskReady=true` 且 `workspaceReady=false`,先明确写“当前任务通过,工作区待关注”,再列出缺证据或待关注门禁;如果只剩 `feature-coverage`,说明是任务账本或覆盖证据未收口,不要把本次功能表述成失败。',
|
|
376
|
-
'- accepted spec 推进前,先运行 `openprd change . --validate --change <id>`。',
|
|
377
|
-
'',
|
|
378
|
-
'## hook 驱动循环',
|
|
379
|
-
'',
|
|
380
|
-
'- 把 `.openprd/harness/run-state.json` 和 `iterations.jsonl` 当成持久循环状态。',
|
|
381
|
-
'- 默认 lite hooks 不记录每一轮工具细节,但会在明确 OpenPrd / 深度工作提示词和产品、模块、流程需求下注入上下文;复杂或模糊需求提示先做三轮 Requirement Intake Reflection,轻量写入门禁会阻断过早改代码;本轮准备结束时再通过 `Stop` 做一次轻量项目经验回顾,并要求 Agent 先用人话明确“这条经验只会保留在当前项目里”,再向用户确认是否保留。',
|
|
382
|
-
'- 只有项目确实需要完整遥测时才使用 `--hook-profile full`。',
|
|
383
|
-
'- 上下文注入后,hooks 会从 OpenPrd 状态里推荐下一项 task、discovery 或 workflow 动作。',
|
|
384
|
-
'- 门禁失败时,任务或覆盖项保持未完成状态,让下一轮继续重试。',
|
|
385
|
-
'- 可以把跨任务可复用经验记录到 `.openprd/harness/learnings.md`、本地 `AGENTS.md` 或 `docs/basic/`。',
|
|
386
|
-
'',
|
|
387
|
-
'## 长程实现循环',
|
|
388
|
-
'',
|
|
389
|
-
'- 运行 `openprd loop . --init`,再运行 `openprd loop . --plan --change <id>` 生成 `.openprd/harness/feature-list.json`。',
|
|
390
|
-
'- 用 `openprd loop . --next` 找到下一个依赖已满足的任务。',
|
|
391
|
-
'- 用 `openprd loop . --run --agent codex --dry-run` 或 `openprd loop . --run --agent claude --dry-run` 生成单任务 prompt 和启动命令。',
|
|
392
|
-
'- 只有当前用户消息明确要求执行开发、继续任务或深度调研时,才运行 `openprd loop . --run`。单纯的规划问题不构成执行授权。',
|
|
393
|
-
'- 每个 loop 任务对应一个全新 agent 会话边界,不要在同一会话里继续下一项任务。',
|
|
394
|
-
'- 只有在任务 verify 命令和 task-scoped evidence 通过后,才用 `openprd loop . --finish --item <task-id> --evidence <path-or-summary>` 收尾;如果用户明确要求 commit,再先通过高风险最终门禁。',
|
|
395
|
-
'- 前端界面任务里,Codex desktop 优先用 Computer Use;Codex CLI 和 Claude Code 优先用 Playwright、MCP 浏览器自动化或项目现有 e2e 工具。大界面改动进入实现前,先按用户目标、信息架构变化、视觉决策成本和验证风险判断方案评审形态:已有界面时 Codex desktop 必须优先用 Computer Use 获取产品内当前功能截图;冷启动没有现有界面时,基于已确认 PRD、用户群体、第一版切片和视觉目标生成设计 brief。',
|
|
396
|
-
'- 用户只是要求生成图片、封面图、配图、海报、插画、图标、贴纸、头像、banner、主视觉/KV、运营图、效果图、视觉稿、mockup 或先看样子时,默认调用 `imagegen`(Codex 原生 Image 2)生成图片;对 logo、icon、avatar、badge 等开发素材,如果用户未明确要求 mockup、场景图、设备框、卡片承载、名片/包装展示或参考界面复刻,默认按独立素材输出(standalone asset)处理:使用全画布单主体,不额外添加 UI frame、卡片、设备壳、名片、桌面陈列、手持实拍或其他展示容器。只有当用户明确要求 mockup、场景化效果图、容器化呈现,或参考图本身包含这些结构时,才生成对应容器或场景;除非用户明确指定 HTML/SVG/CSS/Canvas/代码稿,不要生成临时 HTML 再截图;未调用 `imagegen` 前,不要声称生图已完成、失败或限流。',
|
|
397
|
-
'- 如果场景判断属于大界面改动,已有界面时基于产品截图生成至少 3 个设计方向;冷启动没有现有界面时基于已确认 PRD、用户群体、第一版切片和视觉目标生成至少 3 个设计方向;再横向拼接成带 1/2/3 序号的大图作为候选效果图给用户确认,并主动确认是否符合预期、是否纳入后续效果图/实现截图对比、以及是否按此继续实现。只有确认后才把选定方向、整张图或其中子图整理到 `.openprd/harness/visual-reviews/`。如果已有确认参考效果图、图片资产或用户给图并进入实现阶段,阶段性完成后必须生成实现截图,并用 `openprd visual-compare . --reference <效果图> --actual <实现截图>` 输出 JPG 视觉对比图;如果参考图里有多个子图、网格或对象,先运行 `openprd visual-prepare` 生成 reference-set、contact sheet 和模板,再逐项对比;如果没有明确参考图,先判断新建界面还是修改既有界面:新建界面先完成 3 方向方案评审,修改既有界面动手前先截修改前截图,完成后截修改后截图,并用 `openprd visual-compare . --before <修改前截图> --after <修改后截图>` 输出 JPG 自检图。未查看对比图、或对比图仍有明显差异/漂移时,不要声称界面视觉完成;如果用户后续说“跟效果图”“不一致”“好丑”“复刻”,至少先产出一份视觉证据图。',
|
|
398
|
-
'- `openprd loop . --finish` 会写入 `.openprd/harness/test-reports/<task-id>.md` 和 `.openprd/harness/test-reports/<task-id>.html`;把这两份结构化测试报告和任务改动一起提交。',
|
|
399
|
-
'- 让 `.openprd/harness/feature-list.json`、`progress.md`、`agent-sessions.jsonl`、`loop-state.json`、`loop-prompts/` 和 `test-reports/` 成为持久状态。',
|
|
400
|
-
'',
|
|
401
|
-
'## 失败处理',
|
|
402
|
-
'',
|
|
403
|
-
'- 命令失败后不要凭直觉继续。',
|
|
404
|
-
'- 重新运行 `openprd run . --context`、`openprd doctor .`,并按输出里的修复命令处理。',
|
|
405
|
-
'- 如果失败假设影响产品范围,把它保留在 `.openprd/engagements/active/open-questions.md`。',
|
|
406
|
-
'',
|
|
407
|
-
'## 历史项目',
|
|
408
|
-
'',
|
|
409
|
-
'- 批量处理旧项目之前,先用 `openprd fleet <root> --dry-run` 审计。',
|
|
410
|
-
'- 已有历史项目要先回填全局名册时,用 `openprd fleet <root> --sync-registry` 把已初始化的 `.openprd/` 工作区写回 `~/.openprd/registry/workspaces.jsonl`。',
|
|
411
|
-
'- 用 `openprd fleet <root> --backfill-work-units` 为已有 PRD 版本补 work unit、digest 和稳定评审页。',
|
|
412
|
-
'- 用 `openprd fleet <root> --update-openprd` 只刷新已经包含 `.openprd/` 的项目,并顺带补齐历史 work unit 绑定。',
|
|
413
|
-
'- 除非用户明确要求 OpenPrd 接管 agent-only 或 plain 项目,否则不要使用 `--setup-missing`。',
|
|
414
|
-
'',
|
|
415
|
-
].join('\n'),
|
|
416
|
-
},
|
|
417
|
-
{
|
|
418
|
-
id: 'openprd-standards',
|
|
419
|
-
description: '初始化并校验 `docs/basic`、文件说明书和文件夹 README 标准。',
|
|
420
|
-
body: [
|
|
421
|
-
'# OpenPrd Standards',
|
|
422
|
-
'',
|
|
423
|
-
'当文档、文件说明书、文件夹 README 或实现就绪检查在范围内时,使用这份 skill。',
|
|
424
|
-
'',
|
|
425
|
-
'## 必需文档',
|
|
426
|
-
'',
|
|
427
|
-
'- `docs/basic/file-structure.md`',
|
|
428
|
-
'- `docs/basic/app-flow.md`',
|
|
429
|
-
'- `docs/basic/prd.md`',
|
|
430
|
-
'- `docs/basic/frontend-guidelines.md`',
|
|
431
|
-
'- `docs/basic/backend-structure.md`',
|
|
432
|
-
'- `docs/basic/tech-stack.md`',
|
|
433
|
-
'',
|
|
434
|
-
'报告实现就绪前,先运行 `openprd standards . --verify`。',
|
|
435
|
-
'对包含源码文件的项目,这个门禁还要求 `docs/basic/` 内容具体可用、文件头说明书存在,以及 `[project]_[folder]_README.md` 文件夹说明完整;如果涉及后端实现,`docs/basic/backend-structure.md` 还必须显式覆盖 CLI 接入面和 API 接入面,或写明不适用原因。',
|
|
436
|
-
'研发期代码修改完成后、最终回复前,运行 `openprd dev-check . <file...>` 或 `node scripts/openprd-dev-check.mjs . <file...>`;该标准层只检查本轮实际 touched code files 的行数状态,不替代 `standards --verify`;需要关注的文件会提供“后续建议”表格行,最终回复应按 🔴 → 🟠 → 🟡 的顺序呈现。',
|
|
437
|
-
'当 dev-check 识别出新的代码扩展名时,会自动补齐识别规则并记录;豁免路径、项目规矩、用户偏好或 OpenPrd 默认行为只作为候选留到收工复盘,用 `openprd grow . --review` 集中确认。',
|
|
438
|
-
'维护 OpenPrd 本身时,新增或修改任何配置类能力都要检查是否应该成为 grow-aware 配置:高置信可复用、可被用户习惯影响、会随项目环境变化的配置默认纳入 `openprd grow`;不确定时主动询问用户;一次性固定规则才保留为静态配置。',
|
|
439
|
-
'',
|
|
440
|
-
'## 文档影响检查',
|
|
441
|
-
'',
|
|
442
|
-
'- 编辑前先识别本次会变化的文件、文件夹、用户流程、架构边界、依赖和产品行为。',
|
|
443
|
-
'- 代码修改完成后用 dev-check 回顾行数:`ok` 可正常收尾;需要关注的文件必须在最终回复以 **后续建议** 表格呈现,并按 🔴 → 🟠 → 🟡 排序;直接复用 dev-check 生成的表格,保留“关注程度”列里的完整风险标签,不要缩成纯 emoji。',
|
|
444
|
-
'- 新增配置类能力时同步评审 grow-aware 入口:候选类型、scope、review/apply 行为、拒绝后不重复提示,以及 user-local 与项目共享配置的边界。',
|
|
445
|
-
'- 新增源码文件:如果缺少文件说明书就补上,并确认所在文件夹 README 已存在。',
|
|
446
|
-
'- 修改源码文件:若已有文件说明书,先读取;当文件职责、输入、输出、依赖或维护规则变化时更新它。',
|
|
447
|
-
'- 文件夹内容新增、移动、删除或改作他用:新增或更新文件夹 README,使其反映当前职责和文件布局。',
|
|
448
|
-
'- 功能、流程、架构、依赖或产品行为变化:即使文件已存在,也更新对应的 `docs/basic/` 文档。',
|
|
449
|
-
'- 后端、脚本、Agent、工具链、服务或数据处理变化:把 CLI 与 API 视为同级接入面,更新 `docs/basic/backend-structure.md` 中的命令入口、输出契约、`help`/`doctor`/`dry-run`/`status`、接口协议和不适用说明。',
|
|
450
|
-
'- 若必需文档或说明书缺失,或仍停留在模板态,就绪前必须补齐。',
|
|
451
|
-
'- 如果最终不需要改文档,也要说明文档影响检查已完成,以及为什么可以保持不变。',
|
|
452
|
-
'',
|
|
453
|
-
'## 同步触发条件',
|
|
454
|
-
'',
|
|
455
|
-
'- 文件或文件夹新增、移动、删除:更新 `docs/basic/file-structure.md` 和相关文件夹 README。',
|
|
456
|
-
'- 产品流程、状态、路由或任务行为变化:更新 `docs/basic/app-flow.md`。',
|
|
457
|
-
'- 用户可见能力或验收标准变化:更新 `docs/basic/prd.md`。',
|
|
458
|
-
'- 框架、依赖、运行时或构建命令变化:更新 `docs/basic/tech-stack.md`。',
|
|
459
|
-
'- 前端或后端结构变化:更新对应的 `docs/basic/` 指南;后端变化时同时评估 CLI 与 API 两个接入面。',
|
|
460
|
-
'',
|
|
461
|
-
'## 门禁',
|
|
462
|
-
'',
|
|
463
|
-
'`openprd standards . --verify` 必须在 freeze、handoff、accepted spec apply/archive、commit、push、release 和 publish 之前通过。',
|
|
464
|
-
'',
|
|
465
|
-
].join('\n'),
|
|
466
|
-
},
|
|
467
|
-
{
|
|
468
|
-
id: 'openprd-discovery-loop',
|
|
469
|
-
description: '面向现有项目、参考项目和模糊需求的持续 OpenPrd discovery。',
|
|
470
|
-
body: [
|
|
471
|
-
'# OpenPrd Discovery Loop',
|
|
472
|
-
'',
|
|
473
|
-
'当用户要求继续、深挖、补全、对比、复刻、全面梳理 requirements,或进行大量只读扫描时,使用这份 skill。',
|
|
474
|
-
'',
|
|
475
|
-
'## 大量只读扫描调度',
|
|
476
|
-
'',
|
|
477
|
-
'- 日常任务仍由主 agent 先直接读取本地上下文;不要因为用户只说“看看、分析、梳理、定位、排查”就自动并行。',
|
|
478
|
-
'- 用户明确要求深度分析、深入调研、全面梳理、多角度评估、交叉验证、并行排查、对标复刻或风险审查时,优先考虑只读 subagent。',
|
|
479
|
-
'- 任务需要同时阅读多个目录、文档、模块、日志、历史实现或参考项目,且并行收集证据能明显减少主上下文污染或节省时间时,可以启动。',
|
|
480
|
-
'- 任务涉及外部技术事实、公开仓库对标、复杂排障、发布风险或安全风险,且需要独立复核时,可以启动;仍必须遵守 Context7、DeepWiki、secrets-vault 和长文件门禁。',
|
|
481
|
-
'- 用户明确说“不用 subagent / 直接做 / 先别并行 / 只回答”时,不启动。',
|
|
482
|
-
'- 单文件小改、明确文案微调、简单命令、非常短的问题或清晰 bug 修复,默认不启动。',
|
|
483
|
-
'- 一旦进入深度研究型 subagent 流程,默认使用 3 个只读 subagent:2 个独立调研执行者 + 1 个审查/交叉验证者。',
|
|
484
|
-
'- 最多启动 5 个 subagent:最多 4 个调研执行者 + 1 个审查者。只有任务天然拆成 4 个互不冲突的研究分支时才扩到 5 个。',
|
|
485
|
-
'- 代码与文档调研优先使用 `spark-code-researcher`、`spark-doc-reader` 或 `documentation-explore`;对标复刻用 `electron-parity-mapper`;安装发布或渠道排障用 `release-diagnostics-researcher`、`channel-debug-researcher`;审查与风险扫描用 `skill-workflow-reviewer`、`security-risk-researcher`。',
|
|
486
|
-
'- 每个 subagent 只回答一个清晰问题,不再继续 spawn;主 agent 负责决策、整合和所有写入,subagent 只做只读调研、归纳和交叉验证。',
|
|
487
|
-
'- subagent 输出必须回到主 agent 汇总;写入 discovery claim、requirements、specs 或 tasks 前,主 agent 必须把结论映射到证据路径、置信度和未解决问题。',
|
|
488
|
-
'',
|
|
489
|
-
'## 循环',
|
|
490
|
-
'',
|
|
491
|
-
'- 用 `openprd discovery . --mode <brownfield|reference|requirement>` 启动或恢复。',
|
|
492
|
-
'- 每次只推进一个有证据支撑的覆盖项。',
|
|
493
|
-
'- 报告运行健康前,用 `openprd discovery . --verify` 做校验。',
|
|
494
|
-
'- 通过 `openprd standards . --verify` 保持基线文档标准同步。',
|
|
495
|
-
'- 单个任务完成后只保留 task-scoped evidence;阶段收口或整体实现完成后,再用 `openprd quality . --verify` 审查 HTML 质量评估报告里的场景标签、必需 EVO 门禁、日志、业务护栏、冒烟覆盖、性能和知识缺口。',
|
|
496
|
-
'',
|
|
497
|
-
'## 深度规则',
|
|
498
|
-
'',
|
|
499
|
-
'- 每个 claim 都要带来源、证据路径和置信度。',
|
|
500
|
-
'- 推断出的行为不能直接变成 accepted requirement,必须保持可评审。',
|
|
501
|
-
'- 大型任务文件必须分片并通过校验。',
|
|
502
|
-
'- 只有在覆盖耗尽、被阻塞,或明确交接后才停止。',
|
|
503
|
-
'',
|
|
504
|
-
].join('\n'),
|
|
505
|
-
},
|
|
57
|
+
const RUNTIME_DETECTION_PROTOCOL = {
|
|
58
|
+
version: 1,
|
|
59
|
+
activeEvidencePriority: [
|
|
60
|
+
{
|
|
61
|
+
id: 'hook-session-payload',
|
|
62
|
+
confidence: 'high',
|
|
63
|
+
summary: '当前客户端 hook 直接传入的 session、turn、agent_type、cwd、model、tool_name 等字段。',
|
|
64
|
+
fields: ['session_id', 'sessionId', 'turn_id', 'turnId', 'agent_type', 'agentType', 'transcript_path', 'transcriptPath', 'cwd', 'hook_event_name', 'tool_name'],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'explicit-launcher',
|
|
68
|
+
confidence: 'high',
|
|
69
|
+
summary: 'OpenPrd 或上层 launcher 明确传入的 agent/client 参数。',
|
|
70
|
+
fields: ['OPENPRD_AGENT', 'OPENPRD_CLIENT', 'OPENPRD_ACTIVE_CLIENT'],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 'sdk-or-headless-session',
|
|
74
|
+
confidence: 'medium-high',
|
|
75
|
+
summary: 'SDK、headless runner 或子会话 registry 返回的结构化 agent/session 信息。',
|
|
76
|
+
fields: ['sessionId', 'threadId', 'agentType', 'client'],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: 'child-process-env',
|
|
80
|
+
confidence: 'medium',
|
|
81
|
+
summary: '子进程环境变量只能证明当前命令运行环境,不能单独证明顶层对话客户端。',
|
|
82
|
+
fields: ['CODEX_HOME', 'CLAUDE_PROJECT_DIR', 'CLAUDE_CODE_CHILD_SESSION', 'CURSOR_TRACE_ID'],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'config-or-cli-probe',
|
|
86
|
+
confidence: 'low-medium',
|
|
87
|
+
summary: '项目或用户配置、CLI 是否存在,只能说明能力可配置或可执行,不能说明当前对话是谁。',
|
|
88
|
+
fields: ['.codex/config.toml', '.claude', '.cursor', 'codex --version'],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
id: 'agent-self-report',
|
|
92
|
+
confidence: 'advisory',
|
|
93
|
+
summary: 'Agent 自述只作兜底提示,不能覆盖 hook/session 证据。',
|
|
94
|
+
fields: ['assistant-response'],
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
outputFields: ['activeClient', 'surface', 'executionMode', 'confidence', 'sessionId', 'turnId', 'agentType', 'model', 'evidence', 'observedCapabilities'],
|
|
98
|
+
confidenceRules: [
|
|
99
|
+
'优先相信当前会话 hook/session payload;env 和配置探针只能作为补充证据。',
|
|
100
|
+
'executionMode=automation/cron/scheduled/headless/unattended 时默认进入 automation-safe mode:不注入 OpenPrd context,不阻断写入,不要求 dev-check / quality / doctor;只有明确 OpenPrd 维护任务或显式启用 OpenPrd 时才恢复 OpenPrd 工作流。',
|
|
101
|
+
'Codex 的 Image 2、Computer Use、browser window 等属于 surface-dependent 能力,不要仅凭 codex CLI 或项目配置推断已可用。',
|
|
102
|
+
'Claude Code、Cursor 等平台同理:先识别当前对话客户端,再按该客户端的 capability pack 激活工具路径。',
|
|
103
|
+
],
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const PLATFORM_CAPABILITY_PACK_REGISTRY = [
|
|
506
107
|
{
|
|
507
|
-
id: '
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
108
|
+
id: 'codex',
|
|
109
|
+
name: 'Codex 能力包',
|
|
110
|
+
client: 'codex',
|
|
111
|
+
activation: 'activeClient=codex,且能力有 hook/session、manifest 或当前工具面证据时启用。',
|
|
112
|
+
surfaces: ['codex-hook', 'codex-desktop', 'codex-cli', 'codex-exec', 'codex-unknown'],
|
|
113
|
+
capabilities: [
|
|
114
|
+
{
|
|
115
|
+
id: 'codex-hooks',
|
|
116
|
+
name: 'Codex hook 上下文与门禁',
|
|
117
|
+
status: 'installed-when-tool-enabled',
|
|
118
|
+
evidence: ['.codex/hooks.json', '.codex/config.toml', '.codex/hooks/openprd-hook.mjs'],
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
id: 'native-image-generation',
|
|
122
|
+
name: 'Codex 原生 Image 2 / imagegen',
|
|
123
|
+
status: 'surface-dependent',
|
|
124
|
+
evidence: ['tool-surface:imagegen', 'tool-surface:image_gen'],
|
|
125
|
+
note: '只在当前 Codex surface 明确提供 imagegen/image_gen 时启用;不要从 Codex CLI 存在反推。',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: 'computer-use',
|
|
129
|
+
name: 'Codex Computer Use / Codex-owned browser window',
|
|
130
|
+
status: 'surface-dependent',
|
|
131
|
+
evidence: ['tool-surface:computer-use', 'tool-surface:chrome', 'tool-surface:browser'],
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: 'conversation-canvas',
|
|
135
|
+
name: 'OpenPrd 对话协同画布',
|
|
136
|
+
status: 'available-through-openprd-canvas',
|
|
137
|
+
evidence: ['openprd canvas . --thread <id> --thread-title <name>', 'openprd canvas . --open --open-target codex-browser', '.openprd/harness/canvas-sessions/<session-key>/'],
|
|
138
|
+
note: '画布状态按 thread/session ID 绑定,thread-title/session-title 只用于当前对话展示和 daemon 透传;Codex Image 2 生成物可通过本地 canvas service 同步到选中卡片;选区发送会保存 handoff 记录并复制提示。没有当前会话证据时显式传 --thread 或 --session,并在知道标题时附带 --thread-title 或 --session-title;需要打开到 Codex 右侧 Browser 时显式传 --open-target codex-browser 并由 Codex Agent 使用 Browser 工具导航,不让 shell open 误弹系统浏览器。Codex Agent 侧已验证的最小打开路径是 Browser plugin + node_repl:setupBrowserRuntime -> agent.browsers.get("iab") -> visibility.set(true) -> browser.tabs.new() -> tab.goto(url)。',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: 'codex-current-thread-relay',
|
|
142
|
+
name: 'Codex 当前线程桥接',
|
|
143
|
+
status: 'surface-dependent-agent-tool',
|
|
144
|
+
evidence: ['codex app-server turn/start', '.openprd/harness/canvas-sessions/<session-key>/relays/*.status.json', 'tool-surface:codex_app.send_message_to_thread', 'openprd canvas . --bridge-outbox --claim next', '.openprd/harness/canvas-sessions/<session-key>/ops.json:type=agent-foreground-relay'],
|
|
145
|
+
note: '只在 Codex App 当前 thread binding 明确时启用;画布 handoff 默认由本机 Codex app-server 走 thread/resume -> turn/start,把 text + localImage 提交到绑定线程,并在 relays/ 留 payload/status/log。自动投递关闭、明确失败或长时间未启动时,才写入 agent-foreground-relay 队列,当前 Codex Agent 领取后调用 codex_app.send_message_to_thread 兜底发送,并用 --bridge-sent/--bridge-failed 回写。OpenPrd 不提供自己的生图 API,AI 生图仍由 Codex 原生 Image 2/imagegen 完成。',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: 'codex-runtime-health',
|
|
149
|
+
name: 'Codex CLI runtime 健康检查与显式修复',
|
|
150
|
+
status: 'available-through-openprd-doctor',
|
|
151
|
+
evidence: ['openprd doctor . --tools codex'],
|
|
152
|
+
},
|
|
153
|
+
],
|
|
550
154
|
},
|
|
551
155
|
{
|
|
552
|
-
id: '
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
'## 就绪规则',
|
|
579
|
-
'',
|
|
580
|
-
'- `openprd run . --verify` 若显示 `taskReady=true` 且 `workspaceReady=false`,不能宣称整体工作区就绪;先明确区分“当前任务通过,工作区待关注”,再列出未通过门禁。若只剩 `feature-coverage`,说明是任务账本或覆盖证据未收口,不要把本次功能表述成失败。',
|
|
581
|
-
'- 大界面改动缺少实现前 3 方向效果图评审或用户未确认方向时,不要进入大 UI 实现;UI 任务有参考图但缺少 visual-compare 输出时,不要宣称视觉实现完成;没有参考图时先判断新建界面还是修改既有界面,新建界面缺少 3 方向方案评审、修改既有界面缺少修改前后截图对比时,都不要宣称视觉自检完成;如果对比图仍有明显偏差或漂移,先返工而不是把差异留给用户发现。',
|
|
582
|
-
'- 最终回复必须列出未通过的必需 EVO 门禁;场景可选门禁可以说明为 advisory,但不能混同为已通过。',
|
|
583
|
-
'',
|
|
584
|
-
'## 收紧规则',
|
|
585
|
-
'',
|
|
586
|
-
'Agent 创建的性能基线从合理的行业平均默认值开始。用户可以放宽或收紧,但 Agent 的自更新只能收紧阈值。',
|
|
587
|
-
'',
|
|
588
|
-
].join('\n'),
|
|
156
|
+
id: 'claude-code',
|
|
157
|
+
name: 'Claude Code 能力包',
|
|
158
|
+
client: 'claude',
|
|
159
|
+
activation: 'activeClient=claude,且 Claude Code hook/SDK/session evidence 匹配时启用。',
|
|
160
|
+
surfaces: ['claude-code-hook', 'claude-code-interactive', 'claude-code-headless', 'claude-code-sdk', 'claude-code-unknown'],
|
|
161
|
+
capabilities: [
|
|
162
|
+
{
|
|
163
|
+
id: 'claude-code-hooks',
|
|
164
|
+
name: 'Claude Code hooks 与 agent_type / agent_id 识别',
|
|
165
|
+
status: 'installed-when-tool-enabled',
|
|
166
|
+
evidence: ['.claude/skills', '.mcp.json', 'hook.agent_type', 'hook.agent_id'],
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: 'claude-code-child-session',
|
|
170
|
+
name: 'Claude Code 子会话识别',
|
|
171
|
+
status: 'env-or-sdk-evidence',
|
|
172
|
+
evidence: ['CLAUDE_CODE_CHILD_SESSION', 'SDK session result'],
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: 'image-generation-preference',
|
|
176
|
+
name: '生图偏好路由(无内置免费生图)',
|
|
177
|
+
status: 'user-preference-required',
|
|
178
|
+
evidence: ['.openprd/harness/image-generation-preference.json'],
|
|
179
|
+
note: 'Claude Code 当前没有对话内免费生图工具。生图请求先读 image-generation-preference.json 的用户已确认偏好;没有偏好时必须先问用户选哪种生图方式并把答复写回该文件,绝不擅自调用用户本地或自有付费生图 API。',
|
|
180
|
+
},
|
|
181
|
+
],
|
|
589
182
|
},
|
|
590
183
|
{
|
|
591
|
-
id: '
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
]
|
|
184
|
+
id: 'cursor',
|
|
185
|
+
name: 'Cursor 能力包',
|
|
186
|
+
client: 'cursor',
|
|
187
|
+
activation: 'activeClient=cursor,且 Cursor rule/config 或上层 launcher 明确指向 Cursor 时启用。',
|
|
188
|
+
surfaces: ['cursor-rules', 'cursor-agent', 'cursor-unknown'],
|
|
189
|
+
capabilities: [
|
|
190
|
+
{
|
|
191
|
+
id: 'cursor-rules',
|
|
192
|
+
name: 'Cursor rules / commands 引导',
|
|
193
|
+
status: 'installed-when-tool-enabled',
|
|
194
|
+
evidence: ['.cursor/rules/openprd.mdc', '.cursor/commands'],
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: 'cursor-mcp',
|
|
198
|
+
name: 'Cursor MCP 配置增强',
|
|
199
|
+
status: 'optional',
|
|
200
|
+
evidence: ['.cursor/mcp.json'],
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
id: 'native-image-generation',
|
|
204
|
+
name: 'Cursor 内置 GenerateImage 生图工具',
|
|
205
|
+
status: 'surface-dependent',
|
|
206
|
+
evidence: ['tool-surface:GenerateImage', 'tool-surface:generate_image'],
|
|
207
|
+
note: '只在当前 Cursor 对话面提供 GenerateImage 工具时启用;它是 Cursor 对话内免费能力,生图请求默认优先使用,不要改走用户本地付费 API。',
|
|
208
|
+
},
|
|
209
|
+
],
|
|
617
210
|
},
|
|
618
211
|
];
|
|
619
212
|
|
|
620
|
-
const
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
},
|
|
628
|
-
{
|
|
629
|
-
id: 'standards',
|
|
630
|
-
title: 'OpenPrd Standards',
|
|
631
|
-
body: [
|
|
632
|
-
'Run `openprd standards . --verify`. If it fails, repair `docs/basic/`, file manual templates, or folder README templates before continuing.',
|
|
633
|
-
].join('\n'),
|
|
634
|
-
},
|
|
635
|
-
{
|
|
636
|
-
id: 'grow',
|
|
637
|
-
title: 'OpenPrd Grow',
|
|
638
|
-
body: [
|
|
639
|
-
'Treat grow as an end-of-task review layer, not an in-task interruption. Auto-apply whitelisted tool-recognition fixes such as detected code extensions; queue user preferences, project governance rules, and OpenPrd default behavior as candidates, then run `openprd grow . --review` at wrap-up for user confirmation.',
|
|
640
|
-
].join('\n'),
|
|
641
|
-
},
|
|
642
|
-
{
|
|
643
|
-
id: 'change',
|
|
644
|
-
title: 'OpenPrd Change',
|
|
645
|
-
body: [
|
|
646
|
-
'Generate or inspect an OpenPrd change. Prefer `openprd change . --generate --change <id>`, then `openprd change . --validate --change <id>`.',
|
|
647
|
-
].join('\n'),
|
|
648
|
-
},
|
|
649
|
-
{
|
|
650
|
-
id: 'discovery',
|
|
651
|
-
title: 'OpenPrd Discovery',
|
|
652
|
-
body: [
|
|
653
|
-
'Start or resume OpenPrd discovery. Use `openprd discovery . --resume` when a run exists; otherwise choose the mode from context.',
|
|
654
|
-
].join('\n'),
|
|
655
|
-
},
|
|
656
|
-
{
|
|
657
|
-
id: 'doctor',
|
|
658
|
-
title: 'OpenPrd Doctor',
|
|
659
|
-
body: [
|
|
660
|
-
'Run `openprd doctor .` and repair missing AGENTS, skills, commands, hooks, standards, validation gates, or Codex CLI runtime health.',
|
|
661
|
-
'For Codex CLI optional dependency failures, first inspect `openprd doctor . --tools codex`; only run `openprd doctor . --tools codex --fix` when the user explicitly wants OpenPrd to execute the global npm repair command.',
|
|
662
|
-
].join('\n'),
|
|
663
|
-
},
|
|
664
|
-
{
|
|
665
|
-
id: 'verify',
|
|
666
|
-
title: 'OpenPrd Verify',
|
|
667
|
-
body: [
|
|
668
|
-
'Run `openprd run . --verify`. It verifies standards, workspace validation, the currently focused change structure (not just the global active change), and active discovery state, then reports `taskReady` separately from `workspaceReady`. When `taskReady=true` and `workspaceReady=false`, final reporting must preserve that split; if the only attention gate is `feature-coverage`, describe it as task-ledger or evidence debt rather than a failed implementation.',
|
|
669
|
-
].join('\n'),
|
|
670
|
-
},
|
|
671
|
-
{
|
|
672
|
-
id: 'visual-prepare',
|
|
673
|
-
title: 'OpenPrd Visual Prepare',
|
|
674
|
-
body: [
|
|
675
|
-
'When one confirmed reference image contains multiple sub-images, grid cells, or objects, run `openprd visual-prepare . --reference <effect-image> --grid <columns>x<rows>` or `--boxes <plan.json>` before implementation comparison.',
|
|
676
|
-
'Treat newly generated images as candidate references until the user confirms they match expectations, should be used for later effect-image vs implementation comparison, and should drive implementation.',
|
|
677
|
-
'The command writes a deterministic reference-set under `.openprd/harness/visual-reviews/reference-sets/<id>/`, including `reference-set.json`, `crops/`, `contact-sheet.jpg`, `focus-board.template.json`, `parallel-board.template.json`, and `compare-plan.json`.',
|
|
678
|
-
'Use `--include <csv>` when the user only wants part of a grid or board to enter later acceptance, instead of blindly carrying the whole image forward.',
|
|
679
|
-
'Always open the generated contact sheet before proceeding, and reject any run where the numbering, crop boundaries, or object completeness look wrong.',
|
|
680
|
-
'After preparation, use `compare-plan.json` for per-item `openprd visual-compare --reference/--actual` commands, or edit the generated board templates when one whole screen needs local-region acceptance.',
|
|
681
|
-
].join('\n'),
|
|
682
|
-
},
|
|
683
|
-
{
|
|
684
|
-
id: 'visual-compare',
|
|
685
|
-
title: 'OpenPrd Visual Compare',
|
|
686
|
-
body: [
|
|
687
|
-
'When UI work has a confirmed reference effect image or user-provided design, capture the implemented UI screenshot, then run `openprd visual-compare . --reference <effect-image> --actual <implementation-screenshot>`.',
|
|
688
|
-
'Treat newly generated images as candidate references until the user confirms they match expectations, should be used for later effect-image vs implementation comparison, and should drive implementation.',
|
|
689
|
-
'The command creates a side-by-side JPG under `.openprd/harness/visual-reviews/` by default, with Simplified Chinese labels: left `效果图`, right `实现截图`.',
|
|
690
|
-
'When UI work has no reference image, first distinguish new UI from existing UI changes. For new screens, return to the pre-implementation three-direction visual review. For existing UI changes, capture the before screenshot first, implement the change, capture the after screenshot from the same entry, viewport, account, and data state, then run `openprd visual-compare . --before <before-screenshot> --after <after-screenshot>` for a before/after self-check labeled `修改前` / `修改后`.',
|
|
691
|
-
'When one reference image contains multiple sub-images, grid cells, or objects, run `openprd visual-prepare . --reference <effect-image> --grid <columns>x<rows>` or `--boxes <plan.json>` first so the agent compares item by item instead of comparing the whole board blindly.',
|
|
692
|
-
'When local detail matters more than the whole screen, prepare a board JSON and run `openprd visual-compare . --board <board.json>` to generate a `focus-board` with overview boxes plus numbered zoom panels.',
|
|
693
|
-
'When the agent explores multiple optimization directions in parallel, use `openprd visual-compare . --board <board.json>` with `mode=parallel-board` to assemble screenshots, GIF first frames, and key metrics into one review board.',
|
|
694
|
-
'Inspect the generated image and keep iterating until there are no obvious visual differences before claiming completion. If the user says the implementation looks wrong, ugly, inconsistent, or asks for replication, do not claim you already compared it without producing at least one visual evidence artifact.',
|
|
695
|
-
'For large UI changes before implementation, decide from user goal, information architecture change, visual decision cost, and validation risk. If an existing screen is available, capture the current in-product screen with Codex Computer Use; if this is a cold-start screen, create a design brief from the confirmed PRD, audience, first slice, and visual goal. Generate at least three Image 2 directions from that screenshot or brief, combine them into one horizontal numbered contact sheet as a candidate effect-image board, and ask the user whether it matches expectations, should be used for later comparison, and should drive implementation before you store the chosen reference-set under `.openprd/harness/visual-reviews/`.',
|
|
696
|
-
].join('\n'),
|
|
213
|
+
const IMAGE_GENERATION_ROUTING = {
|
|
214
|
+
version: 1,
|
|
215
|
+
order: ['surface-builtin', 'user-preference', 'ask-user'],
|
|
216
|
+
surfaceBuiltins: {
|
|
217
|
+
codex: 'imagegen (Codex 原生 Image 2)',
|
|
218
|
+
cursor: 'GenerateImage (Cursor 内置生图工具)',
|
|
219
|
+
claude: null,
|
|
697
220
|
},
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
'When the user gives a historical session ID, task handle, work unit, or a clear requirement/task description, pass `--message <user-prompt>` so `run --context` resolves that explicit target before considering the global active change. Treat session IDs as tool-neutral; do not require or invent tool-specific ID syntax.',
|
|
704
|
-
'',
|
|
705
|
-
'Intent gate: `openprd run . --context` is advisory. Execute mutating recommendations only when the current user message explicitly asks for development, implementation, task continuation, deep research/benchmarking, replication, or commit. Stay read-only for planning, analysis, review, explanation, and file-impact questions.',
|
|
706
|
-
].join('\n'),
|
|
707
|
-
},
|
|
708
|
-
{
|
|
709
|
-
id: 'loop',
|
|
710
|
-
title: 'OpenPrd Loop',
|
|
711
|
-
body: [
|
|
712
|
-
'使用长程 agent harness 做开发落地。',
|
|
713
|
-
'',
|
|
714
|
-
'1. Run `openprd loop . --init` once for the workspace.',
|
|
715
|
-
'2. Run `openprd loop . --plan --change <id>` to build the feature list from structured change tasks.',
|
|
716
|
-
'3. Run `openprd loop . --next` to inspect the next dependency-ready task.',
|
|
717
|
-
'4. Run `openprd loop . --run --agent codex --dry-run` or `openprd loop . --run --agent claude --dry-run` to prepare one fresh single-task session.',
|
|
718
|
-
'5. For real Codex runs, OpenPrd preflights `codex --version` before launching the child session. If a Codex optional dependency is missing, diagnose it with `openprd doctor . --tools codex`; only use `openprd loop . --run --agent codex --repair-agent` when the user explicitly approves the global npm repair.',
|
|
719
|
-
'6. Only run `openprd loop . --run` when the current user message explicitly asks to execute development, continue a task, or perform deep research/benchmarking.',
|
|
720
|
-
'7. 每个任务都必须先自测;前端界面任务在 Codex 桌面优先用 Computer Use,在 CLI/Claude Code 优先用 Playwright 或 MCP 自动化。',
|
|
721
|
-
'8. After the session completes, run `openprd loop . --finish --item <task-id> --commit` only when commit is explicitly part of the requested execution.',
|
|
722
|
-
'',
|
|
723
|
-
'Do not continue into the next task inside the same agent session.',
|
|
724
|
-
].join('\n'),
|
|
725
|
-
},
|
|
726
|
-
{
|
|
727
|
-
id: 'repair',
|
|
728
|
-
title: 'OpenPrd Repair',
|
|
729
|
-
body: [
|
|
730
|
-
'Use `openprd doctor .` to identify drift or missing generated files. Run `openprd update .` for generated guidance drift, repair standards/docs manually, then re-run verification.',
|
|
731
|
-
'Codex CLI runtime repair is explicit: use `openprd doctor . --tools codex --fix` or `openprd loop . --run --agent codex --repair-agent` only after the user accepts that OpenPrd will run `npm install -g @openai/codex@latest`.',
|
|
732
|
-
].join('\n'),
|
|
221
|
+
preferencePath: '.openprd/harness/image-generation-preference.json',
|
|
222
|
+
preferenceSchema: {
|
|
223
|
+
provider: '用户指定的生图方式,例如 imagegen / GenerateImage / 某个 MCP 工具名',
|
|
224
|
+
source: 'user-confirmed',
|
|
225
|
+
updatedAt: 'ISO timestamp',
|
|
733
226
|
},
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
{
|
|
742
|
-
id: 'guard',
|
|
743
|
-
title: 'OpenPrd Guard',
|
|
744
|
-
body: [
|
|
745
|
-
'Before a high-risk action, verify the harness gates: `openprd standards . --verify`, `openprd validate .`, and when relevant `openprd change . --validate --change <id>`.',
|
|
746
|
-
].join('\n'),
|
|
747
|
-
},
|
|
748
|
-
{
|
|
749
|
-
id: 'fleet',
|
|
750
|
-
title: 'OpenPrd Fleet',
|
|
751
|
-
body: [
|
|
752
|
-
'Audit or update historical projects. Start with `openprd fleet <root> --dry-run`; use `--sync-registry` to backfill the global workspace registry, `--backfill-work-units` for historical PRD identity binding, `--update-openprd` only for projects that already have `.openprd/`, and reserve `--setup-missing` for explicitly selected projects.',
|
|
753
|
-
].join('\n'),
|
|
754
|
-
},
|
|
755
|
-
];
|
|
227
|
+
rules: [
|
|
228
|
+
'第一层先判断当前对话工具面:Codex 用原生 imagegen(Image 2),Cursor 用内置 GenerateImage;两者都是工具内免费能力,默认优先使用。',
|
|
229
|
+
'当前工具面没有内置免费生图时,读 preferencePath 里用户已确认的偏好作为默认。',
|
|
230
|
+
'没有已确认偏好时必须先询问用户选哪种生图方式,并把答复以 user-confirmed 来源写回 preferencePath,下次直接默认使用。',
|
|
231
|
+
'绝不在用户未明确指定的情况下调用用户本地或自有付费生图 API,避免产生额外成本。',
|
|
232
|
+
],
|
|
233
|
+
};
|
|
756
234
|
|
|
757
|
-
function renderCommandCatalog() {
|
|
758
|
-
return [
|
|
759
|
-
'# OpenPrd Command Catalog',
|
|
760
|
-
'',
|
|
761
|
-
'这份清单只负责回答两件事:当前 CLI 有哪些稳定入口,以及什么情况下该用哪条命令。',
|
|
762
|
-
'',
|
|
763
|
-
'## 状态与修复',
|
|
764
|
-
'',
|
|
765
|
-
'- `openprd run . --context`:读取 hook-stable 建议上下文;它是建议,不是自动执行指令。续做历史任务或按用户描述找对应需求/任务时,可带 `--message <用户原话>` 先解析显式目标。',
|
|
766
|
-
'- `openprd run . --verify`:校验当前 run 门禁,并把 `taskReady` 与 `workspaceReady` 分开报告;如果只剩 `feature-coverage`,表示任务账本或覆盖证据待收口,不等于本次功能失败。',
|
|
767
|
-
'- `openprd doctor .`:检查生成引导、hooks、skills、standards 与验证健康度;`--tools codex` 还会检查 `codex --version`。',
|
|
768
|
-
'- `openprd doctor . --tools codex --fix`:在用户明确同意后运行 `npm install -g @openai/codex@latest`,并在安装后复查 Codex CLI。',
|
|
769
|
-
'- `openprd update .`:修复生成引导、skills、hooks 与 drift。',
|
|
770
|
-
'- `openprd next .`:查看下一步 harness 动作。',
|
|
771
|
-
'',
|
|
772
|
-
'## 需求与评审',
|
|
773
|
-
'',
|
|
774
|
-
'- `openprd clarify .`:生成需求入口自省,并把澄清压缩回对话内确认。',
|
|
775
|
-
'- `openprd capture . --field <path> --value <text|json>`:把用户确认写回状态。',
|
|
776
|
-
'- `openprd synthesize .`:生成可评审 PRD 与 `review.html`。',
|
|
777
|
-
'- `openprd review . --open`:打开当前 PRD review artifact。',
|
|
778
|
-
'- `openprd review . --mark confirmed --version <id> --digest <sha256> --work-unit <id>`:记录当前稳定评审稿;默认用于人类确认后的记录,若当前 lane 已进入 silent-record policy,也只能对精确匹配的稳定 artifact 记录。',
|
|
779
|
-
'',
|
|
780
|
-
'## 设计与实现准备',
|
|
781
|
-
'',
|
|
782
|
-
'- 界面、页面、视觉、样式、信息架构或前端体验任务进入实现前,先读取 `$openprd-frontend-design` 与 `.openprd/design/`;优先补齐 `.openprd/design/active/facts-sheet.md`、`asset-spec.md`、`image-preflight.md`、`direction-plan.md`、`selected-direction.md`,再开始编码。如果用户已经给了效果图、设计稿、参考截图或其他明确参考图,先把它当成主参考源:只有现有 starter、theme、layout 足够接近时才复用,不接近就允许偏离默认组合,以参考图为准。空白工作区优先从 `.openprd/design/templates/` 里挑最近模板;如果当前轮用户已经把页面主题、模块范围或“直接实现”的意图说清,优先运行 `openprd run . --context --message <用户原话>`。如果页面主题和模块范围已经明确,优先运行 `openprd design-starter . --starter <starter-id> --out index.html --brief "<页面主题>" --sections "<模块1|模块2|模块3>"` 起第一版真实页面。只有当前页确认不依赖外部产品事实、品牌素材或真实图片,才在 active design artifacts 写清无依赖并补 `--no-external-facts --no-brand-assets --no-real-images`;若题目更像旅游、导览、展览、博物馆、城市、自然观察或案例内容页,先不要带 `--no-real-images`,让 starter 先尝试补首批真实图片;若这类冷启动即使带 message 仍短暂返回 `clarify-user`,把它当成摘要级提醒,先用 3 到 5 行 mini-plan 收口,再继续。starter 落地后默认进入 `Patch Mode`:必须直接在生成的入口文件上补丁修改;即使结构要大改,也是在同一路径内覆盖,不做 delete-first,更不要删除 `index.html` 后另起新稿。如果确实要整页重写,先把完整新稿写到 sibling draft,例如 `index.next.html`,确认内容成形后再覆盖回 `index.html`,不要让正式入口出现空窗。starter 一落地后,只允许做一轮就地对焦:快速读一次生成的入口文件和必要的 active design artifacts;这轮对焦结束后,下一步就必须是真实写入口,不要再回头搜网页、翻 `docs/basic/` 或继续模板漫游。把最后一批必要的查事实、查图、读模板动作放在口头宣布之前做完;一旦已经说“开始覆盖入口文件”或“开始整页重写”,下一步必须出现真实写文件动作,而不是继续只读浏览、压图或停在口头承诺;必要时 hook 会把这类非写入动作挡回去。`Patch Mode` 完成不等于只补合同、只下载素材或只写计划;至少要把入口文件本体改完、主要占位清掉,并把已准备好的真实图片或参考约束真正落进页面。',
|
|
783
|
-
'- `openprd design-starter . --starter <content-home|product-launch|ops-dashboard> --out <index.html>`:把内置页面模板直接落成当前项目入口文件,避免空白工作区卡在“知道该用哪份模板,但还没真正开始写页面”的阶段。若再补 `--brief <页面主题> --sections <模块1|模块2|模块3>`,starter 会同步写实 active design artifacts,并把模板占位替成第一版真实内容。',
|
|
784
|
-
'- 没有明确参考方向时,不要直接落回同一种安全极简解;先在 `.openprd/design/active/direction-plan.md` 里给出 3 个异源方向,至少拉开 lens、theme、layout 或素材策略。',
|
|
785
|
-
'- 大界面改动视觉方案评审:先按用户目标、信息架构变化、视觉决策成本和验证风险判断是否需要方案评审;已有界面时用 Codex Computer Use 截取产品内当前功能截图,冷启动没有现有界面时用已确认 PRD、用户群体、第一版切片和视觉目标生成设计 brief;再用 `imagegen`(Codex 原生 Image 2)生成至少 3 个设计方向,并横向拼接为一张左上角标注 1/2/3 的大图作为候选效果图。Agent 主动确认是否符合预期、是否纳入后续效果图/实现截图对比、以及是否按此继续实现;只有确认后,才把选定方向、整张图或其中子图整理到 `.openprd/harness/visual-reviews/`,并进入大 UI 实现。',
|
|
786
|
-
'- `openprd change . --generate --change <id>`:把 PRD 转成 change。',
|
|
787
|
-
'- `openprd change . --validate --change <id>`:校验 change 结构。',
|
|
788
|
-
'- `openprd tasks . --change <id>`:查看当前 dependency-ready 任务。',
|
|
789
|
-
'- `openprd tasks . --change <id> --advance --verify --item <task-id>`:运行 verify 并推进单个任务。',
|
|
790
|
-
'- `openprd loop . --plan --change <id>`:为长程实现构建单任务列表。',
|
|
791
|
-
'- `openprd loop . --run --agent codex|claude --dry-run`:准备一个 fresh single-task session。',
|
|
792
|
-
'- `openprd loop . --run --agent codex --repair-agent`:Codex 真实运行前健康检查失败时,显式执行同一全局 npm 修复入口后再重试检查。',
|
|
793
|
-
'',
|
|
794
|
-
'## Benchmark 与学习包',
|
|
795
|
-
'',
|
|
796
|
-
'- `openprd benchmark add <url|repo|file> --notes <text>`:把外部最佳实践先写入 candidate,用于后续 approve/verify。',
|
|
797
|
-
'- `openprd benchmark observe <url|repo|file> --notes <text>`:记录本轮被采纳的外部信源,累计 evidence 和采纳次数;达到阈值后只提示 approve,不自动晋级。',
|
|
798
|
-
'- `openprd benchmark list .`:查看当前项目的 approved 与 candidate benchmark source。',
|
|
799
|
-
'- `openprd benchmark approve <benchmark-id>`:把 candidate 纳入项目级长期 registry。',
|
|
800
|
-
'- `openprd benchmark verify .`:检查重复来源、失效链接、缺场景和过宽触发词。',
|
|
801
|
-
'- `openprd learn . --topic <text> --open`:生成当前项目的学习包骨架和 HTML 阅读器;当用户目标是学习、复盘、教学、经验沉淀或长期阅读,并且产物需要章节、证据锚点、图文讲解、检索练习或阅读体验时,默认先走这条路径。',
|
|
802
|
-
'- `openprd learn . --content-json <file> --open`:让 Agent 写完 `learning-content.json` 后重新渲染最终图文阅读器。',
|
|
803
|
-
'',
|
|
804
|
-
'## 发布与版本',
|
|
805
|
-
'',
|
|
806
|
-
'- `openprd release . --set <0.1.23>`:设置当前项目版本,并启用 release-ledger。',
|
|
807
|
-
'- `openprd release . --notes "<新增 / 修复 / 优化 ...>"`:把本轮用户可感知变化累计到当前项目版本。',
|
|
808
|
-
'- `node scripts/openprd-github-release-notes.mjs . --version <0.1.23> --tag <0.1.23|v0.1.23> --out <file>`:从当前 release-ledger 渲染 GitHub Release 文案;缺少匹配版本或版本条目时直接失败。',
|
|
809
|
-
'',
|
|
810
|
-
'## 视觉与质量',
|
|
811
|
-
'',
|
|
812
|
-
'- `openprd visual-prepare . --reference <效果图> --grid <列>x<行>` / `--boxes <plan.json>`:把整板、网格图或多对象参考图整理成 reference-set,生成 crops、contact sheet 和 board 模板;先检查 contact sheet,再决定哪些对象进入后续实现与验收。',
|
|
813
|
-
'- `openprd visual-compare . --reference <效果图> --actual <实现截图>`:实现阶段已有确认参考图后,输出左右对比 JPG;如果参考图是一张多子图、网格或多对象组合,先运行 `visual-prepare` 整理 reference-set,再逐项对比。',
|
|
814
|
-
'- `openprd visual-compare . --before <修改前截图> --after <修改后截图>`:实现阶段没有参考图时先判断新建界面还是修改既有界面;新建界面回到实现前 3 方向方案评审,修改既有界面输出修改前后自检 JPG。',
|
|
815
|
-
'- `openprd visual-compare . --board <board.json>`:当要审局部细节、整板局部映射或多对象验收时输出“局部焦点证据板”;当并行跑了多个优化方向时输出“并行实验证据板”。',
|
|
816
|
-
'- `openprd dev-check . <file...>`:收工回顾 touched code files 的行数状态与下一步动作;需要关注的文件会给最终回复可直接使用的“后续建议”表格行。',
|
|
817
|
-
'- `openprd standards . --verify`:校验 `docs/basic/`、文件说明书、文件夹 README 等标准。',
|
|
818
|
-
'- `openprd quality . --verify`:生成 HTML 质量评估报告并检查 EVO 门禁。',
|
|
819
|
-
'- `openprd grow . --review`:审查执行中发现的规则/配置候选,再决定是否 apply。',
|
|
820
|
-
'',
|
|
821
|
-
'## 深度扫描与历史项目',
|
|
822
|
-
'',
|
|
823
|
-
'- `openprd discovery . --resume|--verify`:恢复或校验 discovery 状态。',
|
|
824
|
-
'- `openprd fleet <root> --dry-run`:批量审计历史项目。',
|
|
825
|
-
'- `openprd fleet <root> --sync-registry`:把当前 root 下已初始化的 `.openprd/` 工作区回填到全局 registry。',
|
|
826
|
-
'- `openprd fleet <root> --backfill-work-units`:补历史 PRD work unit 绑定。',
|
|
827
|
-
'- `openprd fleet <root> --update-openprd`:只刷新已有 `.openprd/` 的项目。',
|
|
828
|
-
'',
|
|
829
|
-
'## 使用原则',
|
|
830
|
-
'',
|
|
831
|
-
'- 规划、分析、评审、解释影响范围时,保持只读;不要因为命令存在就直接执行写入。',
|
|
832
|
-
'- 只有用户明确要求实现、继续任务、深度调研、对标复刻或提交时,才进入 `tasks --advance`、`loop --run`、commit、push 等执行动作。',
|
|
833
|
-
'- 高风险动作前先过 `openprd standards . --verify`、`openprd quality . --verify` 和 `openprd run . --verify`;`openprd doctor .` 主要用于集成漂移、生成引导 drift,或 commit/push/freeze/handoff 前的最终健康检查。',
|
|
834
|
-
'- OpenPrd 自身发布到 GitHub 的新版本,默认要同时具备匹配的项目版本、版本 tag 和 GitHub Release;只有 push/tag 没有 Release 不算发布闭环。',
|
|
835
|
-
'',
|
|
836
|
-
].join('\n');
|
|
837
|
-
}
|
|
838
235
|
|
|
839
236
|
function cjoin(...parts) {
|
|
840
237
|
return path.join(...parts);
|
|
@@ -1090,32 +487,42 @@ function agentContractBody() {
|
|
|
1090
487
|
'- `$openprd-benchmark-router`:外部技术、公开 GitHub 仓库、benchmark/对标/最佳实践路由。',
|
|
1091
488
|
'- `$openprd-standards` / `$openprd-quality`:`docs/basic/`、就绪验证、EVO 门禁、知识沉淀。',
|
|
1092
489
|
'- `$openprd-diagram-review` / `$openprd-discovery-loop`:可视评审与长时间只读挖掘。',
|
|
490
|
+
'- 当前对话环境与平台能力包:优先看 `.openprd/harness/runtime-environment.json`,协议和能力清单看 `.openprd/harness/install-manifest.json` 的 `runtimeDetection` / `platformCapabilityPacks`。',
|
|
1093
491
|
'',
|
|
1094
492
|
'### 默认行为',
|
|
1095
493
|
'',
|
|
1096
|
-
'1.
|
|
494
|
+
'1. 动手前先判断 executionMode。无人值守自动化(Codex automation、Claude Code headless、cron、scheduled、unattended task)默认不要注入 OpenPrd context,不阻断写入,不要求 `openprd dev-check` / `quality` / `doctor`;除非 automation prompt 明确写明“这是 OpenPrd 维护任务”“显式启用 OpenPrd / enable OpenPrd / openprd-maintenance”。',
|
|
495
|
+
'1a. 互动或显式启用 OpenPrd 的场景,再从 `.openprd/` 重建状态,并先运行 `openprd run . --context`;它是建议上下文,不是自动执行指令。',
|
|
496
|
+
'1a. 代码搜索默认从当前任务相关源码、测试和 change/task 文件起步;不要把 `.openprd/quality/reports/`、`.openprd/harness/` 或 `.openprd/learning/` 当源码目录做 repo-wide `rg`。质量报告只在需要审阅就绪证据时按最新报告路径显式读取。',
|
|
1097
497
|
'2. 规划、分析、架构评审、“怎么改”或“会动哪些文件”类请求保持只读;只有用户明确要求实现、继续任务、深度调研、对标复刻或提交时才进入执行。',
|
|
1098
498
|
'3. 先分流再执行:`openprd-requirement-intake` 按影响面、未知数、决策成本和验证成本判断需求类型,并保留内部路由码对照:直接处理=L0,现有功能优化=L1,新功能/新流程方案=L2。用户审查默认把路由码并进“需求类型:直接处理(L0)”这类标签里;只有内部排障确实受益时,才额外附“内部路由码”。直接处理类需求可直接处理并事后说明,不打开正式 PRD/review/change/tasks;现有功能优化先在对话内给 mini-plan 再执行,默认不生成正式 PRD/change/tasks;如果用户刚刚已经确认了 L1 mini-plan、范围边界或正式产品边界,后续承接要写成“已确认,我按这个继续”,不要用“确认,我们就按这个……”这类像再次索取确认的句子。只有新功能/新流程方案才先走 requirement intake、对话内 requirement 摘要确认,再 `review/change/tasks`,最后才实现。L2 的 requirement 摘要默认按“需求判断 / 需求理解 / 功能范围 / 技术方案”来写,其中“功能范围”和“技术方案”优先用 Markdown 表格,帮助用户一眼看清;`需求判断` 和 `需求理解` 先用 1 到 2 句轻量主句说清这次是什么、核心问题和第一版目标,边界、风险、异常例子和技术细节下沉到后面的分项或表格,不要把它们都塞进一整段长话里,也不要把某条示例文案写成固定模板。若当前仍在 0 到 1 探索、脑暴或值不值得做的判断,摘要里还要主动补上“验证与创业闭环”:第一批最容易触达的社区或种子用户、你为什么算这个社区里的自己人、当前替代方案和痛点证据、先怎么手工交付、手工作战卡怎么写、能不能先用 spreadsheet / 表单 / no-code 跑起来、如果必须开始做产品也只自动化最重复的一步并先压成 forms / lists / CRUD 骨架、第一版只做哪一件事、能不能压成周末级 MVP、第一批客户路径、从第一个客户开始怎么收费、客户 1 如何打平成本、有没有 10 个样本和更强付费信号、达到什么条件才允许产品化、增长阶段守什么纪律、这条路是否可逆、是否真在解决客户问题、以及是否符合团队价值观、是不是你愿意长期住进去的业务形态。L2 的首轮澄清只能承诺“我先整理需求摘要给你确认”,不能把 requirement 摘要确认、review 和实现压成一句“你回我一句我就开始实现”。如果 `openprd run . --context` 仍然建议 `clarify-user`,当前这轮回复的目标就只能是 `需求摘要` 或 `1 个最高价值澄清点`,不要写成“我先按默认方案实现”。如果用户的下一条回复只是承接上一轮 requirement 摘要的短跟进,而不是提出新范围、改目标或重新发起分析请求,就把它当成对上一轮摘要、默认方向或选项的继续确认,不要重新开一轮泛化 clarify;应直接按当前对话上下文把已确认事实用 canonical capture 路径、`user-confirmed` 来源写回,而不是继续写 `agent-inferred/project-derived` 的用户澄清字段。单纯的“请帮我实现/继续实现”只表示有执行意图,不表示可以跳过 requirement 摘要确认、`capture/classify/synthesize` 写入路径或 review;只有用户明确表示“不需要进行任何确认”时,才允许静默走完整 requirement write path。`review.html` 是稳定评审 artifact,不再默认等于唯一的人类停顿点;默认按 decision-points approval policy 执行,只有当前 lane 仍要求人类决策时才在 final answer 主体里停下请求确认;当 review 已确认且 tasks 已就绪但还需要执行授权时,先给执行确认清单再请用户确认。',
|
|
1099
499
|
'4. change/tasks 就绪后,用 `openprd-test-strategy` 按风险选择单元、集成、端到端、人工、视觉、小程序、性能或安全验证组合,并在任务或报告中保留 evidence-plan;同时根据任务边界记录 execution strategy:小范围修正保持 `serial`,中等规模 L1/L2 可推荐 `parallel-workers`,高风险或大规模实现再升级到 `parallel-workers-isolated`;70/20/10 只作健康形状参考,不作硬门禁。',
|
|
1100
|
-
|
|
500
|
+
'5. 纯图片、封面图、配图、海报、插画、图标、贴纸、mockup 或“先看样子”请求按生图路由选工具:先判断当前对话工具面,Codex 环境用原生 `imagegen`(Image 2),Cursor 环境用内置 `GenerateImage`,两者都是工具内免费能力;都不可用或无法判断时,先读 `.openprd/harness/image-generation-preference.json` 的用户已确认偏好,没有偏好就先问用户选哪种生图方式,并把答复以 `user-confirmed` 来源写回该文件作为下次默认;绝不擅自调用用户本地或自有付费生图 API。生图工具是工具路径,不是审美豁免,生成前先写清用途、受众、气质、约束和记忆点,并用 anti-slop 避免默认紫白/蓝紫渐变、通用字体、白底卡片堆叠和无语境装饰;其中 logo、icon、avatar、badge 等开发素材在用户未明确要求场景化展示时,默认按独立素材输出(standalone asset)生成:全画布单主体,不额外添加卡片、设备框或其他展示容器;只有实际发生生图工具调用后,才能汇报生图结果、失败或限流。生图结果先当候选效果图,不要默认登记到 `.openprd/harness/visual-reviews/`。Agent 要主动确认是否符合预期、是否纳入后续效果图/实现截图对比、以及是否按此继续实现;只有确认后,才把选定方向、整张图或其中子图整理成 reference-set 并进入实现。进入实现阶段时,已有确认参考图用 `openprd visual-compare --reference/--actual`;如果参考图是一张整板、网格图或多对象组合,先运行 `openprd visual-prepare --reference <效果图> --grid <列>x<行>` 或 `--boxes <plan.json>`,确认 contact sheet 后再逐项对比;没有参考图时先判断新建界面还是修改既有界面,新建界面先按用户目标、信息架构变化、视觉决策成本和验证风险完成 3 方向方案评审,修改既有界面用 `openprd visual-compare --before/--after`;局部细节重点则补 `openprd visual-compare --board <focus-board.json>`,多方向实验则补 `openprd visual-compare --board <parallel-board.json>`;普通截图、Computer/Browser/Playwright 实测截图要作为证据时补 `openprd visual-compare --board <verification-board.json>`;同构列表、卡片、网格、表格或用户反馈没对齐时补 `openprd visual-compare --board <alignment-board.json>`,并同时覆盖容器轨道与内部内容槽位轨道;单个 logo、icon、avatar、badge、按钮图形或图片内部居中/视觉重心/偏心问题补 `openprd visual-compare --board <centering-board.json>`,并同时覆盖画布中心、主体外接框中心和视觉重心偏移。visual evidence 同时检查气质、层级、字体/色彩/表面角色和记忆点,不只检查截图是否存在。用户后续如果说“跟效果图”“不一致”“好丑”“复刻”,不能只口头说对比过了,至少先产出一份视觉证据图。如果用户目标是把工作转成可学习、可复用、可回看、可教学或可沉淀的材料,先按期望产物是否需要章节结构、证据锚点、图文讲解、检索练习、工作示例或长期阅读体验来判断;需要时优先走 `openprd learn .` 生成学习包和阅读器,不要用关键词表触发;“仙侠风格的学习材料”这类短请求也按学习型交付物处理,风格只作为 `--genre` 题材参数。',
|
|
501
|
+
'5a. 对 logo、icon、avatar、badge、贴纸、空态插画、单物件 UI 位图等开发素材,如果最终要接入 UI 并需要透明背景,默认走“候选评审 -> 资产工程化 -> 接入验证”的图标资产链路:先基于用途、受众、气质、约束和记忆点生成 3 个差异足够大的独立素材候选方向,并保持纯 `#00ff00` 绿幕、无文字、无 UI 容器、主体居中且留足裁切边距;用户选定前不写入项目文件。用户选定后再定位源图或 contact sheet,保留绿幕源图,用 `remove_chroma_key.py` 抠成透明 PNG/WebP,按真实 UI 需要裁切居中并导出 384px 或多尺寸资产;接入时按首页卡片、工具格、吸顶栏、偏好预览等实际场景分别调显示比例,而不是只换图片路径。收口时同步写回 `.openprd/design/active/asset-spec.md` 和 `selected-direction.md`,说明选中的方向、资产路径、透明产物、接入位置和验证结果;最终回复必须区分绿幕源图、透明产物和是否已经接入。',
|
|
502
|
+
'5b. 卡片宽度、间距、留白、对齐、颜色、圆角、字号、按钮或图标等轻量 UI 可视优化,仍可按 L0/L1 小范围修正推进,不自动升级成大界面 3 方向方案评审;但它是用户可见变化,动手前要有一句审美意图和记忆点,收口必须补 `visual-compare` 修改前后图、局部焦点证据板、截图实测证据板、对齐辅助线证据板或内部居中证据板,并检查气质、层级、颜色、字号、间距和表面角色是否成立。只要界面里有同构列表、卡片、网格或表格,就把容器轨道以及标题、副标题、描述、标签、状态、价格、按钮、图标、操作区等相同文案类型/相同组件槽位的对齐当作默认验收项,不等用户先投诉;只量外框、列宽或行顶不算完整对齐验收。只要任务在判断单个素材/图标/头像/徽标/按钮图形的内部居中、偏心或视觉重心,就把 centering-board 当作默认验收项;单张原始截图或主观“看起来居中”不算完整居中验收。build、package、`openprd dev-check` 和单张原始截图不能替代视觉证据。`visual-compare` 每次都会返回 `chatEmbed` markdown;生成证据板后必须把这行 `` 直接嵌入最终回复,让证据在对话流里可见,不要只报告文件路径;`openprd dev-check` 在触达界面文件且最近 24 小时没有证据板时也会输出视觉证据提醒,收口前按提醒补齐。',
|
|
1101
503
|
'6. 界面、页面、视觉、样式、信息架构或前端体验任务进入实现前,先读取 `$openprd-frontend-design`,并用 `.openprd/design/active/` 补齐 `facts-sheet / asset-spec / image-preflight / direction-plan / selected-direction`;空白工作区优先从 `.openprd/design/templates/` 选最近模板。若用户已经给了效果图、设计稿、参考截图或其他明确参考图,先把它当成主参考源;只有现有 starter、theme、layout 足够接近时才复用,不接近就允许偏离默认组合,以参考图为准。若当前轮用户已经把页面主题、模块范围或“直接实现”的意图说清,优先运行 `openprd run . --context --message <用户原话>`。若页面主题和模块范围已经明确,优先运行 `openprd design-starter . --starter <starter-id> --out index.html --brief "<页面主题>" --sections "<模块1|模块2|模块3>"` 起第一版真实页面;只有这个页面本来就不依赖外部产品事实、品牌素材或真实图片时,才在 active design artifacts 写清无依赖并补 `--no-external-facts --no-brand-assets --no-real-images`;若题目更像旅游、导览、展览、博物馆、城市、自然观察或案例内容页,先不要带 `--no-real-images`,让 starter 先尝试补首批真实图片;若这类冷启动即使带 message 仍短暂返回 `clarify-user`,把它当成摘要级提醒,先用 3 到 5 行 mini-plan 收口,再继续。starter 落地后默认进入 `Patch Mode`,必须直接在生成的入口文件上补丁修改;即使结构要大改,也是在同一路径内覆盖,不做 delete-first,更不要删除 `index.html` 后另起新稿。如果确实要整页重写,先把完整新稿写到 sibling draft,例如 `index.next.html`,确认内容成形后再覆盖回 `index.html`,不要让正式入口出现空窗;starter 一落地后,只允许做一轮就地对焦:快速读一次生成的入口文件和必要的 active design artifacts;这轮对焦结束后,下一步就必须是真实写入口,不要再回头搜网页、翻 `docs/basic/` 或继续模板漫游;把最后一批必要的查事实、查图、读模板动作放在口头宣布之前做完;一旦已经说“开始覆盖入口文件”或“开始整页重写”,下一步必须出现真实写文件动作,而不是继续只读浏览、压图或停在口头承诺;必要时 hook 会把这类非写入动作挡回去;`Patch Mode` 完成不等于只补合同、只下载素材或只写计划;至少要把入口文件本体改完、主要占位清掉,并把已准备好的真实图片或参考约束真正落进页面;没有明确参考方向时,不要直接落回同一种安全极简解。',
|
|
504
|
+
'6a. 写产品界面上用户能看到的文案时,必须站在当前用户视角写:这句话要说明用户现在能做什么、会发生什么、为什么值得点、下一步怎么走。除非这是面向开发者或专业技术人员的技术型产品,否则默认用普通人能看懂的语言写结果、状态、限制和行动,不要暴露 API、SDK、模型、数据库、缓存、错误码或内部模块。正反例:不要写“适合想保留全部工具入口的用户”,改写成“首页会显示所有工具入口,你可以直接选择需要的功能”;不要写“API 请求失败,错误码 500”,改写成“暂时保存失败,请稍后再试”;技术型产品可以保留必要术语,但仍要写清用户动作、影响和修复路径。',
|
|
505
|
+
'6b. 开发新功能出现新的入口、按钮、tab、卡片、空态或工具格时,默认自动配图标,不等用户提出:先复用项目已有图标体系;项目没有时按图标最佳实践路由选型(UI 图标 Phosphor,落码 Lucide/Tabler/React Icons,AI 品牌 LobeHub Icons,技术栈 Tech Icons,功能图标/插画 iconfont),把图标名、来源、用途登记到 `.openprd/design/active/asset-spec.md` 的“功能图标”行再接入。只有语义确实不需要图标或用户明确说不要时才跳过,并在收口说明原因。',
|
|
1102
506
|
'7. 用户给出会话 ID 并要求继续时,按工具无关的历史会话续接;不要要求工具专属 ID,也不要用当前 active change 或相似历史替代指定会话。',
|
|
1103
507
|
'8. 单个 task 收尾时只运行本任务最小足够验证,并通过 `--evidence`、测试报告或任务 metadata 留下 task-scoped evidence;代码修改完成后、最终回复前,针对本轮实际 touched code files 运行 `openprd dev-check . <file...>`。阶段收口、全部实现完成、handoff/commit/release/publish 前,再运行 `openprd standards . --verify`、`openprd quality . --verify` 和 `openprd run . --verify`;L2 或跨页面实现的最终回复必须列出最新 HTML 质量报告和 task-scoped Markdown/HTML 测试报告路径。如果还没有 `.openprd/harness/test-reports/` 下的 Markdown / HTML 测试报告,就不要把状态表述成项目级已经闭环。',
|
|
1104
508
|
'9. 微信小程序相关任务默认按“最小足够验证”执行:只有用户明确要求小程序实测、截图、抓日志/网络、复现问题,或当前改动必须依赖运行态证据时,才升级到本地小程序运行态验证;默认沿用当前小程序运行态或开发者工具会话连续验证,不要为了验证自动重开应用;只有用户明确要求从 0 到 1、冷启动或重开时,才从头启动。如果当前客户端没有相应工具,不要假定已经安装,也不要把缺少工具当成阻断。',
|
|
1105
509
|
'10. `openprd init/setup/update/doctor` 记录的 `optionalCapabilities` 是非阻断式增强建议。当前任务明显受益但能力还未配置时,可在后续建议里说明它能帮什么、附官方文档 / GitHub 链接,并询问用户是否需要按当前客户端补配置;不要因为它未配置就阻断当前任务。',
|
|
510
|
+
'11. 判断当前用户正在和 Codex、Claude Code 还是 Cursor 对话时,先看 `.openprd/harness/runtime-environment.json` 的 hook/session evidence,再按 install manifest 里的 `platformCapabilityPacks` 启用平台专属能力。Codex 原生 Image 2、Computer Use、Codex-owned browser window、OpenPrd 对话协同画布和 Codex 当前线程桥接属于 surface-dependent 能力,只有当前工具面或 hook/session 证据明确支持时才使用;画布必须绑定当前 thread/session,无法自动识别时用 `openprd canvas . --thread <id> --thread-title <name>` 或 `--session <id> --session-title <name>` 显式隔离,标题只用于当前对话展示;当前线程桥接只在 Codex App 当前 thread binding 明确时使用,浏览器写入 handoff 后由 OpenPrd 服务端默认通过 Codex app-server `thread/resume -> turn/start` 提交到绑定线程,失败或关闭时才进入 `agent-foreground-relay` 兜底队列;不要仅凭 Codex CLI、`.codex/config.toml` 或 `CODEX_HOME` 推断可用。',
|
|
1106
511
|
'',
|
|
1107
512
|
'### Hook-Enforced Gates',
|
|
1108
513
|
'',
|
|
514
|
+
'- automation-safe:识别到 Codex automation、Claude Code headless、cron、scheduled 或 unattended task 时,hook 默认不注入 OpenPrd context、不阻断写入、不要求 dev-check / quality / doctor;只有 OpenPrd 维护任务或显式启用 OpenPrd 时才恢复这些门禁。',
|
|
1109
515
|
'- requirement:需求未完成 `clarify/review/change/tasks` 前阻断实现写入;tasks 就绪后,只有用户原始意图已明确要求实现,或后续在看过执行确认清单后明确发出执行指令时才放行。',
|
|
1110
516
|
'- research:公开 GitHub 架构/对标先 DeepWiki;第三方技术用法、配置、限制、版本差异或迁移先查本地证据,不足时再按 `resolve_library_id -> query_docs` 使用 Context7。',
|
|
1111
517
|
'- design:界面、页面、视觉和前端体验任务进入实现前,先读取 `$openprd-frontend-design`,并补齐 `.openprd/design/active/` 下的事实、素材、图片和方向合同。',
|
|
1112
518
|
'- skill-visualization:修改 skill、`SKILL.md`、`AGENTS.md` 或相关 workflow 前,先输出彩色 Mermaid 方案并等待用户确认。',
|
|
519
|
+
'- autonomy-risk:即使已经授权实现,也默认阻断未经当前用户明确批准的云端热修复、生产远端写入、业务兜底、写死逻辑、客户端/服务端补业务数据或缓存补行。',
|
|
1113
520
|
'- secrets / weapp / browser / copy:分别处理 `secrets-vault`、按需的小程序运行态验证、窗口归属与 i18n/普通用户文案提醒。',
|
|
1114
521
|
'- 需要细节时,读 router 指向的 skill 和 command catalog,而不是继续扩写 `AGENTS.md`。',
|
|
1115
522
|
'',
|
|
1116
523
|
'### High-Risk Gate',
|
|
1117
524
|
'',
|
|
1118
|
-
'
|
|
525
|
+
'For interactive OpenPrd flows, before freeze, handoff, accepted spec apply/archive, commit, push, release, or publish, ensure `openprd standards . --verify`, `openprd quality . --verify`, `openprd run . --verify`, and `openprd doctor .` are healthy. Unattended automation uses its own runbook, logs, tests, publish checks, and notification contract unless it explicitly opts into OpenPrd.',
|
|
1119
526
|
'If the quality report says `productionReady=false`, do not claim overall readiness. Reuse `openprd run . --verify` to separate current-task status from workspace-level debt, list the missing evidence or gates, and when only `feature-coverage` is pending describe it as task-ledger or evidence debt rather than a failed implementation.',
|
|
1120
527
|
'The only baseline documentation path is `docs/basic/`.',
|
|
1121
528
|
'',
|
|
@@ -1222,7 +629,7 @@ function renderCommand(command, adapter) {
|
|
|
1222
629
|
'',
|
|
1223
630
|
command.body,
|
|
1224
631
|
'',
|
|
1225
|
-
'
|
|
632
|
+
'For interactive OpenPrd work, rebuild state from `.openprd/` before acting. In unattended automation, skip OpenPrd context/gates unless the task explicitly opts into OpenPrd.',
|
|
1226
633
|
'',
|
|
1227
634
|
].join('\n');
|
|
1228
635
|
}
|
|
@@ -1514,6 +921,27 @@ async function ensureHarnessState(projectRoot) {
|
|
|
1514
921
|
if (!(await exists(eventsPath))) {
|
|
1515
922
|
await writeText(eventsPath, '');
|
|
1516
923
|
}
|
|
924
|
+
const runtimeEnvironmentPath = harnessPath(projectRoot, OPENPRD_HARNESS_RUNTIME_ENVIRONMENT);
|
|
925
|
+
if (!(await exists(runtimeEnvironmentPath))) {
|
|
926
|
+
await writeJson(runtimeEnvironmentPath, {
|
|
927
|
+
version: 1,
|
|
928
|
+
active: {
|
|
929
|
+
activeClient: 'unknown',
|
|
930
|
+
surface: 'unknown',
|
|
931
|
+
executionMode: 'interactive',
|
|
932
|
+
confidence: 0,
|
|
933
|
+
sessionId: null,
|
|
934
|
+
turnId: null,
|
|
935
|
+
agentType: null,
|
|
936
|
+
model: null,
|
|
937
|
+
evidence: [],
|
|
938
|
+
observedCapabilities: [],
|
|
939
|
+
},
|
|
940
|
+
runtimeDetection: RUNTIME_DETECTION_PROTOCOL,
|
|
941
|
+
platformCapabilityPacks: [],
|
|
942
|
+
updatedAt: null,
|
|
943
|
+
});
|
|
944
|
+
}
|
|
1517
945
|
}
|
|
1518
946
|
|
|
1519
947
|
function optionalCapabilityLocations(projectRoot, tools, options = {}) {
|
|
@@ -1587,6 +1015,24 @@ async function collectOptionalCapabilities(projectRoot, tools, options = {}) {
|
|
|
1587
1015
|
}));
|
|
1588
1016
|
}
|
|
1589
1017
|
|
|
1018
|
+
function configuredOptionalCapabilityIds(optionalCapabilities) {
|
|
1019
|
+
return (Array.isArray(optionalCapabilities) ? optionalCapabilities : [])
|
|
1020
|
+
.filter((capability) => capability.configured)
|
|
1021
|
+
.map((capability) => capability.id);
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
function buildPlatformCapabilityPacks(tools, optionalCapabilities = []) {
|
|
1025
|
+
const toolSet = new Set(normalizeTools(tools));
|
|
1026
|
+
const configuredOptional = configuredOptionalCapabilityIds(optionalCapabilities);
|
|
1027
|
+
return PLATFORM_CAPABILITY_PACK_REGISTRY
|
|
1028
|
+
.filter((pack) => toolSet.has(pack.client))
|
|
1029
|
+
.map((pack) => ({
|
|
1030
|
+
...pack,
|
|
1031
|
+
capabilities: pack.capabilities.map((capability) => ({ ...capability })),
|
|
1032
|
+
optionalEnhancements: configuredOptional,
|
|
1033
|
+
}));
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1590
1036
|
async function writeInstallManifest(projectRoot, options, changes, tools, optionalCapabilities) {
|
|
1591
1037
|
const version = await packageVersion();
|
|
1592
1038
|
const managedFiles = Array.isArray(options.managedFiles) ? options.managedFiles : [];
|
|
@@ -1604,13 +1050,26 @@ async function writeInstallManifest(projectRoot, options, changes, tools, option
|
|
|
1604
1050
|
availableProfiles: Object.keys(OPENPRD_HOOK_PROFILES),
|
|
1605
1051
|
state: OPENPRD_HARNESS_HOOK_STATE,
|
|
1606
1052
|
eventsLog: OPENPRD_HARNESS_EVENTS,
|
|
1053
|
+
runtimeEnvironment: OPENPRD_HARNESS_RUNTIME_ENVIRONMENT,
|
|
1607
1054
|
driftReport: OPENPRD_HARNESS_DRIFT,
|
|
1608
1055
|
},
|
|
1056
|
+
runtimeDetection: RUNTIME_DETECTION_PROTOCOL,
|
|
1057
|
+
platformCapabilityPacks: buildPlatformCapabilityPacks(tools, optionalCapabilities),
|
|
1058
|
+
imageGenerationRouting: IMAGE_GENERATION_ROUTING,
|
|
1609
1059
|
optionalCapabilities,
|
|
1610
1060
|
};
|
|
1611
1061
|
const manifestPath = harnessPath(projectRoot, OPENPRD_HARNESS_MANIFEST);
|
|
1612
1062
|
const existed = await exists(manifestPath);
|
|
1613
1063
|
await writeJson(manifestPath, manifest);
|
|
1064
|
+
const runtimeEnvironmentPath = harnessPath(projectRoot, OPENPRD_HARNESS_RUNTIME_ENVIRONMENT);
|
|
1065
|
+
const runtimeEnvironment = await readJson(runtimeEnvironmentPath).catch(() => null);
|
|
1066
|
+
await writeJson(runtimeEnvironmentPath, {
|
|
1067
|
+
version: 1,
|
|
1068
|
+
...(runtimeEnvironment ?? {}),
|
|
1069
|
+
runtimeDetection: RUNTIME_DETECTION_PROTOCOL,
|
|
1070
|
+
platformCapabilityPacks: manifest.platformCapabilityPacks,
|
|
1071
|
+
imageGenerationRouting: IMAGE_GENERATION_ROUTING,
|
|
1072
|
+
});
|
|
1614
1073
|
const configuredCount = optionalCapabilities.filter((capability) => capability.configured).length;
|
|
1615
1074
|
changes.push({ path: OPENPRD_HARNESS_MANIFEST, status: existed ? 'updated' : 'created' });
|
|
1616
1075
|
await appendJsonl(harnessPath(projectRoot, OPENPRD_HARNESS_EVENTS), {
|
|
@@ -1620,6 +1079,7 @@ async function writeInstallManifest(projectRoot, options, changes, tools, option
|
|
|
1620
1079
|
tools,
|
|
1621
1080
|
hookProfile,
|
|
1622
1081
|
managedFileCount: managedFiles.length,
|
|
1082
|
+
platformCapabilityPackCount: manifest.platformCapabilityPacks.length,
|
|
1623
1083
|
optionalCapabilityConfiguredCount: configuredCount,
|
|
1624
1084
|
optionalCapabilityRecommendedCount: optionalCapabilities.length - configuredCount,
|
|
1625
1085
|
});
|
|
@@ -1630,6 +1090,10 @@ async function readInstallManifest(projectRoot) {
|
|
|
1630
1090
|
return readJson(harnessPath(projectRoot, OPENPRD_HARNESS_MANIFEST)).catch(() => null);
|
|
1631
1091
|
}
|
|
1632
1092
|
|
|
1093
|
+
async function readRuntimeEnvironment(projectRoot) {
|
|
1094
|
+
return readJson(harnessPath(projectRoot, OPENPRD_HARNESS_RUNTIME_ENVIRONMENT)).catch(() => null);
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1633
1097
|
async function inspectManagedFile(projectRoot, entry) {
|
|
1634
1098
|
if (!entry || entry.scope === 'user') {
|
|
1635
1099
|
return { ...entry, ok: true, skipped: true, reason: 'external-user-scope' };
|
|
@@ -1903,12 +1367,26 @@ export async function doctorOpenPrdAgentIntegration(projectRoot, options = {}) {
|
|
|
1903
1367
|
const manifest = await readInstallManifest(projectRoot);
|
|
1904
1368
|
const hookProfile = normalizeHookProfile(options.hookProfile ?? manifest?.hooks?.profile);
|
|
1905
1369
|
const optionalCapabilities = await collectOptionalCapabilities(projectRoot, tools, options);
|
|
1370
|
+
const platformCapabilityPacks = manifest?.platformCapabilityPacks ?? buildPlatformCapabilityPacks(tools, optionalCapabilities);
|
|
1371
|
+
const runtimeEnvironment = await readRuntimeEnvironment(projectRoot);
|
|
1906
1372
|
|
|
1907
1373
|
await collectDoctorCheck(projectRoot, checks, 'AGENTS.md', (file) => fileHas(file, 'OPENPRD:AGENTS:START'), 'Missing OpenPrd managed AGENTS block.');
|
|
1908
1374
|
await collectDoctorCheck(projectRoot, checks, OPENPRD_HARNESS_MANIFEST, (file) => fileHas(file, '"managedFiles"'), 'Missing OpenPrd install manifest.');
|
|
1909
1375
|
await collectDoctorCheck(projectRoot, checks, OPENPRD_HARNESS_HOOK_STATE, (file) => fileHas(file, '"version"'), 'Missing OpenPrd hook state.');
|
|
1376
|
+
await collectDoctorCheck(projectRoot, checks, OPENPRD_HARNESS_RUNTIME_ENVIRONMENT, (file) => fileHas(file, '"runtimeDetection"'), 'Missing OpenPrd runtime environment state.');
|
|
1910
1377
|
await collectDoctorCheck(projectRoot, checks, OPENPRD_HARNESS_EVENTS, (file) => exists(file), 'Missing OpenPrd harness events log.');
|
|
1911
1378
|
await collectGeneratedDoctorCheck(projectRoot, checks, '.openprd/harness/command-catalog.md', 'OpenPrd command catalog');
|
|
1379
|
+
const ignoreStatus = await readOperationalGitignoreStatus(projectRoot);
|
|
1380
|
+
checks.push({
|
|
1381
|
+
path: ignoreStatus.path,
|
|
1382
|
+
ok: ignoreStatus.ok,
|
|
1383
|
+
kind: 'search-isolation',
|
|
1384
|
+
reason: ignoreStatus.ok ? 'ok' : 'missing-openprd-generated-artifact-ignores',
|
|
1385
|
+
message: ignoreStatus.ok
|
|
1386
|
+
? 'ok'
|
|
1387
|
+
: `Missing OpenPrd generated artifact ignores: ${ignoreStatus.missing.join(', ')}`,
|
|
1388
|
+
repairHint: ignoreStatus.ok ? undefined : 'Run openprd update . to add search and VCS isolation for generated reports.',
|
|
1389
|
+
});
|
|
1912
1390
|
|
|
1913
1391
|
if (tools.includes('codex')) {
|
|
1914
1392
|
await collectDoctorCheck(projectRoot, checks, '.codex/config.toml', (file) => fileHas(file, '[[hooks.UserPromptSubmit]]') && fileHas(file, '[[hooks.PreToolUse]]'), 'Codex config is missing OpenPrd hook definitions.');
|
|
@@ -1960,6 +1438,9 @@ export async function doctorOpenPrdAgentIntegration(projectRoot, options = {}) {
|
|
|
1960
1438
|
hookProfile,
|
|
1961
1439
|
checks,
|
|
1962
1440
|
drift,
|
|
1441
|
+
runtimeDetection: manifest?.runtimeDetection ?? RUNTIME_DETECTION_PROTOCOL,
|
|
1442
|
+
runtimeEnvironment,
|
|
1443
|
+
platformCapabilityPacks,
|
|
1963
1444
|
optionalCapabilities,
|
|
1964
1445
|
errors: checks.filter((check) => !check.ok).map((check) => (
|
|
1965
1446
|
`${check.path}: ${check.message}${check.repairHint ? ` ${check.repairHint}` : ''}`
|