skilldrop-cli 1.1.0 → 1.1.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.
Files changed (50) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/packs/ai-engineering/skills/judge-audit/SKILL.md +24 -6
  4. package/packs/ai-engineering/skills/judge-audit/evals/evals.json +29 -0
  5. package/packs/ai-engineering/skills/judge-audit/evals/files/10/judge_eval.csv +61 -0
  6. package/packs/ai-engineering/skills/judge-audit/evals/files/11/mod_sample_scored.csv +201 -0
  7. package/packs/ai-engineering/skills/judge-audit/manifest.json +1 -1
  8. package/packs/converters/skills/md-to-pptx/SKILL.md +25 -8
  9. package/packs/converters/skills/md-to-pptx/evals/evals.json +30 -0
  10. package/packs/converters/skills/md-to-pptx/evals/files/6/q3-status-report.md +72 -0
  11. package/packs/converters/skills/md-to-pptx/evals/files/7/runbooks/db-failover.md +59 -0
  12. package/packs/converters/skills/md-to-pptx/evals/files/7/runbooks/diagrams/topology.png +0 -0
  13. package/packs/converters/skills/md-to-pptx/manifest.json +1 -1
  14. package/packs/converters/skills/md-to-pptx/reference.md +9 -1
  15. package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +35 -2
  16. package/packs/frontend/skills/bundle-size-review/SKILL.md +5 -2
  17. package/packs/frontend/skills/bundle-size-review/evals/evals.json +30 -0
  18. package/packs/frontend/skills/bundle-size-review/evals/files/8/.browserslistrc +6 -0
  19. package/packs/frontend/skills/bundle-size-review/evals/files/8/babel.config.js +6 -0
  20. package/packs/frontend/skills/bundle-size-review/evals/files/8/dist/stats.json +854 -0
  21. package/packs/frontend/skills/bundle-size-review/evals/files/8/package-lock.json.fixture +73 -0
  22. package/packs/frontend/skills/bundle-size-review/evals/files/8/package.json.fixture +28 -0
  23. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/App.jsx +23 -0
  24. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/BookingForm.jsx +18 -0
  25. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/admin/Reports.jsx +17 -0
  26. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/index.jsx +4 -0
  27. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/landing/Hero.jsx +17 -0
  28. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/landing/index.jsx +4 -0
  29. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/polyfills.js +3 -0
  30. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/utils/format.js +4 -0
  31. package/packs/frontend/skills/bundle-size-review/evals/files/8/webpack.config.js +35 -0
  32. package/packs/frontend/skills/bundle-size-review/evals/files/9/.github/workflows/size.yml.fixture +12 -0
  33. package/packs/frontend/skills/bundle-size-review/evals/files/9/build.mjs +17 -0
  34. package/packs/frontend/skills/bundle-size-review/evals/files/9/meta.main.json +100 -0
  35. package/packs/frontend/skills/bundle-size-review/evals/files/9/meta.pr412.json +196 -0
  36. package/packs/frontend/skills/bundle-size-review/evals/files/9/package.json.fixture +17 -0
  37. package/packs/frontend/skills/bundle-size-review/evals/files/9/scripts/check-size.mjs +11 -0
  38. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/api.ts +11 -0
  39. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/composer.tsx +21 -0
  40. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/emoji/data.ts +8 -0
  41. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/emoji/picker.tsx +22 -0
  42. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/styles.ts +11 -0
  43. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/widget.ts +15 -0
  44. package/packs/frontend/skills/bundle-size-review/manifest.json +1 -1
  45. package/packs/solution-architect/skills/event-contract-draft/SKILL.md +36 -8
  46. package/packs/solution-architect/skills/event-contract-draft/evals/evals.json +30 -0
  47. package/packs/solution-architect/skills/event-contract-draft/evals/files/6/infra/topics.yaml +10 -0
  48. package/packs/solution-architect/skills/event-contract-draft/evals/files/6/src/checkout/order_events.py +57 -0
  49. package/packs/solution-architect/skills/event-contract-draft/evals/files/7/docs/webhooks.yaml +40 -0
  50. package/packs/solution-architect/skills/event-contract-draft/manifest.json +1 -1
