dominion-cli 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 (298) hide show
  1. package/README.md +304 -0
  2. package/dist/app.d.ts +15 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +36 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/cli.d.ts +9 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +369 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/account.d.ts +28 -0
  11. package/dist/commands/account.d.ts.map +1 -0
  12. package/dist/commands/account.js +133 -0
  13. package/dist/commands/account.js.map +1 -0
  14. package/dist/commands/billing.d.ts +16 -0
  15. package/dist/commands/billing.d.ts.map +1 -0
  16. package/dist/commands/billing.js +61 -0
  17. package/dist/commands/billing.js.map +1 -0
  18. package/dist/commands/buy.d.ts +27 -0
  19. package/dist/commands/buy.d.ts.map +1 -0
  20. package/dist/commands/buy.js +293 -0
  21. package/dist/commands/buy.js.map +1 -0
  22. package/dist/commands/cart/add.d.ts +17 -0
  23. package/dist/commands/cart/add.d.ts.map +1 -0
  24. package/dist/commands/cart/add.js +119 -0
  25. package/dist/commands/cart/add.js.map +1 -0
  26. package/dist/commands/cart/clear.d.ts +12 -0
  27. package/dist/commands/cart/clear.d.ts.map +1 -0
  28. package/dist/commands/cart/clear.js +49 -0
  29. package/dist/commands/cart/clear.js.map +1 -0
  30. package/dist/commands/cart/index.d.ts +8 -0
  31. package/dist/commands/cart/index.d.ts.map +1 -0
  32. package/dist/commands/cart/index.js +8 -0
  33. package/dist/commands/cart/index.js.map +1 -0
  34. package/dist/commands/cart/list.d.ts +14 -0
  35. package/dist/commands/cart/list.d.ts.map +1 -0
  36. package/dist/commands/cart/list.js +51 -0
  37. package/dist/commands/cart/list.js.map +1 -0
  38. package/dist/commands/cart/remove.d.ts +13 -0
  39. package/dist/commands/cart/remove.d.ts.map +1 -0
  40. package/dist/commands/cart/remove.js +24 -0
  41. package/dist/commands/cart/remove.js.map +1 -0
  42. package/dist/commands/credits.d.ts +10 -0
  43. package/dist/commands/credits.d.ts.map +1 -0
  44. package/dist/commands/credits.js +139 -0
  45. package/dist/commands/credits.js.map +1 -0
  46. package/dist/commands/dns/add.d.ts +30 -0
  47. package/dist/commands/dns/add.d.ts.map +1 -0
  48. package/dist/commands/dns/add.js +144 -0
  49. package/dist/commands/dns/add.js.map +1 -0
  50. package/dist/commands/dns/index.d.ts +7 -0
  51. package/dist/commands/dns/index.d.ts.map +1 -0
  52. package/dist/commands/dns/index.js +7 -0
  53. package/dist/commands/dns/index.js.map +1 -0
  54. package/dist/commands/dns/list.d.ts +24 -0
  55. package/dist/commands/dns/list.d.ts.map +1 -0
  56. package/dist/commands/dns/list.js +111 -0
  57. package/dist/commands/dns/list.js.map +1 -0
  58. package/dist/commands/dns/remove.d.ts +24 -0
  59. package/dist/commands/dns/remove.d.ts.map +1 -0
  60. package/dist/commands/dns/remove.js +137 -0
  61. package/dist/commands/dns/remove.js.map +1 -0
  62. package/dist/commands/domains/detail.d.ts +20 -0
  63. package/dist/commands/domains/detail.d.ts.map +1 -0
  64. package/dist/commands/domains/detail.js +112 -0
  65. package/dist/commands/domains/detail.js.map +1 -0
  66. package/dist/commands/domains/index.d.ts +6 -0
  67. package/dist/commands/domains/index.d.ts.map +1 -0
  68. package/dist/commands/domains/index.js +6 -0
  69. package/dist/commands/domains/index.js.map +1 -0
  70. package/dist/commands/domains/list.d.ts +21 -0
  71. package/dist/commands/domains/list.d.ts.map +1 -0
  72. package/dist/commands/domains/list.js +106 -0
  73. package/dist/commands/domains/list.js.map +1 -0
  74. package/dist/commands/hack.d.ts +9 -0
  75. package/dist/commands/hack.d.ts.map +1 -0
  76. package/dist/commands/hack.js +104 -0
  77. package/dist/commands/hack.js.map +1 -0
  78. package/dist/commands/integrations.d.ts +20 -0
  79. package/dist/commands/integrations.d.ts.map +1 -0
  80. package/dist/commands/integrations.js +92 -0
  81. package/dist/commands/integrations.js.map +1 -0
  82. package/dist/commands/login.d.ts +15 -0
  83. package/dist/commands/login.d.ts.map +1 -0
  84. package/dist/commands/login.js +95 -0
  85. package/dist/commands/login.js.map +1 -0
  86. package/dist/commands/logout.d.ts +13 -0
  87. package/dist/commands/logout.d.ts.map +1 -0
  88. package/dist/commands/logout.js +32 -0
  89. package/dist/commands/logout.js.map +1 -0
  90. package/dist/commands/search.d.ts +24 -0
  91. package/dist/commands/search.d.ts.map +1 -0
  92. package/dist/commands/search.js +162 -0
  93. package/dist/commands/search.js.map +1 -0
  94. package/dist/commands/settings/index.d.ts +6 -0
  95. package/dist/commands/settings/index.d.ts.map +1 -0
  96. package/dist/commands/settings/index.js +6 -0
  97. package/dist/commands/settings/index.js.map +1 -0
  98. package/dist/commands/settings/set.d.ts +25 -0
  99. package/dist/commands/settings/set.d.ts.map +1 -0
  100. package/dist/commands/settings/set.js +215 -0
  101. package/dist/commands/settings/set.js.map +1 -0
  102. package/dist/commands/settings/view.d.ts +17 -0
  103. package/dist/commands/settings/view.d.ts.map +1 -0
  104. package/dist/commands/settings/view.js +99 -0
  105. package/dist/commands/settings/view.js.map +1 -0
  106. package/dist/commands/team/add.d.ts +17 -0
  107. package/dist/commands/team/add.d.ts.map +1 -0
  108. package/dist/commands/team/add.js +64 -0
  109. package/dist/commands/team/add.js.map +1 -0
  110. package/dist/commands/team/index.d.ts +7 -0
  111. package/dist/commands/team/index.d.ts.map +1 -0
  112. package/dist/commands/team/index.js +7 -0
  113. package/dist/commands/team/index.js.map +1 -0
  114. package/dist/commands/team/list.d.ts +13 -0
  115. package/dist/commands/team/list.d.ts.map +1 -0
  116. package/dist/commands/team/list.js +51 -0
  117. package/dist/commands/team/list.js.map +1 -0
  118. package/dist/commands/team/remove.d.ts +14 -0
  119. package/dist/commands/team/remove.d.ts.map +1 -0
  120. package/dist/commands/team/remove.js +57 -0
  121. package/dist/commands/team/remove.js.map +1 -0
  122. package/dist/commands/vercel/index.d.ts +8 -0
  123. package/dist/commands/vercel/index.d.ts.map +1 -0
  124. package/dist/commands/vercel/index.js +8 -0
  125. package/dist/commands/vercel/index.js.map +1 -0
  126. package/dist/commands/vercel/link.d.ts +25 -0
  127. package/dist/commands/vercel/link.d.ts.map +1 -0
  128. package/dist/commands/vercel/link.js +176 -0
  129. package/dist/commands/vercel/link.js.map +1 -0
  130. package/dist/commands/vercel/setup.d.ts +13 -0
  131. package/dist/commands/vercel/setup.d.ts.map +1 -0
  132. package/dist/commands/vercel/setup.js +113 -0
  133. package/dist/commands/vercel/setup.js.map +1 -0
  134. package/dist/commands/vercel/status.d.ts +15 -0
  135. package/dist/commands/vercel/status.d.ts.map +1 -0
  136. package/dist/commands/vercel/status.js +103 -0
  137. package/dist/commands/vercel/status.js.map +1 -0
  138. package/dist/commands/vercel/unlink.d.ts +16 -0
  139. package/dist/commands/vercel/unlink.d.ts.map +1 -0
  140. package/dist/commands/vercel/unlink.js +118 -0
  141. package/dist/commands/vercel/unlink.js.map +1 -0
  142. package/dist/commands/webhooks/add.d.ts +16 -0
  143. package/dist/commands/webhooks/add.d.ts.map +1 -0
  144. package/dist/commands/webhooks/add.js +61 -0
  145. package/dist/commands/webhooks/add.js.map +1 -0
  146. package/dist/commands/webhooks/index.d.ts +7 -0
  147. package/dist/commands/webhooks/index.d.ts.map +1 -0
  148. package/dist/commands/webhooks/index.js +7 -0
  149. package/dist/commands/webhooks/index.js.map +1 -0
  150. package/dist/commands/webhooks/list.d.ts +14 -0
  151. package/dist/commands/webhooks/list.d.ts.map +1 -0
  152. package/dist/commands/webhooks/list.js +47 -0
  153. package/dist/commands/webhooks/list.js.map +1 -0
  154. package/dist/commands/webhooks/remove.d.ts +14 -0
  155. package/dist/commands/webhooks/remove.d.ts.map +1 -0
  156. package/dist/commands/webhooks/remove.js +57 -0
  157. package/dist/commands/webhooks/remove.js.map +1 -0
  158. package/dist/commands/whoami.d.ts +13 -0
  159. package/dist/commands/whoami.d.ts.map +1 -0
  160. package/dist/commands/whoami.js +33 -0
  161. package/dist/commands/whoami.js.map +1 -0
  162. package/dist/components/account-card.d.ts +17 -0
  163. package/dist/components/account-card.d.ts.map +1 -0
  164. package/dist/components/account-card.js +19 -0
  165. package/dist/components/account-card.js.map +1 -0
  166. package/dist/components/billing-table.d.ts +22 -0
  167. package/dist/components/billing-table.d.ts.map +1 -0
  168. package/dist/components/billing-table.js +53 -0
  169. package/dist/components/billing-table.js.map +1 -0
  170. package/dist/components/celebration.d.ts +21 -0
  171. package/dist/components/celebration.d.ts.map +1 -0
  172. package/dist/components/celebration.js +55 -0
  173. package/dist/components/celebration.js.map +1 -0
  174. package/dist/components/contact-form.d.ts +23 -0
  175. package/dist/components/contact-form.d.ts.map +1 -0
  176. package/dist/components/contact-form.js +109 -0
  177. package/dist/components/contact-form.js.map +1 -0
  178. package/dist/components/dns-table.d.ts +14 -0
  179. package/dist/components/dns-table.d.ts.map +1 -0
  180. package/dist/components/dns-table.js +71 -0
  181. package/dist/components/dns-table.js.map +1 -0
  182. package/dist/components/domain-card.d.ts +14 -0
  183. package/dist/components/domain-card.d.ts.map +1 -0
  184. package/dist/components/domain-card.js +41 -0
  185. package/dist/components/domain-card.js.map +1 -0
  186. package/dist/components/domain-table.d.ts +30 -0
  187. package/dist/components/domain-table.d.ts.map +1 -0
  188. package/dist/components/domain-table.js +87 -0
  189. package/dist/components/domain-table.js.map +1 -0
  190. package/dist/components/error-display.d.ts +25 -0
  191. package/dist/components/error-display.d.ts.map +1 -0
  192. package/dist/components/error-display.js +51 -0
  193. package/dist/components/error-display.js.map +1 -0
  194. package/dist/components/layout.d.ts +14 -0
  195. package/dist/components/layout.d.ts.map +1 -0
  196. package/dist/components/layout.js +21 -0
  197. package/dist/components/layout.js.map +1 -0
  198. package/dist/components/logo.d.ts +37 -0
  199. package/dist/components/logo.d.ts.map +1 -0
  200. package/dist/components/logo.js +70 -0
  201. package/dist/components/logo.js.map +1 -0
  202. package/dist/components/matrix-rain.d.ts +17 -0
  203. package/dist/components/matrix-rain.d.ts.map +1 -0
  204. package/dist/components/matrix-rain.js +105 -0
  205. package/dist/components/matrix-rain.js.map +1 -0
  206. package/dist/components/purchase-confirmation.d.ts +17 -0
  207. package/dist/components/purchase-confirmation.d.ts.map +1 -0
  208. package/dist/components/purchase-confirmation.js +17 -0
  209. package/dist/components/purchase-confirmation.js.map +1 -0
  210. package/dist/components/search-results.d.ts +30 -0
  211. package/dist/components/search-results.d.ts.map +1 -0
  212. package/dist/components/search-results.js +53 -0
  213. package/dist/components/search-results.js.map +1 -0
  214. package/dist/components/settings-card.d.ts +14 -0
  215. package/dist/components/settings-card.d.ts.map +1 -0
  216. package/dist/components/settings-card.js +40 -0
  217. package/dist/components/settings-card.js.map +1 -0
  218. package/dist/components/spinner-messages.d.ts +19 -0
  219. package/dist/components/spinner-messages.d.ts.map +1 -0
  220. package/dist/components/spinner-messages.js +55 -0
  221. package/dist/components/spinner-messages.js.map +1 -0
  222. package/dist/lib/achievements.d.ts +107 -0
  223. package/dist/lib/achievements.d.ts.map +1 -0
  224. package/dist/lib/achievements.js +341 -0
  225. package/dist/lib/achievements.js.map +1 -0
  226. package/dist/lib/auth.d.ts +45 -0
  227. package/dist/lib/auth.d.ts.map +1 -0
  228. package/dist/lib/auth.js +125 -0
  229. package/dist/lib/auth.js.map +1 -0
  230. package/dist/lib/cart.d.ts +69 -0
  231. package/dist/lib/cart.d.ts.map +1 -0
  232. package/dist/lib/cart.js +131 -0
  233. package/dist/lib/cart.js.map +1 -0
  234. package/dist/lib/config.d.ts +51 -0
  235. package/dist/lib/config.d.ts.map +1 -0
  236. package/dist/lib/config.js +116 -0
  237. package/dist/lib/config.js.map +1 -0
  238. package/dist/lib/dns-validation.d.ts +51 -0
  239. package/dist/lib/dns-validation.d.ts.map +1 -0
  240. package/dist/lib/dns-validation.js +185 -0
  241. package/dist/lib/dns-validation.js.map +1 -0
  242. package/dist/lib/easter-eggs.d.ts +21 -0
  243. package/dist/lib/easter-eggs.d.ts.map +1 -0
  244. package/dist/lib/easter-eggs.js +64 -0
  245. package/dist/lib/easter-eggs.js.map +1 -0
  246. package/dist/lib/error-personality.d.ts +35 -0
  247. package/dist/lib/error-personality.d.ts.map +1 -0
  248. package/dist/lib/error-personality.js +191 -0
  249. package/dist/lib/error-personality.js.map +1 -0
  250. package/dist/lib/errors.d.ts +8 -0
  251. package/dist/lib/errors.d.ts.map +1 -0
  252. package/dist/lib/errors.js +7 -0
  253. package/dist/lib/errors.js.map +1 -0
  254. package/dist/lib/konami.d.ts +51 -0
  255. package/dist/lib/konami.d.ts.map +1 -0
  256. package/dist/lib/konami.js +107 -0
  257. package/dist/lib/konami.js.map +1 -0
  258. package/dist/lib/loading-messages.d.ts +13 -0
  259. package/dist/lib/loading-messages.d.ts.map +1 -0
  260. package/dist/lib/loading-messages.js +13 -0
  261. package/dist/lib/loading-messages.js.map +1 -0
  262. package/dist/lib/namecom-client.d.ts +73 -0
  263. package/dist/lib/namecom-client.d.ts.map +1 -0
  264. package/dist/lib/namecom-client.js +260 -0
  265. package/dist/lib/namecom-client.js.map +1 -0
  266. package/dist/lib/nameserver-presets.d.ts +27 -0
  267. package/dist/lib/nameserver-presets.d.ts.map +1 -0
  268. package/dist/lib/nameserver-presets.js +45 -0
  269. package/dist/lib/nameserver-presets.js.map +1 -0
  270. package/dist/lib/purchase.d.ts +71 -0
  271. package/dist/lib/purchase.d.ts.map +1 -0
  272. package/dist/lib/purchase.js +160 -0
  273. package/dist/lib/purchase.js.map +1 -0
  274. package/dist/lib/schemas.d.ts +1968 -0
  275. package/dist/lib/schemas.d.ts.map +1 -0
  276. package/dist/lib/schemas.js +112 -0
  277. package/dist/lib/schemas.js.map +1 -0
  278. package/dist/lib/team.d.ts +71 -0
  279. package/dist/lib/team.d.ts.map +1 -0
  280. package/dist/lib/team.js +135 -0
  281. package/dist/lib/team.js.map +1 -0
  282. package/dist/lib/theme.d.ts +152 -0
  283. package/dist/lib/theme.d.ts.map +1 -0
  284. package/dist/lib/theme.js +185 -0
  285. package/dist/lib/theme.js.map +1 -0
  286. package/dist/lib/types.d.ts +136 -0
  287. package/dist/lib/types.d.ts.map +1 -0
  288. package/dist/lib/types.js +19 -0
  289. package/dist/lib/types.js.map +1 -0
  290. package/dist/lib/vercel-client.d.ts +110 -0
  291. package/dist/lib/vercel-client.d.ts.map +1 -0
  292. package/dist/lib/vercel-client.js +196 -0
  293. package/dist/lib/vercel-client.js.map +1 -0
  294. package/dist/lib/webhooks.d.ts +83 -0
  295. package/dist/lib/webhooks.d.ts.map +1 -0
  296. package/dist/lib/webhooks.js +195 -0
  297. package/dist/lib/webhooks.js.map +1 -0
  298. package/package.json +66 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Rotating witty loading messages for search spinners.
