Skip to content

Commit 41fcf63

Browse files
committed
Merge main into Coupang adapter branch
2 parents 60e94a9 + e3c729a commit 41fcf63

23 files changed

Lines changed: 1886 additions & 80 deletions

โ€ŽCONTRIBUTING.mdโ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ The shape is:
5757
{
5858
name: 'sahibinden',
5959
category: 'general',
60-
match: (url) => /^https?:\/\/(www\.)?sahibinden\.com\//.test(url),
60+
matches: (url) => /^https?:\/\/(www\.)?sahibinden\.com\//.test(url),
6161
notes: `
6262
- (one short bullet per non-obvious fact about the site, written in the
6363
imperative voice for an LLM that has never seen this page before.)
@@ -69,7 +69,7 @@ Each adapter needs four things:
6969

7070
1. **`name`** โ€” short identifier, lowercase, no spaces. Used in logs and the settings UI.
7171
2. **`category`** โ€” usually `'general'`. Reserved for future filtering.
72-
3. **`match(url)`** โ€” regex against the current tab URL. Match the broadest
72+
3. **`matches(url)`** โ€” regex against the current tab URL. Match the broadest
7373
form of the domain (`.com`, `.co.uk`, `.com.tr` country variants if applicable),
7474
but don't match unrelated subdomains.
7575
4. **`notes`** โ€” the body the agent will see prepended to its first message

โ€Ždocs/fr/site-adapters.mdโ€Ž

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ Les adaptateurs de site sont la **contribution la plus recherchรฉe nยฐ1** (voir
1212

1313
### Correspondance
1414

15-
`getActiveAdapter(url)` parcourt le tableau `ADAPTERS` et retourne le **premier** adaptateur dont `match(url)` retourne `true` :
15+
`getActiveAdapter(url)` parcourt le tableau `ADAPTERS` et retourne le **premier** adaptateur dont `matches(url)` retourne `true` :
1616

1717
```js
1818
export function getActiveAdapter(url) {
1919
if (!url) return null;
2020
for (const a of ADAPTERS) {
2121
try {
22-
if (a.match(url)) return a;
22+
if (a.matches(url)) return a;
2323
} catch (e) { /* ignorer les matchers mal formรฉs */ }
2424
}
2525
return null;
@@ -52,7 +52,7 @@ d'injecter les conseils Mastodon plus largement.
5252
{
5353
name: 'my-site', // identifiant court unique
5454
category: 'general', // 'general' | 'finance'
55-
match: (url) => /^https?:\/\/(www\.)?example\.com\//.test(url),
55+
matches: (url) => /^https?:\/\/(www\.)?example\.com\//.test(url),
5656
notes: `
5757
- Point 1 : le conseil actionnable.
5858
- Point 2 : un autre conseil.
@@ -67,7 +67,7 @@ d'injecter les conseils Mastodon plus largement.
6767
|---|---|---|
6868
| `name` | string | Identifiant unique pour l'adaptateur. Utilisรฉ dans les en-tรชtes d'invite systรจme. |
6969
| `category` | `'general'` ou `'finance'` | `'finance'` ajoute une banniรจre `[FINANCE / ENJEUX ร‰LEVร‰S]` ร  l'en-tรชte et dรฉclenche des consignes de sรฉcuritรฉ supplรฉmentaires dans l'invite systรจme. |
70-
| `match` | `(url) => boolean` | Retourne `true` quand l'adaptateur doit se dรฉclencher pour cette URL. L'expression rรฉguliรจre est prรฉfรฉrรฉe โ€” gardez-la assez spรฉcifique pour รฉviter les faux positifs. |
70+
| `matches` | `(url) => boolean` | Retourne `true` quand l'adaptateur doit se dรฉclencher pour cette URL. L'expression rรฉguliรจre est prรฉfรฉrรฉe โ€” gardez-la assez spรฉcifique pour รฉviter les faux positifs. |
7171
| `notes` | string | Conseils sous forme de puces injectรฉs dans le premier message utilisateur. **Maximum 4 ร  8 lignes.** Voir les consignes de style ci-dessous. |
7272

7373
### Ordre
@@ -108,7 +108,7 @@ Les adaptateurs sont ordonnรฉs par catรฉgorie/site dans le tableau `ADAPTERS`. *
108108
{
109109
name: 'twitter',
110110
category: 'general',
111-
match: (url) => /^https?:\/\/(www\.)?(twitter\.com|x\.com)\//.test(url),
111+
matches: (url) => /^https?:\/\/(www\.)?(twitter\.com|x\.com)\//.test(url),
112112
notes: `
113113
- Le composeur est un contenteditable, pas un textarea. Le nombre de caractรจres est appliquรฉ cรดtรฉ client.
114114
- La timeline est virtualisรฉe โ€” les tweets disparaissent du DOM. Utilisez la recherche, pas le dรฉfilement, pour trouver un tweet.
@@ -124,7 +124,7 @@ Les adaptateurs sont ordonnรฉs par catรฉgorie/site dans le tableau `ADAPTERS`. *
124124
{
125125
name: 'stripe',
126126
category: 'finance',
127-
match: (url) => /^https?:\/\/(dashboard\.)?stripe\.com\//.test(url),
127+
matches: (url) => /^https?:\/\/(dashboard\.)?stripe\.com\//.test(url),
128128
notes: `
129129
- Bascule LIVE vs TEST en haut ร  droite. Toujours confirmer le mode.
130130
- Les remboursements sont partiels par dรฉfaut โ€” vรฉrifier le montant attentivement.
@@ -161,7 +161,7 @@ Ouvrez chaque site adaptรฉ et vรฉrifiez :
161161

162162
- [ ] Ajouter l'objet adaptateur au tableau `ADAPTERS` dans `src/chrome/src/agent/adapters.js`
163163
- [ ] Reflรฉter exactement la mรชme modification dans `src/firefox/src/agent/adapters.js`
164-
- [ ] S'assurer que la regex `match()` est spรฉcifique et ne masque pas les adaptateurs voisins
164+
- [ ] S'assurer que la regex `matches()` est spรฉcifique et ne masque pas les adaptateurs voisins
165165
- [ ] Si `category: 'finance'`, le placer AVANT `finance-generic` dans le tableau
166166
- [ ] Vรฉrifier que les notes sont concises (4 ร  8 puces)
167167
- [ ] Tester la correspondance avec `getActiveAdapter(url)`

โ€Ždocs/site-adapters.mdโ€Ž

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ Site adapters are the **#1 most-wanted contribution** (see CONTRIBUTING.md). The
1212

1313
### Matching
1414

15-
`getActiveAdapter(url)` iterates the `ADAPTERS` array and returns the **first** adapter whose `match(url)` returns `true`:
15+
`getActiveAdapter(url)` iterates the `ADAPTERS` array and returns the **first** adapter whose `matches(url)` returns `true`:
1616

1717
```js
1818
export function getActiveAdapter(url) {
1919
if (!url) return null;
2020
for (const a of ADAPTERS) {
2121
try {
22-
if (a.match(url)) return a;
22+
if (a.matches(url)) return a;
2323
} catch (e) { /* skip malformed matchers */ }
2424
}
2525
return null;
@@ -52,7 +52,7 @@ injecting Mastodon guidance more broadly.
5252
{
5353
name: 'my-site', // unique short identifier
5454
category: 'general', // 'general' | 'finance'
55-
match: (url) => /^https?:\/\/(www\.)?example\.com\//.test(url),
55+
matches: (url) => /^https?:\/\/(www\.)?example\.com\//.test(url),
5656
notes: `
5757
- Bullet 1: the actionable tip.
5858
- Bullet 2: another tip.
@@ -67,7 +67,7 @@ injecting Mastodon guidance more broadly.
6767
|---|---|---|
6868
| `name` | string | Unique identifier for the adapter. Used in system-prompt headings. |
6969
| `category` | `'general'` or `'finance'` | `'finance'` adds a `[FINANCE / HIGH-STAKES]` banner to the heading and triggers extra safety guidance in the system prompt. |
70-
| `match` | `(url) => boolean` | Returns `true` when the adapter should fire for this URL. Regex is preferred โ€” keep it specific enough to avoid false matches. |
70+
| `matches` | `(url) => boolean` | Returns `true` when the adapter should fire for this URL. Regex is preferred โ€” keep it specific enough to avoid false matches. |
7171
| `notes` | string | Bulleted guidance injected into the first user message. **Keep 4โ€“8 lines max.** See style guidance below. |
7272

7373
### Ordering
@@ -108,7 +108,7 @@ Adapters are ordered by category/site in the `ADAPTERS` array. **Finance adapter
108108
{
109109
name: 'twitter',
110110
category: 'general',
111-
match: (url) => /^https?:\/\/(www\.)?(twitter\.com|x\.com)\//.test(url),
111+
matches: (url) => /^https?:\/\/(www\.)?(twitter\.com|x\.com)\//.test(url),
112112
notes: `
113113
- The composer is a contenteditable, not a textarea. Character count is enforced client-side.
114114
- The timeline is virtualized โ€” tweets scroll out of the DOM. Use search, not scroll, to find a tweet.
@@ -124,7 +124,7 @@ Adapters are ordered by category/site in the `ADAPTERS` array. **Finance adapter
124124
{
125125
name: 'stripe',
126126
category: 'finance',
127-
match: (url) => /^https?:\/\/(dashboard\.)?stripe\.com\//.test(url),
127+
matches: (url) => /^https?:\/\/(dashboard\.)?stripe\.com\//.test(url),
128128
notes: `
129129
- LIVE vs TEST mode toggle in the top-right. Always confirm which mode.
130130
- Refunds are partial-by-default โ€” check the amount carefully.
@@ -161,7 +161,7 @@ Open each adapted site and verify:
161161

162162
- [ ] Add the adapter object to the `ADAPTERS` array in `src/chrome/src/agent/adapters.js`
163163
- [ ] Mirror the exact same change to `src/firefox/src/agent/adapters.js`
164-
- [ ] Ensure the `match()` regex is specific and doesn't shadow neighboring adapters
164+
- [ ] Ensure the `matches()` regex is specific and doesn't shadow neighboring adapters
165165
- [ ] If `category: 'finance'`, place it BEFORE `finance-generic` in the array
166166
- [ ] Verify the notes are 4โ€“8 concise bullets
167167
- [ ] Test matching with `getActiveAdapter(url)`

โ€Ždocs/zh-CN/site-adapters.mdโ€Ž

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212

1313
### ๅŒน้…
1414

15-
`getActiveAdapter(url)` ้ๅކ `ADAPTERS` ๆ•ฐ็ป„๏ผŒ่ฟ”ๅ›ž็ฌฌไธ€ไธช `match(url)` ่ฟ”ๅ›ž `true` ็š„้€‚้…ๅ™จ๏ผš
15+
`getActiveAdapter(url)` ้ๅކ `ADAPTERS` ๆ•ฐ็ป„๏ผŒ่ฟ”ๅ›ž็ฌฌไธ€ไธช `matches(url)` ่ฟ”ๅ›ž `true` ็š„้€‚้…ๅ™จ๏ผš
1616

1717
```js
1818
export function getActiveAdapter(url) {
1919
if (!url) return null;
2020
for (const a of ADAPTERS) {
2121
try {
22-
if (a.match(url)) return a;
22+
if (a.matches(url)) return a;
2323
} catch (e) { /* ่ทณ่ฟ‡ๆ ผๅผ้”™่ฏฏ็š„ๅŒน้…ๅ™จ */ }
2424
}
2525
return null;
@@ -51,7 +51,7 @@ export function getActiveAdapter(url) {
5151
{
5252
name: 'my-site', // ๅ”ฏไธ€็Ÿญๆ ‡่ฏ†็ฌฆ
5353
category: 'general', // 'general' | 'finance'
54-
match: (url) => /^https?:\/\/(www\.)?example\.com\//.test(url),
54+
matches: (url) => /^https?:\/\/(www\.)?example\.com\//.test(url),
5555
notes: `
5656
- ่ฆ็‚น 1๏ผšๅฏๆ“ไฝœ็š„ๅปบ่ฎฎใ€‚
5757
- ่ฆ็‚น 2๏ผšๅฆไธ€ไธชๅปบ่ฎฎใ€‚
@@ -66,7 +66,7 @@ export function getActiveAdapter(url) {
6666
|---|---|---|
6767
| `name` | string | ้€‚้…ๅ™จ็š„ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆใ€‚็”จไบŽ็ณป็ปŸๆ็คบ็š„ๆ ‡้ข˜ใ€‚ |
6868
| `category` | `'general'` ๆˆ– `'finance'` | `'finance'` ไผšๅœจๆ ‡้ข˜ไธญๆทปๅŠ  `[FINANCE / HIGH-STAKES]` ๆจชๅน…๏ผŒๅนถๅœจ็ณป็ปŸๆ็คบไธญ่งฆๅ‘้ขๅค–็š„ๅฎ‰ๅ…จๆŒ‡ๅฏผใ€‚ |
69-
| `match` | `(url) => boolean` | ๅฝ“้€‚้…ๅ™จๅบ”ไธบ่ฏฅ URL ่งฆๅ‘ๆ—ถ่ฟ”ๅ›ž `true`ใ€‚ๆŽจ่ไฝฟ็”จๆญฃๅˆ™่กจ่พพๅผโ€”โ€”ไฟๆŒ่ถณๅคŸๅ…ทไฝ“ไปฅ้ฟๅ…้”™่ฏฏๅŒน้…ใ€‚ |
69+
| `matches` | `(url) => boolean` | ๅฝ“้€‚้…ๅ™จๅบ”ไธบ่ฏฅ URL ่งฆๅ‘ๆ—ถ่ฟ”ๅ›ž `true`ใ€‚ๆŽจ่ไฝฟ็”จๆญฃๅˆ™่กจ่พพๅผโ€”โ€”ไฟๆŒ่ถณๅคŸๅ…ทไฝ“ไปฅ้ฟๅ…้”™่ฏฏๅŒน้…ใ€‚ |
7070
| `notes` | string | ๆณจๅ…ฅๅˆฐ็ฌฌไธ€ๆก็”จๆˆทๆถˆๆฏไธญ็š„่ฆ็‚นๅผๆŒ‡ๅฏผใ€‚**ๆœ€ๅคšไฟๆŒ 4โ€“8 ่กŒใ€‚** ๅ‚่งไธ‹้ข็š„้ฃŽๆ ผๆŒ‡ๅ—ใ€‚ |
7171

7272
### ๆŽ’ๅบ
@@ -107,7 +107,7 @@ export function getActiveAdapter(url) {
107107
{
108108
name: 'twitter',
109109
category: 'general',
110-
match: (url) => /^https?:\/\/(www\.)?(twitter\.com|x\.com)\//.test(url),
110+
matches: (url) => /^https?:\/\/(www\.)?(twitter\.com|x\.com)\//.test(url),
111111
notes: `
112112
- ็ผ–่พ‘ๅ™จๆ˜ฏไธ€ไธช contenteditable๏ผŒ่€Œไธๆ˜ฏ textareaใ€‚ๅญ—็ฌฆๆ•ฐ็”ฑๅฎขๆˆท็ซฏๅผบๅˆถ้™ๅˆถใ€‚
113113
- ๆ—ถ้—ด็บฟๆ˜ฏ่™šๆ‹ŸๅŒ–็š„โ€”โ€”ๆŽจๆ–‡ไผšๆปšๅŠจๅ‡บ DOMใ€‚ไฝฟ็”จๆœ็ดข่€Œไธๆ˜ฏๆปšๅŠจๆฅๆŸฅๆ‰พๆŽจๆ–‡ใ€‚
@@ -123,7 +123,7 @@ export function getActiveAdapter(url) {
123123
{
124124
name: 'stripe',
125125
category: 'finance',
126-
match: (url) => /^https?:\/\/(dashboard\.)?stripe\.com\//.test(url),
126+
matches: (url) => /^https?:\/\/(dashboard\.)?stripe\.com\//.test(url),
127127
notes: `
128128
- LIVE ไธŽ TEST ๆจกๅผๅˆ‡ๆขๅœจๅณไธŠ่ง’ใ€‚ๅง‹็ปˆ็กฎ่ฎคๅฝ“ๅ‰ๆจกๅผใ€‚
129129
- ้€€ๆฌพ้ป˜่ฎคไธบ้ƒจๅˆ†้€€ๆฌพโ€”โ€”่ฏทไป”็ป†ๆฃ€ๆŸฅ้‡‘้ขใ€‚
@@ -160,7 +160,7 @@ export function getActiveAdapter(url) {
160160

161161
- [ ] ๅฐ†้€‚้…ๅ™จๅฏน่ฑกๆทปๅŠ ๅˆฐ `src/chrome/src/agent/adapters.js` ็š„ `ADAPTERS` ๆ•ฐ็ป„ไธญ
162162
- [ ] ๅฐ†ๅฎŒๅ…จ็›ธๅŒ็š„ๆ›ดๆ”นๅŒๆญฅๅˆฐ `src/firefox/src/agent/adapters.js`
163-
- [ ] ็กฎไฟ `match()` ๆญฃๅˆ™่กจ่พพๅผๅ…ทไฝ“ไธ”ไธไผš้ฎ่”ฝ็›ธ้‚ป็š„้€‚้…ๅ™จ
163+
- [ ] ็กฎไฟ `matches()` ๆญฃๅˆ™่กจ่พพๅผๅ…ทไฝ“ไธ”ไธไผš้ฎ่”ฝ็›ธ้‚ป็š„้€‚้…ๅ™จ
164164
- [ ] ๅฆ‚ๆžœ `category: 'finance'`๏ผŒๅฐ†ๅ…ถๆ”พๅœจๆ•ฐ็ป„ไธญ `finance-generic` ไน‹ๅ‰
165165
- [ ] ้ชŒ่ฏ notes ๆ˜ฏ 4โ€“8 ๆก็ฎ€ๆด็š„่ฆ็‚น
166166
- [ ] ไฝฟ็”จ `getActiveAdapter(url)` ๆต‹่ฏ•ๅŒน้…

โ€Žsrc/chrome/src/agent/adapters.jsโ€Ž

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15942,6 +15942,21 @@ const ADAPTERS = [
1594215942
- Login pages (\`wp-login.php\`) have a stable shape: \`#user_login\` (username/email), \`#user_pass\` (password), \`#wp-submit\` (submit). The password field is type=password โ€” when the user provides credentials, do not echo them in any summary.`,
1594315943
},
1594415944

15945+
{
15946+
name: 'wechat-official-account',
15947+
category: 'general',
15948+
matches: (url) => /^https?:\/\/mp\.weixin\.qq\.com\/(?:$|[?#]|cgi-bin(?:[/?#]|$))/.test(url),
15949+
notes: `
15950+
- Confirm the current official account name in the top bar before editing or publishing; an old tab or session-token URL may belong to a different account.
15951+
- The article editor has separate title and body editable regions. The body uses ProseMirror/contenteditable; focus each region separately and verify its text after writing so the title is not inserted into the body or vice versa.
15952+
- "ไฟๅญ˜ไธบ่‰็จฟ" (Save as draft) and "ๅ‘่กจ" (Publish) are different outcomes. A saved draft is not publicly visible and must never be reported as published.
15953+
- Under "ๅฐ้ข" (Cover), "ไปŽๆญฃๆ–‡้€‰ๆ‹ฉ" (Select from article) can reuse an inline image. Confirm the intended image and crop instead of accepting the first thumbnail automatically.
15954+
- Before clicking "ๅ‘่กจ", re-check the account, title, author/byline, summary, and cover because publishing is externally visible.
15955+
- Publishing can open stacked confirmation dialogs followed by "ๅพฎไฟก้ชŒ่ฏ" with a QR code. Pause for the user to complete verification; do not dismiss, bypass, or repeatedly retry the dialog.
15956+
- Treat publishing as successful only when "ๅ‘่กจ่ฎฐๅฝ•" shows the new article (or a final public article URL is available), not when the editor closes or a confirmation button was clicked.
15957+
- Dashboard links contain short-lived session tokens. If a deep link expires or redirects, navigate from the current dashboard instead of inventing or reusing a tokenized URL.`,
15958+
},
15959+
1594515960
// โ”€โ”€โ”€ Commerce โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
1594615961
{
1594715962
name: 'amazon',
@@ -16308,6 +16323,20 @@ const ADAPTERS = [
1630816323
- "๋กœ์ผ“๋ฐฐ์†ก" describes Coupang-fulfilled delivery, while "์™€์šฐ" free shipping, free returns, or dawn delivery are membership-conditional. Confirm the selected offer and the cart total before promising delivery, savings, or a final price.`,
1630916324
},
1631016325

16326+
// โ”€โ”€โ”€ Regional โ€” Rakuten Ichiba (Japan) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
16327+
{
16328+
name: 'rakuten-ichiba',
16329+
category: 'general',
16330+
matches: (url) => /^https?:\/\/(?:(?:www|search|item)\.rakuten\.co\.jp|basket\.step\.rakuten\.co\.jp)\//.test(url),
16331+
notes: `
16332+
- As of 2026-07, Rakuten Ichiba is a MARKETPLACE of independently operated "ใ‚ทใƒงใƒƒใƒ—" (shops). Stable labels: "่ฒทใ„็‰ฉใ‹ใ”ใซๅ…ฅใ‚Œใ‚‹" = add to cart, "่ฒทใ„็‰ฉใ‹ใ”" = cart, and "ใ”่ณผๅ…ฅๆ‰‹็ถšใ" = proceed to checkout.
16333+
- Search results marked "[PR]" are sponsored. For a price comparison, use "ๅŒใ˜ๅ•†ๅ“ใ‚’ๅฎ‰ใ„้ †ใง่ฆ‹ใ‚‹" when available, then compare the exact variant's "ไพกๆ ผ+้€ๆ–™" and per-unit price; do not rank the first result or a bare "ใ€œ" price range as cheapest.
16334+
- Select every size, color, pack count, delivery timing, and other required option before comparing or adding. "ๅฎšๆœŸ่ณผๅ…ฅ" is a recurring purchase with a different price โ€” keep normal purchase selected unless the user explicitly asks for a subscription.
16335+
- The cart is divided into boxes by shop. On desktop, items from different shops cannot share one checkout; mobile "ใŠใพใจใ‚่ณผๅ…ฅ" may batch the steps, but each shop still creates a separate order and shipment. Read each box and click its own "ใ”่ณผๅ…ฅๆ‰‹็ถšใ".
16336+
- Shipping is shop- and destination-specific. A 39 Shop's 3,980ๅ†† free-shipping line applies within the same eligible shop and order, not across shops; "็‰นๅฎš้€ๆ–™", remote regions, chilled delivery, and large items can remain chargeable. Verify every shop's cart total.
16337+
- "ใƒใ‚คใƒณใƒˆ", SPU, and ใ‚นใƒผใƒ‘ใƒผDEAL are conditional rewards, not an immediate cash-price reduction; campaigns may require entry, membership, payment methods, or have caps, and shipping/tax do not earn ordinary points. Report the payable total separately from expected points.`,
16338+
},
16339+
1631116340
// โ”€โ”€โ”€ Regional โ€” Tรผrkiye (TR) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
1631216341
// Regional adapters are the project's #1 wanted contribution (CONTRIBUTING.md);
1631316342
// Tรผrkiye is top of the priority list. Add more TR sites (trendyol,

0 commit comments

Comments
ย (0)