af6e139d30
short-ship and long-ship share one ship-id record under .pouch/ship/<id>/. specifier writes PRDs into spec/; delivery-loop appends evidence pointers. Old names stay as deprecation stubs so existing installs keep working.
53 lines
3.7 KiB
HTML
53 lines
3.7 KiB
HTML
<!doctype html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>{{feature_title}} · PRD {{revision}}</title>
|
|
<style>
|
|
:root { color-scheme: light; --ink:#18212f; --muted:#64748b; --line:#dbe3ed; --soft:#f5f8fb; --accent:#2457a6; --warn:#9a5b00; }
|
|
* { box-sizing:border-box; }
|
|
body { margin:0; color:var(--ink); background:#eef2f6; font:16px/1.65 system-ui,-apple-system,"Segoe UI",sans-serif; }
|
|
main { max-width:1120px; margin:0 auto; padding:32px 22px 72px; }
|
|
article { background:#fff; border:1px solid var(--line); border-radius:14px; padding:42px clamp(24px,5vw,72px); box-shadow:0 8px 28px #18212f0d; }
|
|
h1,h2,h3 { line-height:1.25; color:#101827; }
|
|
h1 { font-size:clamp(2rem,5vw,3.5rem); margin:0 0 16px; }
|
|
h2 { margin-top:42px; padding-top:18px; border-top:1px solid var(--line); }
|
|
a { color:var(--accent); }
|
|
.meta { display:flex; flex-wrap:wrap; gap:8px; margin:20px 0 34px; }
|
|
.badge { padding:4px 10px; border:1px solid var(--line); border-radius:999px; background:var(--soft); font-size:.9rem; }
|
|
.status { border-color:#e7c487; color:var(--warn); background:#fff8e8; }
|
|
.callout { padding:16px 18px; border-left:4px solid var(--accent); background:var(--soft); }
|
|
table { width:100%; border-collapse:collapse; display:block; overflow-x:auto; }
|
|
th,td { min-width:140px; padding:10px 12px; border:1px solid var(--line); text-align:left; vertical-align:top; }
|
|
th { background:var(--soft); }
|
|
code,pre { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; }
|
|
pre { overflow:auto; padding:16px; background:#111827; color:#e5edf8; border-radius:8px; }
|
|
@media print { body { background:#fff; } main { padding:0; } article { border:0; box-shadow:none; padding:0; } .page-break { break-before:page; } }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<main>
|
|
<article>
|
|
<header>
|
|
<p class="meta"><span class="badge">Ship: {{ship_id}}</span><span class="badge">PRD: {{revision}}</span><span class="badge status">状态:{{status}}</span></p>
|
|
<h1>{{feature_title}}</h1>
|
|
<p>{{one_sentence_summary}}</p>
|
|
<p class="muted">生成时间:{{generated_at}} · 基于版本:{{changed_from}}</p>
|
|
</header>
|
|
|
|
<section id="summary"><h2>1. 摘要</h2><p>{{problem_and_success}}</p></section>
|
|
<section id="scope"><h2>2. 范围</h2><h3>目标</h3><ul><li>{{goal}}</li></ul><h3>非目标</h3><ul><li>{{non_goal}}</li></ul></section>
|
|
<section id="scenarios"><h2>3. 场景与流程</h2><p>{{user_scenarios}}</p></section>
|
|
<section id="options"><h2>4. 方案与决策</h2><p>{{recommended_option}}</p><table><thead><tr><th>方案</th><th>收益</th><th>代价/风险</th><th>结论</th></tr></thead><tbody><tr><td>{{option}}</td><td>{{benefit}}</td><td>{{tradeoff}}</td><td>{{decision}}</td></tr></tbody></table></section>
|
|
<section id="design"><h2>5. 设计</h2><p>{{interaction_domain_api_data}}</p></section>
|
|
<section id="nonfunctional"><h2>6. 非功能要求</h2><ul><li>{{security_performance_observability}}</li></ul></section>
|
|
<section id="tasks"><h2>7. 任务预览</h2><table><thead><tr><th>ID</th><th>切片</th><th>依赖</th><th>Expected</th><th>Verification</th></tr></thead><tbody><tr><td>{{task_id}}</td><td>{{task_title}}</td><td>{{depends_on}}</td><td>{{expected}}</td><td>{{verification}}</td></tr></tbody></table></section>
|
|
<section id="acceptance"><h2>8. 验收标准</h2><ol><li>{{observable_signal}}</li></ol></section>
|
|
<section id="risks"><h2>9. 风险与未决问题</h2><div class="callout">{{unresolved_questions}}</div></section>
|
|
<section id="changes"><h2>10. 本轮变更</h2><ul><li>{{change_summary}}</li></ul></section>
|
|
</article>
|
|
</main>
|
|
</body>
|
|
</html>
|