opencode-skills-collection 4.0.21 → 4.0.22

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 (30) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +3 -1
  2. package/bundled-skills/agents-generator/SKILL.md +5 -5
  3. package/bundled-skills/agents-generator/assets/agents-full.md +1 -1
  4. package/bundled-skills/antigravity-maintainer-batch-release/SKILL.md +1 -1
  5. package/bundled-skills/cohesivity/SKILL.md +11 -4
  6. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  7. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  8. package/bundled-skills/docs/maintainers/repo-growth-seo.md +1 -1
  9. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  10. package/bundled-skills/docs/users/aas-core.md +1 -1
  11. package/bundled-skills/docs/users/bundles.md +1 -1
  12. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  13. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  14. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  15. package/bundled-skills/docs/users/usage.md +3 -3
  16. package/bundled-skills/docs/users/visual-guide.md +4 -4
  17. package/bundled-skills/docs/vietnamese/README.vi.md +1 -7
  18. package/bundled-skills/generate-nanobanana/SKILL.md +133 -0
  19. package/bundled-skills/generate-nanobanana/references/gemini-3-pro-image.md +87 -0
  20. package/bundled-skills/generate-nanobanana/references/gemini-3.1-flash-image.md +81 -0
  21. package/bundled-skills/generate-nanobanana/references/gemini-3.1-flash-lite-image.md +82 -0
  22. package/bundled-skills/generate-nanobanana/references/gemini-omni-flash-preview.md +160 -0
  23. package/bundled-skills/gh-attach/SKILL.md +17 -13
  24. package/bundled-skills/loki-mode/autonomy/run.sh +24 -2
  25. package/bundled-skills/loki-mode/examples/todo-app-generated/backend/package-lock.json +3 -3
  26. package/bundled-skills/loki-mode/examples/todo-app-generated/frontend/package-lock.json +7 -7
  27. package/bundled-skills/shopify-review-triage/SKILL.md +425 -0
  28. package/bundled-skills/unified-ai-gateway/SKILL.md +53 -30
  29. package/package.json +1 -1
  30. package/skills_index.json +69 -2