@@ -0,0 +1,11 @@
1
+ const CSS = `
2
+ #parcelpost-chat { position: fixed; right: 24px; bottom: 24px; font: 14px/1.4 system-ui, sans-serif; }
3
+ #parcelpost-chat form { display: flex; gap: 8px; background: #fff; border-radius: 12px; padding: 12px; box-shadow: 0 4px 24px rgba(0,0,0,.15); }
4
+ #parcelpost-chat textarea { flex: 1; min-height: 40px; resize: none; border: 1px solid #d0d4dc; border-radius: 8px; padding: 8px; }
5
+ `;
6
+
7
+ export function injectStyles(root: HTMLElement) {
8
+ const style = document.createElement('style');
9
+ style.textContent = CSS;
10
+ root.appendChild(style);
11
+ }
@@ -0,0 +1,15 @@
1
+ import { render, h } from 'preact';
2
+ import { Composer } from './composer';
3
+ import { injectStyles } from './styles';
4
+
5
+ const root = document.createElement('div');
6
+ root.id = 'parcelpost-chat';
7
+ document.body.appendChild(root);
8
+ injectStyles(root);
9
+
10
+ async function openPicker(onPick: (char: string) => void) {
11
+ const { default: mountPicker } = await import('./emoji/picker');
12
+ mountPicker(root, onPick);
13
+ }
14
+
15
+ render(h(Composer, { openPicker }), root);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bundle-size-review",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "Find what makes a JavaScript bundle heavy and what can safely come out, from the bundler's stats file (webpack stats.json, an esbuild metafile, or the rollup-plugin-visualizer raw-data JSON that Vite builds use) read together with the repo around it (package.json, .browserslistrc, the lockfile, the bundler config and the source files that import the heavy modules). Gives each entry's first-load JavaScript in the exact bytes the stats record, kept apart from lazy chunks; finds whole-library imports, CommonJS packages that can't be tree-shaken, packages bundled twice and polyfills the browser targets don't need; names the import chain that pulls each module in before suggesting a removal; and, given before and after stats, says what grew, why, whether it lands in the first load and which per-entry budget would have caught it. Use when the user says \"why is our bundle so big\", \"what can we cut from the bundle\", \"review this stats.json\", \"why is lodash or moment in our bundle\", \"the bundle grew in this PR\", or \"set a bundle size budget\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -24,7 +24,16 @@ APIs are `api-contract-draft`; a dataset's schema and quality SLAs for analytics
24
24
  by paymentId?") gets a direct answer in a few lines: yes or no, why, the fix. No AsyncAPI
25
25
  document. A request to define events gets the full contract (step 11).
26
26
 
27
- 2. **List the facts, the producer and the consumers.** For each consumer, write what it does
27
+ 2. **When the user brings a draft, keep it theirs.** Their payload, event names or spec are the
28
+ starting point, not a sketch to redo. Keep their names, fields and shapes. Change one only
29
+ when it breaks a rule below: a float for money, personal data no consumer uses, a card
30
+ number, a command for a name, no event id. List each change: *"`price` (float) →
31
+ `priceMinor` + `currency`: floats lose pennies when summed"*. Anything you'd change that
32
+ breaks no rule goes under "Also worth considering", unapplied. ❌ Renaming their
33
+ events, dropping their fields and reshaping the payload, then answering their question
34
+ underneath.
35
+
36
+ **Then list the facts, the producer and the consumers.** For each consumer, write what it does
28
37
  with each event; that line decides payload size and justifies every field. Ask at most 2
29
38
  questions, spent on who consumes and what they do with it, and which broker. Missing broker
30
39
  → write broker-neutral with a Kafka binding, tagged `[assumption]`.
@@ -106,16 +115,30 @@ APIs are `api-contract-draft`; a dataset's schema and quality SLAs for analytics
106
115
  It checks AsyncAPI 3.x structure, `$ref`s, past-tense names, the envelope in every message,
107
116
  one type per schema, unmarked personal data, closed schemas, deprecation dates, and each
108
117
  channel's key, ordering, delivery, retention, replay and DLQ notes. When it can't run, say
109
- the document is unchecked. Never claim a check that didn't run.
118
+ the document is unchecked. Never claim a check that didn't run. Report it as what it
119
+ checked and what it found: ✅ *"Checked against AsyncAPI 3.0 structure and the rules
120
+ above (envelope, past-tense names, PII marks, per-channel key, retention and DLQ): no
121
+ failures."* ❌ *"Passes the structural check."*
110
122
 
111
123
  11. **Reply in this order:**
