@kavtuai/guildgate 0.1.0

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 (133) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +399 -0
  4. package/README.tr.md +397 -0
  5. package/SECURITY.md +36 -0
  6. package/TEST_REPORT.md +50 -0
  7. package/bin/guildgate-doctor.mjs +91 -0
  8. package/bin/guildgate-writing-check.mjs +73 -0
  9. package/dist/action.d.ts +65 -0
  10. package/dist/action.d.ts.map +1 -0
  11. package/dist/action.js +4 -0
  12. package/dist/action.js.map +1 -0
  13. package/dist/cache.d.ts +23 -0
  14. package/dist/cache.d.ts.map +1 -0
  15. package/dist/cache.js +53 -0
  16. package/dist/cache.js.map +1 -0
  17. package/dist/crypto.d.ts +15 -0
  18. package/dist/crypto.d.ts.map +1 -0
  19. package/dist/crypto.js +87 -0
  20. package/dist/crypto.js.map +1 -0
  21. package/dist/discord/authorizer.d.ts +41 -0
  22. package/dist/discord/authorizer.d.ts.map +1 -0
  23. package/dist/discord/authorizer.js +101 -0
  24. package/dist/discord/authorizer.js.map +1 -0
  25. package/dist/discord/oauth.d.ts +64 -0
  26. package/dist/discord/oauth.d.ts.map +1 -0
  27. package/dist/discord/oauth.js +226 -0
  28. package/dist/discord/oauth.js.map +1 -0
  29. package/dist/discord/permissions.d.ts +85 -0
  30. package/dist/discord/permissions.d.ts.map +1 -0
  31. package/dist/discord/permissions.js +99 -0
  32. package/dist/discord/permissions.js.map +1 -0
  33. package/dist/discord.d.ts +4 -0
  34. package/dist/discord.d.ts.map +1 -0
  35. package/dist/discord.js +4 -0
  36. package/dist/discord.js.map +1 -0
  37. package/dist/errors.d.ts +43 -0
  38. package/dist/errors.d.ts.map +1 -0
  39. package/dist/errors.js +57 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/express.d.ts +3 -0
  42. package/dist/express.d.ts.map +1 -0
  43. package/dist/express.js +3 -0
  44. package/dist/express.js.map +1 -0
  45. package/dist/fastify.d.ts +3 -0
  46. package/dist/fastify.d.ts.map +1 -0
  47. package/dist/fastify.js +3 -0
  48. package/dist/fastify.js.map +1 -0
  49. package/dist/http/express.d.ts +24 -0
  50. package/dist/http/express.d.ts.map +1 -0
  51. package/dist/http/express.js +60 -0
  52. package/dist/http/express.js.map +1 -0
  53. package/dist/http/fastify.d.ts +25 -0
  54. package/dist/http/fastify.d.ts.map +1 -0
  55. package/dist/http/fastify.js +57 -0
  56. package/dist/http/fastify.js.map +1 -0
  57. package/dist/i18n.d.ts +5 -0
  58. package/dist/i18n.d.ts.map +1 -0
  59. package/dist/i18n.js +66 -0
  60. package/dist/i18n.js.map +1 -0
  61. package/dist/index.d.ts +13 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +13 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/kernel.d.ts +83 -0
  66. package/dist/kernel.d.ts.map +1 -0
  67. package/dist/kernel.js +395 -0
  68. package/dist/kernel.js.map +1 -0
  69. package/dist/memory-store.d.ts +13 -0
  70. package/dist/memory-store.d.ts.map +1 -0
  71. package/dist/memory-store.js +261 -0
  72. package/dist/memory-store.js.map +1 -0
  73. package/dist/realtime/hub.d.ts +42 -0
  74. package/dist/realtime/hub.d.ts.map +1 -0
  75. package/dist/realtime/hub.js +152 -0
  76. package/dist/realtime/hub.js.map +1 -0
  77. package/dist/realtime/outbox.d.ts +12 -0
  78. package/dist/realtime/outbox.d.ts.map +1 -0
  79. package/dist/realtime/outbox.js +18 -0
  80. package/dist/realtime/outbox.js.map +1 -0
  81. package/dist/realtime.d.ts +3 -0
  82. package/dist/realtime.d.ts.map +1 -0
  83. package/dist/realtime.js +3 -0
  84. package/dist/realtime.js.map +1 -0
  85. package/dist/redis.d.ts +49 -0
  86. package/dist/redis.d.ts.map +1 -0
  87. package/dist/redis.js +233 -0
  88. package/dist/redis.js.map +1 -0
  89. package/dist/resilience.d.ts +23 -0
  90. package/dist/resilience.d.ts.map +1 -0
  91. package/dist/resilience.js +85 -0
  92. package/dist/resilience.js.map +1 -0
  93. package/dist/security.d.ts +21 -0
  94. package/dist/security.d.ts.map +1 -0
  95. package/dist/security.js +94 -0
  96. package/dist/security.js.map +1 -0
  97. package/dist/session.d.ts +32 -0
  98. package/dist/session.d.ts.map +1 -0
  99. package/dist/session.js +97 -0
  100. package/dist/session.js.map +1 -0
  101. package/dist/stores.d.ts +73 -0
  102. package/dist/stores.d.ts.map +1 -0
  103. package/dist/stores.js +4 -0
  104. package/dist/stores.js.map +1 -0
  105. package/dist/testing.d.ts +32 -0
  106. package/dist/testing.d.ts.map +1 -0
  107. package/dist/testing.js +60 -0
  108. package/dist/testing.js.map +1 -0
  109. package/dist/types.d.ts +183 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +4 -0
  112. package/dist/types.js.map +1 -0
  113. package/docs/WRITING_STYLE.md +118 -0
  114. package/docs/architecture.md +83 -0
  115. package/docs/custom-stores.md +111 -0
  116. package/docs/owner-management.md +44 -0
  117. package/docs/research-notes.md +61 -0
  118. package/docs/setup.md +104 -0
  119. package/docs/threat-model.md +79 -0
  120. package/docs/tr/arastirma-notlari.md +41 -0
  121. package/docs/tr/guvenlik-bildirimi.md +7 -0
  122. package/docs/tr/kurulum.md +63 -0
  123. package/docs/tr/mimari.md +59 -0
  124. package/docs/tr/sahip-yonetimi.md +7 -0
  125. package/docs/tr/tehdit-modeli.md +39 -0
  126. package/docs/tr/veritabani-suruculeri.md +23 -0
  127. package/docs/tr/yazim-kilavuzu.md +116 -0
  128. package/docs/uml/action-sequence.mmd +39 -0
  129. package/docs/uml/components.mmd +84 -0
  130. package/docs/uml/deployment.mmd +19 -0
  131. package/docs/uml/oauth-sequence.mmd +30 -0
  132. package/docs/uml/realtime-sequence.mmd +28 -0
  133. package/package.json +90 -0
