ui-ux-master 1.1.0
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/LICENSE +21 -0
- package/README.md +198 -0
- package/SKILL.md +717 -0
- package/agent-templates/antigravity/AGENTS.append.md +15 -0
- package/agent-templates/claude/commands/ui-ux-master.md +25 -0
- package/agent-templates/codex/AGENTS.append.md +15 -0
- package/agent-templates/cursor/rules/ui-ux-master.mdc +10 -0
- package/agent-templates/gemini/GEMINI.append.md +9 -0
- package/agent-templates/universal/ui-ux-master-trigger.md +18 -0
- package/agent-templates/windsurf/rules/ui-ux-master.md +17 -0
- package/bin/ui-ux-master.mjs +192 -0
- package/docs/slash-command-compatibility.md +58 -0
- package/package.json +55 -0
- package/references/accessibility-advanced-patterns.md +43 -0
- package/references/competitive-landscape.md +47 -0
- package/references/content-design-and-i18n.md +53 -0
- package/references/data-visualization-dashboard-ux.md +46 -0
- package/references/design-system-playbook.md +133 -0
- package/references/ethical-inclusive-design.md +52 -0
- package/references/platform-guidelines.md +59 -0
- package/references/service-design-journey-mapping.md +39 -0
- package/references/top-100-brand-website-analysis.md +302 -0
- package/references/ui-ux-complete-checklist.md +214 -0
- package/references/ui-ux-curriculum-and-standards.md +40 -0
- package/references/ui-ux-frontend-implementation-rules.md +378 -0
- package/references/ui-ux-memory-workflow.md +175 -0
- package/references/usability-heuristics.md +65 -0
- package/references/ux-measurement-quality-gates.md +58 -0
- package/references/ux-research-methods.md +99 -0
- package/references/wcag-aa-quick-reference.md +85 -0
- package/scripts/build_deployment_zip.py +42 -0
- package/scripts/validate_skill.py +303 -0
- package/templates/component-spec.md +127 -0
- package/templates/design-system-spec.md +121 -0
- package/templates/top-brand-frontend-spec.md +133 -0
- package/templates/ui-ux-audit-report.md +146 -0
- package/templates/ui-ux-brief.md +86 -0
- package/templates/ui-ux-memory.md +204 -0
- package/tests/install-smoke.test.mjs +71 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# UI/UX Audit Report
|
|
2
|
+
|
|
3
|
+
## Executive Summary
|
|
4
|
+
|
|
5
|
+
- Overall score:
|
|
6
|
+
- Top strengths:
|
|
7
|
+
- Top risks:
|
|
8
|
+
- Highest-impact recommendation:
|
|
9
|
+
- Evidence confidence: high / medium / low:
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
- Screens/pages reviewed:
|
|
14
|
+
- User goal reviewed:
|
|
15
|
+
- Devices/viewports reviewed:
|
|
16
|
+
- Platform conventions reviewed:
|
|
17
|
+
- Evidence used:
|
|
18
|
+
|
|
19
|
+
## Scorecard
|
|
20
|
+
|
|
21
|
+
| Area | Score 1-5 | Evidence Confidence | Notes |
|
|
22
|
+
|---|---:|---|---|
|
|
23
|
+
| Clarity | | | |
|
|
24
|
+
| Hierarchy | | | |
|
|
25
|
+
| Flow | | | |
|
|
26
|
+
| Content design | | | |
|
|
27
|
+
| Accessibility | | | |
|
|
28
|
+
| Consistency | | | |
|
|
29
|
+
| Responsiveness | | | |
|
|
30
|
+
| Feedback/states | | | |
|
|
31
|
+
| Trust | | | |
|
|
32
|
+
| Platform fit | | | |
|
|
33
|
+
| Internationalization/content resilience | | | |
|
|
34
|
+
| Ethics/privacy/dark-pattern risk | | | |
|
|
35
|
+
| Performance perception | | | |
|
|
36
|
+
| Conversion/task success | | | |
|
|
37
|
+
| Data visualization/dashboard UX if applicable | | | |
|
|
38
|
+
| Implementation readiness | | | |
|
|
39
|
+
|
|
40
|
+
## Heuristic Findings
|
|
41
|
+
|
|
42
|
+
| Location | Heuristic/Principle | Severity | Evidence | Recommendation |
|
|
43
|
+
|---|---|---|---|---|
|
|
44
|
+
| | | | | |
|
|
45
|
+
|
|
46
|
+
## Severity-Ranked Findings
|
|
47
|
+
|
|
48
|
+
### Critical
|
|
49
|
+
|
|
50
|
+
1. Finding:
|
|
51
|
+
- Heuristic/WCAG/platform rule:
|
|
52
|
+
- Evidence:
|
|
53
|
+
- Evidence confidence:
|
|
54
|
+
- Impact:
|
|
55
|
+
- Recommendation:
|
|
56
|
+
- Acceptance criteria:
|
|
57
|
+
|
|
58
|
+
### High
|
|
59
|
+
|
|
60
|
+
1. Finding:
|
|
61
|
+
- Heuristic/WCAG/platform rule:
|
|
62
|
+
- Evidence:
|
|
63
|
+
- Evidence confidence:
|
|
64
|
+
- Impact:
|
|
65
|
+
- Recommendation:
|
|
66
|
+
- Acceptance criteria:
|
|
67
|
+
|
|
68
|
+
### Medium
|
|
69
|
+
|
|
70
|
+
1. Finding:
|
|
71
|
+
- Heuristic/WCAG/platform rule:
|
|
72
|
+
- Evidence:
|
|
73
|
+
- Evidence confidence:
|
|
74
|
+
- Impact:
|
|
75
|
+
- Recommendation:
|
|
76
|
+
- Acceptance criteria:
|
|
77
|
+
|
|
78
|
+
### Low
|
|
79
|
+
|
|
80
|
+
1. Finding:
|
|
81
|
+
- Heuristic/WCAG/platform rule:
|
|
82
|
+
- Evidence:
|
|
83
|
+
- Evidence confidence:
|
|
84
|
+
- Impact:
|
|
85
|
+
- Recommendation:
|
|
86
|
+
- Acceptance criteria:
|
|
87
|
+
|
|
88
|
+
## Measured Evidence and Quality Gates
|
|
89
|
+
|
|
90
|
+
- Primary task success metric:
|
|
91
|
+
- Accessibility gate:
|
|
92
|
+
- Responsive/platform gate:
|
|
93
|
+
- Performance perception gate:
|
|
94
|
+
- Analytics/events needed:
|
|
95
|
+
- Usability validation recommended:
|
|
96
|
+
|
|
97
|
+
## Quick Wins
|
|
98
|
+
|
|
99
|
+
- [ ] Quick win 1:
|
|
100
|
+
- [ ] Quick win 2:
|
|
101
|
+
- [ ] Quick win 3:
|
|
102
|
+
|
|
103
|
+
## Recommended Revised Structure
|
|
104
|
+
|
|
105
|
+
- Header/nav:
|
|
106
|
+
- Main content:
|
|
107
|
+
- Primary CTA:
|
|
108
|
+
- Secondary actions:
|
|
109
|
+
- Supporting content:
|
|
110
|
+
- Footer/persistent actions:
|
|
111
|
+
|
|
112
|
+
## Copy Improvements
|
|
113
|
+
|
|
114
|
+
| Current | Suggested | Reason |
|
|
115
|
+
|---|---|---|
|
|
116
|
+
| | | |
|
|
117
|
+
|
|
118
|
+
## Accessibility Fixes
|
|
119
|
+
|
|
120
|
+
- [ ] Contrast:
|
|
121
|
+
- [ ] Keyboard:
|
|
122
|
+
- [ ] Focus:
|
|
123
|
+
- [ ] Labels:
|
|
124
|
+
- [ ] Semantics:
|
|
125
|
+
- [ ] Motion:
|
|
126
|
+
- [ ] Complex widgets/ARIA:
|
|
127
|
+
|
|
128
|
+
## Responsive and Platform Fixes
|
|
129
|
+
|
|
130
|
+
- Mobile:
|
|
131
|
+
- Tablet:
|
|
132
|
+
- Desktop:
|
|
133
|
+
- Wide:
|
|
134
|
+
- Native/platform convention issues:
|
|
135
|
+
|
|
136
|
+
## QA Checklist
|
|
137
|
+
|
|
138
|
+
- [ ] Main user task succeeds.
|
|
139
|
+
- [ ] Keyboard-only task succeeds.
|
|
140
|
+
- [ ] Screen reader labels are meaningful.
|
|
141
|
+
- [ ] Loading, empty, error, success states are present.
|
|
142
|
+
- [ ] Mobile layout works at 320px.
|
|
143
|
+
- [ ] Text contrast meets WCAG AA.
|
|
144
|
+
- [ ] Platform conventions are respected.
|
|
145
|
+
- [ ] Content survives expected localization/text expansion.
|
|
146
|
+
- [ ] No dark patterns or unclear privacy/permission prompts remain.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# UI/UX Brief
|
|
2
|
+
|
|
3
|
+
## Project
|
|
4
|
+
|
|
5
|
+
- Product/project name:
|
|
6
|
+
- Platform: web / iOS / Android / desktop / email / kiosk / TV / wearable / other:
|
|
7
|
+
- Existing URL/app/repo:
|
|
8
|
+
- Stage: idea / MVP / beta / production / redesign
|
|
9
|
+
- UI/UX memory location if available:
|
|
10
|
+
|
|
11
|
+
## Goal
|
|
12
|
+
|
|
13
|
+
- Primary user goal:
|
|
14
|
+
- Business goal:
|
|
15
|
+
- Success metric:
|
|
16
|
+
- Guardrail metric:
|
|
17
|
+
- Deadline or scope limit:
|
|
18
|
+
|
|
19
|
+
## Users
|
|
20
|
+
|
|
21
|
+
- Primary users:
|
|
22
|
+
- Secondary users:
|
|
23
|
+
- User jobs-to-be-done:
|
|
24
|
+
- Context of use:
|
|
25
|
+
- Accessibility needs:
|
|
26
|
+
- Device, input, bandwidth, stress, and environment constraints:
|
|
27
|
+
|
|
28
|
+
## Current Problem
|
|
29
|
+
|
|
30
|
+
- What is not working now:
|
|
31
|
+
- Evidence: analytics, support tickets, screenshots, feedback, stakeholder opinion:
|
|
32
|
+
- Research confidence: high / medium / low / assumption only:
|
|
33
|
+
- Main friction points:
|
|
34
|
+
- Unknowns that require research:
|
|
35
|
+
|
|
36
|
+
## Research and Evidence Plan
|
|
37
|
+
|
|
38
|
+
- Research objective:
|
|
39
|
+
- Method: interview / survey / analytics / usability test / card sort / tree test / heuristic review / accessibility test / other:
|
|
40
|
+
- Participants or evidence source:
|
|
41
|
+
- Consent/privacy notes:
|
|
42
|
+
- Expected output:
|
|
43
|
+
|
|
44
|
+
## Constraints
|
|
45
|
+
|
|
46
|
+
- Brand/design system:
|
|
47
|
+
- Tech stack:
|
|
48
|
+
- Devices/browsers:
|
|
49
|
+
- Platform conventions to follow:
|
|
50
|
+
- Compliance/legal:
|
|
51
|
+
- Ethics/privacy/safety risks:
|
|
52
|
+
- Content/localization: locales, languages, RTL, reading level, legal copy:
|
|
53
|
+
- Must keep:
|
|
54
|
+
- Must avoid:
|
|
55
|
+
|
|
56
|
+
## Competitive/Reference Direction
|
|
57
|
+
|
|
58
|
+
- Products liked:
|
|
59
|
+
- Products disliked:
|
|
60
|
+
- Desired personality:
|
|
61
|
+
- What to extract as method, not copy:
|
|
62
|
+
|
|
63
|
+
## Deliverables Needed
|
|
64
|
+
|
|
65
|
+
- UX strategy:
|
|
66
|
+
- IA/site map:
|
|
67
|
+
- User flows:
|
|
68
|
+
- Journey map/service blueprint:
|
|
69
|
+
- Wireframes:
|
|
70
|
+
- Visual direction:
|
|
71
|
+
- Prototype:
|
|
72
|
+
- Design system:
|
|
73
|
+
- Accessibility audit:
|
|
74
|
+
- Usability test plan:
|
|
75
|
+
- Developer handoff:
|
|
76
|
+
- Measurement/quality gates:
|
|
77
|
+
|
|
78
|
+
## Assumptions
|
|
79
|
+
|
|
80
|
+
- Assumption 1:
|
|
81
|
+
- Assumption 2:
|
|
82
|
+
|
|
83
|
+
## Open Questions
|
|
84
|
+
|
|
85
|
+
- Question 1:
|
|
86
|
+
- Question 2:
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# UI/UX Memory
|
|
2
|
+
|
|
3
|
+
This file stores stable UI/UX and branding decisions for this application. Read this before creating or modifying frontend. Update it only with durable design-system decisions.
|
|
4
|
+
|
|
5
|
+
## Product Summary
|
|
6
|
+
|
|
7
|
+
- Product name:
|
|
8
|
+
- Product type:
|
|
9
|
+
- Primary platform:
|
|
10
|
+
- One-sentence promise:
|
|
11
|
+
|
|
12
|
+
## Target Users and Jobs
|
|
13
|
+
|
|
14
|
+
- Primary users:
|
|
15
|
+
- Primary job-to-be-done:
|
|
16
|
+
- Secondary users/jobs:
|
|
17
|
+
- Main success moment:
|
|
18
|
+
|
|
19
|
+
## Brand Personality
|
|
20
|
+
|
|
21
|
+
- Personality keywords:
|
|
22
|
+
- Trust level needed:
|
|
23
|
+
- Emotional tone:
|
|
24
|
+
- Should feel like:
|
|
25
|
+
- Should not feel like:
|
|
26
|
+
|
|
27
|
+
## Design Method Blend
|
|
28
|
+
|
|
29
|
+
Use methods from `top-100-brand-website-analysis.md`.
|
|
30
|
+
|
|
31
|
+
- Primary method:
|
|
32
|
+
- Supporting method 1:
|
|
33
|
+
- Supporting method 2:
|
|
34
|
+
- Rationale:
|
|
35
|
+
|
|
36
|
+
## Existing Branding Baseline
|
|
37
|
+
|
|
38
|
+
- Logo/wordmark:
|
|
39
|
+
- Current color scheme:
|
|
40
|
+
- Current fonts:
|
|
41
|
+
- Current layout style:
|
|
42
|
+
- Current component style:
|
|
43
|
+
- Current tone of voice:
|
|
44
|
+
- Screens/components used as baseline:
|
|
45
|
+
|
|
46
|
+
## Design Tokens
|
|
47
|
+
|
|
48
|
+
### Colors
|
|
49
|
+
|
|
50
|
+
| Token | Value | Usage |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| color.background | | |
|
|
53
|
+
| color.surface | | |
|
|
54
|
+
| color.surface-muted | | |
|
|
55
|
+
| color.text-primary | | |
|
|
56
|
+
| color.text-secondary | | |
|
|
57
|
+
| color.border | | |
|
|
58
|
+
| color.primary | | |
|
|
59
|
+
| color.primary-hover | | |
|
|
60
|
+
| color.secondary | | |
|
|
61
|
+
| color.success | | |
|
|
62
|
+
| color.warning | | |
|
|
63
|
+
| color.danger | | |
|
|
64
|
+
| color.focus | | |
|
|
65
|
+
|
|
66
|
+
### Typography
|
|
67
|
+
|
|
68
|
+
| Token | Value | Usage |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| font.primary | | |
|
|
71
|
+
| font.mono | | |
|
|
72
|
+
| text.display | | |
|
|
73
|
+
| text.h1 | | |
|
|
74
|
+
| text.h2 | | |
|
|
75
|
+
| text.h3 | | |
|
|
76
|
+
| text.body | | |
|
|
77
|
+
| text.body-sm | | |
|
|
78
|
+
| text.label | | |
|
|
79
|
+
| text.caption | | |
|
|
80
|
+
|
|
81
|
+
### Spacing and Layout
|
|
82
|
+
|
|
83
|
+
- Spacing scale:
|
|
84
|
+
- Container max width:
|
|
85
|
+
- Page padding:
|
|
86
|
+
- Section spacing:
|
|
87
|
+
- Grid columns/gaps:
|
|
88
|
+
- Mobile layout rules:
|
|
89
|
+
|
|
90
|
+
### Shape, Elevation, Motion
|
|
91
|
+
|
|
92
|
+
- Radius scale:
|
|
93
|
+
- Shadow/elevation style:
|
|
94
|
+
- Border style:
|
|
95
|
+
- Motion duration/easing:
|
|
96
|
+
- Reduced motion behavior:
|
|
97
|
+
|
|
98
|
+
## Component Rules
|
|
99
|
+
|
|
100
|
+
### Buttons
|
|
101
|
+
|
|
102
|
+
- Primary:
|
|
103
|
+
- Secondary:
|
|
104
|
+
- Tertiary/ghost:
|
|
105
|
+
- Destructive:
|
|
106
|
+
- Disabled/loading:
|
|
107
|
+
|
|
108
|
+
### Forms
|
|
109
|
+
|
|
110
|
+
- Input style:
|
|
111
|
+
- Label style:
|
|
112
|
+
- Helper text:
|
|
113
|
+
- Validation style:
|
|
114
|
+
- Error copy style:
|
|
115
|
+
|
|
116
|
+
### Cards/Panels
|
|
117
|
+
|
|
118
|
+
- Card structure:
|
|
119
|
+
- Padding:
|
|
120
|
+
- Border/elevation:
|
|
121
|
+
- Hover/focus behavior:
|
|
122
|
+
|
|
123
|
+
### Navigation
|
|
124
|
+
|
|
125
|
+
- Header/sidebar style:
|
|
126
|
+
- Current state:
|
|
127
|
+
- Mobile behavior:
|
|
128
|
+
|
|
129
|
+
### Tables/Lists
|
|
130
|
+
|
|
131
|
+
- Density:
|
|
132
|
+
- Sorting/filtering:
|
|
133
|
+
- Empty/loading/error:
|
|
134
|
+
- Mobile behavior:
|
|
135
|
+
|
|
136
|
+
### Modals/Drawers/Popovers
|
|
137
|
+
|
|
138
|
+
- Usage rule:
|
|
139
|
+
- Focus behavior:
|
|
140
|
+
- Close behavior:
|
|
141
|
+
- Mobile behavior:
|
|
142
|
+
|
|
143
|
+
## Interaction and State Rules
|
|
144
|
+
|
|
145
|
+
- Loading:
|
|
146
|
+
- Empty:
|
|
147
|
+
- Error:
|
|
148
|
+
- Success:
|
|
149
|
+
- Disabled:
|
|
150
|
+
- Permission denied:
|
|
151
|
+
- Offline/network:
|
|
152
|
+
- Hover/focus/active:
|
|
153
|
+
|
|
154
|
+
## Accessibility Rules
|
|
155
|
+
|
|
156
|
+
- WCAG target:
|
|
157
|
+
- Focus indicator:
|
|
158
|
+
- Contrast requirements:
|
|
159
|
+
- Keyboard rules:
|
|
160
|
+
- Screen reader rules:
|
|
161
|
+
- Touch target rules:
|
|
162
|
+
- Motion rules:
|
|
163
|
+
|
|
164
|
+
## Content and Microcopy Voice
|
|
165
|
+
|
|
166
|
+
- Voice:
|
|
167
|
+
- CTA style:
|
|
168
|
+
- Error style:
|
|
169
|
+
- Empty-state style:
|
|
170
|
+
- Confirmation style:
|
|
171
|
+
- Words to use:
|
|
172
|
+
- Words to avoid:
|
|
173
|
+
|
|
174
|
+
## Responsive Rules
|
|
175
|
+
|
|
176
|
+
- 320px:
|
|
177
|
+
- 375px:
|
|
178
|
+
- 768px:
|
|
179
|
+
- 1024px:
|
|
180
|
+
- 1440px:
|
|
181
|
+
|
|
182
|
+
## Do / Don't
|
|
183
|
+
|
|
184
|
+
### Do
|
|
185
|
+
|
|
186
|
+
-
|
|
187
|
+
|
|
188
|
+
### Don't
|
|
189
|
+
|
|
190
|
+
-
|
|
191
|
+
|
|
192
|
+
## Local Exceptions
|
|
193
|
+
|
|
194
|
+
Use this only for intentional one-off deviations.
|
|
195
|
+
|
|
196
|
+
| Area | Exception | Reason | Date |
|
|
197
|
+
|---|---|---|---|
|
|
198
|
+
| | | | |
|
|
199
|
+
|
|
200
|
+
## Design Decision Change Log
|
|
201
|
+
|
|
202
|
+
| Date | Decision | Reason | Scope |
|
|
203
|
+
|---|---|---|---|
|
|
204
|
+
| | | | |
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { execFileSync } from 'node:child_process';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
|
|
8
|
+
const root = path.resolve(import.meta.dirname, '..');
|
|
9
|
+
const bin = path.join(root, 'bin', 'ui-ux-master.mjs');
|
|
10
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
|
|
11
|
+
const templates = [
|
|
12
|
+
'agent-templates/claude/commands/ui-ux-master.md',
|
|
13
|
+
'agent-templates/universal/ui-ux-master-trigger.md',
|
|
14
|
+
'agent-templates/codex/AGENTS.append.md',
|
|
15
|
+
'agent-templates/windsurf/rules/ui-ux-master.md',
|
|
16
|
+
'agent-templates/antigravity/AGENTS.append.md',
|
|
17
|
+
'agent-templates/gemini/GEMINI.append.md',
|
|
18
|
+
'agent-templates/cursor/rules/ui-ux-master.mdc',
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
function run(args, cwd = root) {
|
|
22
|
+
return execFileSync(process.execPath, [bin, ...args], { cwd, encoding: 'utf8' });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
test('package exposes ui-ux-master bin', () => {
|
|
26
|
+
assert.equal(pkg.bin['ui-ux-master'], './bin/ui-ux-master.mjs');
|
|
27
|
+
assert.ok(fs.existsSync(bin));
|
|
28
|
+
assert.ok(fs.readFileSync(bin, 'utf8').startsWith('#!/usr/bin/env node'));
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('agent templates include trigger and avoid local absolute paths', () => {
|
|
32
|
+
for (const rel of templates) {
|
|
33
|
+
const text = fs.readFileSync(path.join(root, rel), 'utf8');
|
|
34
|
+
assert.match(text, /\/ui-ux-master/);
|
|
35
|
+
assert.match(text, /\.ui-ux-master\/SKILL\.md|\.ui-ux-master\/|\.ui-ux-master/);
|
|
36
|
+
assert.match(text, /UI\/UX|ui-ux-master/i);
|
|
37
|
+
assert.doesNotMatch(text, /C:\\|C:\/xampp|C:\/Users|\/workspace/);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('cli help doctor and where work', () => {
|
|
42
|
+
assert.match(run(['--help']), /ui-ux-master install/);
|
|
43
|
+
assert.match(run(['where']).trim(), /UI-UX Skills|ui-ux-master/i);
|
|
44
|
+
assert.match(run(['doctor', '--dry-run']), /trigger: \/ui-ux-master/);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('project install dry-run does not write', () => {
|
|
48
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ui-ux-master-dry-'));
|
|
49
|
+
fs.writeFileSync(path.join(dir, 'package.json'), '{}');
|
|
50
|
+
const out = run(['install', '--project', '--dry-run', '--dir', dir]);
|
|
51
|
+
assert.match(out, /dry-run/);
|
|
52
|
+
assert.equal(fs.existsSync(path.join(dir, 'AGENTS.md')), false);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('project install writes expected files and is idempotent', () => {
|
|
56
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ui-ux-master-install-'));
|
|
57
|
+
fs.writeFileSync(path.join(dir, 'package.json'), '{}');
|
|
58
|
+
run(['install', '--project', '--dir', dir]);
|
|
59
|
+
run(['install', '--project', '--dir', dir]);
|
|
60
|
+
assert.ok(fs.existsSync(path.join(dir, '.ui-ux-master', 'SKILL.md')));
|
|
61
|
+
assert.ok(fs.existsSync(path.join(dir, '.ui-ux-master', 'references', 'ui-ux-memory-workflow.md')));
|
|
62
|
+
assert.ok(fs.existsSync(path.join(dir, '.ui-ux-master', 'templates', 'ui-ux-memory.md')));
|
|
63
|
+
assert.ok(fs.existsSync(path.join(dir, '.claude', 'commands', 'ui-ux-master.md')));
|
|
64
|
+
assert.ok(fs.existsSync(path.join(dir, 'AGENTS.md')));
|
|
65
|
+
assert.ok(fs.existsSync(path.join(dir, '.windsurf', 'rules', 'ui-ux-master.md')));
|
|
66
|
+
assert.ok(fs.existsSync(path.join(dir, 'GEMINI.md')));
|
|
67
|
+
const agents = fs.readFileSync(path.join(dir, 'AGENTS.md'), 'utf8');
|
|
68
|
+
assert.equal((agents.match(/ui-ux-master:start/g) || []).length, 1);
|
|
69
|
+
assert.match(agents, /\.ui-ux-master\/SKILL\.md/);
|
|
70
|
+
assert.match(agents, /\/ui-ux-master/);
|
|
71
|
+
});
|