112
- 1. **What the contract decides**, 3–6 lines, leading with every pushback from steps 3–9.
113
- 2. **Decisions**: a table of decision, choice, why (shape in [`reference.md`](reference.md)).
114
- 3. **What consumers must do**: numbered, at most 6: dedupe, ignore unknown fields, revision
124
+ 1. **The answer to each question the user asked**, numbered in their order, in plain
125
+ words, one to three lines each: ✅ *"Versioning: add fields freely; a rename or type
126
+ change ships as `booking.confirmed.v2` beside v1 until a date agreed with
127
+ consumers."* A question the contract answers still gets its own line here, not left
128
+ for the reader to find in the spec.
129
+ 2. **What the contract decides**, 3–6 lines, leading with every pushback from steps 3–9,
130
+ then each change you made to their draft (step 2).
131
+ 3. **Decisions**: a table of decision, choice, why (shape in [`reference.md`](reference.md)).
132
+ 4. **What consumers must do**: numbered, at most 6: dedupe, ignore unknown fields, revision
115
133
  check, no cross-key order, DLQ duty, the migration they owe and by when.
116
- 4. **The AsyncAPI document**, saved as `asyncapi.json` when files can be written, inline
117
- otherwise; then one line on the check result.
118
- 5. **To confirm**: each open item with who can answer it.
134
+ 5. **The AsyncAPI document**, saved as `asyncapi.json` when files can be written, inline
135
+ otherwise; then one line on the check result. When it's saved, show each event in the
136
+ reply as a short field table (field, type, required, who uses it), not as JSON. Never
137
+ paste part of the document: show all of it, or point to the file.
138
+ 6. **To confirm**: each open item with who can answer it.
139
+
140
+ The reply starts with the answer: no leftover working notes ("This confirms it", "as
141
+ reworked above"), and no reference to anything the reader can't see.
119
142
 
120
143
  **Non-interactive runs** (subagent, CI, headless): a missing broker, retention, consumer
121
144
  detail or sunset date becomes a tagged `[assumption]` or a "To confirm" line, and the contract
@@ -140,6 +163,9 @@ happens in it that others react to`.
140
163
  - **Retention, replay and dead-letter are stated per channel**, with the DLQ owner named or open.
141
164
  - **The check result is reported only if it ran**, and the document has no FAIL.
142
165
  - **Nothing invented**: no team names, dates, volumes or retention the input didn't give, except as `[assumption]`.
166
+ - **Every question asked is answered in its own line first,** before the contract.
167
+ - **The user's draft stays theirs:** each change to their names, fields or shapes is listed with the rule it fixes, and nothing else is changed.
168
+ - **The document is whole:** saved complete, or shown complete, never cut off.
143
169
 
144
170
  ## When to use this skill
145
171
 
@@ -165,3 +191,5 @@ happens in it that others react to`.
165
191
  - ❌ **In-place breaking change** to a live event, "so there's one version to maintain". Fulfilment breaks at deploy.
166
192
  - ❌ **`additionalProperties: false`** on payloads, which turns every additive change into a breaking one.
167
193
  - ❌ **A DLQ nobody owns.** Messages land there and the business notices weeks later.
194
+ - ❌ **Redesigning the user's payload unasked.** Renamed events and dropped fields they didn't ask about make the contract yours, not theirs, and bury the answer they wanted.
195
+ - ❌ **Answering inside the spec.** "See `x-delivery`" isn't an answer to "do we get exactly-once?". Say no, why, and what they get, in the first lines.
@@ -71,6 +71,36 @@
71
71
  "Provides a compact AsyncAPI 3.0 document describing the webhook messages (a common envelope with event id, type and occurrence time, and messages for the paid/overdue/voided cases with past-tense names) plus a short decisions summary, and recommends signing deliveries (e.g. an HMAC signature header with a timestamp) so receivers can verify the sender and reject replays.",
72
72
  "Invents nothing not in the input (no made-up existing Ledgerly endpoints, customer names, SLAs or numbers beyond 10s, 3 retries, ~40s and the example invoice), and keeps the answer sized to a chatty question — direct answers first, then the spec — rather than a sprawling design document."
73
73
  ]
