④段整套同步(六节 + P/S/F/J + 模板)+ open-design 移到技能根

一、④段整套同步(用户选候选 A)
- 新增 `references/stage-proto-doc/assets/产品文档模板.html`(16 KB/247 行,从备份拷、转 LF)。
- ④段 SKILL.md 换成备份 15:28 那版,并按模板口径改齐:
  · 「产品文档框架」从「四块+一附录」改成**六节** —— 页面结构/功能清单/使用场景/操作流程/
    跨页与界面状态/待确认与偏离;与模板同构,⛔ 不从空白页重写结构。
  · 编号从 R/S/F 改成 **P 页面/S 场景/F 功能/J 二级功能**,各自唯一、按展示顺序通排。
  · 保留旧版有价值的要求:每项功能补齐 做什么/入口在哪/输入边界/异常与恢复;重点功能三处标红;
    横向流程图每步写清页面/功能/操作/完成判据。
  · 完成标准「七节」→「六节」,自查清单同步换掉「需求」那批条目,补模板与配图两条。
  · 路径 `designs/<项目>/` → `docs/pm/<项目>/ui/`(2 处)。
  · 补回本机那条「每份产出文档开头都要有一张图」的引用(指向主 skill,段内不复述)。
- 主 skill 同步:四段结构表④行、④段沿革、画图小节(④段画页面结构图 + 用户路径)。

二、open-design 移到技能根(用户选候选 A)
- `git mv product-planning/references/stage-delivery/assets/open-design → open-design/`(4178 文件)。
- `.gitignore` 白名单加 `!/open-design/` —— 否则移出去就不再纳入版本控制。
- 引用改 11 处:路径形态 `assets/open-design/...` → `<技能根>/open-design/...`;
  「随段携带的自带件」改称「同根技能」;「路径怎么找」那条改成自带件(段内相对路径)与
  同根技能(`<技能根>/<技能名>/`)两类分开写。
- open-design 自己的 ATTRIBUTION.md 两处同步(它现在与 oil-ui-pro 同层)。
- 副作用(有益):命名闸门读数由 2063 降到 225 —— 此前它把 open-design 里 919 个第三方 md
  当成规则一起扫了;现在只扫本包 23 个 md。已确认④段的 H1 与 4a/4b/4c 子步仍在检查范围内。

三、验收
- check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 225 / 失败 0 / 提示 27。
- 活文件里 `assets/open-design` 残留 0;工作区 CRLF 文件 0。
This commit is contained in:
admin committed 2026-10-15 21:17:28 +08:00
1 parent fa0a9026c8
commit 5afeb6b78a
4184 files changed
+326 -70

No files matched your search