@@ -0,0 +1,116 @@
1
+ # Yazım kuralları
2
+
3
+ Bu dosya GuildGate belgeleri, hata metinleri, örnekler, sürüm notları ve depo sayfaları için yazım kurallarını belirler.
4
+
5
+ Kontrol listesi, 25 Temmuz 2026 tarihinde incelenen Wikipedia **Signs of AI writing** sayfasındaki başlıklardan hazırlanmıştır. Sayfa, bu işaretlerin kesin kanıt olmadığını belirtir. GuildGate bu listeyi yazar tespiti için değil, metin düzenleme kontrolü için kullanır.
6
+
7
+ Kaynak: https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing
8
+
9
+ ## İçerikten çıkarılacak kalıplar
10
+
11
+ 1. **Dayanaksız önem yükleme.** Küçük bir fonksiyonun sektörü değiştirdiği, kalıcı miras bıraktığı veya geniş bir dönüşümün parçası olduğu kanıt olmadan yazılmaz.
12
+ 2. **Tanınmışlık doldurması.** Basın, uzmanlar veya topluluklardan söz edilecekse kaynak adı ve desteklediği bilgi belirtilir.
13
+ 3. **Yüzeysel yorum.** Bir teknik gerçeğe genel anlam eklemek yerine istek, oturum, kayıt veya yönetici üzerindeki etkisi açıklanır.
14
+ 4. **Reklam dili.** Teknik bölümde övgü yerine davranış, sınır ve ödünleşim yazılır.
15
+ 5. **Belirsiz kaynak.** “Birçok geliştiriciye göre”, “genel olarak bilinir” veya “uzmanlar katılıyor” gibi cümleler kaynak yoksa kaldırılır.
16
+ 6. **Hazır gelecek bölümleri.** Projeye özel iş, sorumlu ve kabul ölçütü yoksa “Zorluklar ve gelecek” bölümü eklenmez.
17
+ 7. **Konu adını sürekli tekrarlama.** Genel kavramlar özel ad gibi her paragrafta yinelenmez.
18
+ 8. **Kanıtsız eğilim.** Artan talep, hızlı benimsenme veya değişen sektör beklentisi gibi ifadeler güncel kaynak olmadan kullanılmaz.
19
+
20
+ ## Kelime ve cümle kontrolleri
21
+
22
+ Aşağıdaki İngilizce kelimeler tek başına yasak değildir. Somut bir işlevi saklıyorsa daha açık fiille değiştirilir:
23
+
24
+ - additionally
25
+ - align with
26
+ - boasts
27
+ - bolstered
28
+ - crucial
29
+ - delve
30
+ - emphasizing
31
+ - enduring
32
+ - enhance
33
+ - fostering
34
+ - garner
35
+ - highlight
36
+ - interplay
37
+ - intricate
38
+ - key
39
+ - landscape
40
+ - meticulous
41
+ - pivotal
42
+ - robust
43
+ - showcase
44
+ - tapestry
45
+ - testament
46
+ - underscore
47
+ - valuable
48
+ - vibrant
49
+
50
+ Ayrıca şu alışkanlıklar temizlenir:
51
+
52
+ - “Olmak”, “sahip olmak” veya “yapmak” gibi açık fiillerden kaçıp süslü fiil kullanmak.
53
+ - Anlam gerektirmediği hâlde “yalnızca X değil, aynı zamanda Y”, “X değil Y” veya “X yerine Y” karşıtlığı kurmak.
54
+ - Cümleyi tamamlanmış göstermek için üç sıfat, üç fayda veya üç yan cümle eklemek.
55
+ - Aynı sözcüğü tekrar etmemek uğruna zorlanmış eş anlamlılar kullanmak.
56
+ - Paragrafa hazır giriş cümlesiyle başlamak.
57
+ - Bölümü yeni bilgi vermeyen özet cümlesiyle kapatmak.
58
+
59
+ ## Biçim kontrolleri
60
+
61
+ - Her kelimesi büyük harfle başlayan İngilizce başlıklar.
62
+ - Normal kelimeleri veya hemen her maddeyi kalın yazmak.
63
+ - İçeriği zayıf, kalın mini başlıklardan oluşan dikey listeler.
64
+ - Virgül veya nokta yeterliyken sık uzun çizgi kullanmak.
65
+ - Teknik belge, hata, changelog veya güvenlik metninde süs emojisi.
66
+ - Az veriyi büyük göstermek için tablo kullanmak.
67
+ - Kod veya komuta kıvrımlı tırnak kopyalamak.
68
+ - Başlık seviyelerini atlamak.
69
+ - Her başlıktan önce yatay çizgi eklemek.
70
+ - Markdown göstermeyen alana Markdown yapıştırmak.
71
+
72
+ ## Kullanıcıya konuşan hazır metinler
73
+
74
+ Yayımlanmış dosyada asistan konuşması bulunmaz:
75
+
76
+ - Devam etme, genişletme veya başka bir konuda yardım teklifleri.
77
+ - Bilgi kesim tarihi açıklamaları.
78
+ - Okuyucunun ne isteyebileceğine ilişkin tahminler.
79
+ - “İşte düzenlenmiş sürüm”, “elbette” veya “umarım yardımcı olur” gibi çerçeve cümleleri.
80
+ - `[isim ekle]`, `[kaynak ekle]` veya `TODO` biçiminde boş yerler.
81
+ - Şablon talimatları.
82
+ - Prompt, üretim yöntemi veya ret açıklaması.
83
+
84
+ ## Reddedilecek işaretleme ve kaynak kalıntıları
85
+
86
+ Yayın kontrolü şunları bulmalıdır:
87
+
88
+ - Bozuk Markdown kod blokları, bağlantılar, referanslar veya HTML parçaları.
89
+ - Markdown dosyasında wiki işaretlemesi.
90
+ - `contentReference`, `oaicite`, `turn0search`, `attributableIndex` veya `+1` gibi model içi kaynak dizgileri.
91
+ - Gemini citation span, Grok card, DeepSeek dagger, Perplexity yükleme referansı veya `:::writing` bloğu.
92
+ - Var olmayan şablon, kategori, dosya, import, komut, ortam değişkeni veya paket export’u.
93
+ - Kaynak bağlantısında `utm_source` gibi takip parametreleri.
94
+ - Açılmayan ya da yanındaki cümleyi desteklemeyen DOI, ISBN, paket veya belge bağlantısı.
95
+ - Tanımlanıp kullanılmayan kaynaklar.
96
+
97
+ ## Depoya özel kurallar
98
+
99
+ 1. Her dosyada tek dil kullanılır. `README.md` İngilizce, `README.tr.md` Türkçedir.
100
+ 2. İşlemi yapan adlandırılır. Uygun olduğunda “sistem” yerine çekirdek, sürücü, uygulama, Discord veya yönetici yazılır.
101
+ 3. Hata adı belirtilir. “Bir sorun oluştu” yerine `CSRF_INVALID`, `RATE_LIMITED` veya gerçek koşul yazılır.
102
+ 4. Garanti ve öneri ayrılır. “Üretimde HTTP origin reddedilir” garantidir. “Birden fazla instance için Redis kullanın” öneridir.
103
+ 5. Sorumluluk belirtilir. Transaction, şema göçü, proxy güveni, gizli değer saklama ve yedekleme, GuildGate açıkça uygulamadıkça uygulamaya aittir.
104
+ 6. Mutlak güvenlik iddiası kullanılmaz. “Kırılamaz”, “sıfır risk”, “tam güvenli” veya “hatasız” yazılmaz.
105
+ 7. Örnekler derlenebilir olmalı veya sözde kod olduğu açıkça belirtilmelidir.
106
+ 8. Örnekteki her ortam değişkeni `.env.example` dosyasında bulunmalı ya da örneğin yanında açıklanmalıdır.
107
+ 9. Belgede kullanılan her public export, `package.json` ve derlenmiş tip dosyalarında bulunmalıdır.
108
+ 10. Paragraflar taranabilir tutulur; tek cümle sırf görünüm için madde listesine bölünmez.
109
+
110
+ ## Sürüm öncesi kontrol
111
+
112
+ - Yukarıdaki kelimeler depoda aranır ve her eşleşme incelenir.
113
+ - Model kaynak kalıntıları ve boş köşeli parantezler aranır.
114
+ - Bağlantılar, kod örnekleri, testler, tip kontrolü, paket dry-run ve doctor komutu çalıştırılır.
115
+ - Değişen her sayfa bir kez düzenleme yapmadan okunur. Davranışı açıklamadan önem iddiası kuran cümleler işaretlenir.
116
+ - İnceleyen kişiden “insan gibi duruyor mu” değil, doğru ve sınanabilir olup olmadığını kontrol etmesi istenir.
@@ -0,0 +1,39 @@
1
+ sequenceDiagram
2
+ autonumber
3
+ actor Browser
4
+ participant Adapter as HTTP Adapter
5
+ participant Kernel as GuildGate Kernel
6
+ participant Session as SessionStore
7
+ participant Policy as PolicyStore
8
+ participant Limit as RateLimitStore
9
+ participant Idem as IdempotencyStore
10
+ participant Lock as LockStore
11
+ participant App as Application execute()
12
+ participant Cache as CacheStore
13
+ participant Outbox as OutboxStore
14
+ participant Audit as AuditStore
15
+
16
+ Browser->>Adapter: PATCH + cookie + CSRF + idempotency key
17
+ Adapter->>Kernel: execute(action, request)
18
+ Kernel->>Session: resolve(hash(token))
19
+ Session-->>Kernel: session / missing / rotated
20
+ Kernel->>Kernel: exact origin and CSRF checks
21
+ Kernel->>Kernel: parse input and resolve resource
22
+ Kernel->>Policy: maintenance and block checks
23
+ Policy-->>Kernel: current policy decision
24
+ Kernel->>Limit: atomic hit(action subject)
25
+ Limit-->>Kernel: allowed, remaining, reset
26
+ Kernel->>Kernel: application or Discord authorization
27
+ Kernel->>Idem: begin(key, request hash)
28
+ Idem-->>Kernel: started / replay / conflict / inflight
29
+ Kernel->>Lock: acquire(resource lease)
30
+ Lock-->>Kernel: acquired
31
+ Kernel->>App: execute(context, parsed input, abort signal)
32
+ App-->>Kernel: committed result
33
+ Kernel->>Cache: deleteByTags(tags)
34
+ Kernel->>Outbox: enqueue(event)
35
+ Kernel->>Idem: complete(key, result)
36
+ Kernel->>Audit: write(result and policy version)
37
+ Kernel->>Lock: release(compare token)
38
+ Kernel-->>Adapter: typed result and session metadata
39
+ Adapter-->>Browser: response and optional rotated cookie
@@ -0,0 +1,84 @@
1
+ classDiagram
2
+ direction LR
3
+
4
+ class Application {
5
+ +HTTP routes
6
+ +Database transactions
7
+ +Policy decisions
8
+ +Schema validation
9
+ }
10
+
11
+ class GuildGateKernel {
12
+ +action(definition)
13
+ +execute(action, request)
14
+ +createSession(input)
15
+ +revokeUserSessions(userId)
16
+ }
17
+
18
+ class SessionManager {
19
+ +create(input)
20
+ +resolve(token)
21
+ +revokeToken(token)
22
+ +revokeAll(userId)
23
+ }
24
+
25
+ class DiscordOAuthClient {
26
+ +beginLogin(input)
27
+ +completeLogin(input)
28
+ +getAccessToken(userId)
29
+ +revoke(userId)
30
+ }
31
+
32
+ class DiscordGuildAuthorizer {
33
+ +inspect(input)
34
+ +require(policy)
35
+ }
36
+
37
+ class GuildGateStores {
38
+ <<interface>>
39
+ +SessionStore sessions
40
+ +OAuthStateStore oauthStates
41
+ +OAuthCredentialStore credentials
42
+ +RateLimitStore rateLimits
43
+ +CacheStore cache
44
+ +IdempotencyStore idempotency
45
+ +LockStore locks
46
+ +AuditStore audit
47
+ +OutboxStore outbox
48
+ +PolicyStore policies
49
+ }
50
+
51
+ class RealtimeHub {
52
+ +attach(connection)
53
+ +subscribe(channel)
54
+ +publish(event)
55
+ +revokeSession(sessionIdHash)
56
+ }
57
+
58
+ class FrameworkAdapter {
59
+ <<interface>>
60
+ +translateRequest()
61
+ +writeResponse()
62
+ }
63
+
64
+ class DiscordAPI {
65
+ <<external>>
66
+ }
67
+
68
+ class DatabaseOrCache {
69
+ <<external>>
70
+ }
71
+
72
+ Application --> FrameworkAdapter
73
+ FrameworkAdapter --> GuildGateKernel
74
+ Application --> GuildGateKernel
75
+ GuildGateKernel --> SessionManager
76
+ GuildGateKernel --> GuildGateStores
77
+ DiscordOAuthClient --> GuildGateKernel
78
+ DiscordOAuthClient --> GuildGateStores
79
+ DiscordOAuthClient --> DiscordAPI
80
+ DiscordGuildAuthorizer --> DiscordOAuthClient
81
+ DiscordGuildAuthorizer --> DiscordAPI
82
+ RealtimeHub --> SessionManager
83
+ RealtimeHub --> GuildGateStores
84
+ GuildGateStores --> DatabaseOrCache
@@ -0,0 +1,19 @@
1
+ flowchart LR
2
+ B[Browser] -->|HTTPS| P[Reverse proxy]
3
+ P --> A1[Dashboard instance A]
4
+ P --> A2[Dashboard instance B]
5
+
6
+ A1 --> D[(Durable database)]
7
+ A2 --> D
8
+ A1 --> R[(Redis or atomic temporary store)]
9
+ A2 --> R
10
+ A1 --> X[Discord API]
11
+ A2 --> X
12
+
13
+ D -->|credentials audit policies outbox| W[Outbox worker]
14
+ W --> Q[Realtime transport or event bus]
15
+ Q --> A1
16
+ Q --> A2
17
+
18
+ note1[Application controls schema migrations backup retention and proxy trust]
19
+ D --- note1
@@ -0,0 +1,30 @@
1
+ sequenceDiagram
2
+ autonumber
3
+ actor Browser
4
+ participant App as Application
5
+ participant OAuth as DiscordOAuthClient
6
+ participant State as OAuthStateStore
7
+ participant Discord as Discord OAuth2 API
8
+ participant Credentials as OAuthCredentialStore
9
+ participant Session as SessionManager
10
+
11
+ Browser->>App: GET /auth/discord
12
+ App->>OAuth: beginLogin(returnTo, locale)
13
+ OAuth->>State: put(hash(state), hash(browser nonce), expiry)
14
+ OAuth-->>App: authorization URL and HttpOnly nonce cookie
15
+ App-->>Browser: Set-Cookie and redirect
16
+ Browser->>Discord: authorization request with state
17
+ Discord-->>Browser: redirect with code and state
18
+ Browser->>App: GET callback + nonce cookie
19
+ App->>OAuth: completeLogin(code, state, nonce)
20
+ OAuth->>State: consume(hash(state))
21
+ State-->>OAuth: one record or null
22
+ OAuth->>Discord: exchange code
23
+ Discord-->>OAuth: access and refresh tokens
24
+ OAuth->>Discord: GET current user and guilds
25
+ Discord-->>OAuth: user and guild list
26
+ OAuth->>Credentials: store encrypted token record
27
+ OAuth->>Session: create new opaque session
28
+ Session-->>OAuth: raw token once and stored hash
29
+ OAuth-->>App: user, guilds, session cookie, local return path
30
+ App-->>Browser: clear nonce cookie, set session cookie, redirect
@@ -0,0 +1,28 @@
1
+ sequenceDiagram
2
+ autonumber
3
+ actor Browser
4
+ participant Transport as WebSocket Transport
5
+ participant Hub as RealtimeHub
6
+ participant Session as SessionManager
7
+ participant Limit as RateLimitStore
8
+ participant Authz as Application Authorizer
9
+
10
+ Browser->>Transport: connection with Origin and session cookie
11
+ Transport->>Hub: attach(connection, origin, session token)
12
+ Hub->>Session: resolve(token)
13
+ Session-->>Hub: active session
14
+ Hub-->>Browser: ready
15
+ Browser->>Transport: subscribe guild:123
16
+ Transport->>Hub: subscribe(connection, channel)
17
+ Hub->>Authz: authorize(session, channel)
18
+ Authz-->>Hub: allowed
19
+ Hub-->>Browser: subscribed
20
+ Browser->>Transport: client message
21
+ Transport->>Hub: acceptMessage(payload)
22
+ Hub->>Limit: atomic message limit hit
23
+ Limit-->>Hub: allowed
24
+ Hub-->>Transport: parsed payload
25
+ Note over Hub: Publish checks channel membership and buffered bytes
26
+ Hub-->>Browser: versioned event
27
+ Session-->>Hub: session revoked by application
28
+ Hub-->>Browser: close 1008
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@kavtuai/guildgate",
3
+ "version": "0.1.0",
4
+ "description": "Security and control primitives for Discord bot dashboards.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "kavtuai",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/Kavtuai/guildgate.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Kavtuai/guildgate/issues"
14
+ },
15
+ "homepage": "https://github.com/Kavtuai/guildgate#readme",
16
+ "keywords": [
17
+ "discord",
18
+ "dashboard",
19
+ "oauth2",
20
+ "security",
21
+ "rate-limit",
22
+ "cache",
23
+ "websocket",
24
+ "typescript"
25
+ ],
26
+ "engines": {
27
+ "node": ">=22"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "bin",
32
+ "docs",
33
+ "README.md",
34
+ "README.tr.md",
35
+ "CHANGELOG.md",
36
+ "TEST_REPORT.md",
37
+ "LICENSE",
38
+ "SECURITY.md"
39
+ ],
40
+ "exports": {
41
+ ".": {
42
+ "types": "./dist/index.d.ts",
43
+ "import": "./dist/index.js"
44
+ },
45
+ "./discord": {
46
+ "types": "./dist/discord.d.ts",
47
+ "import": "./dist/discord.js"
48
+ },
49
+ "./fastify": {
50
+ "types": "./dist/fastify.d.ts",
51
+ "import": "./dist/fastify.js"
52
+ },
53
+ "./express": {
54
+ "types": "./dist/express.d.ts",
55
+ "import": "./dist/express.js"
56
+ },
57
+ "./redis": {
58
+ "types": "./dist/redis.d.ts",
59
+ "import": "./dist/redis.js"
60
+ },
61
+ "./realtime": {
62
+ "types": "./dist/realtime.d.ts",
63
+ "import": "./dist/realtime.js"
64
+ },
65
+ "./testing": {
66
+ "types": "./dist/testing.d.ts",
67
+ "import": "./dist/testing.js"
68
+ }
69
+ },
70
+ "bin": {
71
+ "guildgate-doctor": "bin/guildgate-doctor.mjs",
72
+ "guildgate-writing-check": "bin/guildgate-writing-check.mjs"
73
+ },
74
+ "scripts": {
75
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
76
+ "build": "npm run clean && tsc -p tsconfig.json",
77
+ "test": "npm run build && npm run writing:check && node --test tests/*.test.mjs",
78
+ "typecheck": "tsc -p tsconfig.json --noEmit",
79
+ "pack:check": "npm pack --dry-run",
80
+ "prepublishOnly": "npm test && npm run pack:check",
81
+ "writing:check": "node ./bin/guildgate-writing-check.mjs"
82
+ },
83
+ "publishConfig": {
84
+ "access": "public"
85
+ },
86
+ "devDependencies": {
87
+ "@types/node": "^22.15.0",
88
+ "typescript": "^5.8.3"
89
+ }
90
+ }