74
+ },
75
+ {
76
+ "id": 6,
77
+ "held_out": "2026-10-22",
78
+ "prompt": "We're pulling order handling out of the Larkspur Goods checkout monolith. Right now the only 'contract' for the `orders` Kafka topic is src/checkout/order_events.py, and the topic config is in infra/topics.yaml. Three teams will consume it: fulfilment (needs every event for a given order in the order it happened), loyalty (counts orders per customer), and analytics (re-loads the last 7 days from the topic every Monday into the warehouse). Please draft a proper AsyncAPI contract for the topic that we can review with those teams, and tell me what has to change on the producer side.",
79
+ "assertions": [
80
+ "Answers the actual request directly: delivers an AsyncAPI 3.0 document (asyncapi: 3.0.x, with channels plus operations using action send/receive, not 2.x publish/subscribe) for the `orders` topic, plus a short list of producer-side changes / decisions rather than a long essay.",
81
+ "Renames the event types create_order, update_order_status and cancel_order to past-tense facts (e.g. OrderPlaced, OrderCancelled) and replaces the generic update_order_status with specific past-tense events for paid/packed/shipped/delivered or an explicitly justified OrderStatusChanged.",
82
+ "Removes card_number and card_expiry from the event payload entirely (not merely tagging them) and marks customer_email, customer_phone and shipping_address as PII, dropping or justifying them per consumer since none of fulfilment, loyalty or analytics obviously needs all of them.",
83
+ "Replaces key=None (round-robin, which gives no ordering at all) with an explicit partition key, choosing order_id (or justifying customer_id), and states that ordering holds only per key within one partition; also flags that raising partitions from 6 to 24 before the November peak remaps keys to partitions and breaks per-order ordering across the change unless handled (e.g. drain first or create a new topic).",
84
+ "Flags that retention.ms 86400000 (1 day) cannot support analytics' 7-day Monday replay and recommends retention of at least 7 days (with margin) or a different replay source.",
85
+ "Defines a required envelope with a unique event id (plus type, occurred-at time, schema version), states delivery is at-least-once, tells consumers to deduplicate on the event id, and notes the producer's acks=1 / enable.idempotence=false setting as at odds with the guarantees (recommend acks=all and idempotence).",
86
+ "Flags that _publish runs before session.commit() so an event can be emitted for an order that then rolls back, and recommends publishing after commit via a transactional outbox (or equivalent).",
87
+ "Invents nothing not in the input: no extra consumer teams, fields, SLAs, throughput figures or tooling are presented as existing facts; any proposed values (retention length, deprecation dates, DLQ topic names) are labelled as proposals for the review."
88
+ ]
89
+ },
90
+ {
91
+ "id": 7,
92
+ "held_out": "2026-10-22",
93
+ "prompt": "partners keep complaining they get invoice_paid twice, and our webhook doc (docs/webhooks.yaml) is a mess. can u redo it as asyncapi 3? also while we're at it change amount to amount_cents as an int, the float thing is embarrassing. want to ship next sprint. oh and Brightwell Payroll says sometimes they get paid before created?? not sure if thats related",
94
+ "assertions": [
95
+ "Answers the actual request directly: returns a rewritten AsyncAPI 3.0 document for the Tallyfern invoice webhooks (operations with action, the 2.6 `subscribe` mapped to Tallyfern sending) plus a brief decisions note sized for a quick review, not a lecture.",
96
+ "Does not rename or retype `amount` in place: calls that a breaking change for existing partners, adds a new integer minor-unit field alongside the deprecated `amount`, and gives a dated deprecation/removal plan rather than shipping the swap next sprint.",
97
+ "Catches that the currency enum includes JPY (zero decimal places), so a field named amount_cents is wrong for it; uses minor units with the currency exponent (e.g. amount_minor) or otherwise defines the scale per currency.",
98
+ "Explains the duplicate invoice_paid deliveries as expected under at-least-once delivery with the 10s timeout and up-to-5 retries, adds a required unique event id that stays the same across retries, and tells partners to deduplicate on it and return 2xx quickly before processing.",
99
+ "Addresses Brightwell Payroll's paid-before-created report as a separate issue from duplicates: states webhooks have no ordering guarantee (retries can reorder them) and gives consumers a way to cope, such as an occurred-at timestamp or per-invoice sequence/version, tolerating unknown invoices, or fetching current invoice state.",
100
+ "Replaces 'after the 5th failure the event is dropped' with keeping failed deliveries (dead-letter) and a way for partners to replay or redeliver them, with any retention window marked as a proposal for the team to decide.",
101
+ "Marks customer.email and customer.tax_id (and name) as PII and minimises the payload, e.g. dropping tax_id or the embedded customer object in favour of an id, and flags that the HMAC signature covers only raw_body with no timestamp, so a captured request can be replayed; recommends signing a timestamp and enforcing a tolerance window.",
102
+ "Invents nothing not in the input: no partner names other than Brightwell Payroll, no endpoints, API routes, fields or existing features beyond those in docs/webhooks.yaml are presented as current fact; new elements are clearly proposed."
103
+ ]
74
104
  }
75
105
  ]
76
106
  }