@@ -0,0 +1,89 @@
---
name: wireframe-greybox
description: |
A crisp greybox / blueprint lo-fi wireframe — neutral grey blocks on a
pale page, image placeholders drawn as a rectangle with a diagonal X,
text shown as solid "lorem bars" of varying widths, sharp 1.5–2px
borders, and a single monospace redline accent for annotations. Reads
like a structural blueprint before any visual design is applied. Use
when the brief asks for "greybox", "blueprint wireframe", "lo-fi
dashboard", "low fidelity", "线框图", or "灰盒原型".
triggers:
- "greybox"
- "grey box wireframe"
- "blueprint wireframe"
- "lo-fi dashboard"
- "low fidelity"
- "wireframe"
- "线框图"
- "灰盒"
od:
mode: prototype
platform: desktop
scenario: design
fidelity: wireframe
preview:
type: html
entry: index.html
design_system:
requires: false
sections: [color, typography, layout, components]
example_prompt: "Greybox a lo-fi blueprint wireframe for a desktop SaaS dashboard — app bar, sidebar nav, a 4-up KPI row, a schematic chart panel, and a list/table with image-placeholder thumbnails, all in neutral grey with monospace redline annotations."
---
# Wireframe Greybox Skill
Produce a single crisp greybox wireframe page. The whole point is
*structure, not skin* — communicate hierarchy and layout with neutral
grey blocks, never with real color, copy, or imagery. Everything is a
placeholder: text is grey "lorem bars", images are rectangles with a
diagonal cross, numbers are big solid blocks. The only color on the page
is the single redline accent reserved for monospace annotations.
## Workflow
1. **Stay structural.** Ignore any DESIGN.md that pushes finished UI —
this is deliberately low fidelity. Use a clean system sans (Inter /
system-ui) for shape and a mono (IBM Plex Mono / JetBrains Mono) for
the redline annotations only. No hand-drawn fonts, no brand color.
2. **Set the greybox palette.** Page is a pale neutral (`#f7f7f8`),
blocks are medium grey (`#e3e3e6`), borders are crisp and defined
(`#c9c9cf` for soft edges, `#1c1b1a` for emphasis), and exactly one
accent (a blue or coral redline) carries every monospace annotation.
Keep contrast high enough to read as a small thumbnail — never
near-white-on-white.
3. **Lay out the dashboard**, in order, each on its own `data-od-id`:
- **App bar** — a logo greybox, a row of nav lorem-bars, and an
avatar circle on the right.
- **Sidebar nav** — icon squares + lorem-bar labels; mark one item
active with a filled/inverted block.
- **KPI row** — four greyboxes, each a small label bar above a big
solid "number" bar.
- **Chart panel** — an inline SVG greybox: axes plus a few
hatched/grey bars or a schematic line. No real data.
- **List / table panel** — a header row plus ~5 rows of lorem bars,
with one column of image-placeholders drawn as a box with a
diagonal X.
- **Annotations** — one or two small monospace redlines pinned to the
canvas (e.g. `01 · 12-col grid`, `max-width 1280`).
4. **Write** one self-contained HTML document — `<!doctype html>`
through `</html>`, CSS inline, no external JS or images. SVG and CSS
draw every placeholder. A `max-width` container plus a media query
collapses columns under ~1000px.
5. **Self-check.** It should read as a blueprint at thumbnail size: grey
blocks, X-crossed image boxes, lorem bars, and exactly one accent
color on the monospace redlines. If any greybox is missing, the page
looks colored, or it disappears as a blank thumbnail, fix it.
## Output contract
Emit between `<artifact>` tags:
```
<artifact identifier="wireframe-slug" type="text/html" title="Wireframe — Title">
<!doctype html>
<html>...</html>
</artifact>
```
One sentence before the artifact, nothing after.
@@ -0,0 +1,280 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Acme Analytics — Greybox Wireframe</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet" />
<style>
:root {
--page: #f7f7f8;
--panel: #ffffff;
--box: #e3e3e6;
--box-dark: #d4d4d9;
--bar: #cfcfd5;
--bar-soft: #dddde1;
--rule: #c9c9cf;
--ink: #1c1b1a;
--ink-soft: #6c6c72;
--accent: #2f6df0;
--sans: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
--mono: 'IBM Plex Mono', ui-monospace, monospace;
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--page);
color: var(--ink);
font: 14px/1.5 var(--sans);
-webkit-font-smoothing: antialiased;
}
.frame { max-width: 1280px; margin: 0 auto; padding: 24px; position: relative; }
/* generic placeholders */
.lorem { height: 9px; border-radius: 3px; background: var(--bar); display: block; }
.lorem.soft { background: var(--bar-soft); }
.lorem.dark { background: var(--box-dark); }
.greybox { background: var(--box); border: 1.5px solid var(--rule); border-radius: 6px; }
/* image placeholder: box with diagonal X */
.imgph {
position: relative; background: var(--box);
border: 1.5px solid var(--rule); border-radius: 5px; overflow: hidden;
}
.imgph::before, .imgph::after {
content: ''; position: absolute; inset: 0; margin: auto;
width: 141%; height: 1.5px; background: var(--rule);
top: 0; bottom: 0; left: -20%; transform-origin: center;
}
.imgph::before { transform: rotate(45deg); }
.imgph::after { transform: rotate(-45deg); }
/* redline annotation accent */
.redline {
font: 500 11px/1.2 var(--mono); color: var(--accent);
letter-spacing: 0.04em; display: inline-flex; align-items: center; gap: 6px;
}
.redline .tick { width: 7px; height: 7px; border: 1.5px solid var(--accent); display: inline-block; }
/* ---- app bar ---- */
.appbar {
display: flex; align-items: center; gap: 24px;
background: var(--panel); border: 1.5px solid var(--rule);
border-radius: 8px; padding: 12px 18px; margin-bottom: 16px;
}
.appbar .logo { width: 110px; height: 24px; background: var(--box-dark); border: 1.5px solid var(--rule); border-radius: 5px; flex-shrink: 0; }
.appbar nav { display: flex; gap: 22px; flex: 1; }
.appbar nav .lorem { width: 56px; }
.appbar nav .lorem.w2 { width: 72px; }
.appbar nav .lorem.w3 { width: 44px; }
.appbar .avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--box-dark); border: 1.5px solid var(--rule); flex-shrink: 0; }
/* ---- shell: sidebar + main ---- */
.shell { display: grid; grid-template-columns: 208px 1fr; gap: 16px; }
/* ---- sidebar ---- */
.sidebar { background: var(--panel); border: 1.5px solid var(--rule); border-radius: 8px; padding: 14px 12px; align-self: start; }
.sidebar .navitem { display: flex; align-items: center; gap: 11px; padding: 9px 10px; border-radius: 6px; margin-bottom: 4px; }
.sidebar .navitem .icn { width: 18px; height: 18px; border: 1.5px solid var(--rule); border-radius: 4px; background: var(--box); flex-shrink: 0; }
.sidebar .navitem .lorem { width: 78px; }
.sidebar .navitem.active { background: var(--ink); }
.sidebar .navitem.active .icn { background: #3a3a3c; border-color: #3a3a3c; }
.sidebar .navitem.active .lorem { background: #b9b9bf; }
.sidebar .sep { height: 1.5px; background: var(--rule); margin: 12px 4px; border: 0; }
.main { display: flex; flex-direction: column; gap: 16px; }
/* ---- KPI row ---- */
.kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
.kpi { background: var(--panel); border: 1.5px solid var(--rule); border-radius: 8px; padding: 16px; }
.kpi .label { width: 60%; height: 8px; }
.kpi .num { margin-top: 14px; height: 30px; width: 72%; background: var(--box-dark); border-radius: 5px; }
.kpi .sub { margin-top: 12px; width: 45%; height: 7px; }
/* ---- chart panel ---- */
.panel { background: var(--panel); border: 1.5px solid var(--rule); border-radius: 8px; padding: 16px 18px; }
.panel .phead { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
.panel .phead .title { width: 140px; height: 11px; }
.panel .phead .toolbar { display: flex; gap: 8px; }
.panel .phead .toolbar .chip { width: 46px; height: 20px; background: var(--box); border: 1.5px solid var(--rule); border-radius: 5px; }
.chartwrap svg { width: 100%; height: 200px; display: block; }
/* ---- table panel ---- */
.tpanel .thead, .tpanel .trow {
display: grid; grid-template-columns: 64px 1.6fr 1fr 0.8fr 70px;
gap: 14px; align-items: center;
}
.tpanel .thead { padding: 0 0 12px; border-bottom: 1.5px solid var(--rule); margin-bottom: 10px; }
.tpanel .thead .lorem { height: 8px; background: var(--box-dark); }
.tpanel .trow { padding: 11px 0; border-bottom: 1.5px solid #ededf0; }
.tpanel .trow:last-child { border-bottom: 0; }
.tpanel .thumb { width: 48px; height: 36px; }
.tpanel .trow .l-100 { width: 100%; }
.tpanel .trow .l-80 { width: 80%; }
.tpanel .trow .l-65 { width: 65%; }
.tpanel .trow .l-50 { width: 50%; }
.tpanel .trow .l-40 { width: 40%; }
.tpanel .pill { height: 18px; width: 58px; background: var(--box); border: 1.5px solid var(--rule); border-radius: 999px; }
/* ---- annotations ---- */
.annotations {
display: flex; gap: 22px; flex-wrap: wrap;
margin-top: 18px; padding-top: 14px; border-top: 1.5px dashed var(--accent);
}
.ann-float {
position: absolute; top: 96px; right: 30px;
border: 1.5px dashed var(--accent); border-radius: 6px;
padding: 6px 9px; background: rgba(247,247,248,0.9);
}
@media (max-width: 1000px) {
.shell { grid-template-columns: 1fr; }
.sidebar { display: flex; flex-wrap: wrap; gap: 6px; }
.sidebar .sep { display: none; }
.sidebar .navitem { margin-bottom: 0; }
.sidebar .navitem .lorem { width: 56px; }
.kpis { grid-template-columns: 1fr 1fr; }
.ann-float { display: none; }
.tpanel .thead, .tpanel .trow { grid-template-columns: 56px 1.4fr 1fr 64px; }
.tpanel .col-hide { display: none; }
}
</style>
</head>
<body>
<div class="frame">
<!-- TOP APP BAR -->
<header class="appbar" data-od-id="app-bar">
<div class="logo"></div>
<nav>
<span class="lorem"></span>
<span class="lorem w2"></span>
<span class="lorem w3"></span>
<span class="lorem"></span>
</nav>
<div class="avatar"></div>
</header>
<div class="ann-float redline" data-od-id="annotation-float"><span class="tick"></span>max-width 1280</div>
<div class="shell">
<!-- LEFT SIDEBAR NAV -->
<aside class="sidebar" data-od-id="sidebar">
<div class="navitem active"><span class="icn"></span><span class="lorem"></span></div>
<div class="navitem"><span class="icn"></span><span class="lorem"></span></div>
<div class="navitem"><span class="icn"></span><span class="lorem"></span></div>
<div class="navitem"><span class="icn"></span><span class="lorem"></span></div>
<hr class="sep" />
<div class="navitem"><span class="icn"></span><span class="lorem"></span></div>
<div class="navitem"><span class="icn"></span><span class="lorem"></span></div>
</aside>
<main class="main">
<!-- KPI ROW -->
<section class="kpis" data-od-id="kpis">
<div class="kpi"><span class="lorem label"></span><div class="num"></div><span class="lorem sub soft"></span></div>
<div class="kpi"><span class="lorem label"></span><div class="num"></div><span class="lorem sub soft"></span></div>
<div class="kpi"><span class="lorem label"></span><div class="num"></div><span class="lorem sub soft"></span></div>
<div class="kpi"><span class="lorem label"></span><div class="num"></div><span class="lorem sub soft"></span></div>
</section>
<!-- MAIN CHART PANEL -->
<section class="panel chartwrap" data-od-id="chart">
<div class="phead">
<span class="lorem title"></span>
<div class="toolbar"><span class="chip"></span><span class="chip"></span></div>
</div>
<svg viewBox="0 0 720 200" preserveAspectRatio="none" aria-hidden="true">
<defs>
<pattern id="hatch" patternUnits="userSpaceOnUse" width="7" height="7" patternTransform="rotate(45)">
<line x1="0" y1="0" x2="0" y2="7" stroke="#c9c9cf" stroke-width="2"/>
</pattern>
</defs>
<!-- gridlines -->
<line x1="48" y1="40" x2="704" y2="40" stroke="#ededf0" stroke-width="1.5"/>
<line x1="48" y1="90" x2="704" y2="90" stroke="#ededf0" stroke-width="1.5"/>
<line x1="48" y1="140" x2="704" y2="140" stroke="#ededf0" stroke-width="1.5"/>
<!-- axes -->
<line x1="48" y1="20" x2="48" y2="172" stroke="#1c1b1a" stroke-width="2"/>
<line x1="48" y1="172" x2="704" y2="172" stroke="#1c1b1a" stroke-width="2"/>
<!-- schematic bars (alternating solid grey / hatched) -->
<rect x="84" y="118" width="56" height="54" fill="#e3e3e6" stroke="#c9c9cf" stroke-width="1.5"/>
<rect x="172" y="86" width="56" height="86" fill="url(#hatch)" stroke="#c9c9cf" stroke-width="1.5"/>
<rect x="260" y="100" width="56" height="72" fill="#e3e3e6" stroke="#c9c9cf" stroke-width="1.5"/>
<rect x="348" y="58" width="56" height="114" fill="url(#hatch)" stroke="#c9c9cf" stroke-width="1.5"/>
<rect x="436" y="78" width="56" height="94" fill="#e3e3e6" stroke="#c9c9cf" stroke-width="1.5"/>
<rect x="524" y="44" width="56" height="128" fill="url(#hatch)" stroke="#c9c9cf" stroke-width="1.5"/>
<rect x="612" y="96" width="56" height="76" fill="#e3e3e6" stroke="#c9c9cf" stroke-width="1.5"/>
<!-- schematic trend line over the bars -->
<polyline points="112,128 200,98 288,112 376,70 464,90 552,56 640,108"
fill="none" stroke="#1c1b1a" stroke-width="2" stroke-dasharray="6 5" stroke-linecap="round"/>
</svg>
</section>
<!-- SECONDARY LIST / TABLE PANEL -->
<section class="panel tpanel" data-od-id="table">
<div class="phead">
<span class="lorem title"></span>
<div class="toolbar"><span class="chip"></span></div>
</div>
<div class="thead">
<span class="lorem"></span>
<span class="lorem"></span>
<span class="lorem"></span>
<span class="lorem col-hide"></span>
<span class="lorem"></span>
</div>
<div class="trow">
<span class="imgph thumb"></span>
<span class="lorem l-80"></span>
<span class="lorem l-65 soft"></span>
<span class="lorem l-50 soft col-hide"></span>
<span class="pill"></span>
</div>
<div class="trow">
<span class="imgph thumb"></span>
<span class="lorem l-100"></span>
<span class="lorem l-50 soft"></span>
<span class="lorem l-65 soft col-hide"></span>
<span class="pill"></span>
</div>
<div class="trow">
<span class="imgph thumb"></span>
<span class="lorem l-65"></span>
<span class="lorem l-80 soft"></span>
<span class="lorem l-40 soft col-hide"></span>
<span class="pill"></span>
</div>
<div class="trow">
<span class="imgph thumb"></span>
<span class="lorem l-100"></span>
<span class="lorem l-65 soft"></span>
<span class="lorem l-50 soft col-hide"></span>
<span class="pill"></span>
</div>
<div class="trow">
<span class="imgph thumb"></span>
<span class="lorem l-80"></span>
<span class="lorem l-40 soft"></span>
<span class="lorem l-65 soft col-hide"></span>
<span class="pill"></span>
</div>
</section>
<!-- MONOSPACE REDLINE ANNOTATIONS -->
<footer class="annotations" data-od-id="annotations">
<span class="redline"><span class="tick"></span>01 · 12-col grid</span>
<span class="redline"><span class="tick"></span>02 · gutter 16px</span>
<span class="redline"><span class="tick"></span>03 · greybox / lo-fi · no color</span>
</footer>
</main>
</div>
</div>
</body>
</html>