@ssheleg/sheleg-dev 0.12.0 → 0.13.1
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 +52 -0
- package/package.json +1 -1
- package/plugins/sheleg-dev/.claude-plugin/plugin.json +1 -1
- package/plugins/sheleg-dev/skills/ad-tracking/SKILL.md +11 -0
- package/plugins/sheleg-dev/skills/crypto-payments/SKILL.md +15 -0
- package/plugins/sheleg-dev/skills/frontend-performance/SKILL.md +11 -0
- package/plugins/sheleg-dev/skills/google-auth/SKILL.md +9 -0
- package/plugins/sheleg-dev/skills/google-signin/SKILL.md +9 -0
- package/plugins/sheleg-dev/skills/stripe-billing/SKILL.md +29 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,55 @@
|
|
|
1
|
+
## v0.13.1 — a payment bug reaches the billing skill
|
|
2
|
+
|
|
3
|
+
The 2026-10-08 family routing audit found that a request opening with the symptom rather
|
|
4
|
+
than the vendor — «баг в оплате», "payment bug", or plain «оплата» — loaded no skill.
|
|
5
|
+
`stripe-billing` was written for someone who already knew the word Stripe: its
|
|
6
|
+
description led with "connecting a product to Stripe" and its only payment phrase was
|
|
7
|
+
«оплата подпиской».
|
|
8
|
+
|
|
9
|
+
- **`stripe-billing` now names "payment bug", «баг в оплате» and «оплата» in its first
|
|
10
|
+
sentence**, ahead of the point where harness listings truncate a description. Room
|
|
11
|
+
was made by tightening wording, not by dropping a trigger: every routed trigger the
|
|
12
|
+
umbrella's table holds for this skill is still advertised. 959 → 965 characters,
|
|
13
|
+
inside the 970 working limit.
|
|
14
|
+
- **The trigger corpus gains `q15` and `q16`** («баг в оплате: после оплаты подписка не
|
|
15
|
+
активируется», "Payment bug: customers are charged twice for one Stripe checkout"),
|
|
16
|
+
one per split. They are data for the next measured run, not a result.
|
|
17
|
+
|
|
18
|
+
Bare «оплата» is broad, and the near-miss negatives already in the corpus (`q09` «нарисуй
|
|
19
|
+
экран оплаты», `q11` Telegram Stars) are the cases a measured run should watch: the
|
|
20
|
+
first is the visual layer's, the second telegram-dev's.
|
|
21
|
+
|
|
22
|
+
## v0.13.0 — the gate exists on one surface, and every skill now says so
|
|
23
|
+
|
|
24
|
+
This pack ships a `PreToolUse` money gate (`hooks/money-gate.js`) that refuses a refund,
|
|
25
|
+
a payout, a dispute close, a live `sk_live_…` key and `SKIP_BILLING=true` in production
|
|
26
|
+
until the authorised person has signed that category off. It runs on Claude Code and
|
|
27
|
+
nowhere else. Measured 2026-09-14: of the seven skills, **one** (`error-tracking`) wrote
|
|
28
|
+
a degradation contract; `stripe-billing` never mentioned the gate at all and
|
|
29
|
+
`crypto-payments` named it and sent the consequences to the README — so the two skills
|
|
30
|
+
the gate exists FOR were the two that did not say what happens without it.
|
|
31
|
+
|
|
32
|
+
- **`## Degradation` in all seven skill bodies**, one line per axis, in the shape
|
|
33
|
+
`references/host-capabilities.md` requires: not-Claude-Code, installed-by-copy, and the
|
|
34
|
+
capability each skill's own work needs (Stripe CLI, node fixtures, a browser channel, a
|
|
35
|
+
console login).
|
|
36
|
+
- **`check_degradation_is_written_where_a_host_capability_ships`** — a pack that ships
|
|
37
|
+
`hooks/hooks.json` requires the section in every skill body. Watched failing on four
|
|
38
|
+
skills before they were written.
|
|
39
|
+
- **The body budget is MEASURED, not estimated.** This gate divided by 3.9 chars/token
|
|
40
|
+
while the family's CI auditor measures with tiktoken, and the two disagree by up to 8%
|
|
41
|
+
in the same direction: `crypto-payments` estimated **4986** and measured **4618** — a
|
|
42
|
+
verdict of *past the working limit* over 132 tokens of real headroom, which is what
|
|
43
|
+
blocked this change from landing. With no tokenizer installed the check now DISCLOSES
|
|
44
|
+
that it could not measure instead of failing a file it never counted. make-skill
|
|
45
|
+
v0.28.0 closed exactly this for the family auditor; this repo kept the estimate and so
|
|
46
|
+
kept the defect.
|
|
47
|
+
- **The `биллинг` trigger is now `биллинг подписок`.** Bare `биллинг` collided with
|
|
48
|
+
`agent-orchestrator`'s `биллинг LLM` across packs, where no per-repo validator can see
|
|
49
|
+
it: this one meters what an agent burned, that one charges a card.
|
|
50
|
+
- `docs/evals/stripe-billing.md` restates a measured figure (4521 tokens, tiktoken)
|
|
51
|
+
rather than a heuristic one, and the validator compares it to a measurement.
|
|
52
|
+
|
|
1
53
|
## v0.12.0 — the integration doctrine closes its audit, and a crypto reference gains its map
|
|
2
54
|
|
|
3
55
|
Sherlock external-v3 (43 findings) — the largest share in the family — each with
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ssheleg/sheleg-dev",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.1",
|
|
4
4
|
"description": "Seven integration skills for the layer a product reaches once it has users: Stripe subscription billing and cancellation retention, crypto payments, ad and conversion tracking under Consent Mode v2, Google sign-in and the wider Google auth surface, error tracking, and Core Web Vitals. This package is the installer CLI.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"sheleg-dev": "bin/sheleg-dev.js"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "sheleg-dev",
|
|
4
4
|
"displayName": "Sheleg Dev",
|
|
5
5
|
"description": "The integration layer a product needs once it has users: Stripe subscription billing reconciled into your own database, crypto payments that survive over-payment and duplicate webhooks, ad and conversion tracking under Consent Mode v2, Google sign-in with the account-linking guards, the wider Google auth surface, and Core Web Vitals work that moves the score, and Sentry error tracking wired so it does not forward your own credentials to a third party and so a stack trace names the commit that caused it.",
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.13.1",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "ssheleg",
|
|
9
9
|
"url": "https://x.com/sshlg93"
|
|
@@ -414,3 +414,14 @@ when** line, so the trigger has one home and this table stays an index.
|
|
|
414
414
|
|
|
415
415
|
For the page-speed side of the same problem — what the tag does to LCP and TBT,
|
|
416
416
|
and what to do about it — see the `frontend-performance` skill in this pack.
|
|
417
|
+
|
|
418
|
+
## Degradation
|
|
419
|
+
|
|
420
|
+
- **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the pack's
|
|
421
|
+
`PreToolUse` gate does not run. It is the thing that refuses a live key or an
|
|
422
|
+
irreversible action in this pack; elsewhere those rules are advice you follow by hand.
|
|
423
|
+
- **Installed by copy rather than as a plugin**: the doctrine arrives, `hooks/` does not
|
|
424
|
+
— same loss, same remedy.
|
|
425
|
+
- **No network, or the ad platform's API unreachable**: server-side events cannot be
|
|
426
|
+
verified end to end. Say the dedup check did not run rather than reporting it held;
|
|
427
|
+
a browser pixel firing proves the browser, never the conversion.
|
|
@@ -399,3 +399,18 @@ a green suite, each with the defect it catches:
|
|
|
399
399
|
| Cannot answer "how much did we net" | commission and `merchantAmount` never stored |
|
|
400
400
|
| A dev machine, a CI job or an agent run is holding the production key | no separate credential, and no assertion binding the key to a declared environment |
|
|
401
401
|
| Real invoices in a merchant dashboard nobody watches | a staging credential declared live — the mismatch nothing refused |
|
|
402
|
+
|
|
403
|
+
## Degradation
|
|
404
|
+
|
|
405
|
+
- **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the
|
|
406
|
+
`PreToolUse` gate named above — `plugins/sheleg-dev/hooks/money-gate.js` — does not
|
|
407
|
+
run there. Nothing refuses a payout, a refund, an exported `HELEKET_API_KEY` in a
|
|
408
|
+
`test` run, or `SKIP_BILLING=true` in production. The three lines are advice again,
|
|
409
|
+
which is exactly the state that made them ineffective for four releases: name the
|
|
410
|
+
surface you are on, and make the authorisation a human step out loud.
|
|
411
|
+
- **Installed by copy rather than as a plugin**: the doctrine arrives, the hook does
|
|
412
|
+
not. The README carries the categories and how one is authorised for a session.
|
|
413
|
+
- **No node, or the fixtures cannot run**: the invariant fixtures are the executable
|
|
414
|
+
half of this skill. Say the check did not run rather than reporting the invariant as
|
|
415
|
+
held — an unrun check and a passing one are indistinguishable from the exit code
|
|
416
|
+
nobody looked at.
|
|
@@ -192,3 +192,14 @@ Four names that used to sit here — `frontend-design`, `landing-page-design`,
|
|
|
192
192
|
`next-best-practices`, `responsive-design` — resolved to nothing installable, and
|
|
193
193
|
`seo-audit` was one character-class away from the real `seo-aeo-audit`, which is
|
|
194
194
|
how a typo survives review.
|
|
195
|
+
|
|
196
|
+
## Degradation
|
|
197
|
+
|
|
198
|
+
- **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the pack's
|
|
199
|
+
`PreToolUse` gate does not run — every rule here still applies, enforced by a person
|
|
200
|
+
instead of a hook.
|
|
201
|
+
- **No browser channel** (no Chrome DevTools MCP, no Playwright): a page is judged from
|
|
202
|
+
the diff and the numbers are not measured on this machine. Record the weaker claim;
|
|
203
|
+
a Lighthouse score nobody ran is not a score.
|
|
204
|
+
- **No network**: PageSpeed Insights and field data are unavailable. Lab reasoning is
|
|
205
|
+
still worth doing — say which half you did.
|
|
@@ -279,3 +279,12 @@ if credentials.expired and credentials.refresh_token:
|
|
|
279
279
|
- **[ADC & Service Accounts](references/adc-and-service-accounts.md)** — Application Default Credentials setup, service account keys, JWT, Compute credentials, environment configuration (Node.js + Python)
|
|
280
280
|
- **[Sign In with Google](references/sign-in-with-google.md)** — Google Identity Services (GIS), ID token verification, CSRF protection, One Tap, FedCM (Node.js + Python)
|
|
281
281
|
- **[Workload Identity Federation](references/workload-identity.md)** — AWS, Azure, OIDC/SAML federation, workforce identity, executable-sourced credentials (Node.js + Python)
|
|
282
|
+
|
|
283
|
+
## Degradation
|
|
284
|
+
|
|
285
|
+
- **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the pack's
|
|
286
|
+
`PreToolUse` gate does not run; a live credential is refused by nothing but you.
|
|
287
|
+
- **Installed by copy rather than as a plugin**: doctrine yes, `hooks/` no.
|
|
288
|
+
- **No browser, or no console access**: the consent screen and the client-id half are a
|
|
289
|
+
human step. Name the exact screen and what is blocked, do the code half, and do not
|
|
290
|
+
loop on a login only a person can complete.
|
|
@@ -151,3 +151,12 @@ attacker's account.
|
|
|
151
151
|
| `access_denied` on consent | Consent screen still in Testing → publish the app |
|
|
152
152
|
| Works locally, breaks in prod | Prod origin missing in GCP, or `Secure` cookie served over plain HTTP |
|
|
153
153
|
| One Tap missing / FedCM console warnings | FedCM is mandatory since Aug 2025 and the opt-out is gone (checked 2026-08-06). Load `gsi/client` from Google and keep it current — a vendored or pinned copy is the real break. The rendered button flow is unaffected; code branching on the old `isNotDisplayed()` moment callbacks is not |
|
|
154
|
+
|
|
155
|
+
## Degradation
|
|
156
|
+
|
|
157
|
+
- **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the pack's
|
|
158
|
+
`PreToolUse` gate does not run — the rules here hold, the refusal does not.
|
|
159
|
+
- **No browser channel**: the sign-in button and its redirect are verified by reading
|
|
160
|
+
the code, not by watching it work. Record that as the weaker claim it is.
|
|
161
|
+
- **No console access**: creating the OAuth client is a human step; state it once, do
|
|
162
|
+
the rest, and say what is waiting on it.
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: stripe-billing
|
|
3
3
|
description: >-
|
|
4
|
-
Use when connecting a product to Stripe,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
agent toolchain, the pinned API version
|
|
9
|
-
|
|
4
|
+
Use when connecting a product to Stripe, fixing a payment bug
|
|
5
|
+
("баг в оплате", "оплата"), or auditing a live integration: checkout,
|
|
6
|
+
renewals, seats, proration, refunds, cancellation and the cancel-step
|
|
7
|
+
coupon, the portal, and the webhook that turns a payment into an
|
|
8
|
+
entitlement. Covers Stripe's agent toolchain, the pinned API version, SDK
|
|
9
|
+
retries, price resolution, claim-first webhook idempotency, what
|
|
10
10
|
billing_reason decides, cumulative refunds, the cancellation field
|
|
11
|
-
flexible billing_mode moved, retention eligibility Stripe cannot
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"invoice.paid", "proration", "refund", "cancel subscription",
|
|
15
|
-
coupon", "подключить Stripe", "оплата подпиской",
|
|
16
|
-
"скидка при отмене", "биллинг". Not for choosing
|
|
17
|
-
(stripe-best-practices) or reading Stripe docs
|
|
11
|
+
flexible billing_mode moved, retention eligibility Stripe cannot express,
|
|
12
|
+
and write ordering with compensating reverts. Triggers - "add Stripe",
|
|
13
|
+
"Stripe checkout", "subscription billing", "webhook signature",
|
|
14
|
+
"invoice.paid", "proration", "refund", "cancel subscription",
|
|
15
|
+
"retention coupon", "подключить Stripe", "оплата подпиской",
|
|
16
|
+
"вебхук Stripe", "скидка при отмене", "биллинг подписок". Not for choosing
|
|
17
|
+
between Stripe products (stripe-best-practices) or reading Stripe docs
|
|
18
|
+
(stripe-docs).
|
|
18
19
|
license: MIT
|
|
19
20
|
---
|
|
20
21
|
|
|
@@ -379,6 +380,21 @@ renewal and proration. The one thing to know before you get there: the signing
|
|
|
379
380
|
secret `stripe listen` prints is **not** the dashboard's, and using the wrong one
|
|
380
381
|
fails verification in a way that reads like a key problem.
|
|
381
382
|
|
|
383
|
+
## Degradation
|
|
384
|
+
|
|
385
|
+
- **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the
|
|
386
|
+
`PreToolUse` money gate this pack ships does not exist there — nothing refuses a
|
|
387
|
+
refund, a payout, a dispute close or a live `sk_live_…` key on your behalf. Every
|
|
388
|
+
rule below still holds; it is advice again rather than a precondition, so the
|
|
389
|
+
authorisation step becomes a human one. Say which you are on before acting on money.
|
|
390
|
+
- **Installed by copy rather than as a plugin**: same loss, same remedy — a plain
|
|
391
|
+
`~/.claude/skills/` copy carries the doctrine and not `hooks/money-gate.js`. The
|
|
392
|
+
README names the categories and how one is signed off; without the hook, that
|
|
393
|
+
sign-off is a sentence somebody has to actually say.
|
|
394
|
+
- **No Stripe CLI, no network, or test keys only**: webhook signature verification and
|
|
395
|
+
the local replay loop are the parts that need the binary. State which is missing
|
|
396
|
+
once, do the rest, and record what could not be verified rather than implying it was.
|
|
397
|
+
|
|
382
398
|
## Before you ship
|
|
383
399
|
|
|
384
400
|
Not a second checklist — every rule below already has a section above, and a rule
|