@@ -0,0 +1,10 @@
1
+ # Kafka topics owned by the checkout team (cluster: larkspur-prod-1)
2
+ topics:
3
+ - name: orders
4
+ partitions: 6
5
+ replication_factor: 3
6
+ config:
7
+ cleanup.policy: delete
8
+ retention.ms: 86400000 # 1 day
9
+ min.insync.replicas: 2
10
+ # Capacity note (Priya, ops): bump partitions to 24 before the November peak.
@@ -0,0 +1,57 @@
1
+ """Order events emitted by the Larkspur Goods checkout service.
2
+
3
+ Today these go onto the `orders` Kafka topic. Nobody wrote down a contract;
4
+ this module *is* the contract right now.
5
+ """
6
+
7
+ import json
8
+ from datetime import datetime, timezone
9
+
10
+ from checkout.db import session
11
+ from checkout.kafka import producer # configured in checkout/kafka.py with acks=1, enable.idempotence=false
12
+
13
+ TOPIC = "orders"
14
+
15
+
16
+ def _publish(event_type: str, order, extra: dict | None = None) -> None:
17
+ body = {
18
+ "event_type": event_type,
19
+ "ts": datetime.now(timezone.utc).isoformat(),
20
+ "order_id": order.id,
21
+ "customer_id": order.customer_id,
22
+ "customer_email": order.customer.email,
23
+ "customer_phone": order.customer.phone,
24
+ "shipping_address": order.shipping_address.as_dict(),
25
+ "card_number": order.payment.card_number,
26
+ "card_expiry": order.payment.card_expiry,
27
+ "total": float(order.total),
28
+ "currency": order.currency,
29
+ "lines": [
30
+ {"sku": line.sku, "qty": line.qty, "unit_price": float(line.unit_price)}
31
+ for line in order.lines
32
+ ],
33
+ "status": order.status,
34
+ }
35
+ if extra:
36
+ body.update(extra)
37
+ # TODO: pick a key. Round-robin for now so partitions stay even.
38
+ producer.send(TOPIC, key=None, value=json.dumps(body).encode())
39
+
40
+
41
+ def create_order(order) -> None:
42
+ session.add(order)
43
+ _publish("create_order", order)
44
+ session.commit()
45
+
46
+
47
+ def update_order_status(order, new_status: str) -> None:
48
+ # new_status is one of: "paid", "packed", "shipped", "delivered"
49
+ order.status = new_status
50
+ _publish("update_order_status", order, {"new_status": new_status})
51
+ session.commit()
52
+
53
+
54
+ def cancel_order(order, reason: str) -> None:
55
+ order.status = "cancelled"
56
+ _publish("cancel_order", order, {"reason": reason})
57
+ session.commit()
@@ -0,0 +1,40 @@
1
+ asyncapi: 2.6.0
2
+ info:
3
+ title: Tallyfern Invoice Webhooks
4
+ version: 0.3.0
5
+ description: |
6
+ Tallyfern POSTs these to the HTTPS endpoint a partner registers in the dashboard.
7
+ Delivery: we wait 10s for a 2xx. On timeout or non-2xx we retry up to 5 times
8
+ (1m, 5m, 15m, 1h, 6h). After the 5th failure the event is dropped.
9
+ Signing: header X-Tallyfern-Signature = hex(HMAC-SHA256(partner_secret, raw_body)).
10
+ channels:
11
+ invoice-events:
12
+ subscribe:
13
+ message:
14
+ name: InvoiceEvent
15
+ payload:
16
+ type: object
17
+ properties:
18
+ event:
19
+ type: string
20
+ enum: [invoice_created, invoice_paid, invoice_voided]
21
+ invoice_id:
22
+ type: string
23
+ amount:
24
+ type: number
25
+ description: Invoice total in major units, e.g. 129.99
26
+ currency:
27
+ type: string
28
+ enum: [USD, EUR, GBP, JPY]
29
+ customer:
30
+ type: object
31
+ properties:
32
+ name:
33
+ type: string
34
+ email:
35
+ type: string
36
+ tax_id:
37
+ type: string
38
+ paid_at:
39
+ type: string
40
+ format: date-time
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "event-contract-draft",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Draft the contract for an event or message interface (Kafka topics, SNS/SQS, EventBridge, Pub/Sub, RabbitMQ, webhooks) as an AsyncAPI 3.0 document plus a short decisions page — past-tense event names, a required envelope with event id for deduplication, the partition key and the ordering it does and doesn't give, at-least-once delivery and how consumers stay idempotent, data minimisation with PII marked, additive-only versioning with dated deprecation, and retention, replay and dead-letter handling. Use when the user wants to define events, design a Kafka topic or message schema, write an AsyncAPI spec, agree what a producer publishes and what consumers must do, or version an event safely.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },