@openprd/cli 0.1.9 → 0.1.10

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.
Files changed (134) hide show
  1. package/.openprd/benchmarks/index.md +15 -1
  2. package/.openprd/config.yaml +10 -0
  3. package/.openprd/design/README.md +47 -0
  4. package/.openprd/design/README_EN.md +25 -0
  5. package/.openprd/design/active/asset-spec.md +15 -0
  6. package/.openprd/design/active/direction-plan.md +7 -0
  7. package/.openprd/design/active/facts-sheet.md +13 -0
  8. package/.openprd/design/active/image-preflight.md +9 -0
  9. package/.openprd/design/active/selected-direction.md +11 -0
  10. package/.openprd/design/anti-slop.md +16 -0
  11. package/.openprd/design/assets/dark-mesh.svg +14 -0
  12. package/.openprd/design/assets/paper-grid.svg +14 -0
  13. package/.openprd/design/assets/surface-presets.md +21 -0
  14. package/.openprd/design/assets/workbench-grid.svg +16 -0
  15. package/.openprd/design/checklists/ui-quality-gate.md +22 -0
  16. package/.openprd/design/components/component-catalog.md +42 -0
  17. package/.openprd/design/layouts/layout-catalog.json +45 -0
  18. package/.openprd/design/lenses/frontend-lenses.md +31 -0
  19. package/.openprd/design/recipes/content-experience.md +26 -0
  20. package/.openprd/design/recipes/operational-tool.md +25 -0
  21. package/.openprd/design/recipes/product-launch.md +26 -0
  22. package/.openprd/design/templates/README.md +36 -0
  23. package/.openprd/design/templates/README_EN.md +31 -0
  24. package/.openprd/design/templates/content-home.html +415 -0
  25. package/.openprd/design/templates/ops-dashboard.html +340 -0
  26. package/.openprd/design/templates/product-launch.html +360 -0
  27. package/.openprd/design/themes/theme-catalog.json +77 -0
  28. package/.openprd/engagements/active/prd.md +111 -100
  29. package/.openprd/schema/prd.schema.yaml +10 -0
  30. package/.openprd/templates/base/intake.md +4 -0
  31. package/.openprd/templates/base/prd.md +16 -6
  32. package/AGENTS.md +10 -7
  33. package/README.md +26 -28
  34. package/README_EN.md +3 -3
  35. package/package.json +41 -2
  36. package/scripts/openprd-codex-isolated-worker.mjs +799 -0
  37. package/skills/openprd-benchmark-router/SKILL.md +4 -0
  38. package/skills/openprd-frontend-design/SKILL.md +161 -0
  39. package/skills/openprd-frontend-design/references/design-asset-contract.md +34 -0
  40. package/skills/openprd-frontend-design/references/direction-engine.md +46 -0
  41. package/skills/openprd-harness/SKILL.md +37 -20
  42. package/skills/openprd-learning-review/SKILL.md +2 -1
  43. package/skills/openprd-learning-review/references/style-packs/xianxia-cultivation.prompt.md +1 -1
  44. package/skills/openprd-quality/SKILL.md +5 -3
  45. package/skills/openprd-requirement-intake/SKILL.md +27 -5
  46. package/skills/openprd-requirement-intake/references/prd-template-lenses.md +6 -3
  47. package/skills/openprd-requirement-intake/references/routing-rubric.md +9 -5
  48. package/skills/openprd-requirement-intake/references/startup-validation-lens.md +23 -0
  49. package/skills/openprd-router/SKILL.md +13 -5
  50. package/skills/openprd-shared/SKILL.md +38 -25
  51. package/src/agent-integration.js +120 -69
  52. package/src/brainstorm-artifacts.js +1657 -0
  53. package/src/brainstorm-presentation.js +223 -0
  54. package/src/brainstorm.js +603 -0
  55. package/src/cli/args.js +51 -3
  56. package/src/cli/doctor-print.js +34 -8
  57. package/src/cli/print.js +6 -0
  58. package/src/cli/quality-print.js +70 -0
  59. package/src/cli/run-print.js +43 -1
  60. package/src/cli/shared-print.js +33 -2
  61. package/src/cli/workflow-print.js +21 -0
  62. package/src/codex-hook-runner-template.mjs +838 -58
  63. package/src/design-starter-support.js +462 -0
  64. package/src/design-starter.js +1207 -0
  65. package/src/knowledge.js +232 -20
  66. package/src/learning-review.js +3 -3
  67. package/src/loop.js +839 -101
  68. package/src/openprd.js +86 -1
  69. package/src/openspec/change-validate.js +1 -0
  70. package/src/prd-core.js +18 -0
  71. package/src/quality-learning.js +50 -6
  72. package/src/quality.js +2 -2
  73. package/src/run-harness.js +191 -29
  74. package/src/self-update.js +301 -4
  75. package/src/standards.js +46 -5
  76. package/src/visual-prepare.js +940 -0
  77. package/src/workspace-core.js +137 -0
  78. package/src/workspace-workflow.js +190 -7
  79. package/.openprd/benchmarks/evidence/milvus-io-ai-code-review-gets-better-when-models-debate-claude-vs-gemini-vs-code.md +0 -14
  80. package/.openprd/benchmarks/evidence/nolanlawson-com-using-ai-to-write-better-code-more-slowly.md +0 -14
  81. package/.openprd/discovery/config.json +0 -35
  82. package/.openprd/engagements/active/flows.md +0 -35
  83. package/.openprd/engagements/active/handoff.md +0 -16
  84. package/.openprd/engagements/active/review.html +0 -61
  85. package/.openprd/engagements/active/roles.md +0 -22
  86. package/.openprd/engagements/work-units/wu-20260524015648-6d33ded7.json +0 -23
  87. package/.openprd/engagements/work-units/wu-20260602113956-a99b5b88.json +0 -18
  88. package/.openprd/engagements/work-units/wu-20260602122244-78656aaf.json +0 -18
  89. package/.openprd/engagements/work-units/wu-20260602122442-e96489e2.json +0 -18
  90. package/.openprd/engagements/work-units/wu-20260602132835-695429e8.json +0 -18
  91. package/.openprd/exports/.gitkeep +0 -0
  92. package/.openprd/knowledge/candidates/candidate-turn-1780116203372-5f266a79e968c758/candidate.json +0 -78
  93. package/.openprd/knowledge/candidates/candidate-turn-1780116203372-5f266a79e968c758/diagnostic-report.json +0 -129
  94. package/.openprd/knowledge/candidates/candidate-turn-1780116203372-5f266a79e968c758/root-cause-candidates.json +0 -41
  95. package/.openprd/knowledge/candidates/candidate-turn-1780116203372-5f266a79e968c758/timeline.json +0 -14
  96. package/.openprd/knowledge/drafts/openprd-experience-diagnostic-candidate-turn-1780116203372-5f266a79e968c758/SKILL.md +0 -49
  97. package/.openprd/knowledge/index.json +0 -47
  98. package/.openprd/reviews/v0001.html +0 -1322
  99. package/.openprd/reviews/v0002.html +0 -1150
  100. package/.openprd/reviews/v0003.html +0 -1150
  101. package/.openprd/reviews/v0004.html +0 -1150
  102. package/.openprd/reviews/v0005.html +0 -1150
  103. package/.openprd/sessions/.gitkeep +0 -0
  104. package/.openprd/state/changes.json +0 -27
  105. package/.openprd/state/current.json +0 -505
  106. package/.openprd/state/release-ledger.json +0 -387
  107. package/.openprd/state/version-index.json +0 -67
  108. package/.openprd/state/versions/.gitkeep +0 -0
  109. package/.openprd/state/versions/v0001.json +0 -121
  110. package/.openprd/state/versions/v0001.md +0 -161
  111. package/.openprd/state/versions/v0002.json +0 -264
  112. package/.openprd/state/versions/v0002.md +0 -183
  113. package/.openprd/state/versions/v0003.json +0 -269
  114. package/.openprd/state/versions/v0003.md +0 -188
  115. package/.openprd/state/versions/v0004.json +0 -274
  116. package/.openprd/state/versions/v0004.md +0 -193
  117. package/.openprd/state/versions/v0005.json +0 -299
  118. package/.openprd/state/versions/v0005.md +0 -189
  119. package/docs/assets/openprd-capability-overview-en.png +0 -0
  120. package/docs/assets/openprd-capability-overview-zh.png +0 -0
  121. package/docs/assets/openprd-learning-html.png +0 -0
  122. package/docs/assets/openprd-quality-html.png +0 -0
  123. package/docs/assets/openprd-requirement-routing-en.png +0 -0
  124. package/docs/assets/openprd-requirement-routing-en.svg +0 -102
  125. package/docs/assets/openprd-requirement-routing-zh-refined.png +0 -0
  126. package/docs/assets/openprd-requirement-routing-zh.png +0 -0
  127. package/docs/assets/openprd-requirement-routing-zh.svg +0 -102
  128. package/docs/assets/openprd-review-html.png +0 -0
  129. package/docs/assets/openprd-scenario-overview.png +0 -0
  130. package/docs/assets/openprd-scenario-overview.svg +0 -114
  131. package/docs/assets/openprd-self-evolving-mechanisms-en.png +0 -0
  132. package/docs/assets/openprd-self-evolving-mechanisms-zh.png +0 -0
  133. package/docs/assets/openprd-visual-compare-case-study-en.png +0 -0
  134. package/docs/assets/openprd-visual-compare-case-study-zh.png +0 -0
