create-issflow 1.9.0 → 1.9.2

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 (61) hide show
  1. package/README.md +1 -1
  2. package/bin/cli.js +2 -2
  3. package/package.json +1 -1
  4. package/template/.issflow/README.md +1 -1
  5. package/template/.issflow/commands/change-request.md +2 -1
  6. package/template/.issflow/commands/design.md +12 -6
  7. package/template/.issflow/commands/phase.md +2 -0
  8. package/template/.issflow/commands/propose.md +80 -18
  9. package/template/.issflow/istartsoft-flow/METHODOLOGY.md +21 -12
  10. package/template/.issflow/skills/ui-ux-pro-max/LICENSE.upstream +21 -0
  11. package/template/.issflow/skills/ui-ux-pro-max/SKILL.md +70 -0
  12. package/template/.issflow/skills/ui-ux-pro-max/UPSTREAM.md +4 -0
  13. package/template/.issflow/skills/ui-ux-pro-max/data/app-interface.csv +33 -0
  14. package/template/.issflow/skills/ui-ux-pro-max/data/catalog-summary.json +78 -0
  15. package/template/.issflow/skills/ui-ux-pro-max/data/charts.csv +26 -0
  16. package/template/.issflow/skills/ui-ux-pro-max/data/colors.csv +193 -0
  17. package/template/.issflow/skills/ui-ux-pro-max/data/data-provenance.json +1348 -0
  18. package/template/.issflow/skills/ui-ux-pro-max/data/google-fonts.csv +1935 -0
  19. package/template/.issflow/skills/ui-ux-pro-max/data/icons.csv +106 -0
  20. package/template/.issflow/skills/ui-ux-pro-max/data/landing.csv +35 -0
  21. package/template/.issflow/skills/ui-ux-pro-max/data/motion.csv +18 -0
  22. package/template/.issflow/skills/ui-ux-pro-max/data/products.csv +193 -0
  23. package/template/.issflow/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  24. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -0
  25. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  26. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/avalonia.csv +57 -0
  27. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  28. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +60 -0
  29. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/javafx.csv +76 -0
  30. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  31. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
  32. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/nextjs.csv +62 -0
  33. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +77 -0
  34. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +68 -0
  35. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  36. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/react.csv +67 -0
  37. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/shadcn.csv +69 -0
  38. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/svelte.csv +56 -0
  39. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  40. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
  41. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/uno.csv +60 -0
  42. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/uwp.csv +56 -0
  43. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  44. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/winui.csv +60 -0
  45. package/template/.issflow/skills/ui-ux-pro-max/data/stacks/wpf.csv +57 -0
  46. package/template/.issflow/skills/ui-ux-pro-max/data/styles.csv +89 -0
  47. package/template/.issflow/skills/ui-ux-pro-max/data/typography.csv +75 -0
  48. package/template/.issflow/skills/ui-ux-pro-max/data/ui-reasoning.csv +193 -0
  49. package/template/.issflow/skills/ui-ux-pro-max/data/ux-guidelines.csv +120 -0
  50. package/template/.issflow/skills/ui-ux-pro-max/references/pro-rules.md +117 -0
  51. package/template/.issflow/skills/ui-ux-pro-max/references/quick-reference.md +256 -0
  52. package/template/.issflow/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  53. package/template/.issflow/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  54. package/template/.issflow/skills/ui-ux-pro-max/scripts/__pycache__/reasoning_contract.cpython-313.pyc +0 -0
  55. package/template/.issflow/skills/ui-ux-pro-max/scripts/core.py +993 -0
  56. package/template/.issflow/skills/ui-ux-pro-max/scripts/design_system.py +1668 -0
  57. package/template/.issflow/skills/ui-ux-pro-max/scripts/reasoning_contract.py +123 -0
  58. package/template/.issflow/skills/ui-ux-pro-max/scripts/search.py +177 -0
  59. package/template/.issflow/skills/ux-design/SKILL.md +3 -0
  60. package/template/.issflow/templates/UX-PACK-template.md +1 -0
  61. package/template/.issflow/templates/proposal.html +129 -38
package/README.md CHANGED
@@ -32,7 +32,7 @@ The portable kit (every tool) in `<project>/.issflow/`:
32
32
 
33
33
  - `agents/` — planner · researcher · implementer · test-author · debugger · e2e-runner · synthesizer
34
34
  - `commands/` — `/overview` `/feature` `/goal` `/propose` `/phase` `/sprint` `/ui-audit` `/qa-audit` `/security-audit` `/release` `/uat` `/change-request` `/replan` `/quick` `/synthesize` `/runbook` `/store-wisdom` `/log-issue` `/log-decision` `/unstuck`
35
- - `skills/` — caveman · grill-me · karpathy-guidelines · ux-design · security · code-standards
35
+ - `skills/` — caveman · grill-me · karpathy-guidelines · ux-design · ui-ux-pro-max · security · code-standards
36
36
  - `hooks/` — session-start · context-guard · plan-gate (rule-13 enforcement) · pre-compact · subagent-stop · feature-gate (Stop gate for `/feature`, artifact-verified)
37
37
  - `istartsoft-flow/METHODOLOGY.md` — the full methodology (single source of truth)
38
38
 
