@namewta/speculo 0.8.6 → 0.8.8

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 (98) hide show
  1. package/dist/src/structured.js +8 -4
  2. package/dist/src/structured.js.map +1 -1
  3. package/package.json +1 -1
  4. package/template/canonical/canonical-specdev-goal-plan.md +67 -20
  5. package/template/canonical/canonical-specdev-grill-with-docs.md +17 -9
  6. package/template/canonical/canonical-specdev-orchestrate-implementation.md +2784 -0
  7. package/template/canonical/canonical-specdev-spec.md +19 -9
  8. package/template/canonical/canonical-specdev-tickets.md +58 -16
  9. package/template/canonical/canonical-specdev-wayfinder.md +11 -11
  10. package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +1 -1
  11. package/template/workflows/specdev/I-implement/I-implement.md +10 -5
  12. package/template/workflows/specdev/I-implement/execution-preflight.md +2 -0
  13. package/template/workflows/specdev/I-init-setup/I-init-setup.md +1 -1
  14. package/template/workflows/specdev/I-init-setup/config-template.json +2 -2
  15. package/template/workflows/specdev/O-orchestrate-implementation/O-orchestrate-implementation.md +129 -0
  16. package/template/workflows/specdev/O-orchestrate-implementation/conflict-and-drift.md +18 -0
  17. package/template/workflows/specdev/O-orchestrate-implementation/execution-loop.md +30 -0
  18. package/template/workflows/specdev/O-orchestrate-implementation/implementation-evidence-template.md +39 -0
  19. package/template/workflows/specdev/O-orchestrate-implementation/implementation-map-template.md +50 -0
  20. package/template/workflows/specdev/O-orchestrate-implementation/implementation-plan-template.md +61 -0
  21. package/template/workflows/specdev/O-orchestrate-implementation/input-readiness.md +25 -0
  22. package/template/workflows/specdev/O-orchestrate-implementation/super-dag.md +27 -0
  23. package/template/workflows/specdev/P-goal-plan/planning-modes.md +1 -1
  24. package/template/workflows/specdev/P-prototype/P-prototype.md +30 -26
  25. package/template/workflows/specdev/P-prototype/design-library/INDEX.md +43 -0
  26. package/template/workflows/specdev/P-prototype/design-library/color-and-theme.md +65 -0
  27. package/template/workflows/specdev/P-prototype/design-library/foundations.md +66 -0
  28. package/template/workflows/specdev/P-prototype/design-library/interaction-patterns.md +61 -0
  29. package/template/workflows/specdev/P-prototype/design-library/product-pattern-index.md +73 -0
  30. package/template/workflows/specdev/P-prototype/design-library/research-provenance.md +54 -0
  31. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/METHODOLOGY.md +90 -0
  32. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/README.md +31 -0
  33. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/data/extended-projects.json +241 -0
  34. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/data/projects.json +253 -0
  35. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/reference/USAGE.md +40 -0
  36. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/reference/design-tokens.css +145 -0
  37. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/report/OPEN_SOURCE_UI_RESEARCH_2026.md +519 -0
  38. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/PROJECT_TEMPLATE.md +29 -0
  39. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/README.md +9 -0
  40. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/claude-code-modern-clients.md +407 -0
  41. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/creative-ai-communication.md +574 -0
  42. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/data-dev-tools.md +432 -0
  43. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/personal-multiplatform-apps.md +185 -0
  44. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/productivity-collaboration.md +398 -0
  45. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/01-dense-ide.html +68 -0
  46. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/02-monochrome-console.html +18 -0
  47. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/03-soft-personal-ai.html +17 -0
  48. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/04-responsive-web.html +14 -0
  49. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/05-mobile-supervisor.html +16 -0
  50. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/06-cross-platform-workspace.html +17 -0
  51. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/07-local-first-content.html +9 -0
  52. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/08-media-first.html +17 -0
  53. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/README.md +49 -0
  54. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/ATTRIBUTION.md +9 -0
  55. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/landscape.jpg +0 -0
  56. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/lucide.js +20494 -0
  57. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/mountain.jpg +0 -0
  58. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/workspace.jpg +0 -0
  59. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/index.html +70 -0
  60. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/package-lock.json +78 -0
  61. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/package.json +12 -0
  62. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/screenshots/index-desktop.png +0 -0
  63. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/scripts/gallery.js +134 -0
  64. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/base.css +795 -0
  65. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/pages.css +533 -0
  66. package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/tests/gallery.spec.js +56 -0
  67. package/template/workflows/specdev/P-prototype/design-library/responsive-and-platforms.md +53 -0
  68. package/template/workflows/specdev/P-prototype/design-library/style-index.md +32 -0
  69. package/template/workflows/specdev/P-prototype/design-package.schema.json +70 -0
  70. package/template/workflows/specdev/P-prototype/design-system-template.md +366 -0
  71. package/template/workflows/specdev/P-prototype/detect-existing-style.md +53 -0
  72. package/template/workflows/specdev/P-prototype/generate-design-package.md +50 -0
  73. package/template/workflows/specdev/P-prototype/style-selection-protocol.md +41 -0
  74. package/template/workflows/specdev/P-prototype/tools/materialize-prototype.mjs +126 -0
  75. package/template/workflows/specdev/P-prototype/tools/validate-design-package.mjs +155 -0
  76. package/template/workflows/specdev/README.md +28 -15
  77. package/template/workflows/specdev/T-triage/T-triage.md +1 -1
  78. package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +2 -2
  79. package/template/workflows/specdev/W-wayfinder/local-tracker-contract.md +3 -4
  80. package/template/workflows/specdev/common/README.md +6 -3
  81. package/template/workflows/specdev/common/rules/artifact-contract.md +9 -3
  82. package/template/workflows/specdev/common/rules/change-completion.md +3 -0
  83. package/template/workflows/specdev/common/rules/deviation-control.md +2 -0
  84. package/template/workflows/specdev/common/rules/evidence-and-verification.md +2 -0
  85. package/template/workflows/specdev/common/rules/parent-implementation-orchestration.md +27 -0
  86. package/template/workflows/specdev/common/rules/path-ownership.md +3 -1
  87. package/template/workflows/specdev/common/schemas/config.schema.json +4 -4
  88. package/template/workflows/specdev/common/schemas/implementation-map.schema.json +40 -0
  89. package/template/workflows/specdev/common/schemas/implementation-plan.schema.json +44 -0
  90. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +4 -4
  91. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +1 -3
  92. package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +5 -3
  93. package/template/workflows/specdev/common/tools/README.md +2 -2
  94. package/template/workflows/specdev/common/tools/validate-specdev.mjs +572 -30
  95. package/template/workflows/specdev/P-prototype/logic-prototype.md +0 -24
  96. package/template/workflows/specdev/P-prototype/prototype-record-template.md +0 -46
  97. package/template/workflows/specdev/P-prototype/ui-prototype.md +0 -21
  98. package/template/workflows/specdev/common/schemas/prototype-record.schema.json +0 -24