@@ -0,0 +1,415 @@
1
+ <!-- starter-defaults: lens=editorial-contrast theme=warm-editorial layout=story-map -->
2
+ <!DOCTYPE html>
3
+ <html lang="zh-CN">
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>内容型首页模板</title>
8
+ <style>
9
+ :root {
10
+ --bg: #f3ecdf;
11
+ --panel: rgba(255, 251, 244, 0.88);
12
+ --ink: #241b16;
13
+ --muted: #6a564c;
14
+ --line: rgba(52, 36, 27, 0.16);
15
+ --accent: #8f5b3f;
16
+ --accent-soft: rgba(143, 91, 63, 0.14);
17
+ --shadow: 0 18px 48px rgba(43, 28, 20, 0.12);
18
+ --radius: 24px;
19
+ }
20
+
21
+ * { box-sizing: border-box; }
22
+ body {
23
+ margin: 0;
24
+ font-family: "PingFang SC", "Noto Sans SC", "Helvetica Neue", sans-serif;
25
+ color: var(--ink);
26
+ background:
27
+ radial-gradient(circle at top left, rgba(165, 118, 83, 0.16), transparent 34%),
28
+ linear-gradient(180deg, #f6f0e4 0%, var(--bg) 100%);
29
+ }
30
+
31
+ .page {
32
+ width: min(1180px, calc(100vw - 32px));
33
+ margin: 0 auto;
34
+ padding: 32px 0 56px;
35
+ }
36
+
37
+ .hero,
38
+ .section,
39
+ .cta {
40
+ background: var(--panel);
41
+ border: 1px solid var(--line);
42
+ border-radius: var(--radius);
43
+ box-shadow: var(--shadow);
44
+ backdrop-filter: blur(12px);
45
+ }
46
+
47
+ .hero {
48
+ display: grid;
49
+ grid-template-columns: 1.2fr 0.8fr;
50
+ gap: 24px;
51
+ padding: 28px;
52
+ }
53
+
54
+ .eyebrow,
55
+ .kicker {
56
+ display: inline-flex;
57
+ gap: 8px;
58
+ align-items: center;
59
+ padding: 6px 12px;
60
+ border-radius: 999px;
61
+ background: var(--accent-soft);
62
+ color: var(--accent);
63
+ font-size: 13px;
64
+ }
65
+
66
+ h1,
67
+ h2,
68
+ h3,
69
+ p { margin: 0; }
70
+
71
+ h1 {
72
+ margin-top: 18px;
73
+ font-family: "Songti SC", "STSong", serif;
74
+ font-size: clamp(34px, 5vw, 58px);
75
+ line-height: 1.06;
76
+ font-weight: 600;
77
+ }
78
+
79
+ .lede {
80
+ margin-top: 16px;
81
+ max-width: 52ch;
82
+ line-height: 1.7;
83
+ color: var(--muted);
84
+ }
85
+
86
+ .hero-actions,
87
+ .stat-row,
88
+ .card-grid,
89
+ .mini-grid,
90
+ .timeline {
91
+ display: grid;
92
+ gap: 14px;
93
+ }
94
+
95
+ .hero-actions {
96
+ margin-top: 24px;
97
+ grid-template-columns: repeat(2, minmax(0, 1fr));
98
+ }
99
+
100
+ .button,
101
+ .ghost {
102
+ display: inline-flex;
103
+ justify-content: center;
104
+ align-items: center;
105
+ min-height: 48px;
106
+ padding: 0 18px;
107
+ border-radius: 999px;
108
+ border: 1px solid var(--line);
109
+ text-decoration: none;
110
+ }
111
+
112
+ .button {
113
+ background: var(--ink);
114
+ color: #fff;
115
+ }
116
+
117
+ .ghost {
118
+ color: var(--ink);
119
+ background: rgba(255, 255, 255, 0.56);
120
+ }
121
+
122
+ .feature-panel {
123
+ min-height: 100%;
124
+ padding: 22px;
125
+ border-radius: 20px;
126
+ border: 1px dashed rgba(56, 42, 32, 0.22);
127
+ background:
128
+ linear-gradient(180deg, rgba(255, 255, 255, 0.7), rgba(245, 235, 222, 0.7)),
129
+ repeating-linear-gradient(135deg, rgba(126, 95, 70, 0.06) 0 14px, transparent 14px 28px);
130
+ display: grid;
131
+ gap: 16px;
132
+ align-content: start;
133
+ }
134
+
135
+ .feature-panel ul {
136
+ padding-left: 18px;
137
+ margin: 0;
138
+ color: var(--muted);
139
+ line-height: 1.7;
140
+ }
141
+
142
+ .feature-copy {
143
+ color: var(--muted);
144
+ line-height: 1.7;
145
+ }
146
+
147
+ .feature-media,
148
+ .card-media {
149
+ overflow: hidden;
150
+ border-radius: 18px;
151
+ border: 1px solid var(--line);
152
+ background: rgba(255, 255, 255, 0.54);
153
+ }
154
+
155
+ .feature-media {
156
+ min-height: 260px;
157
+ }
158
+
159
+ .card-media {
160
+ aspect-ratio: 4 / 3;
161
+ margin-bottom: 14px;
162
+ }
163
+
164
+ .media-frame,
165
+ .media-fallback {
166
+ height: 100%;
167
+ min-height: inherit;
168
+ }
169
+
170
+ .media-frame {
171
+ display: grid;
172
+ }
173
+
174
+ .media-frame img {
175
+ width: 100%;
176
+ height: 100%;
177
+ display: block;
178
+ object-fit: cover;
179
+ }
180
+
181
+ .media-frame figcaption,
182
+ .media-fallback span {
183
+ padding: 12px 14px;
184
+ font-size: 13px;
185
+ color: var(--muted);
186
+ }
187
+
188
+ .media-frame figcaption {
189
+ border-top: 1px solid var(--line);
190
+ background: rgba(255, 255, 255, 0.72);
191
+ }
192
+
193
+ .media-fallback {
194
+ display: grid;
195
+ place-items: center;
196
+ background:
197
+ linear-gradient(180deg, rgba(255, 255, 255, 0.82), rgba(243, 233, 219, 0.86)),
198
+ repeating-linear-gradient(135deg, rgba(126, 95, 70, 0.08) 0 16px, transparent 16px 32px);
199
+ }
200
+
201
+ .stat-row {
202
+ margin-top: 22px;
203
+ grid-template-columns: repeat(3, minmax(0, 1fr));
204
+ }
205
+
206
+ .stat,
207
+ .card,
208
+ .mini-card,
209
+ .timeline-card {
210
+ padding: 18px;
211
+ border-radius: 18px;
212
+ border: 1px solid var(--line);
213
+ background: rgba(255, 255, 255, 0.56);
214
+ }
215
+
216
+ .stat strong,
217
+ .timeline-card strong {
218
+ display: block;
219
+ font-size: 24px;
220
+ margin-bottom: 8px;
221
+ }
222
+
223
+ .section {
224
+ margin-top: 20px;
225
+ padding: 24px;
226
+ }
227
+
228
+ .section-head {
229
+ display: flex;
230
+ justify-content: space-between;
231
+ align-items: end;
232
+ gap: 16px;
233
+ margin-bottom: 18px;
234
+ }
235
+
236
+ .section-head p {
237
+ max-width: 42ch;
238
+ color: var(--muted);
239
+ line-height: 1.65;
240
+ }
241
+
242
+ .card-grid {
243
+ grid-template-columns: repeat(3, minmax(0, 1fr));
244
+ }
245
+
246
+ .card h3,
247
+ .mini-card h3 {
248
+ font-size: 18px;
249
+ margin-bottom: 10px;
250
+ }
251
+
252
+ .card p,
253
+ .mini-card p,
254
+ .timeline-card p {
255
+ color: var(--muted);
256
+ line-height: 1.7;
257
+ }
258
+
259
+ .mini-grid {
260
+ grid-template-columns: 1.1fr 0.9fr;
261
+ }
262
+
263
+ .timeline {
264
+ grid-template-columns: repeat(3, minmax(0, 1fr));
265
+ }
266
+
267
+ .cta {
268
+ margin-top: 20px;
269
+ padding: 24px 26px;
270
+ display: flex;
271
+ justify-content: space-between;
272
+ align-items: center;
273
+ gap: 20px;
274
+ }
275
+
276
+ .cta p {
277
+ color: var(--muted);
278
+ line-height: 1.65;
279
+ }
280
+
281
+ @media (max-width: 920px) {
282
+ .hero,
283
+ .mini-grid,
284
+ .timeline,
285
+ .card-grid,
286
+ .stat-row,
287
+ .cta {
288
+ grid-template-columns: 1fr;
289
+ display: grid;
290
+ }
291
+
292
+ .cta {
293
+ align-items: start;
294
+ }
295
+ }
296
+ </style>
297
+ </head>
298
+ <body>
299
+ <main class="page">
300
+ <section class="hero">
301
+ <div>
302
+ <span class="eyebrow">内容型首页模板</span>
303
+ <h1>[品牌名 / 首页主题]</h1>
304
+ <p class="lede">[这里放一句能说明这次首页体验目标的引导文案。它应该同时带出内容气质、用户第一步动作和页面的核心价值。]</p>
305
+ <div class="hero-actions">
306
+ <a class="button" href="#">[主动作]</a>
307
+ <a class="ghost" href="#">[次动作]</a>
308
+ </div>
309
+ <div class="stat-row">
310
+ <article class="stat">
311
+ <span class="kicker">事实卡</span>
312
+ <strong>[关键事实]</strong>
313
+ <p>[事实说明或时间/价格/地点]</p>
314
+ </article>
315
+ <article class="stat">
316
+ <span class="kicker">结构卡</span>
317
+ <strong>[模块入口]</strong>
318
+ <p>[说明该入口为什么重要]</p>
319
+ </article>
320
+ <article class="stat">
321
+ <span class="kicker">提醒卡</span>
322
+ <strong>[准备事项]</strong>
323
+ <p>[到访提醒 / 条件 / 风险]</p>
324
+ </article>
325
+ </div>
326
+ </div>
327
+ <aside class="feature-panel">
328
+ <div class="feature-media">[视觉锚点媒体]</div>
329
+ <div>
330
+ <span class="kicker">视觉锚点</span>
331
+ <h2 style="margin-top: 14px;">[内容型封面区 / 示意图 / 地图 / 馆藏编号]</h2>
332
+ </div>
333
+ <p class="feature-copy">[这里不必是真实摄影,但要有清楚的内容暗示]</p>
334
+ <ul>
335
+ <li>[用纸张、纹理、编号、导览标签或卡片秩序承接气质]</li>
336
+ <li>[避免把它做成通用 SaaS hero]</li>
337
+ </ul>
338
+ </aside>
339
+ </section>
340
+
341
+ <section class="section">
342
+ <div class="section-head">
343
+ <div>
344
+ <span class="kicker">推荐内容</span>
345
+ <h2 style="margin-top: 10px;">[今日推荐 / 值得先看的内容]</h2>
346
+ </div>
347
+ <p>[这里解释这一组内容是按什么逻辑排序,帮助用户快速进入当前主题。]</p>
348
+ </div>
349
+ <div class="card-grid">
350
+ <article class="card">
351
+ <div class="card-media">[推荐媒体一]</div>
352
+ <h3>[推荐项一]</h3>
353
+ <p>[一句说明内容价值、位置或推荐理由。]</p>
354
+ </article>
355
+ <article class="card">
356
+ <div class="card-media">[推荐媒体二]</div>
357
+ <h3>[推荐项二]</h3>
358
+ <p>[一句说明内容价值、位置或推荐理由。]</p>
359
+ </article>
360
+ <article class="card">
361
+ <div class="card-media">[推荐媒体三]</div>
362
+ <h3>[推荐项三]</h3>
363
+ <p>[一句说明内容价值、位置或推荐理由。]</p>
364
+ </article>
365
+ </div>
366
+ </section>
367
+
368
+ <section class="section mini-grid">
369
+ <article class="mini-card">
370
+ <span class="kicker">浏览结构</span>
371
+ <h2 style="margin-top: 12px;">[楼层 / 栏目 / 导览分区]</h2>
372
+ <p style="margin-top: 10px;">[用清楚的浏览结构告诉用户怎么从“看什么”过渡到“怎么去”。]</p>
373
+ </article>
374
+ <article class="mini-card">
375
+ <span class="kicker">路线与准备</span>
376
+ <h2 style="margin-top: 12px;">[路线 / 门票 / 到访准备]</h2>
377
+ <p style="margin-top: 10px;">[把行动入口放在内容之后,但别藏得太深。]</p>
378
+ </article>
379
+ </section>
380
+
381
+ <section class="section">
382
+ <div class="section-head">
383
+ <div>
384
+ <span class="kicker">行动流程</span>
385
+ <h2 style="margin-top: 10px;">[从浏览到出发的时间轴]</h2>
386
+ </div>
387
+ <p>[适合路线规划、参观准备、报名、到访前后流程这类需要顺序感的内容。]</p>
388
+ </div>
389
+ <div class="timeline">
390
+ <article class="timeline-card">
391
+ <strong>01</strong>
392
+ <p>[步骤一]</p>
393
+ </article>
394
+ <article class="timeline-card">
395
+ <strong>02</strong>
396
+ <p>[步骤二]</p>
397
+ </article>
398
+ <article class="timeline-card">
399
+ <strong>03</strong>
400
+ <p>[步骤三]</p>
401
+ </article>
402
+ </div>
403
+ </section>
404
+
405
+ <section class="cta">
406
+ <div>
407
+ <span class="kicker">最终动作</span>
408
+ <h2 style="margin-top: 10px;">[最后一段转化区标题]</h2>
409
+ <p style="margin-top: 8px;">[用一句人话把内容价值和下一步动作收拢起来。]</p>
410
+ </div>
411
+ <a class="button" href="#">[确认动作]</a>
412
+ </section>
413
+ </main>
414
+ </body>
415
+ </html>