package/bin/cli.js CHANGED
@@ -227,8 +227,8 @@ function agentsMd() {
227
227
  '`/change-request` · `/replan` · `/synthesize` · `/runbook` · `/store-wisdom` ·',
228
228
  '`/log-issue` · `/log-decision` · `/unstuck`', '',
229
229
  '## Skills — `.issflow/skills/` (loaded on demand)', '',
230
- 'caveman · grill-me · karpathy-guidelines · ux-design · security · code-standards ·',
231
- 'support-triage', '',
230
+ 'caveman · grill-me · karpathy-guidelines · ux-design · ui-ux-pro-max · security ·',
231
+ 'code-standards · support-triage', '',
232
232
  '## Autonomy', '',
233
233
  'Planning (`/overview` grill + plan approval) always asks — that input is cheap.',
234
234
  '**AUTO (default)** governs the DEV loop: follow the plan, decide + log + continue,',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-issflow",
3
- "version": "1.9.0",
3
+ "version": "1.9.2",
4
4
  "description": "Scaffold the iStartSoftFlow AI-coding workflow into a project. Stack-agnostic, tool-agnostic (Claude Code, Codex, Cursor, Gemini, Aider), non-destructive.",
5
5
  "bin": {
6
6
  "create-issflow": "bin/cli.js"
@@ -14,7 +14,7 @@ This directory is the **portable workflow kit** (tool-agnostic). Every
14
14
  |------|------|
15
15
  | `agents/` | Fresh-context workers (planner, researcher, implementer, …) |
16
16
  | `commands/` | Procedures — Default: `/overview` `/feature` `/quick`; Advanced: `/propose` `/design` `/support` … |
17
- | `skills/` | On-demand cookbooks (ux-design, security, support-triage, …) |
17
+ | `skills/` | On-demand cookbooks (ux-design, ui-ux-pro-max, security, support-triage, …) |
18
18
  | `hooks/` | Lifecycle enforcement scripts |
19
19
  | `istartsoft-flow/` | METHODOLOGY.md — every hard rule lives here once |
20
20
  | `templates/` | Proposal / UX pack / architecture / CR / FEATURE / automation |
@@ -77,7 +77,8 @@ Show me CR-<n> (impact + price delta + new total — no rate). **STOP for approv
77
77
  (commercial gate — always interactive).
78
78
  - **Approved** -> set CR status `approved`; bump PROPOSAL.md to a new version (vN+1)
79
79
  with the delta folded in (**totals only**); re-render `docs/proposal.html` from it
80
- (same template + language; no contingency note / rate); then dispatch `/replan` to
80
+ (same `/propose` package rows + screen appendix — do not dump every PLAN phase
81
+ onto the sign table; same template + language; no contingency note / rate); then dispatch `/replan` to
81
82
  apply the phase changes to PLAN.md (done phases stay frozen). Update STATE.md.
82
83
  NOTE: `/replan` reverts PLAN.md to `> Approval: PENDING` and re-runs the
83
84
  PLAN-APPROVAL gate (hard rule 13) — the commercial CR sign-off is SEPARATE from
@@ -24,13 +24,19 @@ and STOP. Write nothing.
24
24
  Target: `$ARGUMENTS` → `ux` | `arch` | `both` (default **both**).
25
25
 
26
26
  ## STEP 1 — UX PACK (if ux|both)
27
- 1. Apply `ux-design` skill (authoring mode): wireframe baseline + cookbook direction.
28
- 2. Scaffold or update `docs/UX-PACK.md` from `.issflow/templates/UX-PACK-template.md`.
29
- 3. Fill flows, screen inventory, tokens/frame, a11y notes from OVERVIEW + PLAN.
30
- 4. SHOW me UX-PACK.md. **STOP for approval.**
31
- 5. On approve: stamp `> Approval: approved <date> v<n>`; set `design: approved <date>`
27
+ 1. Apply `ui-ux-pro-max` (visual direction): run the kit engine
28
+ `.issflow/skills/ui-ux-pro-max/scripts/search.py --design-system` from
29
+ OVERVIEW product + industry. Fold into UX-PACK tokens — do not create a
30
+ parallel `design-system/` SoT. If Python 3 is missing, ask me to install it
31
+ (do not install tools yourself).
32
+ 2. Apply `ux-design` skill (authoring mode): wireframe baseline + cookbook direction.
33
+ Catalogue output must still pass the cookbook (tokens, a11y, no emoji icons).
34
+ 3. Scaffold or update `docs/UX-PACK.md` from `.issflow/templates/UX-PACK-template.md`.
35
+ 4. Fill flows, screen inventory, tokens/frame, a11y notes from OVERVIEW + PLAN.
36
+ 5. SHOW me UX-PACK.md. **STOP for approval.**
37
+ 6. On approve: stamp `> Approval: approved <date> v<n>`; set `design: approved <date>`
32
38
  in STATE.md; HISTORY line `design v<n> approved`.
33
- 6. On change request: revise and re-show; header stays PENDING.
39
+ 7. On change request: revise and re-show; header stays PENDING.
34
40
 
35
41
  ## STEP 2 — ARCHITECTURE (if arch|both)
36
42
  1. Dispatch `researcher` (DESIGN) only if open unknowns remain; else use OVERVIEW.
@@ -119,6 +119,8 @@ for the slice using the declared E2E runner (it brings the test stack up/down
119
119
  itself). Then run the `ux-design` cookbook + wireframe check on the new UI
120
120
  (hard rule 9): the UI must match the wireframe frame and pass the cookbook
121
121
  (tokens, a11y/WCAG AA, states, breakpoints). A `ux-design` BLOCK is a GATE FAIL.
122
+ Do not re-run `ui-ux-pro-max` `--design-system` here — the look is locked in the
123
+ approved UX pack.
122
124
  Non-frontend phase -> skip §3c.
123
125
 
124
126
  PHASE GATE (rule 5) -> go to §4/§5/§6 (see GATE below).
@@ -1,17 +1,18 @@
1
1
  ---
2
- description: Turn approved requirements + tech stack into a client proposal — scope, phase breakdown, effort + cost estimate, timeline, assumptions, and a sign-off gate. Run after /overview, before building.
2
+ description: Turn approved requirements + tech stack into a client proposal — scope, packages, effort + cost estimate, timeline, assumptions, screen appendix, and a sign-off gate. Run after /overview, before building.
3
3
  argument-hint: [optional: rate / budget / constraints · "dry-run" to preview]
4
4
  ---
5
5
 
6
6
  Caveman ULTRA mode. You are the ORCHESTRATOR.
7
7
 
8
- Purpose: produce `docs/PROPOSAL.md` — WHAT we build, in what phases, how long, how
8
+ Purpose: produce `docs/PROPOSAL.md` — WHAT we build, in what packages, how long, how
9
9
  much, and on what assumptions — for the client to approve BEFORE any build starts.
10
10
  A proposal is a commercial gate: always interactive (both AUTO and GUIDED).
11
11
 
12
12
  DRY-RUN: if `$ARGUMENTS` contains `dry-run`/`--dry-run`, do the full analysis but
13
- EXECUTE NOTHING — print the ACTION PLAN (scope, phase breakdown, rough estimate)
14
- and STOP. No PROPOSAL.md / proposal.html is written. (METHODOLOGY → Dry-run.)
13
+ EXECUTE NOTHING — print the ACTION PLAN (scope, phase breakdown, package collapse,
14
+ rough estimate) and STOP. No PROPOSAL.md / proposal.html is written.
15
+ (METHODOLOGY → Dry-run.)
15
16
 
16
17
  ## PRE-FLIGHT
17
18
  Read `docs/OVERVIEW.md` (scope, stack, success criteria) and `docs/PRD.md` if
@@ -28,12 +29,15 @@ List the deliverables (features / epics) from OVERVIEW / PRD. Mark each
28
29
  **in-scope** or **out-of-scope** explicitly — naming out-of-scope items now is what
29
30
  prevents silent scope creep (and grounds change-order re-pricing later).
30
31
 
31
- ## STEP 2 — PHASE BREAKDOWN
32
+ ## STEP 2 — PHASE BREAKDOWN (internal)
32
33
  Derive the vertical-slice phases (or read `docs/PLAN.md` if it exists). Size each:
33
34
  - complexity: **S | M | L | XL**
34
35
  - effort: an ideal-days RANGE (e.g. 2–3d), + story points if your team uses them
35
36
  - risk / unknowns: what could move the estimate
36
37
 
38
+ Keep this sizing for the **chat math**. Do **not** dump every PLAN phase onto the
39
+ client table — collapse into packages in STEP 5.
40
+
37
41
  ## STEP 3 — ESTIMATE (ask rate · never invent a kit default)
38
42
  Estimation config is **project-private**. The public kit ships **no** default rate
39
43
  card and **no** sample salary/rate numbers — rates are confidential.
@@ -46,22 +50,35 @@ card and **no** sample salary/rate numbers — rates are confidential.
46
50
  3. Optional: store the answered rate/contingency in a **project-local** file the
47
51
  team keeps private (e.g. `docs/ESTIMATE.local.md` gitignored, or OVERVIEW fields
48
52
  that never get published). Never commit personal rate/salary into a public kit
49
- or template.
53
+ or template. If you create `docs/ESTIMATE.local.md`, add it to the project's
54
+ `.gitignore` when it is not already listed.
50
55
  4. Configurable fields (ask or read — no invented kit defaults for money):
51
56
  - **unit:** ideal-days | hours | story-points | both
52
57
  - **rate card:** blended OR per-role (senior / mid / junior…)
53
58
  - **currency:** as declared (ask if unset; THB is common for Thai clients)
54
59
  - **contingency:** % buffer for unknowns (ask if unset)
55
- - **payment milestones:** by-phase, split (e.g. 30/40/30), or none
60
+ - **payment split:** e.g. 30/40/30 — **ASK once; do not guess** a ratio
56
61
  - **language:** rendered doc language (default = project language)
57
62
 
63
+ Ask these **once each** if unset (commercial input — do not invent kit defaults):
64
+
65
+ - **Hours columns:** does the client table show estimated hours next to billed
66
+ hours? If yes → columns ประเมิน / คิดเงิน / ยอด. If no / unset → ชุดงาน + ยอด
67
+ only. Hours are effort, not a rate — still never print the rate.
68
+ - **Managed hosting / database:** is platform hosting+database **in** the quoted
69
+ total? If **not included**, write clearly on page 1 (out of scope + exclusions)
70
+ that the client pays the provider directly. A one-line exclusion is enough —
71
+ do **not** paste vendor SKU/price tables into the kit or invent list prices.
72
+ - **Bank:** include a bank block **only if the human provides** account details
73
+ in this project. No kit default. If none given, omit the column.
74
+
58
75
  Compute cost per phase, then a **Total as a RANGE (low–high)** that already folds
59
76
  in contingency. Show the math **in chat to the human** (rate × effort + contingency).
60
77
  **Timeline:** phases in dependency order → calendar estimate (note parallelism).
61
78
 
62
79
  ### CLIENT-DOC RULE (hard — commercial privacy)
63
80
  Client-facing artifacts (`docs/PROPOSAL.md` client sections, `docs/proposal.html`,
64
- and any PDF/print) MUST show **totals and phase costs only**.
81
+ and any PDF/print) MUST show **totals and package costs only**.
65
82
  **Never** print: hourly/day rates, rate cards, contingency %, “incl. X% buffer”,
66
83
  salary, or the estimate math. Contingency is already inside the numbers — do not
67
84
  label it on the client page.
@@ -71,38 +88,83 @@ List every assumption the estimate rests on (infra provided, third-party/licence
71
88
  costs excluded, content/design provided, etc.). These are the baseline that
72
89
  change-orders re-price against.
73
90
 
91
+ If hosting/database is not in the quote, the exclusion **must** say the client
92
+ pays the provider directly.
93
+
74
94
  ## STEP 5 — WRITE + RENDER
95
+ Collapse the internal PLAN phases into **3–6 client packages / sprints** that a
96
+ non-engineer can read. PLAN may have any number of phases; the sign page does not
97
+ list them all.
98
+
99
+ Payment copy = short **software delivery events** tied to those packages, e.g.
100
+ deposit on sign-off then work starts · when the main package is usable · when
101
+ production is up within the scope on this quote. **Never** construction wording
102
+ (% structure, house handover, site prep / equipment staging).
103
+
75
104
  1. Write `docs/PROPOSAL.md` — the SOURCE OF TRUTH (versioned v1 + date). This is
76
105
  what `CHANGES.md` re-prices against. **Client-safe** body (no rate / no
77
106
  contingency %):
78
107
  ```
79
108
  # Proposal — <project> (v1, <date>)
80
109
  ## Scope — in-scope: … | out-of-scope: …
81
- ## Phases — table: phase | complexity | effort (range) | cost
110
+ ## Packages — table: package | cost
111
+ — or package | estimated | billed | cost (only if hours columns requested)
82
112
  ## Total — <low>–<high> ← totals only; no “incl. X% contingency”
83
113
  ## Timeline — <estimate>, dependency order
84
114
  ## Assumptions — …
85
- ## Exclusions — …
86
- ## Payment — milestones (if any)
115
+ ## Exclusions — … (hosting/database: client pays provider, if that was the answer)
116
+ ## Payment — software delivery events + the asked split (if any)
117
+ ## Screens — docs/proposal.html pages 2–N (or “none — no UI in scope”)
118
+ — not pixel-binding; sign page 1 only; page count must match the HTML
87
119
  ## Sign-off — approved by: ___ date: ___ version: v1
88
120
  ```
121
+ Point the Screens section at the **real** HTML page range after render
122
+ (page 1 = sign · remaining sheets = screen appendix). Keep PROPOSAL.md and
123
+ `docs/proposal.html` in sync.
89
124
  If you keep an internal rate memo, put it in a **separate private** file (not
90
125
  the client PROPOSAL.md / HTML). PROPOSAL.md itself stays client-safe so it can
91
126
  be shared.
92
127
 
93
- 2. RENDER a client-facing `docs/proposal.html` from `.issflow/templates/proposal.html`:
94
- copy it, replace every `{{PLACEHOLDER}}`, and fill the CONTENT in the declared
95
- language (the section labels are already bilingual TH / EN). It must fit ONE A4
96
- page — be terse (≈ 3–6 phase rows, ≈ 4 assumptions, short scope items); trim before
97
- it spills to a second page. Fill `{{COMPANY}}` / `{{COMPANY_TAGLINE}}` / `{{LOGO}}`
98
- from the ISSUING company's brand declared in OVERVIEW (or ask once) — white-label,
99
- never hardcode the kit's name. Leave `{{TOTAL_NOTE}}` empty or a non-rate line
128
+ 2. RENDER a client-facing `docs/proposal.html` from `.issflow/templates/proposal.html`
129
+ (Claude Code also mirrors this under `.claude/templates/` — same file). Copy it,
130
+ replace every `{{PLACEHOLDER}}`, and fill the CONTENT in the declared language
131
+ (the section labels are already bilingual TH / EN).
132
+
133
+ **Page 1 = the only signable A4 sheet.** Be terse (≈ 3–6 package rows, ≈ 4
134
+ assumptions, short scope items). If page 1 overflows A4, **trim the sign-page
135
+ copy first** — never spill the sign block onto page 2. The screen appendix may
136
+ grow extra `.sheet` pages.
137
+
138
+ Fill `{{PACKAGE_TABLE}}` with the matching header:
139
+ - default: ชุดงาน / Packages + Cost
140
+ - if hours columns requested: ประเมิน / คิดเงิน / ยอด (and EN equivalents)
141
+ Fill `{{BANK_COL}}` only when the human gave bank details; otherwise leave
142
+ empty so payment takes the full width.
143
+ Fill `{{COMPANY}}` / `{{COMPANY_TAGLINE}}` / `{{LOGO}}` from the ISSUING
144
+ company's brand declared in OVERVIEW (or ask once) — white-label, never
145
+ hardcode the kit's name. Leave `{{TOTAL_NOTE}}` empty or a non-rate line
100
146
  (e.g. currency / “ราคารวมทั้งโครงการ”) — **never** a contingency % or rate.
147
+ Set `{{PAGE_FOOTER}}` to the real page count (e.g. sign page 1 of N).
148
+
149
+ **Screen appendix (required when UI is in scope)** — same `docs/proposal.html`,
150
+ not a second signable file. After page 1's page-break, emit `.sheet.screens`
151
+ into `{{SCREEN_SHEETS}}`:
152
+ - Build frames from **PLAN + OVERVIEW** modules/capabilities (empty chrome is
153
+ fine). Do **not** wait for UX-PACK (that gate is after sign-off).
154
+ - Cover **every** in-scope module and capability — not a 4–8 frame sampler.
155
+ - Group sheets by package; module bar on each sheet; numbered short captions
156
+ under frames.
157
+ - Label: not pixel-binding. Sign on page 1 only. **No emoji as icons.**
158
+ - Use the template's desk/phone/sidebar/card/table CSS. Do not invent a
159
+ parallel stylesheet.
160
+
101
161
  Print-ready (Ctrl/Cmd-P → A4 → Save as PDF). Keep PROPOSAL.md and proposal.html
102
162
  in sync.
103
163
 
104
164
  ## STEP 6 — SIGN-OFF GATE
105
165
  Show me the proposal. **STOP for approval** (commercial gate — always interactive).
166
+ Do **not** run `/design` or `/phase` yourself.
167
+
106
168
  On approval: record the approved version + date in PROPOSAL.md and STATE.md, and
107
169
  append a HISTORY line `proposal v<n> approved (<total>)`.
108
170
 
@@ -34,10 +34,13 @@
34
34
 
35
35
  Caveman ULTRA mode always on. Apply the `karpathy-guidelines` skill (engineering
36
36
  discipline) on every coding and debugging task. Apply the `ux-design` skill (the UX
37
- cookbook + wireframe baseline) on every UI-facing task. Apply the `security` skill
38
- (the Secure SDLC cookbook) at design (threat model), while coding (secure coding),
39
- and before any deploy. Apply the `code-standards` skill (naming per the language's
40
- own idiom + the declared architecture) on every coding task.
37
+ cookbook + wireframe baseline) on every UI-facing task. When **authoring** a new
38
+ visual direction (`/design`, or no approved UX-PACK yet), apply `ui-ux-pro-max`
39
+ first and fold the look into the UX pack — do not re-roll styles at phase CLOSE.
40
+ Apply the `security` skill (the Secure SDLC cookbook) at design (threat model),
41
+ while coding (secure coding), and before any deploy. Apply the `code-standards`
42
+ skill (naming per the language's own idiom + the declared architecture) on every
43
+ coding task.
41
44
 
42
45
  -----
43
46
 
@@ -109,10 +112,12 @@ from idea to closeout:
109
112
  the proposal estimates *these* phases.
110
113
  5. **Proposal & estimate (OPTIONAL — depends on the job)** — for client / quoted
111
114
  work, `/propose` reads OVERVIEW + PLAN → `docs/PROPOSAL.md` + a rendered
112
- `docs/proposal.html`: scope, phase breakdown, effort + cost estimate, timeline,
113
- assumptions, with a **client sign-off gate** before build. **Ask rate +
114
- contingency in chat** when missing — the kit stores **no** default rate (rates
115
- are confidential). Client docs show **totals only** (never rate or contingency %).
115
+ `docs/proposal.html`: scope, **package** rows on the signable A4 page (not every
116
+ PLAN phase), effort + cost estimate, timeline, assumptions, and a screen
117
+ appendix in the **same HTML** after a page-break, with a **client sign-off gate**
118
+ before build. **Ask rate + contingency in chat** when missing — the kit stores
119
+ **no** default rate (rates are confidential). Client docs show **totals only**
120
+ (never rate or contingency %).
116
121
  Internal / personal projects skip straight from plan to build (and may set
117
122
  design/architecture gates to `n/a`).
118
123
  6. **Design + architecture gates (rule 15 — after proposal, before build)** —
@@ -153,7 +158,7 @@ those gates, never the plan, the money, or the design/arch frame.
153
158
  | House role | Kit surface |
154
159
  |------------|-------------|
155
160
  | BA / PM | `/overview` grill · `grill-me` · PLAN / PROPOSAL / CR gates |
156
- | UX / UI | `/design` (UX pack) · `ux-design` skill · `/ui-audit` · rule 9 CLOSE |
161
+ | UX / UI | `/design` (UX pack) · `ui-ux-pro-max` (look) · `ux-design` (frame + gate) · `/ui-audit` · rule 9 CLOSE |
157
162
  | Architect | `/design` (ARCHITECTURE) · `researcher` DESIGN · `code-standards` · `/log-decision` |
158
163
  | Developer | `implementer` · `/phase` · `/feature` · `/quick` |
159
164
  | QA | `test-author` · `e2e-runner` · `/qa-audit` · `/uat` |
@@ -620,10 +625,12 @@ the KB. The kit works normally without a KB.
620
625
  ## File contract
621
626
 
622
627
  - `docs/PRD.md` — crystallised product requirements (or your BMAD/iSSM stories).
623
- - `docs/PROPOSAL.md` — scope + phase breakdown + effort/cost totals + assumptions
624
- + sign-off. Versioned; client-safe commercial baseline (no rate / contingency %).
628
+ - `docs/PROPOSAL.md` — scope + package rows + effort/cost totals + assumptions
629
+ + screen-appendix page range + sign-off. Versioned; client-safe commercial
630
+ baseline (no rate / contingency %).
625
631
  - `docs/proposal.html` — the client-facing proposal, rendered from PROPOSAL.md via
626
- `.issflow/templates/proposal.html`, in the project language; print-ready (PDF).
632
+ `.issflow/templates/proposal.html`, in the project language; page 1 is the
633
+ signable A4 sheet, then screen frames in the same file (print A4).
627
634
  - `docs/UX-PACK.md` · `docs/ARCHITECTURE.md` — pre-build design/arch frames
628
635
  (rule 15); templates under `.issflow/templates/`.
629
636
  - `.issflow/templates/` — document templates (proposal.html, UX-PACK, ARCHITECTURE,
@@ -687,6 +694,8 @@ the KB. The kit works normally without a KB.
687
694
  `scripts/regression.sh` (default mock; `--real` runs the real corpus).
688
695
  - `.issflow/skills/ux-design/` — the UX cookbook + wireframe baseline (read on
689
696
  demand for any UI work).
697
+ - `.issflow/skills/ui-ux-pro-max/` — visual direction for `/design` (vendored
698
+ search engine + catalogue; MIT upstream).
690
699
  - `.issflow/skills/security/` — the Secure SDLC cookbook + threat-modeling /
691
700
  secure-coding / pentest / standards references (read on demand for security work).
692
701
  - `.issflow/skills/code-standards/` — naming-per-language + architecture cookbook
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Next Level Builder
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: ui-ux-pro-max
3
+ description: >
4
+ Design intelligence for NEW visual direction — styles, palettes, type, landing
5
+ patterns. Use when authoring `/design` UX-PACK, setting OVERVIEW UX direction,
6
+ or the project has no approved UX pack yet. Triggers: "/design", "UX pack",
7
+ "visual direction", "design system", "palette", "typography", "landing pattern",
8
+ "ทิศทางดีไซน์", "โทนสี". Skip for backend, and skip re-rolling styles when an
9
+ approved UX-PACK already exists (follow that frame; validate with ux-design).
10
+ ---
11
+
12
+ # ui-ux-pro-max — visual direction (authoring)
13
+
14
+ Vendored from [ui-ux-pro-max-skill](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill)
15
+ (MIT — see `LICENSE.upstream` + `UPSTREAM.md`). Engine lives **in this folder**.
16
+
17
+ `ux-design` remains the **gate** (hard rule 9 — wireframe + cookbook). This skill
18
+ picks the **look**. Do not let a catalogue restyle override an approved UX pack.
19
+
20
+ ## When
21
+
22
+ - `/design` STEP 1 (author the UX pack) — **required** when UI is in scope.
23
+ - First visual direction (OVERVIEW UX / no approved `docs/UX-PACK.md`).
24
+ - Human explicitly asks to restyle — then re-run and wait for UX-PACK re-approve.
25
+
26
+ **Not** at `/phase` CLOSE. CLOSE = `ux-design` cookbook against the approved pack.
27
+ Do not run `--design-system` again per slice.
28
+
29
+ ## Engine
30
+
31
+ ```
32
+ python3 .issflow/skills/ui-ux-pro-max/scripts/search.py
33
+ ```
34
+
35
+ If this project's kit was mirrored for Claude Code, the same files exist under
36
+ `.claude/skills/ui-ux-pro-max/` — use whichever path is present.
37
+
38
+ Try `python3`, then `python`, then `py -3`. Stdlib only. If Python 3 is missing,
39
+ **ask the human** to install it (python.org / Homebrew / apt). Do not install
40
+ Python or npm yourself. Do not tell them to run `uipro init` — the catalogue
41
+ is already in the kit.
42
+
43
+ On-demand detail: `references/quick-reference.md`, `references/pro-rules.md`.
44
+
45
+ ## Authoring workflow
46
+
47
+ 1. Product / industry / keywords from OVERVIEW + PLAN (2–5 terms). Detect stack
48
+ from the project; never assume HTML+Tailwind.
49
+ 2. Run:
50
+
51
+ ```
52
+ python3 .issflow/skills/ui-ux-pro-max/scripts/search.py "<product> <industry> <keywords>" --design-system -p "<project>" -f markdown
53
+ ```
54
+
55
+ Retry once if empty. Do not persist unverified output. Do **not** pass
56
+ `--persist` / do **not** write a parallel `design-system/` tree — fold into
57
+ `docs/UX-PACK.md` → Frame & tokens (style, palette, type, effects,
58
+ anti-patterns). Kit SoT stays UX-PACK.
59
+ 3. Optional domain search only for a named gap:
60
+
61
+ ```
62
+ python3 .issflow/skills/ui-ux-pro-max/scripts/search.py "<query>" --domain ux|icons|chart|typography|style|color|landing
63
+ python3 .issflow/skills/ui-ux-pro-max/scripts/search.py "<query>" --stack <detected>
64
+ ```
65
+
66
+ 4. Then apply `ux-design` authoring (wireframe + cookbook). Catalogue must still
67
+ pass: no emoji icons, tokens not raw hex in components, WCAG AA.
68
+
69
+ If UX-PACK is already **approved**, read it and stop — unless the human asked to
70
+ change the look.
@@ -0,0 +1,4 @@
1
+ upstream: https://github.com/nextlevelbuilder/ui-ux-pro-max-skill
2
+ commit: 623a9a9
3
+ license: MIT (LICENSE.upstream)
4
+ omitted: scripts/tests, validate_data.py, phosphor-icons-upstream.json, google-font-licenses.json
@@ -0,0 +1,33 @@
1
+ No,Category,Issue,Keywords,Platform,Description,Do,Don't,Code Example Good,Code Example Bad,Severity
2
+ 1,Accessibility,Icon Button Labels,icon button accessibilityLabel,iOS/Android/React Native,Icon-only buttons must expose an accessible label,Set accessibilityLabel or label prop on icon buttons,Icon buttons without accessible names,"<Pressable accessibilityLabel=""Close""><XIcon /></Pressable>",<Pressable><XIcon /></Pressable>,Critical
3
+ 2,Accessibility,Form Control Labels,form input label accessibilityLabel,iOS/Android/React Native,All inputs must have a visible label and an accessibility label,Pair Text label with input and set accessibilityLabel,Inputs with placeholder only,"<View><Text>Email</Text><TextInput accessibilityLabel=""Email address"" /></View>","<TextInput placeholder=""Email"" /></View>",Critical
4
+ 3,Accessibility,Role & Traits,accessibilityRole accessibilityTraits,iOS/Android/React Native,Interactive elements must expose correct roles/traits,Use accessibilityRole/button/link/checkbox etc.,Rely on generic views with no roles,"<Pressable accessibilityRole=""button"">Submit</Pressable>",<View onTouchStart={submit}>Submit</View>,High
5
+ 4,Accessibility,Dynamic Updates,accessibilityLiveRegion announce,iOS/Android/React Native,Async status updates should be announced to screen readers,Use accessibilityLiveRegion or announceForAccessibility,Update text silently with no announcement,"<Text accessibilityLiveRegion=""polite"">{status}</Text>",<Text>{status}</Text>,Medium
6
+ 5,Accessibility,Decorative Icons,accessible={false} importantForAccessibility,iOS/Android/React Native,Decorative icons should be hidden from screen readers,Mark decorative icons as not accessible,Have screen reader read every icon,"<Icon accessible={false} importantForAccessibility=""no"" />",<Icon />,Medium
7
+ 6,Touch,Touch Target Size,touch target size platform runtime arbitration iOS 44pt Android 48dp web 24 CSS px React Native hitSlop,iOS/Android/React Native,Native targets use 44pt on iOS and 48dp on Android; web WCAG 2.2 has a separate 24 by 24 CSS px minimum with exceptions,Select 44pt for iOS and 48dp for Android at runtime; evaluate web targets separately against WCAG 2.5.8 and its exceptions,"Collapse iOS 44pt, Android 48dp, and web 24 CSS px into one cross-platform number","Platform.select({ ios: 44, android: 48 }); // web: evaluate 24 CSS px + WCAG exceptions",<Pressable><Icon size={16} /></Pressable>,Critical
8
+ 7,Touch,Touch Spacing,touch spacing gap 8px,iOS/Android/React Native,Adjacent touch targets need enough spacing,Keep at least 8dp spacing between touchables,Cluster many buttons with no gap,<View style={{ gap: 8 }}><Button ... /><Button ... /></View>,<View><Button ... /><Button ... /></View>,Medium
9
+ 8,Touch,Gesture Conflicts,scroll swipe back gesture,iOS/Android/React Native,Custom gestures must not break system scroll/back,Reserve horizontal swipes for carousels,Full-screen custom swipe conflicting with back,HorizontalPager inside vertical ScrollView,PanResponder on full screen blocking back,High
10
+ 9,Navigation,Back Behavior,back handler navigation stack,iOS/Android/React Native,Back navigation should be predictable and preserve state,Use navigation.goBack and keep screen state,Reset stack or exit app unexpectedly,onPress={() => navigation.goBack()},BackHandler.exitApp() on first press,Critical
11
+ 10,Navigation,Bottom Tabs,tab bar max items,iOS/Android/React Native,Bottom tab bar should have at most 5 primary items,Use 3–5 tabs and move extras to More/Settings,Overloaded tab bar with many icons,Home/Explore/Profile/Settings,Home/Explore/Shop/Cart/Profile/Settings/More,Medium
12
+ 11,Navigation,Modal Escape,modal dismiss close affordance,iOS/Android/React Native,Modals/sheets must have clear close actions,Provide close button and swipe-down where platform expects,Trapping users in modal with no obvious exit,"<Modal><Button title=""Close"" onPress={onClose} /></Modal>",<Modal><View>{children}</View></Modal>,High
13
+ 12,State,Preserve Screen State,navigation preserve state,iOS/Android/React Native,Returning to a screen should restore its scroll and form state,Keep components mounted or persist state,Reset list scroll and form inputs on every visit,<Tab.Navigator screenOptions={{ unmountOnBlur: false }}>,<Tab.Screen options={{ unmountOnBlur: true }} />,Medium
14
+ 13,Feedback,Loading Indicators,activity indicator skeleton,iOS/Android/React Native,Show visible feedback during network operations,Use ActivityIndicator or skeleton for >300ms operations,Leave button and screen frozen,"{loading ? <ActivityIndicator /> : <Button title=""Save"" />}"," ""<Button title=""""Save"""" onPress={submit} /> // no loading""",High
15
+ 14,Feedback,Success Feedback,toast checkmark banner,iOS/Android/React Native,Confirm successful actions with brief feedback,Show toast/checkmark or banner,Complete actions silently with no confirmation,showToast('Saved successfully'),// silently update state only,Medium
16
+ 15,Feedback,Error Feedback,inline error banner,iOS/Android/React Native,Show clear error messages near the problem,input-level error + summary banner,Only change border color with no explanation,<TextInput ... /><Text style={{color:'red'}}>{error}</Text>,<TextInput style={{borderColor:'red'}} />,High
17
+ 16,Forms,Inline Validation,onBlur validation,iOS/Android/React Native,Validate inputs on blur or submit with clear messaging,Validate onBlur and onSubmit,Validate on every keystroke causing jank,onBlur={() => validateEmail(value)},onChangeText={v => validateEmail(v)} // every char,Medium
18
+ 17,Forms,Keyboard Type,keyboardType returnKeyType,iOS/Android/React Native,Use appropriate keyboardType and returnKeyType,Match email/tel/number/search types,Use default keyboard for all inputs,"<TextInput keyboardType=""email-address"" />","<TextInput keyboardType=""default"" />",Medium
19
+ 18,Forms,Auto Focus & Next,autoFocus blurOnSubmit onSubmitEditing,iOS/Android/React Native,Guide users through form fields with Next/Done flows,Use onSubmitEditing to focus next input,Force users to tap each field manually,onSubmitEditing={() => nextRef.current?.focus()},"// no onSubmitEditing, manual tap only",Low
20
+ 19,Forms,Password Visibility,secureTextEntry toggle,iOS/Android/React Native,Allow toggling password visibility securely,Provide Show/Hide icon toggling secureTextEntry,Force users to type blind with no option,<TextInput secureTextEntry={secure} /><Icon onPress={toggle} />,<TextInput secureTextEntry /> // no toggle,Medium
21
+ 20,Performance,Virtualize Long Lists,FlatList SectionList virtualization,iOS/Android/React Native,Use FlatList/SectionList for lists over ~50 items,Use keyExtractor and initialNumToRender appropriately,Render hundreds of items with ScrollView,<FlatList data={items} renderItem={...} />,<ScrollView>{items.map(renderItem)}</ScrollView>,High
22
+ 21,Performance,Image Size & Cache,Image resize cache,iOS/Android/React Native,Use correctly sized and cached images,Use Image component with proper resizeMode and caching,Load full-resolution images everywhere,"<Image source={{uri}} resizeMode=""cover"" />",<Image source={require('4k.png')} /> // small avatar,Medium
23
+ 22,Performance,Debounce High-Freq Events,debounce scroll search,iOS/Android/React Native,Debounce scroll/search callbacks to avoid jank,Wrap handlers with debounce/throttle,Run heavy logic on every event,onScroll={debouncedHandleScroll},onScroll={handleScrollHeavy},Medium
24
+ 23,Animation,Duration & Easing,animation duration easing,iOS/Android/React Native,Micro-interactions should be 150–300ms with native-like easing,Use ease-out for enter/ease-in for exit,Use long or linear animations for core UI,"Animated.timing(..., { duration: 200, easing: Easing.out(Easing.quad) })","Animated.timing(..., { duration: 800, easing: Easing.linear })",Medium
25
+ 24,Animation,Respect Reduced Motion,reduced motion accessibility,iOS/Android/React Native,Respect OS reduced-motion accessibility setting,Check reduceMotionEnabled and simplify animations,Ignore user motion preferences,if (reduceMotionEnabled) skipAnimation(),Always run complex parallax animations,Critical
26
+ 25,Animation,Limited Continuous Motion,loop animation loader,iOS/Android/React Native,Reserve infinite animations for loaders and live data,Use looping only where necessary,Keep decorative elements looping forever,Animated.loop(loaderAnim) for ActivityIndicator,Animated.loop(bounceAnim) on background icons,Medium
27
+ 26,Typography,Base Font Size,fontScale dynamic type,iOS/Android/React Native,Body text must be readable and support Dynamic Type,Use platform fontScale and at least 14–16pt base,Render critical text below 12pt,<Text style={{ fontSize: 16 }}>Body</Text>,<Text style={{ fontSize: 10 }}>Body</Text>,High
28
+ 27,Typography,Dynamic Type Support,allowFontScaling adjustsFontSizeToFit,iOS/Android/React Native,Support system text scaling without breaking layout,Set allowFontScaling and test large text,Disable scaling on all text globally,<Text allowFontScaling>{label}</Text>,<Text allowFontScaling={false}>{label}</Text>,High
29
+ 28,Safe Areas,Safe Area Insets,safe area insets notch gesture,iOS/Android/React Native,Content must not overlap notches/gesture bars,Wrap screens in SafeAreaView or apply insets,Place tappable content under system bars,<SafeAreaView style={{ flex: 1 }}><Screen /></SafeAreaView>,<View style={{ flex: 1 }}><Screen /></View>,High
30
+ 29,Theming,Light/Dark Contrast,dark mode contrast tokens,iOS/Android/React Native,Ensure sufficient contrast in both light and dark themes,Use semantic tokens and test both themes,Reuse light-theme grays directly in dark mode,colors.textPrimaryDark = '#F9FAFB',colors.textPrimaryDark = '#9CA3AF' on '#111827',High
31
+ 30,Anti-Pattern,No Gesture-Only Actions,gesture only hidden controls,iOS/Android/React Native,Don't rely solely on hidden gestures for core actions,Provide visible buttons in addition to gestures,Rely on swipe/shake only with no UI affordance,Swipe to delete + visible Delete button,Only shake device to undo with no UI,Critical
32
+ 31,Accessibility,Dragging Alternatives,accessible drag interaction drag single pointer alternative keyboard drag alternative reorder resize move buttons React Native native runtime platform router arbitration iOS Android web,iOS/Android/React Native,React Native drag and reorder operations need a non-drag path selected for the active native runtime,Provide named Move up/down buttons or a position menu beside drag handles; route iOS and Android behavior through the runtime platform adapter,"Make drag, swipe, or a web-only pointer handler the only way to reorder native content","<Button title=""Move up"" onPress={() => moveItem(index, index - 1)} />",<DragHandle /> only,High
33
+ 32,Forms,Authentication Reuse,password manager passkey paste redundant entry,iOS/Android/React Native,Authentication and multi-step flows should reuse prior values,Support password managers passkeys paste and prefilled confirmed values,Force users to retype credentials or the same data in one flow,"textContentType=""password"" autoComplete=""current-password""",onPaste disabled,Critical
@@ -0,0 +1,78 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "verifiedAt": "2026-08-26",
4
+ "counts": {
5
+ "styles": {
6
+ "total": 88,
7
+ "searchable": 79,
8
+ "active": 50,
9
+ "supplemental": 29,
10
+ "deprecated": 9
11
+ },
12
+ "products": 192,
13
+ "palettes": 192,
14
+ "reasoningProfiles": 192,
15
+ "fontPairings": 74,
16
+ "googleFonts": 1934,
17
+ "curatedIcons": 105,
18
+ "upstreamPhosphorIcons": 1512,
19
+ "uxGuidelines": 119,
20
+ "motionPresets": 17,
21
+ "chartTypes": 25,
22
+ "stacks": 22,
23
+ "stackGuidelines": 1271
24
+ },
25
+ "snapshots": {
26
+ "google-fonts.csv": {
27
+ "sha256": "1c8c3b2ea1faf6a1012da463756def8b3889db33f2226f0343bb4daa80307d03"
28
+ },
29
+ "google-font-licenses.json": {
30
+ "sha256": "35688523f2955795caa1a47c53b83099e60c1708461476f9cc3a050cf3b0148a"
31
+ },
32
+ "icons.csv": {
33
+ "sha256": "50816c6012030178195a16ee481ebf58b47bd985d70e8ec58886cc83f6eddafc"
34
+ },
35
+ "phosphor-icons-upstream.json": {
36
+ "sha256": "2399325233b277b5c97a80e6a5e8941154f5d057beee4e7613db87c87d700236"
37
+ }
38
+ },
39
+ "promotionPolicy": {
40
+ "changedFamilySetRequiresExplicitApproval": true,
41
+ "relevanceGateRequired": true,
42
+ "unlicensedFamiliesExcluded": true
43
+ },
44
+ "pendingCandidates": [
45
+ {
46
+ "family": "Edu NSW ACT Cursive",
47
+ "reason": "No exact-family METADATA.pb entry in the official google/fonts repository snapshot"
48
+ },
49
+ {
50
+ "family": "Edu NSW ACT Hand Pre",
51
+ "reason": "No exact-family METADATA.pb entry in the official google/fonts repository snapshot"
52
+ },
53
+ {
54
+ "family": "Edu QLD Hand",
55
+ "reason": "No exact-family METADATA.pb entry in the official google/fonts repository snapshot"
56
+ },
57
+ {
58
+ "family": "Edu SA Hand",
59
+ "reason": "No exact-family METADATA.pb entry in the official google/fonts repository snapshot"
60
+ },
61
+ {
62
+ "family": "Edu VIC WA NT Hand",
63
+ "reason": "No exact-family METADATA.pb entry in the official google/fonts repository snapshot"
64
+ },
65
+ {
66
+ "family": "Edu VIC WA NT Hand Pre",
67
+ "reason": "No exact-family METADATA.pb entry in the official google/fonts repository snapshot"
68
+ },
69
+ {
70
+ "family": "Google Sans",
71
+ "reason": "No exact-family METADATA.pb entry in the official google/fonts repository snapshot"
72
+ },
73
+ {
74
+ "family": "Google Sans Flex",
75
+ "reason": "No exact-family METADATA.pb entry in the official google/fonts repository snapshot"
76
+ }
77
+ ]
78
+ }