@@ -0,0 +1,32 @@
1
+ # 八种可运行 UI 风格
2
+
3
+ 八个页面都是独立静态 HTML,使用 `<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/</Path>` 的共享样式、`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/scripts/gallery.js</Path>` 和本地 Lucide。先按任务与平台选风格,不按颜色选;页面是原型起点,不是生产组件库。
4
+
5
+ | ID | 风格与入口 | 适用任务 | 主要研究参考 | 样板中的结构与视觉签名 |
6
+ |---|---|---|---|---|
7
+ | 01 | 高密度 IDE:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/01-dense-ide.html</Path>` | IDE、数据库、API、日志工具 | cdesktop、DBeaver、DBX | 工具轨 + 230px explorer + tabs/editor + review panel + status bar;橙色小面积 accent,2/3/4px 圆角,12px 级代码密度 |
8
+ | 02 | 单色桌面控制台:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/02-monochrome-console.html</Path>` | Agent 管理台、本地开发控制台 | Opcode | 252px 侧栏 + 控制台/分析内容;近黑多层表面、浅中性 accent,4/8/12px 圆角,状态与图表依赖层级而非品牌铺色 |
9
+ | 03 | 柔和个人 AI 桌面:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/03-soft-personal-ai.html</Path>` | 个人 AI 助手、消费级桌面工具 | CodePilot、TOKENICODE | 264px 会话/项目栏 + 对话 + 360px 上下文;暖中性、克制阴影、8/12/16px 圆角,浅深主题与 context meter |
10
+ | 04 | 响应式 Web 工作台:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/04-responsive-web.html</Path>` | 自托管 Web UI、PWA、多设备访问 | CloudCLI | 260px 会话栏 + transcript/tools + 350px preview;蓝色动作 accent、4/6/8px 圆角;窄屏使用 drawer、底部导航与安全区,而非压缩三栏 |
11
+ | 05 | 移动监督与审批:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/05-mobile-supervisor.html</Path>` | 通知、审批、远程监督、follow-up | Happy | 最大 390px 的移动任务流;15px UI 字号、44px 级触控目标、紫色 tonal palette、12/18/22px 圆角;审批结果必须可见 |
12
+ | 06 | 多端 Agent 工作区:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/06-cross-platform-workspace.html</Path>` | 跨桌面/Web/移动的 Agent 工作区 | Paseo | 54px 工作区轨 + 250px Agent/会话栏 + tabbed workspace + 330px 工具栏;zinc 中性表面、绿色 accent、4/6/8px 圆角,关注等待审批状态 |
13
+ | 07 | Local-first 内容编辑器:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/07-local-first-content.html</Path>` | 笔记、知识库、local-first 编辑 | Notesnook、Joplin、Outline | 214px 全局栏 + 300px 内容列表 + 无框正文;暖纸面、锈色 accent、4/6/8px 圆角,正文宽度与阅读节奏优先 |
14
+ | 08 | 媒体优先个人应用:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/08-media-first.html</Path>` | 相册、资产库、视觉内容应用 | Immich | 224px 导航 + 自适应媒体网格 + 上传状态;深色低干扰 chrome、蓝色 accent、4/8/10px 圆角,真实图片和媒体本体是第一信号 |
15
+
16
+ ## 选择规则
17
+
18
+ 1. 先匹配用户的主要任务、目标输入设备和信息密度。
19
+ 2. 按配置生成 2-4 个功能候选;候选必须在布局、信息层级或主要操作入口上不同,最终再收束为一个主风格或边界明确的组合。
20
+ 3. 保留共享基础中的 keyboard focus、reduced motion、safe area、drawer/sheet 和稳定尺寸约束。
21
+ 4. 先改 `.theme-*` 的语义变量,再改局部组件;不要在业务节点散落 hex、任意圆角或单次间距。
22
+ 5. 保留布局职责,替换 demo 数据与状态。示例中的 Git、权限、同步、审批和上传只是交互演示。
23
+
24
+ ## 复用定位
25
+
26
+ - 风格总览:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/index.html</Path>`
27
+ - 共享原语与响应式基线:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/base.css</Path>`
28
+ - 八种主题与页面实现:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/pages.css</Path>`
29
+ - 主题、密度、drawer、tab 与演示交互:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/scripts/gallery.js</Path>`
30
+ - Playwright 行为检查:`<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/tests/gallery.spec.js</Path>`
31
+
32
+ 所有页面可直接用浏览器打开。只有重复执行 Playwright 时才在复制出的 change 设计包安装依赖;不要在研究快照内生成 `node_modules` 或 `test-results`。
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:specdev:ui-design-system:v2",
4
+ "title": "SpecDev UI design system frontmatter",
5
+ "type": "object",
6
+ "additionalProperties": true,
7
+ "required": [
8
+ "schema_version",
9
+ "artifact",
10
+ "change",
11
+ "design_id",
12
+ "status",
13
+ "project_kind",
14
+ "platforms",
15
+ "style_candidates",
16
+ "research_snapshot",
17
+ "prototype_files",
18
+ "updated_at"
19
+ ],
20
+ "properties": {
21
+ "schema_version": { "const": 2 },
22
+ "artifact": { "const": "ui-design-system" },
23
+ "change": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(?:-[a-z0-9]+)*$" },
24
+ "design_id": { "type": "string", "pattern": "^UI-\\d{3,}$" },
25
+ "status": { "enum": ["detecting", "selecting", "ready", "blocked"] },
26
+ "project_kind": { "enum": ["existing", "new"] },
27
+ "platforms": {
28
+ "type": "array",
29
+ "minItems": 1,
30
+ "uniqueItems": true,
31
+ "items": { "enum": ["desktop", "web", "mobile"] }
32
+ },
33
+ "detected_style": { "type": ["string", "null"] },
34
+ "style_candidates": {
35
+ "type": "array",
36
+ "minItems": 2,
37
+ "maxItems": 4,
38
+ "uniqueItems": true,
39
+ "items": { "type": "string", "minLength": 1 }
40
+ },
41
+ "selected_style": { "type": ["string", "null"] },
42
+ "density": { "enum": ["compact", "default", "comfortable", "touch", null] },
43
+ "color_mode": { "enum": ["light", "dark", "system", "both", null] },
44
+ "research_snapshot": { "const": "49b5659" },
45
+ "prototype_files": {
46
+ "type": "array",
47
+ "uniqueItems": true,
48
+ "allOf": [
49
+ { "contains": { "const": "final/index.html" } },
50
+ { "contains": { "const": "final/styles.css" } },
51
+ { "contains": { "const": "final/app.js" } }
52
+ ],
53
+ "items": { "type": "string" }
54
+ },
55
+ "updated_at": { "type": "string", "format": "date-time" }
56
+ },
57
+ "allOf": [
58
+ {
59
+ "if": { "properties": { "status": { "const": "ready" } } },
60
+ "then": {
61
+ "required": ["selected_style", "density", "color_mode"],
62
+ "properties": {
63
+ "selected_style": { "type": "string", "minLength": 1 },
64
+ "density": { "type": "string" },
65
+ "color_mode": { "type": "string" }
66
+ }
67
+ }
68
+ }
69
+ ]
70
+ }
@@ -0,0 +1,366 @@
1
+ ---
2
+ schema_version: 2
3
+ artifact: ui-design-system
4
+ change: <YYYY-MM-DD-topic>
5
+ design_id: UI-001
6
+ status: detecting
7
+ project_kind: existing
8
+ platforms: [desktop, web]
9
+ detected_style: null
10
+ style_candidates: [dense-ide, responsive-web]
11
+ selected_style: null
12
+ density: null
13
+ color_mode: null
14
+ research_snapshot: 49b5659
15
+ prototype_files: [final/index.html, final/styles.css, final/app.js]
16
+ updated_at: <ISO-8601>
17
+ ---
18
+
19
+ # UI Design System UI-001: <产品或功能名称>
20
+
21
+ ## Project Evidence
22
+
23
+ ### Scope and Tasks
24
+
25
+ - **Target app:**
26
+ - **Primary users:**
27
+ - **Top tasks:**
28
+ - **Platforms:**
29
+ - **Evidence mode:** rendered / source-only / new-product
30
+
31
+ ### Existing Stack and Design Facts
32
+
33
+ | Dimension | Observed fact | Project-relative evidence | Confidence |
34
+ |---|---|---|---|
35
+ | Framework | | | |
36
+ | Styling | | | |
37
+ | Components and icons | | | |
38
+ | Layout | | | |
39
+ | Color and themes | | | |
40
+ | Type and density | | | |
41
+ | Radius and elevation | | | |
42
+ | Interaction and states | | | |
43
+ | Responsive and accessibility | | | |
44
+
45
+ ### Keep, Adjust, Replace, Add
46
+
47
+ | Action | Decision | Evidence and reason |
48
+ |---|---|---|
49
+ | Keep | | |
50
+ | Adjust | | |
51
+ | Replace | | |
52
+ | Add | | |
53
+
54
+ ## Style Decision
55
+
56
+ ### Functional Candidates
57
+
58
+ | Candidate | Product fit | Structural difference | Research references | Migration cost | Decision |
59
+ |---|---|---|---|---|---|
60
+ | dense-ide | | | DBX, DBeaver, cdesktop | | pending |
61
+ | responsive-web | | | CloudCLI | | pending |
62
+
63
+ ### Decision Log
64
+
65
+ | Layer | Decision | Status | Reason |
66
+ |---|---|---|---|
67
+ | Product and platform | | pending | |
68
+ | Information architecture | | pending | |
69
+ | Density and typography | | pending | |
70
+ | Tone and theme | | pending | |
71
+ | Shape and elevation | | pending | |
72
+ | Interaction and motion | | pending | |
73
+ | Cross-platform reflow | | pending | |
74
+ | Visual convergence | | pending | |
75
+
76
+ ### Selected Direction and Rejections
77
+
78
+ - **Selected style:** pending
79
+ - **Composition boundary:** none
80
+ - **Rejected candidates and reasons:** pending
81
+
82
+ ## Foundation Tokens
83
+
84
+ ### Design Intent
85
+
86
+ Describe how the chosen shell, density, tone and hierarchy serve the primary task. Fixed defaults use a 4px spacing base, role-based colors, two or three main radii, borders for persistent regions and shadows only for overlays. Record every justified override.
87
+
88
+ ### Token Contract
89
+
90
+ | Role | Token | Value | Usage |
91
+ |---|---|---|---|
92
+ | Canvas | `--canvas` | | App background |
93
+ | Surface | `--surface-1` | | Primary work area |
94
+ | Text | `--text-primary` | | Main content |
95
+ | Border | `--border-default` | | Persistent separation |
96
+ | Accent | `--accent` | | Primary action and selection |
97
+ | Focus | `--focus-ring` | | Keyboard focus only |
98
+ | Radius | `--radius-control` | | Input and button |
99
+ | Density | `--control-height` | | Default control |
100
+
101
+ ## Component and State Contract
102
+
103
+ | Component or pattern | Default | Hover | Pressed | Focus | Disabled/loading/error | Keyboard and touch |
104
+ |---|---|---|---|---|---|---|
105
+ | App shell | | | | | | |
106
+ | Navigation | | | | | | |
107
+ | Button and icon button | | | | | | |
108
+ | Form controls | | | | | | |
109
+ | Primary work surface | | | | | | |
110
+ | Overlay | | | | | | |
111
+
112
+ Include empty, no-result, loading, error, offline, read-only and permission-denied where applicable. A state color always has a text, icon or shape cue.
113
+
114
+ ## Interaction Contract
115
+
116
+ | Trigger | Immediate response | Completion response | Failure/recovery | Persistence |
117
+ |---|---|---|---|---|
118
+ | Navigation | | | | URL / local state |
119
+ | Primary action | | | | |
120
+ | Async action | | | | |
121
+ | Destructive action | | | | |
122
+
123
+ - Under 100ms: no loading indicator unless state would otherwise be ambiguous.
124
+ - 100ms-1s: local progress or skeleton without whole-page flashing.
125
+ - Over 1s: persistent progress with cancellation or background-task access.
126
+ - Motion defaults to 120-180ms for local state and 200-240ms for sheets; reduced motion removes nonessential transforms.
127
+
128
+ ## Responsive Contract
129
+
130
+ | Desktop structure | Narrow-screen replacement | Breakpoint evidence | Return/recovery path |
131
+ |---|---|---|---|
132
+ | Fixed sidebar | Drawer or single-level navigation | | |
133
+ | Right inspector | Sheet or full-screen detail | | |
134
+ | Wide toolbar | Primary action plus overflow | | |
135
+ | Hover tools | Explicit button or menu | | |
136
+
137
+ Document desktop, Web and mobile separately when their primary tasks differ. Touch targets are at least 44px; compact desktop controls may look smaller while keeping a usable hit area.
138
+
139
+ ## Prototype Sources
140
+
141
+ The following named blocks are the authoritative runnable prototype. Materialized files must match them exactly.
142
+
143
+ <!-- PROTOTYPE-FILE: final/index.html -->
144
+ ```html
145
+ <!doctype html>
146
+ <html lang="zh-CN">
147
+ <head>
148
+ <meta charset="utf-8">
149
+ <meta name="viewport" content="width=device-width, initial-scale=1">
150
+ <title>Workspace Prototype</title>
151
+ <link rel="stylesheet" href="styles.css">
152
+ </head>
153
+ <body>
154
+ <div class="app-shell">
155
+ <aside class="sidebar" id="sidebar">
156
+ <div class="brand">Project</div>
157
+ <nav aria-label="Primary">
158
+ <button class="nav-item active" type="button">Workspace</button>
159
+ <button class="nav-item" type="button">Activity</button>
160
+ <button class="nav-item" type="button">Settings</button>
161
+ </nav>
162
+ </aside>
163
+ <main class="workspace">
164
+ <header class="toolbar">
165
+ <button class="menu-button" type="button" data-sidebar-toggle aria-controls="sidebar" aria-expanded="false">Menu</button>
166
+ <div>
167
+ <span class="eyebrow">Current project</span>
168
+ <h1>Workspace</h1>
169
+ </div>
170
+ <div class="toolbar-actions">
171
+ <button type="button" data-density-toggle>Density</button>
172
+ <button type="button" data-theme-toggle>Theme</button>
173
+ </div>
174
+ </header>
175
+ <section class="content" aria-live="polite">
176
+ <div class="section-heading">
177
+ <div>
178
+ <h2>Recent work</h2>
179
+ <p>Three active items, one waiting for review.</p>
180
+ </div>
181
+ <button class="primary" type="button" data-primary-action>New item</button>
182
+ </div>
183
+ <div class="work-list" role="list">
184
+ <button class="work-row selected" type="button" role="listitem">
185
+ <span><strong>Design system</strong><small>Updated 4 minutes ago</small></span>
186
+ <span class="status">In progress</span>
187
+ </button>
188
+ <button class="work-row" type="button" role="listitem">
189
+ <span><strong>Responsive shell</strong><small>Updated yesterday</small></span>
190
+ <span class="status neutral">Review</span>
191
+ </button>
192
+ </div>
193
+ <div class="feedback" data-feedback hidden>Draft created. The workspace state is preserved.</div>
194
+ </section>
195
+ </main>
196
+ </div>
197
+ <script src="app.js"></script>
198
+ </body>
199
+ </html>
200
+ ```
201
+ <!-- /PROTOTYPE-FILE -->
202
+
203
+ <!-- PROTOTYPE-FILE: final/styles.css -->
204
+ ```css
205
+ :root {
206
+ color-scheme: light;
207
+ --canvas: #f3f4f2;
208
+ --surface-1: #ffffff;
209
+ --surface-2: #eef0ed;
210
+ --text-primary: #20221f;
211
+ --text-secondary: #666b64;
212
+ --border-default: #d9ddd7;
213
+ --accent: #176b4d;
214
+ --accent-subtle: #e2f0e9;
215
+ --focus-ring: #2478d4;
216
+ --radius-control: 6px;
217
+ --radius-panel: 8px;
218
+ --control-height: 36px;
219
+ --sidebar-width: 248px;
220
+ --font-ui: Inter, "Segoe UI", "PingFang SC", sans-serif;
221
+ }
222
+
223
+ html.dark {
224
+ color-scheme: dark;
225
+ --canvas: #151715;
226
+ --surface-1: #1c1f1c;
227
+ --surface-2: #272b27;
228
+ --text-primary: #f1f3ef;
229
+ --text-secondary: #adb3aa;
230
+ --border-default: #343934;
231
+ --accent: #79bd98;
232
+ --accent-subtle: #21382c;
233
+ --focus-ring: #72aef0;
234
+ }
235
+
236
+ * { box-sizing: border-box; }
237
+ html, body { min-width: 320px; min-height: 100%; margin: 0; }
238
+ body { background: var(--canvas); color: var(--text-primary); font: 14px/1.5 var(--font-ui); }
239
+ button { min-height: var(--control-height); border: 1px solid var(--border-default); border-radius: var(--radius-control); background: var(--surface-1); color: inherit; font: inherit; cursor: pointer; }
240
+ button:hover { background: var(--surface-2); }
241
+ button:active { transform: translateY(1px); }
242
+ button:focus-visible { outline: 3px solid color-mix(in srgb, var(--focus-ring) 35%, transparent); outline-offset: 2px; }
243
+ button:disabled { cursor: not-allowed; opacity: .48; }
244
+ .app-shell { display: flex; min-height: 100vh; }
245
+ .sidebar { width: var(--sidebar-width); flex: 0 0 var(--sidebar-width); border-right: 1px solid var(--border-default); background: var(--surface-1); }
246
+ .brand { height: 56px; padding: 17px 16px; border-bottom: 1px solid var(--border-default); font-weight: 700; }
247
+ .sidebar nav { display: grid; gap: 4px; padding: 10px; }
248
+ .nav-item { justify-content: flex-start; border-color: transparent; text-align: left; }
249
+ .nav-item.active { border-color: color-mix(in srgb, var(--accent) 32%, var(--border-default)); background: var(--accent-subtle); color: var(--accent); }
250
+ .workspace { min-width: 0; flex: 1; }
251
+ .toolbar { display: flex; min-height: 64px; align-items: center; gap: 12px; padding: 8px 20px; border-bottom: 1px solid var(--border-default); background: var(--surface-1); }
252
+ .toolbar h1, .section-heading h2 { margin: 0; font-size: 18px; letter-spacing: 0; }
253
+ .eyebrow, small { display: block; color: var(--text-secondary); font-size: 12px; }
254
+ .toolbar-actions { display: flex; gap: 8px; margin-left: auto; }
255
+ .menu-button { display: none; }
256
+ .content { width: min(960px, calc(100% - 40px)); margin: 0 auto; padding: 32px 0; }
257
+ .section-heading { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; }
258
+ .section-heading p { margin: 4px 0 0; color: var(--text-secondary); }
259
+ .primary { border-color: var(--accent); background: var(--accent); color: #fff; }
260
+ .primary:hover { background: color-mix(in srgb, var(--accent) 88%, #000); }
261
+ .work-list { margin-top: 20px; border-top: 1px solid var(--border-default); }
262
+ .work-row { display: flex; width: 100%; min-height: 64px; align-items: center; justify-content: space-between; border-width: 0 0 1px; border-radius: 0; padding: 10px 12px; text-align: left; }
263
+ .work-row.selected { background: var(--accent-subtle); }
264
+ .status { color: var(--accent); font-size: 12px; font-weight: 700; }
265
+ .status.neutral { color: var(--text-secondary); }
266
+ .feedback { margin-top: 16px; border-left: 3px solid var(--accent); padding: 10px 12px; background: var(--accent-subtle); }
267
+ .density-compact { --control-height: 30px; }
268
+ .density-compact .work-row { min-height: 48px; }
269
+
270
+ @media (max-width: 760px) {
271
+ .sidebar { position: fixed; z-index: 20; inset: 0 auto 0 0; transform: translateX(-100%); transition: transform 180ms ease; }
272
+ .sidebar.open { transform: translateX(0); }
273
+ .menu-button { display: inline-flex; align-items: center; }
274
+ .toolbar { padding-inline: 12px; }
275
+ .toolbar-actions button { min-width: 44px; }
276
+ .content { width: calc(100% - 24px); padding: 24px 0; }
277
+ .section-heading { align-items: stretch; flex-direction: column; }
278
+ .primary { min-height: 44px; }
279
+ }
280
+
281
+ @media (prefers-reduced-motion: reduce) {
282
+ *, *::before, *::after { scroll-behavior: auto !important; transition-duration: .01ms !important; animation-duration: .01ms !important; }
283
+ button:active { transform: none; }
284
+ }
285
+ ```
286
+ <!-- /PROTOTYPE-FILE -->
287
+
288
+ <!-- PROTOTYPE-FILE: final/app.js -->
289
+ ```javascript
290
+ (function () {
291
+ const root = document.documentElement;
292
+ const body = document.body;
293
+ const sidebar = document.querySelector("#sidebar");
294
+ const themeButton = document.querySelector("[data-theme-toggle]");
295
+ const densityButton = document.querySelector("[data-density-toggle]");
296
+ const sidebarButton = document.querySelector("[data-sidebar-toggle]");
297
+ const actionButton = document.querySelector("[data-primary-action]");
298
+ const feedback = document.querySelector("[data-feedback]");
299
+
300
+ const savedTheme = localStorage.getItem("prototype-theme");
301
+ if (savedTheme === "dark" || (!savedTheme && matchMedia("(prefers-color-scheme: dark)").matches)) root.classList.add("dark");
302
+
303
+ themeButton?.addEventListener("click", () => {
304
+ root.classList.toggle("dark");
305
+ localStorage.setItem("prototype-theme", root.classList.contains("dark") ? "dark" : "light");
306
+ });
307
+
308
+ densityButton?.addEventListener("click", () => body.classList.toggle("density-compact"));
309
+
310
+ sidebarButton?.addEventListener("click", () => {
311
+ const open = sidebar?.classList.toggle("open") ?? false;
312
+ sidebarButton.setAttribute("aria-expanded", String(open));
313
+ });
314
+
315
+ document.querySelectorAll(".work-row").forEach((row) => row.addEventListener("click", () => {
316
+ document.querySelectorAll(".work-row").forEach((item) => item.classList.toggle("selected", item === row));
317
+ }));
318
+
319
+ actionButton?.addEventListener("click", () => {
320
+ actionButton.disabled = true;
321
+ actionButton.textContent = "Creating...";
322
+ window.setTimeout(() => {
323
+ actionButton.disabled = false;
324
+ actionButton.textContent = "New item";
325
+ feedback.hidden = false;
326
+ }, 650);
327
+ });
328
+
329
+ document.addEventListener("keydown", (event) => {
330
+ if (event.key === "Escape" && sidebar?.classList.contains("open")) {
331
+ sidebar.classList.remove("open");
332
+ sidebarButton?.setAttribute("aria-expanded", "false");
333
+ sidebarButton?.focus();
334
+ }
335
+ });
336
+ })();
337
+ ```
338
+ <!-- /PROTOTYPE-FILE -->
339
+
340
+ ## Validation and Handoff
341
+
342
+ ### Commands and Evidence
343
+
344
+ | Command | Exit code | Key result | Evidence path |
345
+ |---|---:|---|---|
346
+ | materialize | | | |
347
+ | materialize --check | | | |
348
+ | design package validator | | | |
349
+ | desktop viewport | | | |
350
+ | mobile viewport | | | |
351
+
352
+ ### Acceptance
353
+
354
+ - [ ] Every candidate has a standalone comparison HTML page.
355
+ - [ ] Final source blocks and materialized files are byte-equivalent.
356
+ - [ ] Light/dark, keyboard, focus, long text and reduced motion were checked.
357
+ - [ ] Desktop and mobile screenshots show no blank canvas, overlap or unintended overflow.
358
+ - [ ] No unresolved high-impact design decision remains.
359
+
360
+ ### Handoff
361
+
362
+ - **Authoritative artifact:** `<Path>{roots.state}/specdev/changes/{change}/prototypes/{design-id}/design-system.md</Path>`
363
+ - **Comparison:** `<Path>{roots.state}/specdev/changes/{change}/prototypes/{design-id}/comparison/index.html</Path>`
364
+ - **Runnable final:** `<Path>{roots.state}/specdev/changes/{change}/prototypes/{design-id}/final/index.html</Path>`
365
+ - **Next Work:** G / S / T / I / blocked
366
+ - **Unresolved high-impact questions:** none / ...
@@ -0,0 +1,53 @@
1
+ # Existing Style Detection
2
+
3
+ 在推荐风格前使用。本协议只记录可发现事实;依赖名称、README 宣传语和单张截图都不能单独证明实际 UI。
4
+
5
+ ## 1. 确定检测面
6
+
7
+ 先定位用户实际要设计的应用、入口、代表性路由和目标平台。多应用仓库按 app 分开记录,不把后台、营销站、桌面壳和移动端混为同一风格。至少选择一个主任务页面,以及存在时的列表、详情、设置、空状态和窄屏页面。
8
+
9
+ **完成标准**:检测范围、排除范围、核心用户和最高频 3-5 个任务均已写入 `Project Evidence`。
10
+
11
+ ## 2. 技术与组件证据
12
+
13
+ 穷尽读取与目标 app 相关的 manifest、框架配置、样式入口、主题、组件封装、图标、路由和测试:
14
+
15
+ - Web:React/Vue/Svelte 等框架、SSR/SPA、CSS/Tailwind/SCSS/CSS-in-JS、组件原语和图标库;
16
+ - Desktop:Electron/Tauri/Flutter/原生壳、窗口 chrome、菜单、快捷键、文件和终端能力;
17
+ - Mobile:React Native/Expo/Flutter/原生导航、safe area、keyboard controller、sheet 与手势;
18
+ - 设计系统:raw/semantic/component/business token 层级、浅深主题和密度机制。
19
+
20
+ 记录项目相对路径与具体 symbol/token;不存在时写 `not-found`,不得用常见默认值补齐事实。
21
+
22
+ **完成标准**:每项技术断言可回到 manifest、配置或源码,第三方默认值与项目覆写已区分。
23
+
24
+ ## 3. 视觉与布局盘点
25
+
26
+ 统计或抽样确认重复出现的颜色、字号、行高、字重、间距、控件高度、图标尺寸、圆角、边框、阴影、动画时长和 breakpoint。识别 shell 属于全局侧栏、双层导航、列表-详情、编辑器/画布、仪表盘网格或内容中心,也允许明确的组合。
27
+
28
+ 按 `一致且可复用 / 存在但分裂 / 缺失 / 无法确认` 分类,不因某个页面用了 16px 圆角就把整个产品称为柔和风格。
29
+
30
+ **完成标准**:`Project Evidence` 含可核查的 token 表、布局尺寸和置信度,异常值与主流值分开。
31
+
32
+ ## 4. 交互与状态盘点
33
+
34
+ 检查导航恢复、URL 状态、hover、pressed、focus-visible、selected、disabled、loading、empty、no-result、error、offline、read-only、permission-denied、危险操作和撤销。检查键盘、触屏、200% 缩放、长中文、reduced motion 与深浅主题。
35
+
36
+ 可以运行现有应用时,使用真实页面和极端数据观察;不能运行时明确记录 `source-only`,不虚构浏览器观察。
37
+
38
+ **完成标准**:主要任务的鼠标、键盘和触屏路径均有结论,缺失状态成为后续设计要求。
39
+
40
+ ## 5. 输出检测摘要
41
+
42
+ 形成以下四栏:
43
+
44
+ | 分类 | 含义 |
45
+ |---|---|
46
+ | 保留 | 已一致、符合任务且有证据的设计 |
47
+ | 调整 | 方向正确但 token、状态或跨端行为不完整 |
48
+ | 替换 | 与核心任务、输入设备或可访问性冲突 |
49
+ | 补齐 | 当前不存在但完成任务必须具备 |
50
+
51
+ 最后写出 `detected_style`、密度、色调、主布局、平台和置信度;无法归入单一风格时使用 `hybrid` 并列出组成,不强行贴标签。
52
+
53
+ **完成标准**:候选推荐可以逐条引用本摘要,所有推断均明确标记。
@@ -0,0 +1,50 @@
1
+ # Generate Design Package
2
+
3
+ 在候选已形成后使用。设计系统主文档是源;HTML/CSS/JS 是可运行投影,不能成为第二套未记录规则。
4
+
5
+ ## 1. 生成候选页面
6
+
7
+ 为每个候选创建 `<Path>{roots.state}/specdev/changes/{change}/prototypes/{design-id}/comparison/variants/{style-id}.html</Path>`。每页使用相同真实任务、数据和状态,差异集中在 shell、信息层级、操作入口、密度、token 与跨端策略。页面必须离线运行,不引用 CDN、远程字体或远程图片;可从 `<Path>{roots.workflows}/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/</Path>` 复制已归属的本地资产。
8
+
9
+ 每页至少展示默认、hover/focus、selected、loading、empty/error 中与任务相关的状态,并包含浅/深主题或明确说明为何只有单主题。图标按钮使用项目已有图标库;新项目可复制 design library 内的 Lucide 资产。
10
+
11
+ **完成标准**:2-4 个候选各有独立 HTML,使用同一任务语义,页面差异不只是颜色。
12
+
13
+ ## 2. 生成 comparison 索引
14
+
15
+ `<Path>{roots.state}/specdev/changes/{change}/prototypes/{design-id}/comparison/index.html</Path>` 提供候选名称、适合原因、关键 token、迁移成本、拒绝风险和打开入口。桌面并排或分栏比较;窄屏改为顺序浏览,不把预览压成不可读小窗。索引只帮助比较,不在用户选择前偷偷设置赢家。
16
+
17
+ **完成标准**:所有候选均可从索引到达,返回路径明确,键盘可操作,390px 与 1440px 均无意外溢出。
18
+
19
+ ## 3. 写入最终源码
20
+
21
+ 用户确认后,在设计系统主文档的 `Prototype Sources` 中写入且只写入以下具名块:
22
+
23
+ ````text
24
+ <!-- PROTOTYPE-FILE: final/index.html -->
25
+ ```html
26
+ ...
27
+ ```
28
+ <!-- /PROTOTYPE-FILE -->
29
+ ````
30
+
31
+ CSS 与 JS 分别使用约定的 final 目标。源码不得包含占位符、生产 secret、生产写操作或无法离线取得的依赖。HTML 必须使用相对引用连接物化后的 CSS 与 JS。
32
+
33
+ **完成标准**:三个块路径唯一、语言正确、代码完整,Markdown 单独阅读即可理解全部实现。
34
+
35
+ ## 4. 物化与校验
36
+
37
+ 运行:
38
+
39
+ ```bash
40
+ node <Path>{roots.workflows}/specdev/P-prototype/tools/materialize-prototype.mjs</Path> \
41
+ <Path>{roots.state}/specdev/changes/{change}/prototypes/{design-id}/design-system.md</Path>
42
+
43
+ node <Path>{roots.workflows}/specdev/P-prototype/tools/materialize-prototype.mjs</Path> \
44
+ --check \
45
+ <Path>{roots.state}/specdev/changes/{change}/prototypes/{design-id}/design-system.md</Path>
46
+ ```
47
+
48
+ 随后运行局部 validator、项目可用的 HTML/CSS/JS 检查和浏览器视口检查,把命令、退出码、关键输出与截图相对路径写入 `Validation and Handoff`。
49
+
50
+ **完成标准**:物化二次运行无 diff;最终页面离线可用;所有验收项有证据而不是口头断言。
@@ -0,0 +1,41 @@
1
+ # Style Selection Protocol
2
+
3
+ 在检测完成并已生成 2-4 个功能候选后使用。每轮只关闭一个决策层,每次回答立即写入设计系统主文档;已确认内容不重复询问。
4
+
5
+ ## 决策顺序
6
+
7
+ 1. **产品与平台**:确认主用户、最高频任务、桌面/Web/移动优先级及是否真正跨端。
8
+ 2. **信息架构**:从全局侧栏、双层导航、列表-详情、画布/检查器、仪表盘网格、内容中心中选择 shell 或明确组合。
9
+ 3. **密度与排版**:选择 Compact、Default、Comfortable 或 Touch,并确认 UI/正文/代码字体角色。
10
+ 4. **色调与主题**:选择暖中性、冷中性、单色、品牌强调或媒体深色;确认 light、dark、system 或 both。
11
+ 5. **形状与层级**:确认主圆角组、边框/表面/阴影职责、常驻区与浮层差异。
12
+ 6. **交互与运动**:确认点击、异步、危险操作、拖动、键盘、触屏和 reduced-motion 行为。
13
+ 7. **跨端重排**:确认侧栏、检查器、表格、工具栏、hover 工具在窄屏的任务级替代。
14
+ 8. **可视收束**:打开 comparison,选择一个候选、拒绝其余候选,或明确哪些区域组合;不得只说“更现代”。
15
+
16
+ ## 候选说明合同
17
+
18
+ 每个候选必须包含:风格 id、适用任务、布局变化、token 摘要、三项关键交互、平台策略、现有 UI 的保留/调整/替换项、研究项目、迁移成本和不适用风险。候选必须在信息层级或操作入口上有结构差异,不能只是颜色与文案变化。
19
+
20
+ 候选数读取 `<Path>{roots.state}/specdev/config.json</Path>` 的 `planning.ui_design_default_candidates` 与 `planning.ui_design_max_candidates`,两者必须落在 2-4。事实只支持两个方向时可以少于默认值;达到配置上限前也不得为了凑数引入不适合产品的风格。
21
+
22
+ ## 八种风格路由
23
+
24
+ | 风格 | 首选任务 | 避免场景 |
25
+ |---|---|---|
26
+ | dense-ide | 数据库、API、日志、专业开发工具 | 低频消费级表单 |
27
+ | monochrome-console | Agent 管理、本地控制台、运行监控 | 品牌内容与媒体浏览 |
28
+ | soft-personal-ai | 个人 AI、轻量桌面助手 | 极端数据密度和大表格 |
29
+ | responsive-web | 自托管 Web、PWA、多设备访问 | 强原生手势为核心的移动产品 |
30
+ | mobile-supervisor | 审批、通知、远程监督 | 手机内完整复刻 IDE |
31
+ | cross-platform-workspace | 桌面/Web/移动 Agent 工作区 | 只需单页面内容展示 |
32
+ | local-first-content | 笔记、知识库、长内容 | 监控大盘和媒体墙 |
33
+ | media-first | 相册、视频、资产库 | 长表单和密集代码任务 |
34
+
35
+ 需要 CRM、仪表盘、画布、客服、通信或 API 分窗时,读取 `<Path>{roots.workflows}/specdev/P-prototype/design-library/product-pattern-index.md</Path>`,将产品布局模式与最接近的视觉风格组合,并记录组合边界。
36
+
37
+ ## 持久化与阻塞
38
+
39
+ 每轮更新 frontmatter、`Style Decision` 中的选择表和拒绝理由,再原子重读。用户尚未看到候选 HTML、回答含糊或多个方向仍会改变核心布局时保持 `status: selecting`。用户不在线时可以继续补充可发现证据和生成候选,但不得替用户选择最终风格。
40
+
41
+ **完成标准**:八层决策均为 confirmed 或明确 not-applicable;被拒绝候选有原因,组合候选有逐区域边界,最终方向能直接生成 token 与页面。