3
+ *
4
+ * Used during domain search and other API-wait states
5
+ * to keep the user entertained.
6
+ */
7
+ const SEARCH_MESSAGES = [
8
+ "Consulting the domain gods...",
9
+ "Negotiating with ICANN...",
10
+ "Waking up the DNS elves...",
11
+ "Checking the cosmic registry...",
12
+ "Pinging the name servers...",
13
+ "Bribing the root servers...",
14
+ "Parsing the zone files...",
15
+ "Decrypting the WHOIS oracle...",
16
+ "Summoning the registrar spirits...",
17
+ "Querying the domain dimension...",
18
+ "Scanning the namespace...",
19
+ "Asking the internet nicely...",
20
+ "Dialing into the registry...",
21
+ "Running WHOIS in the matrix...",
22
+ "Consulting the great DNS tree...",
23
+ "Polishing the nameservers...",
24
+ "Herding the DNS packets...",
25
+ "Traversing the domain graph...",
26
+ "Calibrating the TLD scanner...",
27
+ "Warming up the search engines...",
28
+ "Interrogating the root zone...",
29
+ "Flipping through the domain catalog...",
30
+ ];
31
+ let lastIndex = -1;
32
+ /**
33
+ * Get a random loading message, avoiding repeats.
34
+ */
35
+ export function getRandomMessage() {
36
+ let index;
37
+ do {
38
+ index = Math.floor(Math.random() * SEARCH_MESSAGES.length);
39
+ } while (index === lastIndex && SEARCH_MESSAGES.length > 1);
40
+ lastIndex = index;
41
+ return SEARCH_MESSAGES[index];
42
+ }
43
+ /**
44
+ * Get all loading messages (for testing).
45
+ */
46
+ export function getAllMessages() {
47
+ return [...SEARCH_MESSAGES];
48
+ }
49
+ /**
50
+ * Reset the last index tracker (for testing).
51
+ */
52
+ export function resetMessageTracker() {
53
+ lastIndex = -1;
54
+ }
55
+ //# sourceMappingURL=spinner-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-messages.js","sourceRoot":"","sources":["../../src/components/spinner-messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,eAAe,GAAa;IAChC,+BAA+B;IAC/B,2BAA2B;IAC3B,4BAA4B;IAC5B,iCAAiC;IACjC,6BAA6B;IAC7B,6BAA6B;IAC7B,2BAA2B;IAC3B,gCAAgC;IAChC,oCAAoC;IACpC,kCAAkC;IAClC,2BAA2B;IAC3B,+BAA+B;IAC/B,8BAA8B;IAC9B,gCAAgC;IAChC,kCAAkC;IAClC,8BAA8B;IAC9B,4BAA4B;IAC5B,gCAAgC;IAChC,gCAAgC;IAChC,kCAAkC;IAClC,gCAAgC;IAChC,wCAAwC;CACzC,CAAC;AAEF,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;AAEnB;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,KAAa,CAAC;IAClB,GAAG,CAAC;QACF,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC,QAAQ,KAAK,KAAK,SAAS,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;IAE5D,SAAS,GAAG,KAAK,CAAC;IAClB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,eAAe,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,SAAS,GAAG,CAAC,CAAC,CAAC;AACjB,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Achievement system — persistent badges that reward CLI usage.
3
+ *
4
+ * Achievements are stored at ~/.dominion/achievements.json.
5
+ * Each achievement has a unique ID, display info, and unlock criteria
6
+ * checked after relevant operations.
7
+ */
8
+ export type AchievementId = "first_domain" | "collector" | "dns_wizard" | "speed_demon" | "night_owl" | "early_adopter" | "search_addict" | "cart_hoarder" | "friday_13th" | "konami_master";
9
+ export interface AchievementDef {
10
+ id: AchievementId;
11
+ name: string;
12
+ description: string;
13
+ icon: string;
14
+ /** ASCII trophy badge art */
15
+ badge: string;
16
+ }
17
+ export interface UnlockedAchievement {
18
+ id: AchievementId;
19
+ unlockedAt: string;
20
+ }
21
+ export interface AchievementsData {
22
+ unlocked: UnlockedAchievement[];
23
+ stats: {
24
+ domainsRegistered: number;
25
+ dnsRecordsCreated: number;
26
+ searchesPerformed: number;
27
+ fastestPurchaseSec: number | null;
28
+ };
29
+ }
30
+ export declare const ACHIEVEMENTS: Record<AchievementId, AchievementDef>;
31
+ export declare class AchievementManager {
32
+ private readonly filePath;
33
+ private readonly dirPath;
34
+ constructor(configDir?: string);
35
+ /**
36
+ * Load achievements data from disk.
37
+ */
38
+ load(): AchievementsData;
39
+ /**
40
+ * Save achievements data to disk.
41
+ */
42
+ save(data: AchievementsData): void;
43
+ /**
44
+ * Check if an achievement is already unlocked.
45
+ */
46
+ isUnlocked(id: AchievementId): boolean;
47
+ /**
48
+ * Unlock an achievement. Returns true if newly unlocked, false if already had it.
49
+ */
50
+ unlock(id: AchievementId): boolean;
51
+ /**
52
+ * Get all unlocked achievements.
53
+ */
54
+ getUnlocked(): UnlockedAchievement[];
55
+ /**
56
+ * Get the count of unlocked achievements.
57
+ */
58
+ getUnlockedCount(): number;
59
+ /**
60
+ * Get total number of possible achievements.
61
+ */
62
+ getTotalCount(): number;
63
+ /**
64
+ * Get current stats.
65
+ */
66
+ getStats(): AchievementsData["stats"];
67
+ /**
68
+ * Update a stat and check for related achievements.
69
+ * Returns array of newly unlocked achievement IDs.
70
+ */
71
+ updateStat(stat: keyof AchievementsData["stats"], value: number): AchievementId[];
72
+ /**
73
+ * Increment a numeric stat by 1 and check achievements.
74
+ * Returns array of newly unlocked achievement IDs.
75
+ */
76
+ incrementStat(stat: "domainsRegistered" | "dnsRecordsCreated" | "searchesPerformed"): AchievementId[];
77
+ /**
78
+ * Check time-based achievements (night owl, friday 13th).
79
+ * Call this on CLI startup.
80
+ */
81
+ checkTimeBased(now?: Date): AchievementId[];
82
+ /**
83
+ * Check if current version qualifies for early adopter.
84
+ */
85
+ checkEarlyAdopter(version: string): boolean;
86
+ /**
87
+ * Get the file path (for testing / display).
88
+ */
89
+ getFilePath(): string;
90
+ }
91
+ /**
92
+ * Format an achievement for display as a single line.
93
+ */
94
+ export declare function formatAchievement(id: AchievementId, unlocked: boolean): string;
95
+ /**
96
+ * Format the full achievement list for display.
97
+ */
98
+ export declare function formatAllAchievements(unlockedIds: AchievementId[]): string;
99
+ /**
100
+ * Check if today is Friday the 13th.
101
+ */
102
+ export declare function isFridayThe13th(date?: Date): boolean;
103
+ /**
104
+ * Spooky loading messages for Friday the 13th mode.
105
+ */
106
+ export declare const SPOOKY_MESSAGES: string[];
107
+ //# sourceMappingURL=achievements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"achievements.d.ts","sourceRoot":"","sources":["../../src/lib/achievements.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,WAAW,GACX,YAAY,GACZ,aAAa,GACb,WAAW,GACX,eAAe,GACf,eAAe,GACf,cAAc,GACd,aAAa,GACb,eAAe,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,aAAa,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,aAAa,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,KAAK,EAAE;QACL,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC,CAAC;CACH;AAsCD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,cAAc,CAuE9D,CAAC;AAgBF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,SAAS,CAAC,EAAE,MAAM;IAK9B;;OAEG;IACH,IAAI,IAAI,gBAAgB;IAoBxB;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAOlC;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO;IAKtC;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO;IAclC;;OAEG;IACH,WAAW,IAAI,mBAAmB,EAAE;IAIpC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,QAAQ,IAAI,gBAAgB,CAAC,OAAO,CAAC;IAIrC;;;OAGG;IACH,UAAU,CACR,IAAI,EAAE,MAAM,gBAAgB,CAAC,OAAO,CAAC,EACrC,KAAK,EAAE,MAAM,GACZ,aAAa,EAAE;IA4ClB;;;OAGG;IACH,aAAa,CACX,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,GAAG,mBAAmB,GACpE,aAAa,EAAE;IAMlB;;;OAGG;IACH,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,aAAa,EAAE;IAoB3C;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAS3C;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAI9E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,aAAa,EAAE,GAC3B,MAAM,CAUR;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAGpD;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,EAWnC,CAAC"}
@@ -0,0 +1,341 @@
1
+ /**
2
+ * Achievement system — persistent badges that reward CLI usage.
3
+ *
4
+ * Achievements are stored at ~/.dominion/achievements.json.
5
+ * Each achievement has a unique ID, display info, and unlock criteria
6
+ * checked after relevant operations.
7
+ */
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { homedir } from "node:os";
11
+ // ─── Achievement Definitions ─────────────────────────────────────────────────
12
+ const TROPHY_SMALL = `
13
+ ___
14
+ '._.'
15
+ | |
16
+ _|_|_
17
+ `;
18
+ const STAR_BADGE = `
19
+ *
20
+ /|\\
21
+ / | \\
22
+ / | \\
23
+ \\ | /
24
+ \\ | /
25
+ \\|/
26
+ `;
27
+ const LIGHTNING_BADGE = `
28
+ /|
29
+ / |
30
+ / |
31
+ / /
32
+ /
33
+ /
34
+ /
35
+ `;
36
+ const OWL_BADGE = `
37
+ ,___,
38
+ [O.o]
39
+ /)__)
40
+ -"--"-
41
+ `;
42
+ export const ACHIEVEMENTS = {
43
+ first_domain: {
44
+ id: "first_domain",
45
+ name: "First Domain",
46
+ description: "Register your first domain through the CLI",
47
+ icon: "🏆",
48
+ badge: TROPHY_SMALL,
49
+ },
50
+ collector: {
51
+ id: "collector",
52
+ name: "Collector",
53
+ description: "Register 10 domains",
54
+ icon: "📦",
55
+ badge: STAR_BADGE,
56
+ },
57
+ dns_wizard: {
58
+ id: "dns_wizard",
59
+ name: "DNS Wizard",
60
+ description: "Create 50 DNS records",
61
+ icon: "🧙",
62
+ badge: STAR_BADGE,
63
+ },
64
+ speed_demon: {
65
+ id: "speed_demon",
66
+ name: "Speed Demon",
67
+ description: "Complete a purchase in under 30 seconds",
68
+ icon: "⚡",
69
+ badge: LIGHTNING_BADGE,
70
+ },
71
+ night_owl: {
72
+ id: "night_owl",
73
+ name: "Night Owl",
74
+ description: "Use the CLI between 12am and 5am",
75
+ icon: "🦉",
76
+ badge: OWL_BADGE,
77
+ },
78
+ early_adopter: {
79
+ id: "early_adopter",
80
+ name: "Early Adopter",
81
+ description: "Install before v1.0",
82
+ icon: "🌟",
83
+ badge: STAR_BADGE,
84
+ },
85
+ search_addict: {
86
+ id: "search_addict",
87
+ name: "Search Addict",
88
+ description: "Perform 100 domain searches",
89
+ icon: "🔍",
90
+ badge: STAR_BADGE,
91
+ },
92
+ cart_hoarder: {
93
+ id: "cart_hoarder",
94
+ name: "Cart Hoarder",
95
+ description: "Have 10 or more domains in your cart at once",
96
+ icon: "🛒",
97
+ badge: STAR_BADGE,
98
+ },
99
+ friday_13th: {
100
+ id: "friday_13th",
101
+ name: "Superstitious",
102
+ description: "Use the CLI on Friday the 13th",
103
+ icon: "💀",
104
+ badge: TROPHY_SMALL,
105
+ },
106
+ konami_master: {
107
+ id: "konami_master",
108
+ name: "Konami Master",
109
+ description: "Enter the Konami code",
110
+ icon: "🎮",
111
+ badge: TROPHY_SMALL,
112
+ },
113
+ };
114
+ // ─── Default Data ──────────────────────────────────────────────────────────
115
+ const DEFAULT_DATA = {
116
+ unlocked: [],
117
+ stats: {
118
+ domainsRegistered: 0,
119
+ dnsRecordsCreated: 0,
120
+ searchesPerformed: 0,
121
+ fastestPurchaseSec: null,
122
+ },
123
+ };
124
+ // ─── AchievementManager ────────────────────────────────────────────────────
125
+ export class AchievementManager {
126
+ filePath;
127
+ dirPath;
128
+ constructor(configDir) {
129
+ this.dirPath = configDir ?? join(homedir(), ".dominion");
130
+ this.filePath = join(this.dirPath, "achievements.json");
131
+ }
132
+ /**
133
+ * Load achievements data from disk.
134
+ */
135
+ load() {
136
+ if (!existsSync(this.filePath)) {
137
+ return { ...DEFAULT_DATA, unlocked: [], stats: { ...DEFAULT_DATA.stats } };
138
+ }
139
+ try {
140
+ const raw = readFileSync(this.filePath, "utf-8");
141
+ const parsed = JSON.parse(raw);
142
+ return {
143
+ unlocked: parsed.unlocked ?? [],
144
+ stats: {
145
+ ...DEFAULT_DATA.stats,
146
+ ...parsed.stats,
147
+ },
148
+ };
149
+ }
150
+ catch {
151
+ return { ...DEFAULT_DATA, unlocked: [], stats: { ...DEFAULT_DATA.stats } };
152
+ }
153
+ }
154
+ /**
155
+ * Save achievements data to disk.
156
+ */
157
+ save(data) {
158
+ if (!existsSync(this.dirPath)) {
159
+ mkdirSync(this.dirPath, { recursive: true });
160
+ }
161
+ writeFileSync(this.filePath, JSON.stringify(data, null, 2), "utf-8");
162
+ }
163
+ /**
164
+ * Check if an achievement is already unlocked.
165
+ */
166
+ isUnlocked(id) {
167
+ const data = this.load();
168
+ return data.unlocked.some((a) => a.id === id);
169
+ }
170
+ /**
171
+ * Unlock an achievement. Returns true if newly unlocked, false if already had it.
172
+ */
173
+ unlock(id) {
174
+ if (this.isUnlocked(id)) {
175
+ return false;
176
+ }
177
+ const data = this.load();
178
+ data.unlocked.push({
179
+ id,
180
+ unlockedAt: new Date().toISOString(),
181
+ });
182
+ this.save(data);
183
+ return true;
184
+ }
185
+ /**
186
+ * Get all unlocked achievements.
187
+ */
188
+ getUnlocked() {
189
+ return this.load().unlocked;
190
+ }
191
+ /**
192
+ * Get the count of unlocked achievements.
193
+ */
194
+ getUnlockedCount() {
195
+ return this.load().unlocked.length;
196
+ }
197
+ /**
198
+ * Get total number of possible achievements.
199
+ */
200
+ getTotalCount() {
201
+ return Object.keys(ACHIEVEMENTS).length;
202
+ }
203
+ /**
204
+ * Get current stats.
205
+ */
206
+ getStats() {
207
+ return this.load().stats;
208
+ }
209
+ /**
210
+ * Update a stat and check for related achievements.
211
+ * Returns array of newly unlocked achievement IDs.
212
+ */
213
+ updateStat(stat, value) {
214
+ const data = this.load();
215
+ const newlyUnlocked = [];
216
+ if (stat === "fastestPurchaseSec") {
217
+ if (data.stats.fastestPurchaseSec === null || value < data.stats.fastestPurchaseSec) {
218
+ data.stats.fastestPurchaseSec = value;
219
+ }
220
+ }
221
+ else {
222
+ data.stats[stat] = value;
223
+ }
224
+ this.save(data);
225
+ // Check stat-based achievements
226
+ if (stat === "domainsRegistered") {
227
+ if (value >= 1 && !this.isUnlocked("first_domain")) {
228
+ this.unlock("first_domain");
229
+ newlyUnlocked.push("first_domain");
230
+ }
231
+ if (value >= 10 && !this.isUnlocked("collector")) {
232
+ this.unlock("collector");
233
+ newlyUnlocked.push("collector");
234
+ }
235
+ }
236
+ if (stat === "dnsRecordsCreated" && value >= 50 && !this.isUnlocked("dns_wizard")) {
237
+ this.unlock("dns_wizard");
238
+ newlyUnlocked.push("dns_wizard");
239
+ }
240
+ if (stat === "searchesPerformed" && value >= 100 && !this.isUnlocked("search_addict")) {
241
+ this.unlock("search_addict");
242
+ newlyUnlocked.push("search_addict");
243
+ }
244
+ if (stat === "fastestPurchaseSec" && value < 30 && !this.isUnlocked("speed_demon")) {
245
+ this.unlock("speed_demon");
246
+ newlyUnlocked.push("speed_demon");
247
+ }
248
+ return newlyUnlocked;
249
+ }
250
+ /**
251
+ * Increment a numeric stat by 1 and check achievements.
252
+ * Returns array of newly unlocked achievement IDs.
253
+ */
254
+ incrementStat(stat) {
255
+ const data = this.load();
256
+ const newValue = data.stats[stat] + 1;
257
+ return this.updateStat(stat, newValue);
258
+ }
259
+ /**
260
+ * Check time-based achievements (night owl, friday 13th).
261
+ * Call this on CLI startup.
262
+ */
263
+ checkTimeBased(now) {
264
+ const date = now ?? new Date();
265
+ const newlyUnlocked = [];
266
+ // Night Owl: 12am - 5am
267
+ const hour = date.getHours();
268
+ if (hour >= 0 && hour < 5 && !this.isUnlocked("night_owl")) {
269
+ this.unlock("night_owl");
270
+ newlyUnlocked.push("night_owl");
271
+ }
272
+ // Friday the 13th
273
+ if (date.getDay() === 5 && date.getDate() === 13 && !this.isUnlocked("friday_13th")) {
274
+ this.unlock("friday_13th");
275
+ newlyUnlocked.push("friday_13th");
276
+ }
277
+ return newlyUnlocked;
278
+ }
279
+ /**
280
+ * Check if current version qualifies for early adopter.
281
+ */
282
+ checkEarlyAdopter(version) {
283
+ const major = parseInt(version.split(".")[0], 10);
284
+ if (major < 1 && !this.isUnlocked("early_adopter")) {
285
+ this.unlock("early_adopter");
286
+ return true;
287
+ }
288
+ return false;
289
+ }
290
+ /**
291
+ * Get the file path (for testing / display).
292
+ */
293
+ getFilePath() {
294
+ return this.filePath;
295
+ }
296
+ }
297
+ // ─── Formatting Helpers ──────────────────────────────────────────────────────
298
+ /**
299
+ * Format an achievement for display as a single line.
300
+ */
301
+ export function formatAchievement(id, unlocked) {
302
+ const def = ACHIEVEMENTS[id];
303
+ const status = unlocked ? `${def.icon} ` : "[ ] ";
304
+ return `${status}${def.name} — ${def.description}`;
305
+ }
306
+ /**
307
+ * Format the full achievement list for display.
308
+ */
309
+ export function formatAllAchievements(unlockedIds) {
310
+ const unlockedSet = new Set(unlockedIds);
311
+ const lines = [];
312
+ for (const id of Object.keys(ACHIEVEMENTS)) {
313
+ const isUnlocked = unlockedSet.has(id);
314
+ lines.push(formatAchievement(id, isUnlocked));
315
+ }
316
+ return lines.join("\n");
317
+ }
318
+ // ─── Friday the 13th ─────────────────────────────────────────────────────────
319
+ /**
320
+ * Check if today is Friday the 13th.
321
+ */
322
+ export function isFridayThe13th(date) {
323
+ const d = date ?? new Date();
324
+ return d.getDay() === 5 && d.getDate() === 13;
325
+ }
326
+ /**
327
+ * Spooky loading messages for Friday the 13th mode.
328
+ */
329
+ export const SPOOKY_MESSAGES = [
330
+ "Summoning the undead nameservers...",
331
+ "The DNS is coming from INSIDE the house...",
332
+ "Resurrecting expired domains from the graveyard...",
333
+ "Performing a dark ritual on the zone files...",
334
+ "Consulting the ouija board for DNS records...",
335
+ "The ghost of domains past haunts this query...",
336
+ "Blood moon rising over the registrar...",
337
+ "Exorcising the cache demons...",
338
+ "Awakening the ancient root servers...",
339
+ "The cursed WHOIS speaks...",
340
+ ];
341
+ //# sourceMappingURL=achievements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"achievements.js","sourceRoot":"","sources":["../../src/lib/achievements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Auth utilities for login, logout, and whoami flows.
3
+ *
4
+ * Handles credential validation, storage, and retrieval.
5
+ * All credentials stored in ~/.dominion/config.json with 0600 permissions.
6
+ */
7
+ import { ConfigManager } from "./config.js";
8
+ export interface AuthStatus {
9
+ authenticated: boolean;
10
+ username?: string;
11
+ domainCount?: number;
12
+ configPath: string;
13
+ }
14
+ export interface ValidateResult {
15
+ success: boolean;
16
+ username: string;
17
+ domainCount: number;
18
+ error?: string;
19
+ }
20
+ /**
21
+ * Validate Name.com credentials by calling listDomains().
22
+ * Returns domain count on success for display in whoami.
23
+ */
24
+ export declare function validateCredentials(username: string, token: string): Promise<ValidateResult>;
25
+ /**
26
+ * Save validated credentials to config.
27
+ */
28
+ export declare function saveCredentials(username: string, token: string, configManager?: ConfigManager): void;
29
+ /**
30
+ * Clear credentials from config (logout).
31
+ */
32
+ export declare function clearCredentials(configManager?: ConfigManager): void;
33
+ /**
34
+ * Check current auth status without making API calls.
35
+ */
36
+ export declare function getAuthStatus(configManager?: ConfigManager): AuthStatus;
37
+ /**
38
+ * Check auth status with an API call to get live domain count.
39
+ */
40
+ export declare function getAuthStatusWithDomainCount(configManager?: ConfigManager): Promise<AuthStatus>;
41
+ /**
42
+ * Open a URL in the default browser.
43
+ */
44
+ export declare function openInBrowser(url: string): Promise<void>;
45
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK5C,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CA0BzB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,aAAa,GAC5B,IAAI,CAGN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAGpE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,UAAU,CAUvE;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,UAAU,CAAC,CAgCrB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9D"}