@appsforgood/next-supabase-kit 0.1.5 → 0.1.6
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/CHANGELOG.md +5 -0
- package/DOGFOOD.md +9 -0
- package/README.md +40 -4
- package/REPOSITORY_SETTINGS.md +7 -3
- package/SUPPLY_CHAIN.md +5 -5
- package/UPGRADE.md +2 -1
- package/antigravity/commands/accessibility-pass.toml +16 -0
- package/antigravity/commands/browser-qa.toml +18 -0
- package/antigravity/commands/distinctiveness-pass.toml +16 -0
- package/antigravity/commands/frontend.toml +5 -4
- package/antigravity/commands/layout-cleanup.toml +16 -0
- package/antigravity/commands/responsive-cleanup.toml +16 -0
- package/antigravity/commands/screenshot-critique.toml +16 -0
- package/antigravity/commands/ui-audit.toml +17 -0
- package/antigravity/commands/ui-polish.toml +17 -0
- package/antigravity/plugin.json +9 -0
- package/checklists/ui-acceptance-rubric.md +58 -0
- package/checklists/ui-detectors.md +75 -0
- package/dist/index.js +793 -458
- package/dist/index.js.map +1 -1
- package/dist/studio/office/assets/office.css +109 -28
- package/dist/studio/office/assets/office.js +14 -63
- package/dist/studio/wizard/assets/wizard.css +105 -26
- package/dist/studio/wizard/assets/wizard.js +22 -85
- package/examples/next-supabase-installed/.agent-kit/agent-roster.json +7 -3
- package/examples/next-supabase-installed/.agent-kit/manifest.json +11 -11
- package/examples/next-supabase-installed/audit-output.json +7 -2
- package/package.json +21 -5
- package/prompts/ui-command-index.md +124 -0
- package/rosters/next-supabase-default-council.json +37 -12
- package/runtime-skills/ui-improvement-harness/SKILL.md +12 -0
- package/skills/ui-improvement-harness.md +96 -0
- package/templates/next-supabase/AGENT_ROSTER.md +6 -3
- package/templates/next-supabase/ASSISTANT_ADAPTERS.md +3 -1
- package/templates/next-supabase/DECISIONS.md +14 -0
- package/templates/next-supabase/DESIGN.md +3 -0
- package/templates/next-supabase/DOCS.md +5 -1
- package/templates/next-supabase/QUALITY_GATES.md +4 -2
- package/templates/next-supabase/SKILLS.md +14 -0
- package/templates/next-supabase/SPEC.md +5 -1
- package/templates/next-supabase/STYLE_GUIDE.md +3 -1
- package/templates/next-supabase/TESTING.md +4 -0
|
@@ -92,8 +92,7 @@
|
|
|
92
92
|
els.ringPct.textContent = pct + "%";
|
|
93
93
|
els.ring.style.setProperty("--pct", String(pct));
|
|
94
94
|
if (els.levelPill && state.agenticLevel) {
|
|
95
|
-
els.levelPill.textContent =
|
|
96
|
-
"L" + state.agenticLevel.currentLevel + " → L" + state.agenticLevel.targetLevel;
|
|
95
|
+
els.levelPill.textContent = "L" + state.agenticLevel.currentLevel + " → L" + state.agenticLevel.targetLevel;
|
|
97
96
|
els.levelPill.hidden = false;
|
|
98
97
|
}
|
|
99
98
|
render();
|
|
@@ -137,10 +136,8 @@
|
|
|
137
136
|
const sections = state.progress?.sections || [];
|
|
138
137
|
els.sectionNav.innerHTML = sections
|
|
139
138
|
.map((s) => {
|
|
140
|
-
const chipClass =
|
|
141
|
-
|
|
142
|
-
const chipLabel =
|
|
143
|
-
s.status === "done" ? "Done" : s.status === "in_progress" ? "Now" : s.status === "optional" ? "Optional" : "—";
|
|
139
|
+
const chipClass = s.status === "done" ? "done" : s.status === "in_progress" ? "progress" : s.status === "optional" ? "optional" : "";
|
|
140
|
+
const chipLabel = s.status === "done" ? "Done" : s.status === "in_progress" ? "Now" : s.status === "optional" ? "Optional" : "—";
|
|
144
141
|
return (
|
|
145
142
|
'<li><button type="button" data-section="' +
|
|
146
143
|
s.id +
|
|
@@ -171,14 +168,7 @@
|
|
|
171
168
|
|
|
172
169
|
function renderTeamIntro() {
|
|
173
170
|
const cards = state.agents
|
|
174
|
-
.map(
|
|
175
|
-
(a) =>
|
|
176
|
-
'<li class="agent-card"><strong>' +
|
|
177
|
-
escapeHtml(a.name) +
|
|
178
|
-
"</strong><p>" +
|
|
179
|
-
escapeHtml(a.roleSummary) +
|
|
180
|
-
"</p></li>"
|
|
181
|
-
)
|
|
171
|
+
.map((a) => '<li class="agent-card"><strong>' + escapeHtml(a.name) + "</strong><p>" + escapeHtml(a.roleSummary) + "</p></li>")
|
|
182
172
|
.join("");
|
|
183
173
|
return (
|
|
184
174
|
'<p class="why">Next you will brief each specialist — one step per agent. Skip any you are not ready to answer; you can return later.</p>' +
|
|
@@ -211,9 +201,7 @@
|
|
|
211
201
|
}
|
|
212
202
|
|
|
213
203
|
function renderHome() {
|
|
214
|
-
const pills = (boot.stackSignals || [])
|
|
215
|
-
.map((s) => '<span class="pill">' + escapeHtml(s) + "</span>")
|
|
216
|
-
.join("");
|
|
204
|
+
const pills = (boot.stackSignals || []).map((s) => '<span class="pill">' + escapeHtml(s) + "</span>").join("");
|
|
217
205
|
const agentCount = state.agents.length || boot.agents?.length || 0;
|
|
218
206
|
const officePromo =
|
|
219
207
|
'<div class="office-promo">' +
|
|
@@ -243,9 +231,7 @@
|
|
|
243
231
|
depthCard("complete", "Complete (~25 min)", "Standard plus DESIGN and MESSAGING intake drafts.") +
|
|
244
232
|
"</div>" +
|
|
245
233
|
(state.progress?.recommendedNext
|
|
246
|
-
? '<p class="why" style="margin-top:18px">Continue: <strong>' +
|
|
247
|
-
escapeHtml(state.progress.recommendedNext) +
|
|
248
|
-
"</strong></p>"
|
|
234
|
+
? '<p class="why" style="margin-top:18px">Continue: <strong>' + escapeHtml(state.progress.recommendedNext) + "</strong></p>"
|
|
249
235
|
: "")
|
|
250
236
|
);
|
|
251
237
|
}
|
|
@@ -259,8 +245,8 @@
|
|
|
259
245
|
level.currentLevel +
|
|
260
246
|
" → target L" +
|
|
261
247
|
level.targetLevel +
|
|
262
|
-
|
|
263
|
-
(level.maintainerNote ?
|
|
248
|
+
' <span class="hint-inline">(setup progress is separate from audit readiness and visual QA tiers)</span></p>' +
|
|
249
|
+
(level.maintainerNote ? '<p class="hint">' + escapeHtml(level.maintainerNote) + "</p>" : "") +
|
|
264
250
|
"</div>"
|
|
265
251
|
);
|
|
266
252
|
}
|
|
@@ -284,9 +270,9 @@
|
|
|
284
270
|
const val = escapeHtml(state.form[name] || "");
|
|
285
271
|
if (type === "textarea") {
|
|
286
272
|
return (
|
|
287
|
-
|
|
273
|
+
'<label for="' +
|
|
288
274
|
name +
|
|
289
|
-
"
|
|
275
|
+
'">' +
|
|
290
276
|
escapeHtml(label) +
|
|
291
277
|
(hint ? "<span>" + escapeHtml(hint) + "</span>" : "") +
|
|
292
278
|
'</label><textarea id="' +
|
|
@@ -303,9 +289,9 @@
|
|
|
303
289
|
);
|
|
304
290
|
}
|
|
305
291
|
return (
|
|
306
|
-
|
|
292
|
+
'<label for="' +
|
|
307
293
|
name +
|
|
308
|
-
"
|
|
294
|
+
'">' +
|
|
309
295
|
escapeHtml(label) +
|
|
310
296
|
(hint ? "<span>" + escapeHtml(hint) + "</span>" : "") +
|
|
311
297
|
'</label><input id="' +
|
|
@@ -334,25 +320,11 @@
|
|
|
334
320
|
),
|
|
335
321
|
productCategory: () => {
|
|
336
322
|
const opts = (boot.categories || [])
|
|
337
|
-
.map(
|
|
338
|
-
(c) =>
|
|
339
|
-
'<option value="' +
|
|
340
|
-
c +
|
|
341
|
-
'"' +
|
|
342
|
-
(state.form.productCategory === c ? " selected" : "") +
|
|
343
|
-
">" +
|
|
344
|
-
c +
|
|
345
|
-
"</option>"
|
|
346
|
-
)
|
|
323
|
+
.map((c) => '<option value="' + c + '"' + (state.form.productCategory === c ? " selected" : "") + ">" + c + "</option>")
|
|
347
324
|
.join("");
|
|
348
|
-
return
|
|
349
|
-
'<label for="productCategory">Category</label><select id="productCategory" name="productCategory">' +
|
|
350
|
-
opts +
|
|
351
|
-
"</select>"
|
|
352
|
-
);
|
|
325
|
+
return '<label for="productCategory">Category</label><select id="productCategory" name="productCategory">' + opts + "</select>";
|
|
353
326
|
},
|
|
354
|
-
primaryAudience: () =>
|
|
355
|
-
inputField("primaryAudience", "Primary user or buyer", "", "text", "Who uses or pays for this product?"),
|
|
327
|
+
primaryAudience: () => inputField("primaryAudience", "Primary user or buyer", "", "text", "Who uses or pays for this product?"),
|
|
356
328
|
primaryWorkflows: () =>
|
|
357
329
|
inputField(
|
|
358
330
|
"primaryWorkflows",
|
|
@@ -363,16 +335,7 @@
|
|
|
363
335
|
),
|
|
364
336
|
tenantModel: () => {
|
|
365
337
|
const opts = (boot.tenantModels || [])
|
|
366
|
-
.map(
|
|
367
|
-
(c) =>
|
|
368
|
-
'<option value="' +
|
|
369
|
-
c +
|
|
370
|
-
'"' +
|
|
371
|
-
(state.form.tenantModel === c ? " selected" : "") +
|
|
372
|
-
">" +
|
|
373
|
-
c +
|
|
374
|
-
"</option>"
|
|
375
|
-
)
|
|
338
|
+
.map((c) => '<option value="' + c + '"' + (state.form.tenantModel === c ? " selected" : "") + ">" + c + "</option>")
|
|
376
339
|
.join("");
|
|
377
340
|
return '<label for="tenantModel">Who uses the system?</label><select id="tenantModel" name="tenantModel">' + opts + "</select>";
|
|
378
341
|
},
|
|
@@ -388,12 +351,9 @@
|
|
|
388
351
|
"textarea",
|
|
389
352
|
"Describe auth boundaries agents must not break."
|
|
390
353
|
),
|
|
391
|
-
uiPreferred: () =>
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
inputField("uiAvoid", "UI should avoid…", "Optional.", "textarea", "Generic SaaS heroes, card soup, fake metrics."),
|
|
395
|
-
valueProposition: () =>
|
|
396
|
-
inputField("valueProposition", "Value proposition", "", "textarea", "What outcome do users get?"),
|
|
354
|
+
uiPreferred: () => inputField("uiPreferred", "UI should feel like…", "", "textarea", "Task-first, clear hierarchy, readable typography."),
|
|
355
|
+
uiAvoid: () => inputField("uiAvoid", "UI should avoid…", "Optional.", "textarea", "Generic SaaS heroes, card soup, fake metrics."),
|
|
356
|
+
valueProposition: () => inputField("valueProposition", "Value proposition", "", "textarea", "What outcome do users get?"),
|
|
397
357
|
proof: () => inputField("proof", "Proof points", "One per line. Real evidence only.", "textarea", ""),
|
|
398
358
|
objections: () => inputField("objections", "Objections", "One per line. Optional.", "textarea", ""),
|
|
399
359
|
qualityTarget: () => {
|
|
@@ -410,16 +370,7 @@
|
|
|
410
370
|
},
|
|
411
371
|
ideSurface: () => {
|
|
412
372
|
const opts = state.ideSurfaces
|
|
413
|
-
.map(
|
|
414
|
-
(s) =>
|
|
415
|
-
'<option value="' +
|
|
416
|
-
s.id +
|
|
417
|
-
'"' +
|
|
418
|
-
(state.form.ideSurface === s.id ? " selected" : "") +
|
|
419
|
-
">" +
|
|
420
|
-
escapeHtml(s.label) +
|
|
421
|
-
"</option>"
|
|
422
|
-
)
|
|
373
|
+
.map((s) => '<option value="' + s.id + '"' + (state.form.ideSurface === s.id ? " selected" : "") + ">" + escapeHtml(s.label) + "</option>")
|
|
423
374
|
.join("");
|
|
424
375
|
const chip = renderAdapterChip(state.lastAdapterValidation);
|
|
425
376
|
return (
|
|
@@ -494,15 +445,7 @@
|
|
|
494
445
|
: validation.warn > 0
|
|
495
446
|
? "Adapter validate: pass with warnings"
|
|
496
447
|
: "Adapter validate: pass";
|
|
497
|
-
return (
|
|
498
|
-
'<p class="adapter-chip ' +
|
|
499
|
-
kind +
|
|
500
|
-
'" role="status">' +
|
|
501
|
-
escapeHtml(label) +
|
|
502
|
-
" (" +
|
|
503
|
-
escapeHtml(validation.target) +
|
|
504
|
-
")</p>"
|
|
505
|
-
);
|
|
448
|
+
return '<p class="adapter-chip ' + kind + '" role="status">' + escapeHtml(label) + " (" + escapeHtml(validation.target) + ")</p>";
|
|
506
449
|
}
|
|
507
450
|
|
|
508
451
|
function renderComplete() {
|
|
@@ -513,13 +456,7 @@
|
|
|
513
456
|
.join("");
|
|
514
457
|
return (
|
|
515
458
|
'<div class="complete-icon" aria-hidden="true">✓</div><h2>Setup saved</h2>' +
|
|
516
|
-
(level
|
|
517
|
-
? '<p class="why">Agentic level <strong>L' +
|
|
518
|
-
level.currentLevel +
|
|
519
|
-
"</strong> (target L" +
|
|
520
|
-
level.targetLevel +
|
|
521
|
-
").</p>"
|
|
522
|
-
: "") +
|
|
459
|
+
(level ? '<p class="why">Agentic level <strong>L' + level.currentLevel + "</strong> (target L" + level.targetLevel + ").</p>" : "") +
|
|
523
460
|
'<p class="why">Agents read <code>.agent-kit/project-context.md</code> and <code>.agent-kit/agent-briefs.md</code> before meaningful work.</p>' +
|
|
524
461
|
'<ol class="next-steps">' +
|
|
525
462
|
"<li>Run eval loop from <code>LOOP_CODING.md</code>: <code>npm test</code>, <code>agent-kit audit --min-readiness baseline-setup</code></li>" +
|
|
@@ -70,6 +70,7 @@
|
|
|
70
70
|
"frontend-distinctiveness-benchmark",
|
|
71
71
|
"frontend-product-quality-rubric",
|
|
72
72
|
"frontend-design-system",
|
|
73
|
+
"ui-improvement-harness",
|
|
73
74
|
"visual-regression-qa",
|
|
74
75
|
"accessibility-wcag"
|
|
75
76
|
],
|
|
@@ -171,7 +172,7 @@
|
|
|
171
172
|
},
|
|
172
173
|
{
|
|
173
174
|
"id": "frontend-change",
|
|
174
|
-
"triggers": ["screen", "component", "layout", "design", "responsive", "accessibility", "screenshot"],
|
|
175
|
+
"triggers": ["screen", "component", "layout", "design", "responsive", "accessibility", "screenshot", "ui audit", "ui polish", "browser qa"],
|
|
175
176
|
"sequence": ["planner", "frontend-design-lead", "marketing-copy-lead", "nextjs-engineer", "qa-engineer", "docs-maintainer"],
|
|
176
177
|
"council": ["frontend-design-lead", "marketing-copy-lead", "qa-engineer"],
|
|
177
178
|
"requiredOutputs": [
|
|
@@ -183,10 +184,13 @@
|
|
|
183
184
|
"design critique verdict",
|
|
184
185
|
"frontend product-quality scorecard",
|
|
185
186
|
"domain-specific UI rationale",
|
|
187
|
+
"UI detector findings and severity",
|
|
188
|
+
"UI command workflow applied when polishing or auditing",
|
|
186
189
|
"visual QA evidence",
|
|
187
190
|
"state coverage",
|
|
188
191
|
"accessibility checks",
|
|
189
|
-
"desktop/mobile verification"
|
|
192
|
+
"desktop/mobile verification",
|
|
193
|
+
"authenticated screen evidence when applicable"
|
|
190
194
|
]
|
|
191
195
|
},
|
|
192
196
|
{
|
|
@@ -219,7 +223,7 @@
|
|
|
219
223
|
"Meaningful multi-agent work must record council-session evidence in COUNCIL.md or a structured record that follows .agent-kit/schemas/council-session.schema.json.",
|
|
220
224
|
"Planner starts planning and ambiguous requests by default.",
|
|
221
225
|
"Lead Architect must review core changes before implementation.",
|
|
222
|
-
"Frontend Design Lead must record reference-set evidence, anti-references, a design critique verdict, a distinctiveness benchmark,
|
|
226
|
+
"Frontend Design Lead must record reference-set evidence, anti-references, a design critique verdict, a distinctiveness benchmark, a frontend product-quality scorecard, UI detector severity findings, and desktop/mobile screenshot evidence before accepting significant frontend work.",
|
|
223
227
|
"Marketing Copy Lead must ask discovery questions and record audience, pain, outcome, value proposition, proof, objections, voice/tone, and conversion goal before accepting public-facing or conversion-facing copy.",
|
|
224
228
|
"Security Reviewer must review auth, data mutation, external-call, dependency, secret, and release-risk changes.",
|
|
225
229
|
"QA Engineer must verify behavior changes before completion.",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"packageName": "@appsforgood/next-supabase-kit",
|
|
3
|
-
"packageVersion": "0.1.
|
|
3
|
+
"packageVersion": "0.1.6",
|
|
4
4
|
"stack": "next-supabase",
|
|
5
5
|
"installedAt": "2026-06-17T11:49:38.732Z",
|
|
6
6
|
"docs": [
|
|
@@ -40,20 +40,20 @@
|
|
|
40
40
|
"modelRouting": ".agent-kit/model-routing.json",
|
|
41
41
|
"templateHashes": {
|
|
42
42
|
"AGENTS.md": "c7f3e7360938a1ed804d2110e9af96e6f09d50c49138063bef0db1642ddaf84f",
|
|
43
|
-
"AGENT_ROSTER.md": "
|
|
44
|
-
"ASSISTANT_ADAPTERS.md": "
|
|
43
|
+
"AGENT_ROSTER.md": "40147eecf3977bf64431204b67f24eb277a834ba5b6f894c053c79c0a9dbb8f5",
|
|
44
|
+
"ASSISTANT_ADAPTERS.md": "4d37ba6555814cf18c6ac2a302a614af07bb33b0ac0eb5f19886c3af3328cb63",
|
|
45
45
|
"COUNCIL.md": "40bec9051664c9c38b8360ee16f21b5e4716030d19c493cdec67395ab06528e1",
|
|
46
|
-
"SKILLS.md": "
|
|
47
|
-
"SPEC.md": "
|
|
48
|
-
"DECISIONS.md": "
|
|
49
|
-
"DOCS.md": "
|
|
50
|
-
"DESIGN.md": "
|
|
46
|
+
"SKILLS.md": "320b76f37e8b509d597ba01331d3b1a4dc4f1eb68b6d2294ba4125fb2ab02970",
|
|
47
|
+
"SPEC.md": "30dca40819d3d204cfcb33f016e67d0d9008d0fad0907db9c93f6d32e50e057a",
|
|
48
|
+
"DECISIONS.md": "1374d33cc40a9f3086f57c1af885c3e4defaa67df5116168cf4872d2ae8a3628",
|
|
49
|
+
"DOCS.md": "c9501b68bfa97788579ddaaa4b072ca7a7c80a5890e6ec10c05901694fcdae48",
|
|
50
|
+
"DESIGN.md": "e464ff8d9a8e542d00a04143a51417752dc98e1afcfa7e2a5549ecfbb47a479b",
|
|
51
51
|
"MESSAGING.md": "f1f7c0f11796820b60bb44e42a65749763f7167944ba6acf092a1cf7b59e50de",
|
|
52
52
|
"MODEL_ROUTING.md": "f0ca3bd12872cd5f61ff4c6bef670249c0a0188f20c049cb0d09d84219b1839c",
|
|
53
|
-
"QUALITY_GATES.md": "
|
|
54
|
-
"STYLE_GUIDE.md": "
|
|
53
|
+
"QUALITY_GATES.md": "15f260c75d6180d1e583917e367ab522030e878f1a6e93ba5f18eba17fef4bb2",
|
|
54
|
+
"STYLE_GUIDE.md": "0fcb8e04ed3d31fa560a0165588ad56efd262463ca0f3aa26633fba955daf0db",
|
|
55
55
|
"SECURITY.md": "f046e4dc794f49700ddee4cb866e2ba1983a1b71268f2e244892d615b41714f8",
|
|
56
|
-
"TESTING.md": "
|
|
56
|
+
"TESTING.md": "59a82645445c3af0c9ccc26a9ed5154c1f710b202d3d13ffa9558a0b1d8a96de",
|
|
57
57
|
"LOOP_CODING.md": "3d4719c7fc7c2e8465ee15aec27574adbbc5207d58123ecf4f88f3942c522812",
|
|
58
58
|
"DEPLOYMENT.md": "c33d949c2b1850f8ee6c38e5ec565325c3d47f4daac13b81c75e1b35655ea174",
|
|
59
59
|
"UPGRADE.md": "d4678475458744dee7c1f23b69c04e3cf82d9e896196e62455585aaae5d3a25a"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"summary": {
|
|
3
|
-
"pass":
|
|
3
|
+
"pass": 66,
|
|
4
4
|
"warn": 5,
|
|
5
5
|
"fail": 0
|
|
6
6
|
},
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
{
|
|
20
20
|
"level": "pass",
|
|
21
21
|
"area": "install",
|
|
22
|
-
"message": "Agent kit installed at version 0.1.
|
|
22
|
+
"message": "Agent kit installed at version 0.1.6."
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"level": "pass",
|
|
@@ -366,6 +366,11 @@
|
|
|
366
366
|
"message": "No package.json found to verify test scripts.",
|
|
367
367
|
"remediation": "Add package.json with test, lint, and build scripts appropriate to the stack."
|
|
368
368
|
},
|
|
369
|
+
{
|
|
370
|
+
"level": "pass",
|
|
371
|
+
"area": "project-reality",
|
|
372
|
+
"message": "No obvious committed secret patterns detected in tracked source files."
|
|
373
|
+
},
|
|
369
374
|
{
|
|
370
375
|
"level": "pass",
|
|
371
376
|
"area": "project-reality",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@appsforgood/next-supabase-kit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Open agent council, skills, prompts, checklists, and markdown templates for Next.js and Supabase projects.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -73,8 +73,12 @@
|
|
|
73
73
|
"build": "tsup && node scripts/copy-studio-assets.mjs",
|
|
74
74
|
"dev": "tsx src/cli/index.ts",
|
|
75
75
|
"typecheck": "tsc --noEmit",
|
|
76
|
-
"lint": "
|
|
76
|
+
"lint": "eslint .",
|
|
77
|
+
"lint:fix": "eslint . --fix",
|
|
78
|
+
"format": "prettier --write .",
|
|
79
|
+
"format:check": "prettier --check .",
|
|
77
80
|
"test": "vitest run",
|
|
81
|
+
"test:coverage": "vitest run --coverage",
|
|
78
82
|
"test:watch": "vitest",
|
|
79
83
|
"smoke": "node dist/index.js doctor",
|
|
80
84
|
"smoke:install": "node scripts/smoke-install.mjs",
|
|
@@ -87,22 +91,34 @@
|
|
|
87
91
|
"sbom:check": "node scripts/sbom-check.mjs",
|
|
88
92
|
"sbom:generate": "node scripts/sbom-check.mjs --output sbom.cdx.json",
|
|
89
93
|
"publish:verify": "node scripts/post-publish-verify.mjs",
|
|
94
|
+
"changeset": "changeset",
|
|
95
|
+
"changeset:version": "changeset version",
|
|
90
96
|
"release:check": "node scripts/release-check.mjs",
|
|
91
97
|
"pack:check": "npm pack --dry-run",
|
|
92
98
|
"dogfood:init": "node scripts/dogfood-init.mjs",
|
|
93
99
|
"adapter:validate": "node dist/index.js adapter validate all"
|
|
94
100
|
},
|
|
95
101
|
"dependencies": {
|
|
96
|
-
"@
|
|
97
|
-
"
|
|
102
|
+
"@clack/prompts": "^1.6.0",
|
|
103
|
+
"@octokit/rest": "^22.0.1",
|
|
104
|
+
"commander": "^14.0.3",
|
|
105
|
+
"picocolors": "^1.1.1",
|
|
98
106
|
"simple-git": "^3.27.0",
|
|
99
|
-
"zod": "^
|
|
107
|
+
"zod": "^4.4.3"
|
|
100
108
|
},
|
|
101
109
|
"devDependencies": {
|
|
110
|
+
"@changesets/cli": "^2.31.0",
|
|
111
|
+
"@eslint/js": "^9.39.4",
|
|
102
112
|
"@types/node": "^25.9.3",
|
|
113
|
+
"@vitest/coverage-v8": "^4.1.9",
|
|
114
|
+
"eslint": "^9.39.4",
|
|
115
|
+
"eslint-config-prettier": "^10.1.8",
|
|
116
|
+
"globals": "^17.7.0",
|
|
117
|
+
"prettier": "^3.9.4",
|
|
103
118
|
"tsup": "^8.3.5",
|
|
104
119
|
"tsx": "^4.19.2",
|
|
105
120
|
"typescript": "^6.0.3",
|
|
121
|
+
"typescript-eslint": "^8.62.1",
|
|
106
122
|
"vitest": "^4.1.8"
|
|
107
123
|
},
|
|
108
124
|
"overrides": {
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# UI Command Index
|
|
2
|
+
|
|
3
|
+
Use this index to run repeatable UI improvement workflows. These are command-like prompts for any assistant surface and the source of truth for native runtime commands.
|
|
4
|
+
|
|
5
|
+
Canonical sources:
|
|
6
|
+
|
|
7
|
+
- `DESIGN.md`
|
|
8
|
+
- `STYLE_GUIDE.md`
|
|
9
|
+
- `TESTING.md`
|
|
10
|
+
- `QUALITY_GATES.md`
|
|
11
|
+
- `.agent-kit/agent-roster.json`
|
|
12
|
+
- `.agent-kit/skills/ui-improvement-harness.md`
|
|
13
|
+
- `.agent-kit/checklists/ui-detectors.md`
|
|
14
|
+
- `.agent-kit/checklists/ui-acceptance-rubric.md`
|
|
15
|
+
- `.agent-kit/prompts/screenshot-review.md`
|
|
16
|
+
- `.agent-kit/prompts/visual-qa-plan.md`
|
|
17
|
+
|
|
18
|
+
## `/ui-audit`
|
|
19
|
+
|
|
20
|
+
Audit a target UI surface before release.
|
|
21
|
+
|
|
22
|
+
Required steps:
|
|
23
|
+
|
|
24
|
+
1. Identify target route, component, workflow, auth state, data state, and risk tier.
|
|
25
|
+
2. Load product/design context and relevant design brief.
|
|
26
|
+
3. Review desktop and mobile evidence, or state which evidence must still be captured.
|
|
27
|
+
4. Run the UI detector checklist.
|
|
28
|
+
5. Return blockers, majors, minors, preserved capabilities, and required fixes.
|
|
29
|
+
|
|
30
|
+
Required outputs: target surface, risk tier, detector findings by severity, missing evidence, pass/fail verdict.
|
|
31
|
+
|
|
32
|
+
## `/ui-polish`
|
|
33
|
+
|
|
34
|
+
Improve visual quality without changing product scope.
|
|
35
|
+
|
|
36
|
+
Required steps:
|
|
37
|
+
|
|
38
|
+
1. Start from detector findings, screenshots, or a named surface.
|
|
39
|
+
2. Preserve product behavior, auth boundaries, copy claims, and data contracts.
|
|
40
|
+
3. Improve hierarchy, spacing, density, alignment, component states, and interaction feedback.
|
|
41
|
+
4. Avoid decorative complexity and generic SaaS defaults.
|
|
42
|
+
5. Re-run detector and screenshot critique after changes.
|
|
43
|
+
|
|
44
|
+
Required outputs: polish goals, changes made or proposed, detector deltas, screenshots needed, residual risks.
|
|
45
|
+
|
|
46
|
+
## `/layout-cleanup`
|
|
47
|
+
|
|
48
|
+
Reduce clutter and repair layout structure.
|
|
49
|
+
|
|
50
|
+
Required steps:
|
|
51
|
+
|
|
52
|
+
1. Identify primary task, secondary tasks, and content hierarchy.
|
|
53
|
+
2. Remove unnecessary nesting, repeated surfaces, card-within-card patterns, and arbitrary dividers.
|
|
54
|
+
3. Normalize spacing, grouping, alignment, heading scale, and responsive containers.
|
|
55
|
+
4. Verify no truncation, overlap, or horizontal overflow remains.
|
|
56
|
+
|
|
57
|
+
Required outputs: layout findings, cleanup actions, preserved workflow, desktop/mobile evidence.
|
|
58
|
+
|
|
59
|
+
## `/responsive-cleanup`
|
|
60
|
+
|
|
61
|
+
Make a UI work across mobile and desktop.
|
|
62
|
+
|
|
63
|
+
Required steps:
|
|
64
|
+
|
|
65
|
+
1. Review mobile width, desktop width, and any tablet breakpoint used by the project.
|
|
66
|
+
2. Verify tap targets, text fit, navigation, primary action visibility, sticky UI, and scroll behavior.
|
|
67
|
+
3. Verify stateful screens on mobile, not only the happy path.
|
|
68
|
+
4. Capture or request mobile and desktop screenshots before acceptance.
|
|
69
|
+
|
|
70
|
+
Required outputs: viewports checked, responsive findings, fixes, screenshots, remaining risks.
|
|
71
|
+
|
|
72
|
+
## `/accessibility-pass`
|
|
73
|
+
|
|
74
|
+
Run a WCAG 2.1 AA-oriented pass on the target UI.
|
|
75
|
+
|
|
76
|
+
Required steps:
|
|
77
|
+
|
|
78
|
+
1. Check semantics, headings, landmarks, forms, labels, tables, and buttons.
|
|
79
|
+
2. Check keyboard navigation, visible focus, tab order, escape/close behavior, and skip path when applicable.
|
|
80
|
+
3. Check contrast, reduced motion, error association, touch targets, and status announcements.
|
|
81
|
+
4. Keep auth, state, and data-boundary tests separate from visual checks.
|
|
82
|
+
|
|
83
|
+
Required outputs: accessibility findings, severity, fixes, skipped checks, test evidence.
|
|
84
|
+
|
|
85
|
+
## `/distinctiveness-pass`
|
|
86
|
+
|
|
87
|
+
Prove the UI belongs to this product and does not look generic.
|
|
88
|
+
|
|
89
|
+
Required steps:
|
|
90
|
+
|
|
91
|
+
1. Compare the first viewport to product category, audience, workflow, and content fingerprint.
|
|
92
|
+
2. Confirm references were translated into lessons without copying source layouts, copy, assets, or brand marks.
|
|
93
|
+
3. Remove fake metrics, vague claims, abstract filler, and interchangeable card stacks.
|
|
94
|
+
4. Re-score distinctiveness and product quality where significant UI work is involved.
|
|
95
|
+
|
|
96
|
+
Required outputs: product-specific evidence, generic-risk findings, source-safety notes, required changes.
|
|
97
|
+
|
|
98
|
+
## `/screenshot-critique`
|
|
99
|
+
|
|
100
|
+
Review provided screenshots or captured browser screenshots.
|
|
101
|
+
|
|
102
|
+
Required steps:
|
|
103
|
+
|
|
104
|
+
1. Name each screenshot, viewport, route, auth state, data state, and UI state.
|
|
105
|
+
2. Run screenshot review, detector checklist, and accessibility risk scan.
|
|
106
|
+
3. Compare against `DESIGN.md`, `STYLE_GUIDE.md`, and selected creative direction.
|
|
107
|
+
4. Return concrete fixes, not broad design advice.
|
|
108
|
+
|
|
109
|
+
Required outputs: screenshot inventory, blockers, high-value fixes, accepted areas, missing screenshots.
|
|
110
|
+
|
|
111
|
+
## `/browser-qa`
|
|
112
|
+
|
|
113
|
+
Run a live browser QA loop for an implemented UI.
|
|
114
|
+
|
|
115
|
+
Required steps:
|
|
116
|
+
|
|
117
|
+
1. Start or identify the dev/preview server and target routes.
|
|
118
|
+
2. Open the target with required auth, role, tenant, and data state.
|
|
119
|
+
3. Capture desktop and mobile screenshots.
|
|
120
|
+
4. Run detector, screenshot critique, accessibility pass, and responsive cleanup.
|
|
121
|
+
5. Apply scoped fixes and repeat until acceptance criteria pass.
|
|
122
|
+
6. Record evidence with `agent-kit session output` when Agent Studio is in use.
|
|
123
|
+
|
|
124
|
+
Required outputs: route, auth state, commands run, screenshots, detector results, fixes, final verdict.
|
|
@@ -70,6 +70,7 @@
|
|
|
70
70
|
"frontend-distinctiveness-benchmark",
|
|
71
71
|
"frontend-product-quality-rubric",
|
|
72
72
|
"frontend-design-system",
|
|
73
|
+
"ui-improvement-harness",
|
|
73
74
|
"visual-regression-qa",
|
|
74
75
|
"accessibility-wcag"
|
|
75
76
|
],
|
|
@@ -95,13 +96,7 @@
|
|
|
95
96
|
"voice-tone",
|
|
96
97
|
"pricing-copy"
|
|
97
98
|
],
|
|
98
|
-
"skills": [
|
|
99
|
-
"positioning-messaging",
|
|
100
|
-
"conversion-copywriting",
|
|
101
|
-
"landing-page-copy",
|
|
102
|
-
"product-voice-tone",
|
|
103
|
-
"onboarding-empty-state-copy"
|
|
104
|
-
],
|
|
99
|
+
"skills": ["positioning-messaging", "conversion-copywriting", "landing-page-copy", "product-voice-tone", "onboarding-empty-state-copy"],
|
|
105
100
|
"handsOffTo": ["frontend-design-lead", "nextjs-engineer", "qa-engineer", "docs-maintainer"]
|
|
106
101
|
},
|
|
107
102
|
{
|
|
@@ -147,7 +142,19 @@
|
|
|
147
142
|
},
|
|
148
143
|
{
|
|
149
144
|
"id": "core-change",
|
|
150
|
-
"triggers": [
|
|
145
|
+
"triggers": [
|
|
146
|
+
"schema",
|
|
147
|
+
"auth",
|
|
148
|
+
"rls",
|
|
149
|
+
"api",
|
|
150
|
+
"route handler",
|
|
151
|
+
"server action",
|
|
152
|
+
"dependency",
|
|
153
|
+
"upgrade",
|
|
154
|
+
"release workflow",
|
|
155
|
+
"package behavior",
|
|
156
|
+
"cross-layer"
|
|
157
|
+
],
|
|
151
158
|
"sequence": [
|
|
152
159
|
"planner",
|
|
153
160
|
"lead-architect",
|
|
@@ -171,7 +178,7 @@
|
|
|
171
178
|
},
|
|
172
179
|
{
|
|
173
180
|
"id": "frontend-change",
|
|
174
|
-
"triggers": ["screen", "component", "layout", "design", "responsive", "accessibility", "screenshot"],
|
|
181
|
+
"triggers": ["screen", "component", "layout", "design", "responsive", "accessibility", "screenshot", "ui audit", "ui polish", "browser qa"],
|
|
175
182
|
"sequence": ["planner", "frontend-design-lead", "marketing-copy-lead", "nextjs-engineer", "qa-engineer", "docs-maintainer"],
|
|
176
183
|
"council": ["frontend-design-lead", "marketing-copy-lead", "qa-engineer"],
|
|
177
184
|
"requiredOutputs": [
|
|
@@ -183,15 +190,33 @@
|
|
|
183
190
|
"design critique verdict",
|
|
184
191
|
"frontend product-quality scorecard",
|
|
185
192
|
"domain-specific UI rationale",
|
|
193
|
+
"UI detector findings and severity",
|
|
194
|
+
"UI command workflow applied when polishing or auditing",
|
|
186
195
|
"visual QA evidence",
|
|
187
196
|
"state coverage",
|
|
188
197
|
"accessibility checks",
|
|
189
|
-
"desktop/mobile verification"
|
|
198
|
+
"desktop/mobile verification",
|
|
199
|
+
"authenticated screen evidence when applicable"
|
|
190
200
|
]
|
|
191
201
|
},
|
|
192
202
|
{
|
|
193
203
|
"id": "marketing-copy",
|
|
194
|
-
"triggers": [
|
|
204
|
+
"triggers": [
|
|
205
|
+
"copy",
|
|
206
|
+
"copywriting",
|
|
207
|
+
"marketing",
|
|
208
|
+
"positioning",
|
|
209
|
+
"messaging",
|
|
210
|
+
"value prop",
|
|
211
|
+
"value proposition",
|
|
212
|
+
"landing page",
|
|
213
|
+
"headline",
|
|
214
|
+
"cta",
|
|
215
|
+
"conversion",
|
|
216
|
+
"onboarding",
|
|
217
|
+
"empty state",
|
|
218
|
+
"pricing"
|
|
219
|
+
],
|
|
195
220
|
"sequence": ["planner", "marketing-copy-lead", "frontend-design-lead", "qa-engineer", "docs-maintainer"],
|
|
196
221
|
"council": ["marketing-copy-lead", "frontend-design-lead"],
|
|
197
222
|
"requiredOutputs": [
|
|
@@ -219,7 +244,7 @@
|
|
|
219
244
|
"Meaningful multi-agent work must record council-session evidence in COUNCIL.md or a structured record that follows .agent-kit/schemas/council-session.schema.json.",
|
|
220
245
|
"Planner starts planning and ambiguous requests by default.",
|
|
221
246
|
"Lead Architect must review core changes before implementation.",
|
|
222
|
-
"Frontend Design Lead must record reference-set evidence, anti-references, a design critique verdict, a distinctiveness benchmark,
|
|
247
|
+
"Frontend Design Lead must record reference-set evidence, anti-references, a design critique verdict, a distinctiveness benchmark, a frontend product-quality scorecard, UI detector severity findings, and desktop/mobile screenshot evidence before accepting significant frontend work.",
|
|
223
248
|
"Marketing Copy Lead must ask discovery questions and record audience, pain, outcome, value proposition, proof, objections, voice/tone, and conversion goal before accepting public-facing or conversion-facing copy.",
|
|
224
249
|
"Security Reviewer must review auth, data mutation, external-call, dependency, secret, and release-risk changes.",
|
|
225
250
|
"QA Engineer must verify behavior changes before completion.",
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-improvement-harness
|
|
3
|
+
description: Use when running repeatable UI audit, polish, layout cleanup, responsive cleanup, accessibility, screenshot critique, visual distinctiveness, or live browser QA workflows.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UI Improvement Harness Runtime Skill
|
|
7
|
+
|
|
8
|
+
Canonical workflow: `skills/ui-improvement-harness.md`.
|
|
9
|
+
|
|
10
|
+
Installed-project canonical workflow: `.agent-kit/skills/ui-improvement-harness.md`.
|
|
11
|
+
|
|
12
|
+
Use the canonical skill before accepting meaningful UI polish, audit, screenshot review, or browser iteration work. Runtime wrappers must not fork the detector, rubric, or command policy.
|