@@ -0,0 +1,425 @@
1
+ ---
2
+ name: shopify-review-triage
3
+ description: "Turn public 1-3-star Shopify App Store review rows into a P0-P3 triage brief: incident risk, repeated friction, pricing confusion, feature requests, and an explicit needs-human-read bucket."
4
+ category: product
5
+ risk: none
6
+ source: community
7
+ source_repo: alfredtech2026/shopify-app-review-brief
8
+ source_type: community
9
+ date_added: "2026-08-03"
10
+ author: alfredtech2026
11
+ tags: [shopify, app-store-reviews, customer-feedback, triage, product-management, support]
12
+ tools: [claude, cursor, codex, gemini, antigravity]
13
+ license: "MIT"
14
+ license_source: "https://github.com/alfredtech2026/shopify-app-review-brief/blob/main/LICENSE"
15
+ ---
16
+
17
+ # Shopify Review Triage — public low-star reviews to a P0–P3 brief
18
+
19
+ ## Overview
20
+
21
+ Takes rows of **public** Shopify App Store review text and produces one prioritized brief a
22
+ product or support owner can act on: what kind of problem each review describes, how badly it
23
+ can hurt, what to do first, and where the original wording came from.
24
+
25
+ It is built for independent Shopify app teams and the agencies that run their support — the
26
+ case where low-star reviews arrive scattered across several listings plus a few watched
27
+ competitors, and the failure mode is treating them all as equally urgent.
28
+
29
+ The rubric below is not invented here. It is the published rule set behind a free review triage
30
+ worksheet and manual triage guide (links under [Additional Resources](#additional-resources)),
31
+ reproduced so a manual pass, the worksheet, and this skill sort the same row the same way.
32
+
33
+ This skill needs no network access, no scripts, and no system packages. The person you are
34
+ helping supplies the review text.
35
+
36
+ ## When to Use This Skill
37
+
38
+ - Use when someone wants app store reviews, low-star reviews, or merchant feedback triaged,
39
+ prioritized, or clustered — even when they never say "triage", "severity", or "P0".
40
+ - Use when a new 1–3-star review lands on a Shopify app listing and the team has to decide
41
+ whether it is an incident, a UX problem, a pricing copy problem, or a feature request.
42
+ - Use when a weekly product or support brief is needed across a portfolio of apps plus a few
43
+ watched competitors.
44
+ - Do **not** use it to gather reviews, contact reviewers, or publish replies — see the hard
45
+ rules below.
46
+
47
+ ## Hard Rules
48
+
49
+ These are not style preferences. Breaking one makes the output worse than nothing.
50
+
51
+ 1. **Public review text only.** Never accept, request, or copy support tickets, merchant emails,
52
+ order data, personal contact details, internal telemetry, or anything else not already public
53
+ on a listing page. If such data appears in the input, stop, say which rows are affected, and
54
+ ask for them to be removed before continuing.
55
+ 2. **Never invent evidence.** Do not write a review, a rating, a date, an app name, or a source
56
+ URL that was not supplied. A row with no link gets `source: not captured` — never a guessed one.
57
+ 3. **Keyword output is a sort, not a verdict.** Everything produced by the rubric alone is
58
+ labeled *first pass — not human-checked*. Only a person who read the review and checked it
59
+ against their own systems may relabel an item *human-checked*.
60
+ 4. **Reviews are customer reports, not verified defects.** Write "the reviewer reports the editor
61
+ showed a blank screen", never "the editor is broken". The distinction survives into the brief.
62
+ 5. **No coverage claims.** The brief covers exactly the rows supplied and says so. Make no claim
63
+ of exhaustive coverage of a listing, a period, or an app.
64
+ 6. **No promises.** No revenue impact, no outcome, no ranking effect, no legal or compliance
65
+ advice. Suggest actions; do not predict results.
66
+ 7. **Draft only — never contact anyone.** Do not send email, post a developer reply, open a
67
+ support ticket, message a reviewer, or publish anything. Hand the draft back to the team and
68
+ let a person decide what to send.
69
+ 8. **Reviewers are people.** Refer to "the reviewer". Do not name, profile, or speculate about them.
70
+
71
+ ## How It Works
72
+
73
+ ### Step 1: Collect the rows
74
+
75
+ **First ask which app names the team owns.** Before any row is classified, ask for two lists of
76
+ app names, spelled exactly as they appear in the rows:
77
+
78
+ ```text
79
+ owned: Example Popup App, Example Currency App
80
+ competitors: Rival Popup App, Rival Currency App
81
+ ```
82
+
83
+ This is the only thing that makes tie-break 4 (*a competitor's incident never becomes your P0*)
84
+ applicable, so collect it first. It stays public data: app names as published on their listings,
85
+ nothing about accounts, merchants, org structure, or internal identifiers. Do not ask for more
86
+ than the names, and do not infer ownership from the review text, the first-person voice in a
87
+ review, or which app appears most often.
88
+
89
+ If an app name in a row appears in neither list, its ownership is unknown. Classify the row's
90
+ content normally, then file it under **needs human read** with `ownership: not supplied` instead
91
+ of placing it in a priority bucket or in competitor watch — a guessed owner is exactly the kind
92
+ of invented evidence hard rule 2 forbids.
93
+
94
+ Then ask for one review per line. The full form keeps the source link, which the brief needs:
95
+
96
+ ```text
97
+ rating | app name | review date | public reviews URL | review text
98
+ ```
99
+
100
+ The shorter form used by the free worksheet is also fine — treat field 1 as the rating when it
101
+ is a bare 1–5 (optionally followed by `star`/`stars`/`★`), otherwise as the app name:
102
+
103
+ ```text
104
+ rating | app name | review text
105
+ ```
106
+
107
+ Rules for this step:
108
+
109
+ - Lines starting with `#` are comments. Blank lines are skipped.
110
+ - If a row lacks a source URL, carry `source: not captured` through to the brief. Do not drop
111
+ the row and do not fabricate a link.
112
+ - Do not go and fetch anything yourself. This skill needs no network access; the person you are
113
+ helping pastes the public rows they already opened.
114
+ - The trigger this rubric is tuned for is a **new 1–3-star review**. Higher-rated rows still
115
+ classify correctly (a 5★ review often lands in feature requests or needs-human-read), so keep
116
+ them if they were supplied, but never present them as low-star signal.
117
+
118
+ ### Step 2: First pass — apply the rubric
119
+
120
+ Lower-case the review text and normalize curly apostrophes (`’` → `'`) before matching, so a
121
+ pasted "won’t load" still matches `won't load`.
122
+
123
+ Five buckets. Each row gets exactly **one primary** bucket — the first dimension below, in this
124
+ order, with any matching keyword. Further matches are recorded as **secondary**, never as a
125
+ second brief item.
126
+
127
+ #### P0 · Incident risk
128
+
129
+ The purchase path, app activation, or merchant data may be at stake right now. Left alone it
130
+ costs the merchant money and the team installs.
131
+
132
+ **Suggested action.** Try to reproduce on a test store today. If confirmed, treat it as an incident: fix or mitigate first, then reply to the reviewer with what changed.
133
+
134
+ **Signal keywords.** `won't load`, `wont load`, `won't open`, `wont open`, `can't close`, `cannot close`, `won't close`, `blank screen`, `broken`, `crash`, `stopped working`, `not working`, `doesn't work`, `does not work`, `checkout`, `losing sales`, `lost sales`, `error`
135
+
136
+ #### P1 · Repeated friction
137
+
138
+ The product works, but the same struggle keeps showing up across reviews or against an open
139
+ support theme. Repetition is the signal, not volume of adjectives.
140
+
141
+ **Suggested action.** Log it against the matching support theme. If the same complaint repeats across rows, schedule a UX fix ahead of new feature work.
142
+
143
+ **Signal keywords.** `confusing`, `unclear`, `hard to`, `difficult`, `complicated`, `clunky`, `slow`, `couldn't figure`, `could not figure`, `annoying`, `had to contact support`, `setup took`, `too many steps`
144
+
145
+ #### P2 · Pricing confusion
146
+
147
+ What the merchant expected to pay and what happened diverged. Usually a copy problem in the
148
+ listing, the plan limits, or the upgrade prompts — not a code problem.
149
+
150
+ **Suggested action.** Compare what the reviewer expected with the listing's pricing section and in-app upgrade prompts; clarify the copy where they diverge.
151
+
152
+ **Signal keywords.** `pricing`, `price`, `charged`, `charge`, `billing`, `billed`, `expensive`, `free plan`, `trial`, `refund`, `hidden fee`, `hidden cost`, `paywall`
153
+
154
+ #### P3 · Feature request
155
+
156
+ The merchant wants something the app does not do, or could not find. Valuable as a log entry,
157
+ rarely urgent on its own.
158
+
159
+ **Suggested action.** Add it to the feature-request log with a link to the review. If the capability already exists, reply to the reviewer with where to find it.
160
+
161
+ **Signal keywords.** `wish`, `would be great`, `would love`, `please add`, `feature request`, `missing`, `if only`, `would like`, `no option to`, `needs an option`, `hope you add`, `add support for`
162
+
163
+ #### Needs human read
164
+
165
+ No keyword matched. Vague frustration, sarcasm, mixed praise, or a story that needs context.
166
+
167
+ **Suggested action.** No keyword matched. Read the full review yourself and file it manually — the heuristic makes no guess here.
168
+
169
+ **Priority.** The worksheet labels this bucket `P2` and sorts it last. Treat that label as
170
+ provisional placement in the queue, not as a severity judgment — nothing has been judged yet.
171
+
172
+ #### Tie-breaks and escalation
173
+
174
+ 1. **Most severe wins.** A row naming both a broken checkout and a billing surprise files under
175
+ P0 with pricing noted as secondary. Never split one review across two brief items.
176
+ 2. **Repetition escalates.** If the same friction or pricing theme appears in three or more
177
+ reviews within about 60 days, move it up one level and say how many rows drove the change.
178
+ 3. **Age discounts.** A review older than a year is background, not evidence of a current
179
+ problem, unless a recent row corroborates it. Cite it as context, never as the headline.
180
+ 4. **Competitor reviews never create a P0 for you.** Resolve the row's app name against the
181
+ ownership lists from step 1: `owned` keeps its rubric bucket, `competitors` moves to the
182
+ competitor watch section whatever its keywords matched, and a name in neither list goes to
183
+ needs human read with `ownership: not supplied`. A competitor's incident is roadmap,
184
+ positioning, or copy input — never your P0.
185
+ 5. **When unsure, choose needs human read.** The bucket exists so the rubric never launders
186
+ uncertainty into a priority label.
187
+
188
+ ### Step 3: Human pass — verify before you promote anything
189
+
190
+ The first pass is where this skill stops being able to help on its own. Before any item is
191
+ presented as more than a keyword match, a person on the team has to:
192
+
193
+ - read the full original review at its source link;
194
+ - for P0 candidates, attempt to reproduce on a development store and check the error tracker and
195
+ support inbox for matching signals from the same period;
196
+ - record the outcome as *reproduced*, *not reproduced*, or *attempted — notes attached*.
197
+
198
+ Ask for these outcomes rather than assuming them. Until you have them, every item stays labeled
199
+ *first pass — not human-checked*, including in the summary line. An unverified P0 is a candidate,
200
+ not an incident.
201
+
202
+ Known limits to state plainly when they apply: keyword matching is English-only, misses sarcasm
203
+ and context, can misfile a review that mentions "checkout" in passing, and sees only the rows
204
+ supplied.
205
+
206
+ ### Step 4: Write the brief
207
+
208
+ One document per portfolio, sections in rubric order, every item carrying an owner, a next
209
+ action, and a source link. An item without an owner is a note, not a brief entry.
210
+
211
+ <!-- brief-template -->
212
+ ```markdown
213
+ # Low-star review brief — {portfolio or team name} — week of {YYYY-MM-DD}
214
+
215
+ Scope: {apps monitored} · {competitors watched} · {N} rows supplied, {date range}.
216
+ Covers only the rows supplied — no claim of exhaustive coverage.
217
+ Reviews are customer reports, not verified defects. Items marked "first pass" are
218
+ unverified keyword matches; "human-checked" means a person read the review and checked it.
219
+
220
+ ## P0 — Incident risk
221
+ - **{App} — {signal in a few words}** ({rating}★, {review date}, source: {public reviews URL or not captured})
222
+ - Reviewer reports: {one sentence, in their words where possible}
223
+ - Status: first pass — not human-checked / human-checked
224
+ - Reproduced: {yes / no / attempted — notes}
225
+ - Next action: {action} — owner {name}, due {date}
226
+
227
+ ## P1 — Repeated friction
228
+ - **{App} — {theme}** ({rating}★, {date}, source: {public reviews URL or not captured}; also seen: {where})
229
+ - Status: first pass — not human-checked / human-checked
230
+ - Next action: {UX or docs change} — owner {name}, due {date}
231
+
232
+ ## P2 — Pricing confusion
233
+ - **{App} — {signal}** ({rating}★, {date}, source: {public reviews URL or not captured})
234
+ - Expected vs. actual: {one line}
235
+ - Status: first pass — not human-checked / human-checked
236
+ - Next action: {copy or prompt change} — owner {name}, due {date}
237
+
238
+ ## P3 — Feature requests
239
+ - **{App} — {request}** ({rating}★, {date}, source: {public reviews URL or not captured}) — {log it / already exists → reply with where to find it}
240
+
241
+ ## Needs human read
242
+ - **{App}** ({rating}★, {date}, source: {public reviews URL or not captured}) — {no keyword matched; what a human should look for}{, or: ownership: not supplied — app name on neither list}
243
+
244
+ ## Competitor watch
245
+ - **{Competitor} — {signal}**: {what it implies for our roadmap, copy, or positioning}
246
+
247
+ ## Decisions this week
248
+ - {one decision or experiment, with the row(s) that motivated it}
249
+ ```
250
+
251
+ Open the summary line with the counts, e.g. *"Triaged 8 rows supplied: 3 incident risk,
252
+ 2 repeated friction, 1 pricing confusion, 1 feature request, 1 needs human read — first pass,
253
+ not human-checked."*
254
+
255
+ ### Step 5: Self-check before you hand it over
256
+
257
+ Refuse to deliver until every line is true:
258
+
259
+ - [ ] Every item names its bucket and priority from the rubric above, and nothing else.
260
+ - [ ] Every item carries a source link or an explicit `source: not captured`.
261
+ - [ ] Every P0–P3 item is an app on the `owned` list; every competitor row sits in competitor
262
+ watch; every unlisted app name says `ownership: not supplied` under needs human read.
263
+ - [ ] No review text, rating, date, app name, or URL appears that was not supplied.
264
+ - [ ] Every unverified item says *first pass — not human-checked*; nothing claims a human check
265
+ that did not happen.
266
+ - [ ] Claims are phrased as reports ("the reviewer reports…"), not as findings about the code.
267
+ - [ ] The scope line says how many rows were supplied and makes no coverage claim.
268
+ - [ ] No promise about revenue, ratings, outcomes, or compliance appears anywhere.
269
+ - [ ] No private data survived into the output.
270
+ - [ ] Nothing was sent, posted, or published — the brief is a draft for the team.
271
+
272
+ ## Examples
273
+
274
+ ### Example 1: Worked example — eight rows in, first pass out
275
+
276
+ These eight fictional rows are the worksheet's own example set, so the two tools can be compared
277
+ directly. Two of them are deliberately 4★ and 5★, to exercise the feature-request and
278
+ needs-human-read buckets.
279
+
280
+ Ownership context, collected before any of it is classified:
281
+
282
+ ```text
283
+ owned: Example Popup App, Example Currency App, Example Reviews App
284
+ competitors: (none supplied)
285
+ ```
286
+
287
+ ```text
288
+ 1 | Example Popup App | The editor shows a blank screen and the popup won't load. We are losing sales every day.
289
+ 2 | Example Popup App | The overlay can't close on mobile and it blocks the checkout button.
290
+ 1 | Example Currency App | Conversion is broken at checkout and we were still billed for the month.
291
+ 3 | Example Currency App | Setup took hours and the settings screen is confusing. Support was slow to reply.
292
+ 3 | Example Reviews App | The widget looks fine but the template editor is confusing and hard to use on a tablet.
293
+ 2 | Example Currency App | We kept getting charged after uninstalling, and the pricing page never mentioned this.
294
+ 4 | Example Reviews App | Great app, but I wish it could export reviews to CSV. Please add filtering by country.
295
+ 5 | Example Reviews App | Does what it promises and support replied the same day.
296
+ ```
297
+
298
+ First pass over those rows:
299
+
300
+ ```text
301
+ row 1 → P0 incident risk
302
+ row 2 → P0 incident risk
303
+ row 3 → P0 incident risk (secondary: pricing confusion)
304
+ row 4 → P1 repeated friction
305
+ row 5 → P1 repeated friction
306
+ row 6 → P2 pricing confusion
307
+ row 7 → P3 feature request
308
+ row 8 → needs human read
309
+ ```
310
+
311
+ **Explanation:** Rows 4 and 5 both matched `confusing`, so they are flagged as a repeated theme —
312
+ two rows, which is a cluster to watch, not yet the three that trigger escalation. Row 3 is a
313
+ single P0 item with pricing recorded as secondary, never two items. Row 8 matched nothing and
314
+ stays unjudged. All three app names are on the `owned` list, so every bucket above is the team's
315
+ own queue and competitor watch is empty; had `Example Reviews App` been listed as a competitor
316
+ instead, rows 5, 7, and 8 would move there and none of them could become a P0. None of these rows
317
+ carried a source URL, so each item would read `source: not captured` until the team supplies the
318
+ listing links.
319
+
320
+ ### Example 2: A row that carries its source link
321
+
322
+ ```text
323
+ 1 | Example Popup App | 2026-07-28 | https://apps.shopify.com/example-popup-app/reviews?ratings%5B%5D=1 | The editor shows a blank screen and the popup won't load. We are losing sales every day.
324
+ ```
325
+
326
+ Rendered into the brief:
327
+
328
+ ```markdown
329
+ ## P0 — Incident risk
330
+ - **Example Popup App — editor reported blank, popup reported not loading** (1★, 2026-07-28, [source](https://apps.shopify.com/example-popup-app/reviews?ratings%5B%5D=1))
331
+ - Reviewer reports: the editor shows a blank screen, the popup does not load, and they are losing sales daily.
332
+ - Status: first pass — not human-checked
333
+ - Reproduced: not yet attempted
334
+ - Next action: attempt reproduction on a development store today — owner {name}, due {date}
335
+ ```
336
+
337
+ **Explanation:** It files as a P0 only because `Example Popup App` is on the `owned` list; the
338
+ same row from a competitor listing would render under competitor watch instead. The wording stays
339
+ a report ("the reviewer reports"), the status stays *first pass — not human-checked* until a
340
+ person verifies it, and the source link is the listing's public reviews page with the rating
341
+ filter kept — the App Store has no per-review permalink.
342
+
343
+ ## Best Practices
344
+
345
+ - ✅ **Do:** keep one review in exactly one bucket, and record extra matches as secondary notes.
346
+ - ✅ **Do:** carry `source: not captured` forward when a row has no link, so the gap is visible.
347
+ - ✅ **Do:** label every unverified item *first pass — not human-checked*, including in the summary.
348
+ - ✅ **Do:** phrase every finding as a customer report, not as a confirmed defect.
349
+ - ✅ **Do:** state how many rows were supplied and refuse any coverage claim beyond them.
350
+ - ❌ **Don't:** fetch reviews, scrape listings, or ask for support tickets, emails, or order data.
351
+ - ❌ **Don't:** invent a rating, date, app name, or URL that was not supplied.
352
+ - ❌ **Don't:** send, post, or publish anything — including a developer reply to a reviewer.
353
+ - ❌ **Don't:** promise a revenue, ratings, or compliance outcome from any suggested action.
354
+
355
+ ## Limitations
356
+
357
+ - Keyword matching is **English-only**. Non-English reviews match nothing and land in
358
+ needs-human-read; that is the correct outcome, not a bug to work around by translating first.
359
+ - The rubric misses sarcasm, irony, and context, and can misfile a review that mentions
360
+ "checkout" or "missing" in passing.
361
+ - It sees only the rows the person supplies. It cannot know a listing's full review history, the
362
+ team's error tracker, or their support inbox.
363
+ - It cannot verify anything. Every P0 it produces is a *candidate*, not a confirmed incident,
364
+ until a person reproduces it.
365
+ - It does not replace environment-specific validation, testing, or expert review. Stop and ask
366
+ for clarification if required inputs, permissions, or safety boundaries are missing.
367
+
368
+ ## Security & Safety Notes
369
+
370
+ - **No commands, no network, no credentials.** This skill runs on pasted text only. It must not
371
+ fetch listings, call APIs, or read files outside what the person supplies.
372
+ - **Private data is a stop condition.** If support tickets, merchant emails, order records,
373
+ personal contact details, or internal telemetry appear in the input, stop, name the affected
374
+ rows, and ask for them to be removed before continuing.
375
+ - **No outbound messaging.** The output is a draft handed back to the team. Sending email,
376
+ posting a public developer reply, opening a ticket, or contacting a reviewer is out of scope
377
+ under every circumstance (hard rule 7).
378
+ - **Reviewers are people.** Do not name, profile, or speculate about a reviewer; refer to
379
+ "the reviewer".
380
+ - **No promises.** No revenue, ratings, ranking, legal, or compliance claims belong in a brief.
381
+
382
+ ## Common Pitfalls
383
+
384
+ - **Problem:** The Shopify App Store has no stable per-review permalink.
385
+ **Solution:** Cite the listing's public reviews page, keep the rating filter if one was used
386
+ (`…/reviews?ratings%5B%5D=1`), and pin the item with the review date plus the reviewer's first
387
+ few words so a human can find it again.
388
+ - **Problem:** `checkout` is the noisiest keyword in the set — it fires on "we love the checkout
389
+ upsell".
390
+ **Solution:** A P0 whose only evidence is the word `checkout` is a needs-human-read row wearing
391
+ a P0 badge. Say so instead of promoting it.
392
+ - **Problem:** `missing` and `error` cross buckets — "missing a dark mode" is P3, "settings page
393
+ errors out" is P0.
394
+ **Solution:** Primary-bucket order resolves the collision mechanically; the human pass fixes
395
+ the ones where it guessed wrong.
396
+ - **Problem:** A competitor's incident looks worse than anything on the team's own listings.
397
+ **Solution:** It still goes to competitor watch. A competitor's P0 is never yours.
398
+ - **Problem:** One review gets split across two sections, double-counting the same merchant and
399
+ inflating every count in the summary line.
400
+ **Solution:** One review, one item. Secondary matches are annotations.
401
+ - **Problem:** The free in-browser worksheet parses three fields and folds everything after the
402
+ second `|` into the review text, so a five-field row displays its date and URL inside the quote.
403
+ **Solution:** Paste the short form into the worksheet and keep the long form here.
404
+
405
+ ## Related Skills
406
+
407
+ - `@customer-research` — when the goal is broader voice-of-customer synthesis rather than
408
+ prioritizing a specific set of low-star review rows.
409
+ - `@shopify-apps` — when the next step is actually building or fixing the Shopify app behavior a
410
+ triaged P0 points at.
411
+ - `@before-you-build` — when a P3 feature request needs product-risk review before it becomes
412
+ roadmap work.
413
+
414
+ ## Additional Resources
415
+
416
+ This skill packages the public rubric behind **Shopify App Review Brief**, an independent
417
+ open-source project that is not affiliated with or endorsed by Shopify Inc. or any app developer.
418
+ The same four dimensions, priorities, keyword lists, and suggested actions are published in three
419
+ places:
420
+
421
+ - [Manual guide, tie-break rules, and brief template](https://alfredtech2026.github.io/shopify-app-review-brief/guides/shopify-app-review-triage.html)
422
+ - [Free in-browser worksheet that automates the first pass](https://alfredtech2026.github.io/shopify-app-review-brief/tools/review-triage-worksheet.html)
423
+ - [Two worked sample briefs over real public reviews](https://alfredtech2026.github.io/shopify-app-review-brief/#samples)
424
+
425
+ Upstream source repository: [alfredtech2026/shopify-app-review-brief](https://github.com/alfredtech2026/shopify-app-review-brief) (MIT).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: unified-ai-gateway
3
- description: Operate and evaluate Unified AI System through eight governed MCP tools while preserving fake-provider, authorization, and evidence boundaries.
3
+ description: Operate and evaluate Unified AI System through nine governed MCP tools, including provider-free prompt enhancement, while preserving fake-provider, authorization, and evidence boundaries.
4
4
  category: ai-ml
5
5
  risk: critical
6
6
  source: https://github.com/happy520ai/unified-ai-system/tree/master/skills/unified-ai-gateway
@@ -27,20 +27,21 @@ installations require the manual setup below.
27
27
  ## Prerequisites And Setup
28
28
 
29
29
  1. Confirm that Codex CLI and Docker are installed and Docker is running.
30
- 2. If the eight tools are already visible, skip setup and do not register a
30
+ 2. If the nine tools are already visible, skip setup and do not register a
31
31
  duplicate server.
32
- 3. Explain the first stage: it downloads the reviewed immutable linux/amd64
33
- image into Docker's cache, inspects its metadata and layer history, creates
34
- but never starts a temporary container, exports its root filesystem, removes
35
- that temporary container, and writes an inspection inventory to a temporary
36
- directory. Obtain explicit user approval for those download and inspection
37
- changes only.
32
+ 3. Explain the first stage: it downloads one reviewed platform from the
33
+ immutable `0.4.0` multi-platform index into Docker's cache, inspects its
34
+ metadata and layer history, creates but never starts a temporary container,
35
+ exports its root filesystem, removes that temporary container, and writes an
36
+ inspection inventory to a temporary directory. The reviewed platforms are
37
+ linux/amd64 and linux/arm64. Obtain explicit user approval for those download
38
+ and inspection changes only.
38
39
  4. After that first approval, pull the reviewed platform manifest and complete
39
40
  the inspection. Do not execute the image or register it yet:
40
41
 
41
42
  ```bash
42
- IMAGE='ghcr.io/happy520ai/unified-ai-system/mcp-server@sha256:cc17e923335f953631f59fb6a5ffcdce0e12e16c5abf362f1d28747452adadee'
43
- PLATFORM='linux/amd64'
43
+ IMAGE='ghcr.io/happy520ai/unified-ai-system/mcp-server@sha256:c185d124d1f672b5cf210a7b7d4c7dbdc907b81a5f7b62fe312a0dc18839e045'
44
+ PLATFORM='linux/amd64' # Use linux/arm64 only on a reviewed ARM64 engine.
44
45
  REVIEW_DIR="$(mktemp -d)"
45
46
 
46
47
  docker pull --platform "$PLATFORM" "$IMAGE"
@@ -55,13 +56,26 @@ tar -tf "$REVIEW_DIR/rootfs.tar" > "$REVIEW_DIR/rootfs-files.txt"
55
56
  mkdir -p "$REVIEW_DIR/rootfs"
56
57
  tar --same-permissions -xf "$REVIEW_DIR/rootfs.tar" -C "$REVIEW_DIR/rootfs"
57
58
  find "$REVIEW_DIR/rootfs/app" -type f -print > "$REVIEW_DIR/app-files.txt"
58
- find "$REVIEW_DIR/rootfs/app" \( -type l -o -type f -links +1 \) -exec ls -ld {} + > "$REVIEW_DIR/app-links.txt"
59
- find "$REVIEW_DIR/rootfs/app" -type f -name '*.node' -exec sha256sum {} + > "$REVIEW_DIR/native-binaries.sha256"
59
+ : > "$REVIEW_DIR/app-links.txt"
60
+ while IFS= read -r -d '' APP_LINK; do
61
+ ls -ld -- "$APP_LINK" >> "$REVIEW_DIR/app-links.txt"
62
+ done < <(find "$REVIEW_DIR/rootfs/app" \( -type l -o -type f -links +1 \) -print0)
63
+ : > "$REVIEW_DIR/native-binaries.sha256"
64
+ while IFS= read -r -d '' NATIVE_BINARY; do
65
+ sha256sum -- "$NATIVE_BINARY" >> "$REVIEW_DIR/native-binaries.sha256"
66
+ done < <(find "$REVIEW_DIR/rootfs/app" -type f -name '*.node' -print0)
60
67
  find "$REVIEW_DIR/rootfs" -type f \( -perm -0100 -o -perm -0010 -o -perm -0001 \) -print > "$REVIEW_DIR/executable-files.txt"
61
68
  find "$REVIEW_DIR/rootfs" -type f \( -perm -4000 -o -perm -2000 \) -print > "$REVIEW_DIR/suid-sgid-files.txt"
62
- find "$REVIEW_DIR/rootfs/app" -type f \( -name '.env' -o -name '.env.*' -o -name '*.pem' -o -name '*.key' -o -name '*.p12' -o -name '*.pfx' -o -name 'id_rsa*' \) -print > "$REVIEW_DIR/credential-like-files.txt"
63
- find "$REVIEW_DIR/rootfs/app" -type f -name package.json -exec grep -nHE '"(preinstall|install|postinstall|prepare|prepack|postpack)"' {} + > "$REVIEW_DIR/lifecycle-hooks.txt"
64
- grep -RInE 'child_process|spawn\(|fetch\(|AI_GATEWAY_MCP_URL|process\.env|writeFile|appendFile|unlink|rm\(' "$REVIEW_DIR/rootfs/app/packages/mcp-server/src" "$REVIEW_DIR/rootfs/app/packages/shared-sdk/src" > "$REVIEW_DIR/runtime-sensitive-code.txt"
69
+ find "$REVIEW_DIR/rootfs/app" -type f \( -name '.env' -o -name '.env.*' -o -name '*.pem' -o -name '*.key' -o -name '*.p12' -o -name '*.pfx' -o -path '*/.ssh/id_*' \) -print > "$REVIEW_DIR/credential-like-files.txt"
70
+ find "$REVIEW_DIR/rootfs/app" -type f -name 'package.json' \
71
+ -exec grep -nHE '"(preinstall|install|postinstall|prepare|prepack|postpack)"' -- {} + \
72
+ > "$REVIEW_DIR/lifecycle-hooks.txt"
73
+ find \
74
+ "$REVIEW_DIR/rootfs/app/packages/mcp-server/src" \
75
+ "$REVIEW_DIR/rootfs/app/packages/shared-sdk/src" \
76
+ -type f \
77
+ -exec grep -nHE 'child_process|spawn\(|fetch\(|AI_GATEWAY_MCP_URL|process\.env|writeFile|appendFile|unlink|rm\(' -- {} + \
78
+ > "$REVIEW_DIR/runtime-sensitive-code.txt"
65
79
  ```
66
80
 
67
81
  If `sha256sum` is unavailable, use the platform's SHA-256 utility and preserve
@@ -70,19 +84,25 @@ deletion is another filesystem change and requires approval for the exact path.
70
84
 
71
85
  5. Read every generated inventory and report the inspection before proceeding.
72
86
  Compare it with the versioned
73
- [image content review](https://github.com/happy520ai/unified-ai-system/blob/2967617bb266c79992a6ed40e70bb59e67f661ca/docs/security/mcp-image-review-0.3.2.md).
74
- Require linux/amd64 manifest digest
75
- `sha256:cc17e923335f953631f59fb6a5ffcdce0e12e16c5abf362f1d28747452adadee`,
76
- config digest
77
- `sha256:c28166511ca9d95ab6f4c0c8ac0cbc2acbbfdac20f971d074ff6744d39e0248f`,
78
- source `https://github.com/happy520ai/unified-ai-system`, revision
79
- `541430d68fac6b35c512ea7d2df20fe45334e0a5`, version `0.3.2`, license
87
+ [image content review](https://github.com/happy520ai/unified-ai-system/blob/4bbc5e81d1f372a5c80ba5597973f3284965adf6/docs/security/mcp-image-review-0.4.0.md).
88
+ Require OCI index digest
89
+ `sha256:c185d124d1f672b5cf210a7b7d4c7dbdc907b81a5f7b62fe312a0dc18839e045`.
90
+ For linux/amd64, require manifest digest
91
+ `sha256:bb3ba00366a924d511c776986f890d62196ecc380034daf9c42f54000dcc7f2d`
92
+ and config digest
93
+ `sha256:3224ec32c8a1407ba704febf897157866f6cabf86fb515d760b0466fe64c9df1`.
94
+ For linux/arm64, require manifest digest
95
+ `sha256:2a58da07d11de97a4b4051f4a82ac444e7fefb5235556d7997080c96db2da6ae`
96
+ and config digest
97
+ `sha256:1e480c2b6711283f9571079d96c73f5dfc423a30d86c22d05c0dfd052113a9b7`.
98
+ Require source `https://github.com/happy520ai/unified-ai-system`, revision
99
+ `9f606b0b4189ef9759bdc01857919c254209e4be`, version `0.4.0`, license
80
100
  `Apache-2.0`, entrypoint `docker-entrypoint.sh`, and command
81
101
  `node packages/mcp-server/src/index.js`.
82
102
 
83
103
  Report these reviewed risks explicitly: the image uses the default root
84
104
  user; includes Debian shell/package utilities and 11 base-image SUID/SGID
85
- files; contains 549 internal pnpm links, two native Node binaries, and eight
105
+ files; contains 519 internal pnpm links, two native Node binaries, and eight
86
106
  lifecycle-hook declarations; and starts a child gateway with loopback HTTP.
87
107
  The optional `AI_GATEWAY_MCP_URL` can make an HTTP or HTTPS connection only
88
108
  when explicitly passed. The registered command below passes no host files,
@@ -98,12 +118,14 @@ deletion is another filesystem change and requires approval for the exact path.
98
118
  disabled, then inspect the stored configuration:
99
119
 
100
120
  ```bash
101
- codex mcp add unified-ai-system -- docker run --rm -i --pull never --platform linux/amd64 --network none --cap-drop ALL --security-opt no-new-privileges ghcr.io/happy520ai/unified-ai-system/mcp-server@sha256:cc17e923335f953631f59fb6a5ffcdce0e12e16c5abf362f1d28747452adadee
121
+ IMAGE='ghcr.io/happy520ai/unified-ai-system/mcp-server@sha256:c185d124d1f672b5cf210a7b7d4c7dbdc907b81a5f7b62fe312a0dc18839e045'
122
+ PLATFORM='linux/amd64' # Match the reviewed platform inspected above.
123
+ codex mcp add unified-ai-system -- docker run --rm -i --pull never --platform "$PLATFORM" --network none --cap-drop ALL --security-opt no-new-privileges "$IMAGE"
102
124
  codex mcp get unified-ai-system --json
103
125
  ```
104
126
 
105
127
  8. Restart Codex or open a new task, then use `/mcp verbose` to confirm that all
106
- eight tools are available. Remove the registration when it is no longer
128
+ nine tools are available. Remove the registration when it is no longer
107
129
  wanted:
108
130
 
109
131
  ```bash
@@ -141,6 +163,7 @@ deploying a production gateway.
141
163
 
142
164
  - `gateway_health`: managed gateway status and provider mode
143
165
  - `gateway_readiness`: chat-path readiness and blockers
166
+ - `gateway_prompt_enhance`: local prompt structuring without a provider call
144
167
  - `gateway_chat`: deterministic credential-free chat proof
145
168
  - `knowledge_readiness`: knowledge subsystem readiness
146
169
  - `workflow_health`: workflow subsystem status
@@ -167,8 +190,8 @@ Agent:
167
190
  - Do not enable or call a real provider without explicit scoped authorization.
168
191
  - Treat MCP registration, image pulls, container creation, networking, and
169
192
  teardown as host-state changes that require informed user approval.
170
- - Never substitute a mutable tag, the multi-platform index, or an unreviewed
171
- platform manifest for the reviewed linux/amd64 digest. Keep download and
193
+ - Never substitute a mutable tag, a different OCI index, or an unreviewed
194
+ platform manifest for the reviewed `0.4.0` identities. Keep download and
172
195
  inspection approval separate from registration and activation approval.
173
196
  - Keep `--pull never` in the registered command. If the reviewed image is
174
197
  absent from the local cache, fail closed and return to the first approval
@@ -188,8 +211,8 @@ Agent:
188
211
  - The credential-free chat tool proves only the deterministic local fake path.
189
212
  - It does not configure real providers or handle provider credentials.
190
213
  - The published MCP image requires Docker.
191
- - The reviewed `0.3.2` path is limited to linux/amd64. Do not activate an arm64
192
- or other platform image without a separate content review.
214
+ - The reviewed `0.4.0` path covers linux/amd64 and linux/arm64. Do not activate
215
+ another platform image without a separate content review.
193
216
  - The image runs as the container's default root user and bundles the gateway
194
217
  source, package-manager tooling, native dependencies, and base-image
195
218
  SUID/SGID files. The registered command drops capabilities, prevents new
@@ -211,4 +234,4 @@ Agent:
211
234
  - [Unified AI System](https://github.com/happy520ai/unified-ai-system)
212
235
  - [60-second Codex MCP quickstart](https://github.com/happy520ai/unified-ai-system/blob/master/docs/codex-mcp-quickstart.md)
213
236
  - [MCP server guide](https://github.com/happy520ai/unified-ai-system/blob/master/packages/mcp-server/README.md)
214
- - [MCP image content review](https://github.com/happy520ai/unified-ai-system/blob/2967617bb266c79992a6ed40e70bb59e67f661ca/docs/security/mcp-image-review-0.3.2.md)
237
+ - [MCP image content review](https://github.com/happy520ai/unified-ai-system/blob/4bbc5e81d1f372a5c80ba5597973f3284965adf6/docs/security/mcp-image-review-0.4.0.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-skills-collection",
3
- "version": "4.0.21",
3
+ "version": "4.0.22",
4
4
  "description": "OpenCode CLI plugin that automatically downloads and keeps skills up to date.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",