@hasna/skills 0.1.12 → 0.1.14

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 (197) hide show
  1. package/bin/index.js +639 -291
  2. package/bin/mcp.js +301 -180
  3. package/dist/index.d.ts +4 -2
  4. package/dist/index.js +190 -2
  5. package/dist/lib/config.d.ts +27 -0
  6. package/dist/lib/config.test.d.ts +1 -0
  7. package/dist/lib/installer.d.ts +25 -0
  8. package/dist/lib/registry.d.ts +4 -0
  9. package/dist/types/api.d.ts +74 -0
  10. package/package.json +5 -2
  11. package/skills/skill-academic-journal-matcher/bin/cli.ts +34 -0
  12. package/skills/skill-action-item-router/bin/cli.ts +34 -0
  13. package/skills/skill-ad-creative-generator/bin/cli.ts +34 -0
  14. package/skills/skill-advanced-math/bin/cli.ts +34 -0
  15. package/skills/skill-analyze-data/bin/cli.ts +19 -0
  16. package/skills/skill-anomaly-investigator/bin/cli.ts +34 -0
  17. package/skills/skill-api-test-suite/bin/cli.ts +34 -0
  18. package/skills/skill-apidocs/bin/cli.ts +87 -0
  19. package/skills/skill-audio-cleanup-lab/bin/cli.ts +6 -0
  20. package/skills/skill-audiobook-chapter-proofer/bin/cli.ts +34 -0
  21. package/skills/skill-banner-ad-suite/bin/cli.ts +34 -0
  22. package/skills/skill-benchmark-finder/bin/cli.ts +34 -0
  23. package/skills/skill-bio-sequence-tool/bin/cli.ts +34 -0
  24. package/skills/skill-blog-topic-cluster/bin/cli.ts +34 -0
  25. package/skills/skill-brand-style-guide/bin/cli.ts +19 -0
  26. package/skills/skill-brand-voice-audit/bin/cli.ts +34 -0
  27. package/skills/skill-budget-variance-analyzer/bin/cli.ts +6 -0
  28. package/skills/skill-businessactivity/bin/cli.ts +28 -0
  29. package/skills/skill-calendar-events/bin/cli.ts +34 -0
  30. package/skills/skill-campaign-metric-brief/bin/cli.ts +34 -0
  31. package/skills/skill-campaign-moodboard/bin/cli.ts +34 -0
  32. package/skills/skill-caption-style-stylist/bin/cli.ts +34 -0
  33. package/skills/skill-chemistry-calculator/bin/cli.ts +34 -0
  34. package/skills/skill-churn-risk-notifier/bin/cli.ts +34 -0
  35. package/skills/skill-citation-formatter/bin/cli.ts +34 -0
  36. package/skills/skill-classroom-newsletter-kit/bin/cli.ts +34 -0
  37. package/skills/skill-color-palette-harmonizer/bin/cli.ts +34 -0
  38. package/skills/skill-competitor-ad-analyzer/bin/cli.ts +34 -0
  39. package/skills/skill-compliance-copy-check/bin/cli.ts +34 -0
  40. package/skills/skill-compliance-report-pack/bin/cli.ts +34 -0
  41. package/skills/skill-compress-video/bin/cli.ts +19 -0
  42. package/skills/skill-consolelog/bin/cli.ts +884 -0
  43. package/skills/skill-contract-plainlanguage/bin/cli.ts +34 -0
  44. package/skills/skill-copytone-translator/bin/cli.ts +34 -0
  45. package/skills/skill-create-blog-article/bin/cli.ts +34 -0
  46. package/skills/skill-create-ebook/bin/cli.ts +34 -0
  47. package/skills/skill-crm-note-enhancer/bin/cli.ts +34 -0
  48. package/skills/skill-customer-journey-mapper/bin/cli.ts +34 -0
  49. package/skills/skill-dashboard-builder/bin/cli.ts +34 -0
  50. package/skills/skill-dashboard-narrator/bin/cli.ts +34 -0
  51. package/skills/skill-data-anonymizer/bin/cli.ts +34 -0
  52. package/skills/skill-database-explorer/bin/cli.ts +34 -0
  53. package/skills/skill-dataset-health-check/bin/cli.ts +34 -0
  54. package/skills/skill-decision-journal/bin/cli.ts +34 -0
  55. package/skills/skill-delegation-brief-writer/bin/cli.ts +34 -0
  56. package/skills/skill-destination-briefing/bin/cli.ts +34 -0
  57. package/skills/skill-diff-viewer/bin/cli.ts +34 -0
  58. package/skills/skill-domainpurchase/SKILL.md +46 -0
  59. package/skills/skill-domainpurchase/bin/cli.ts +683 -0
  60. package/skills/skill-domainsearch/SKILL.md +41 -0
  61. package/skills/skill-domainsearch/bin/cli.ts +410 -0
  62. package/skills/skill-educational-resource-finder/bin/cli.ts +34 -0
  63. package/skills/skill-email-campaign/bin/cli.ts +34 -0
  64. package/skills/skill-exam-readiness-check/bin/cli.ts +34 -0
  65. package/skills/skill-experiment-power-calculator/bin/cli.ts +34 -0
  66. package/skills/skill-extract-audio/bin/cli.ts +19 -0
  67. package/skills/skill-extract-frames/bin/cli.ts +34 -0
  68. package/skills/skill-extract-invoice/bin/cli.ts +34 -0
  69. package/skills/skill-family-activity-curator/bin/cli.ts +34 -0
  70. package/skills/skill-faq-packager/bin/cli.ts +34 -0
  71. package/skills/skill-feedback-survey-designer/bin/cli.ts +34 -0
  72. package/skills/skill-field-trip-planner/bin/cli.ts +34 -0
  73. package/skills/skill-file-organizer/bin/cli.ts +34 -0
  74. package/skills/skill-folder-tree/bin/cli.ts +34 -0
  75. package/skills/skill-forecast-scenario-lab/bin/cli.ts +34 -0
  76. package/skills/skill-form-filler/bin/cli.ts +34 -0
  77. package/skills/skill-generate-api-client/bin/cli.ts +34 -0
  78. package/skills/skill-generate-book-cover/bin/cli.ts +34 -0
  79. package/skills/skill-generate-chart/bin/cli.ts +34 -0
  80. package/skills/skill-generate-diagram/bin/cli.ts +34 -0
  81. package/skills/skill-generate-dockerfile/bin/cli.ts +34 -0
  82. package/skills/skill-generate-documentation/bin/cli.ts +34 -0
  83. package/skills/skill-generate-docx/bin/cli.ts +6 -0
  84. package/skills/skill-generate-env/bin/cli.ts +34 -0
  85. package/skills/skill-generate-excel/bin/cli.ts +34 -0
  86. package/skills/skill-generate-favicon/bin/cli.ts +34 -0
  87. package/skills/skill-generate-mock-data/bin/cli.ts +34 -0
  88. package/skills/skill-generate-pdf/bin/cli.ts +6 -0
  89. package/skills/skill-generate-pr-description/bin/cli.ts +34 -0
  90. package/skills/skill-generate-presentation/bin/cli.ts +34 -0
  91. package/skills/skill-generate-qrcode/bin/cli.ts +34 -0
  92. package/skills/skill-generate-regex/bin/cli.ts +34 -0
  93. package/skills/skill-generate-resume/bin/cli.ts +34 -0
  94. package/skills/skill-generate-sitemap/bin/cli.ts +34 -0
  95. package/skills/skill-generate-social-posts/bin/cli.ts +34 -0
  96. package/skills/skill-generate-sql/bin/cli.ts +34 -0
  97. package/skills/skill-gif-maker/bin/cli.ts +34 -0
  98. package/skills/skill-github-manager/bin/cli.ts +34 -0
  99. package/skills/skill-gmail/bin/cli.ts +34 -0
  100. package/skills/skill-goal-quarterly-roadmap/bin/cli.ts +34 -0
  101. package/skills/skill-grant-application-drafter/bin/cli.ts +34 -0
  102. package/skills/skill-grocery-basket-optimizer/bin/cli.ts +34 -0
  103. package/skills/skill-guest-communication-suite/bin/cli.ts +34 -0
  104. package/skills/skill-habit-reflection-digest/bin/cli.ts +34 -0
  105. package/skills/skill-highlight-reel-generator/bin/cli.ts +34 -0
  106. package/skills/skill-homework-feedback-coach/bin/cli.ts +34 -0
  107. package/skills/skill-hook/bunfig.toml +5 -0
  108. package/skills/skill-household-maintenance-mgr/bin/cli.ts +34 -0
  109. package/skills/skill-http-server/bin/cli.ts +34 -0
  110. package/skills/skill-implementation/bunfig.toml +5 -0
  111. package/skills/skill-implementation-agent/bin/cli.ts +34 -0
  112. package/skills/skill-implementation-plan/bin/cli.ts +34 -0
  113. package/skills/skill-implementation-todo/bin/cli.ts +34 -0
  114. package/skills/skill-inbox-priority-planner/bin/cli.ts +34 -0
  115. package/skills/skill-invoice/bin/cli.ts +20 -0
  116. package/skills/skill-invoice-dispute-helper/bin/cli.ts +34 -0
  117. package/skills/skill-itinerary-architect/bin/cli.ts +34 -0
  118. package/skills/skill-jingle-composer/bin/cli.ts +34 -0
  119. package/skills/skill-kpi-digest-generator/bin/cli.ts +34 -0
  120. package/skills/skill-lab-notebook-formatter/bin/cli.ts +34 -0
  121. package/skills/skill-landing-page-copy/bin/cli.ts +34 -0
  122. package/skills/skill-latex-table-generator/bin/cli.ts +34 -0
  123. package/skills/skill-learning-style-profiler/bin/cli.ts +34 -0
  124. package/skills/skill-lesson-plan-customizer/bin/cli.ts +34 -0
  125. package/skills/skill-livestream-runofshow/bin/cli.ts +34 -0
  126. package/skills/skill-longform-structurer/bin/cli.ts +34 -0
  127. package/skills/skill-lorem-generator/bin/cli.ts +34 -0
  128. package/skills/skill-managehook/bin/cli.ts +241 -0
  129. package/skills/skill-managemcp/bin/cli.ts +241 -0
  130. package/skills/skill-manageskill/bin/cli.ts +241 -0
  131. package/skills/skill-markdown-validator/bin/cli.ts +34 -0
  132. package/skills/skill-mcp-builder/bin/cli.ts +34 -0
  133. package/skills/skill-meal-plan-designer/bin/cli.ts +34 -0
  134. package/skills/skill-meeting-insight-summarizer/bin/cli.ts +34 -0
  135. package/skills/skill-merge-pdfs/bin/cli.ts +34 -0
  136. package/skills/skill-microcopy-generator/bin/cli.ts +34 -0
  137. package/skills/skill-mindfulness-prompt-cache/bin/cli.ts +34 -0
  138. package/skills/skill-notion-manager/bin/cli.ts +34 -0
  139. package/skills/skill-onboarding-sequence-builder/bin/cli.ts +34 -0
  140. package/skills/skill-onsite-ops-checklist/bin/cli.ts +34 -0
  141. package/skills/skill-outreach-cadence-designer/bin/cli.ts +34 -0
  142. package/skills/skill-packaging-concept-studio/bin/cli.ts +34 -0
  143. package/skills/skill-packing-plan-pro/bin/cli.ts +34 -0
  144. package/skills/skill-parent-teacher-brief/bin/cli.ts +34 -0
  145. package/skills/skill-partner-kit-assembler/bin/cli.ts +34 -0
  146. package/skills/skill-payroll-change-prepper/bin/cli.ts +34 -0
  147. package/skills/skill-persona-based-adwriter/bin/cli.ts +34 -0
  148. package/skills/skill-persona-generator/bin/cli.ts +34 -0
  149. package/skills/skill-personal-daily-ops/bin/cli.ts +34 -0
  150. package/skills/skill-pet-care-scheduler/bin/cli.ts +34 -0
  151. package/skills/skill-podcast-show-notes/bin/cli.ts +34 -0
  152. package/skills/skill-presentation-theme-maker/bin/cli.ts +34 -0
  153. package/skills/skill-press-release-drafter/bin/cli.ts +34 -0
  154. package/skills/skill-print-collateral-designer/bin/cli.ts +34 -0
  155. package/skills/skill-procurement-scorecard/bin/cli.ts +34 -0
  156. package/skills/skill-product-demo-script/bin/cli.ts +34 -0
  157. package/skills/skill-product-mockup/bin/cli.ts +34 -0
  158. package/skills/skill-project-retro-companion/bin/cli.ts +34 -0
  159. package/skills/skill-proposal-redline-advisor/bin/cli.ts +34 -0
  160. package/skills/skill-regex-tester/bin/cli.ts +34 -0
  161. package/skills/skill-remove-background/bin/cli.ts +34 -0
  162. package/skills/skill-risk-disclosure-kit/bin/cli.ts +34 -0
  163. package/skills/skill-roi-comparison-tool/bin/cli.ts +34 -0
  164. package/skills/skill-sales-call-recapper/bin/cli.ts +34 -0
  165. package/skills/skill-salescopy/bin/cli.ts +20 -0
  166. package/skills/skill-scaffold-project/bin/cli.ts +34 -0
  167. package/skills/skill-scholarship-tracker/bin/cli.ts +34 -0
  168. package/skills/skill-scientific-figure-check/bin/cli.ts +34 -0
  169. package/skills/skill-seating-chart-maker/bin/cli.ts +34 -0
  170. package/skills/skill-security-audit/bin/cli.ts +34 -0
  171. package/skills/skill-seo-brief-builder/bin/cli.ts +34 -0
  172. package/skills/skill-slack-assistant/bin/cli.ts +34 -0
  173. package/skills/skill-sleep-routine-analyzer/bin/cli.ts +34 -0
  174. package/skills/skill-social-media-kit/bin/cli.ts +34 -0
  175. package/skills/skill-split-pdf/bin/cli.ts +34 -0
  176. package/skills/skill-sponsorship-proposal-lab/bin/cli.ts +34 -0
  177. package/skills/skill-spreadsheet-cleanroom/bin/cli.ts +34 -0
  178. package/skills/skill-statistical-test-selector/bin/cli.ts +34 -0
  179. package/skills/skill-stress-relief-playbook/bin/cli.ts +34 -0
  180. package/skills/skill-study-guide-builder/bin/cli.ts +34 -0
  181. package/skills/skill-subscription-spend-watcher/bin/cli.ts +34 -0
  182. package/skills/skill-subtitle/bin/cli.ts +20 -0
  183. package/skills/skill-survey-insight-extractor/bin/cli.ts +34 -0
  184. package/skills/skill-terraform-generator/bin/cli.ts +34 -0
  185. package/skills/skill-testimonial-graphics/bin/cli.ts +34 -0
  186. package/skills/skill-timesheet/bin/cli.ts +47 -0
  187. package/skills/skill-travel-budget-balancer/bin/cli.ts +34 -0
  188. package/skills/skill-validate-config/bin/cli.ts +34 -0
  189. package/skills/skill-video-cut-suggester/bin/cli.ts +34 -0
  190. package/skills/skill-video-downloader/bin/cli.ts +34 -0
  191. package/skills/skill-video-thumbnail/bin/cli.ts +34 -0
  192. package/skills/skill-voiceover-casting-assistant/bin/cli.ts +34 -0
  193. package/skills/skill-watermark/bin/cli.ts +34 -0
  194. package/skills/skill-webcrawling/bin/cli.ts +21 -0
  195. package/skills/skill-webinar-script-coach/bin/cli.ts +34 -0
  196. package/skills/skill-wellness-progress-reporter/bin/cli.ts +34 -0
  197. package/skills/skill-workout-cycle-planner/bin/cli.ts +34 -0
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: Domain Search
3
+ description: Search domain availability and suggestions via GoDaddy API
4
+ ---
5
+
6
+ # Domain Search
7
+
8
+ Search domain availability and get suggestions via the GoDaddy API. Provides both a CLI tool and an HTTP server for domain search workflows.
9
+
10
+ ## Features
11
+
12
+ - Check domain name availability
13
+ - Get domain suggestions based on keywords
14
+ - HTTP server mode for API-driven searches
15
+ - Configurable API endpoint and credentials
16
+
17
+ ## Usage
18
+
19
+ ```bash
20
+ # Run the CLI
21
+ skill-domainsearch
22
+
23
+ # Start the HTTP server
24
+ bun run start
25
+
26
+ # Development mode with watch
27
+ bun run dev
28
+ ```
29
+
30
+ ## Environment Variables
31
+
32
+ | Variable | Description |
33
+ |----------|-------------|
34
+ | `DOMAIN_API_KEY` | GoDaddy API key |
35
+ | `DOMAIN_API_SECRET` | GoDaddy API secret |
36
+ | `DOMAIN_CUSTOMER_ID` | GoDaddy customer ID |
37
+ | `DOMAIN_API_URL` | API base URL (default: `https://api.godaddy.com`) |
38
+
39
+ ## Configuration
40
+
41
+ Config is stored at `~/.config/service-domainsearch/config.json`. Environment variables take priority over the config file.
@@ -0,0 +1,410 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { Command } from "commander";
4
+ import {
5
+ loadConfig,
6
+ saveConfig,
7
+ CONFIG_FILE,
8
+ getApiKey,
9
+ getApiSecret,
10
+ getCustomerId,
11
+ } from "../src/lib/config";
12
+ import { domainApi, formatPrice } from "../src/lib/api-client";
13
+ import { ensureInstalled } from "../src/lib/installer";
14
+
15
+ // Ensure service directory exists on startup
16
+ ensureInstalled();
17
+
18
+ const program = new Command();
19
+
20
+ program
21
+ .name("service-domainsearch")
22
+ .description("CLI tool for searching and checking domain availability")
23
+ .version("1.0.0");
24
+
25
+ // ============ CONFIG COMMANDS ============
26
+
27
+ program
28
+ .command("config")
29
+ .description("Show or set configuration")
30
+ .option("--api-key <key>", "Set API key")
31
+ .option("--api-secret <secret>", "Set API secret")
32
+ .option("--customer-id <id>", "Set customer ID")
33
+ .option("--api-url <url>", "Set API URL")
34
+ .option("--show", "Show current configuration")
35
+ .action(async (options) => {
36
+ const config = loadConfig();
37
+
38
+ if (options.apiKey) {
39
+ saveConfig({ apiKey: options.apiKey });
40
+ console.log("API key saved");
41
+ }
42
+
43
+ if (options.apiSecret) {
44
+ saveConfig({ apiSecret: options.apiSecret });
45
+ console.log("API secret saved");
46
+ }
47
+
48
+ if (options.customerId) {
49
+ saveConfig({ customerId: options.customerId });
50
+ console.log("Customer ID saved");
51
+ }
52
+
53
+ if (options.apiUrl) {
54
+ saveConfig({ apiUrl: options.apiUrl });
55
+ console.log(`API URL set to: ${options.apiUrl}`);
56
+ }
57
+
58
+ if (
59
+ options.show ||
60
+ (!options.apiKey &&
61
+ !options.apiSecret &&
62
+ !options.customerId &&
63
+ !options.apiUrl)
64
+ ) {
65
+ const currentConfig = loadConfig();
66
+ console.log("\nConfiguration:");
67
+ console.log(` Config file: ${CONFIG_FILE}`);
68
+ console.log(` API URL: ${currentConfig.apiUrl}`);
69
+ console.log(
70
+ ` API Key: ${currentConfig.apiKey ? "***" + currentConfig.apiKey.slice(-4) : "(not set)"}`
71
+ );
72
+ console.log(
73
+ ` API Secret: ${currentConfig.apiSecret ? "***" + currentConfig.apiSecret.slice(-4) : "(not set)"}`
74
+ );
75
+ console.log(` Customer ID: ${currentConfig.customerId || "(not set)"}`);
76
+ }
77
+ });
78
+
79
+ // ============ CHECK COMMAND (single domain) ============
80
+
81
+ program
82
+ .command("check <domain>")
83
+ .description("Check availability of a single domain")
84
+ .option("-t, --type <type>", "Check type: REGISTRATION, RENEWAL, TRANSFER", "REGISTRATION")
85
+ .option("-p, --period <years>", "Registration period in years", "1")
86
+ .option("--json", "Output as JSON")
87
+ .action(async (domain, options) => {
88
+ try {
89
+ const result = await domainApi.checkAvailability(
90
+ domain,
91
+ options.type,
92
+ parseInt(options.period)
93
+ );
94
+
95
+ if (options.json) {
96
+ console.log(JSON.stringify(result, null, 2));
97
+ return;
98
+ }
99
+
100
+ const status = result.available ? "AVAILABLE" : "TAKEN";
101
+ const price = result.price
102
+ ? formatPrice(result.price, result.currency)
103
+ : "N/A";
104
+ const premium = result.registryPremiumPricing ? " [PREMIUM]" : "";
105
+
106
+ console.log(`\nDomain: ${domain}`);
107
+ console.log(`Status: ${status}`);
108
+ if (result.available) {
109
+ console.log(`Price: ${price}${premium}`);
110
+ console.log(`Period: ${result.period || 1} year(s)`);
111
+ }
112
+ } catch (error) {
113
+ console.error("Error:", error instanceof Error ? error.message : error);
114
+ process.exit(1);
115
+ }
116
+ });
117
+
118
+ // ============ BULK COMMAND (multiple domains) ============
119
+
120
+ program
121
+ .command("bulk <domains...>")
122
+ .description("Check availability of multiple domains")
123
+ .option("--json", "Output as JSON")
124
+ .option("--available-only", "Show only available domains")
125
+ .action(async (domains, options) => {
126
+ try {
127
+ const result = await domainApi.checkBulkAvailability(domains);
128
+
129
+ if (options.json) {
130
+ console.log(JSON.stringify(result, null, 2));
131
+ return;
132
+ }
133
+
134
+ const available = result.domains?.filter((d) => d.available) || [];
135
+ const taken = result.domains?.filter((d) => !d.available) || [];
136
+
137
+ if (options.availableOnly) {
138
+ console.log(`\nAvailable domains (${available.length}):\n`);
139
+ for (const d of available) {
140
+ const price = d.price ? formatPrice(d.price, d.currency) : "N/A";
141
+ const premium = d.registryPremiumPricing ? " [PREMIUM]" : "";
142
+ console.log(` ${d.domain.padEnd(30)} ${price}${premium}`);
143
+ }
144
+ } else {
145
+ console.log(`\nResults for ${domains.length} domains:\n`);
146
+
147
+ if (available.length > 0) {
148
+ console.log("AVAILABLE:");
149
+ for (const d of available) {
150
+ const price = d.price ? formatPrice(d.price, d.currency) : "N/A";
151
+ const premium = d.registryPremiumPricing ? " [PREMIUM]" : "";
152
+ console.log(` ${d.domain.padEnd(30)} ${price}${premium}`);
153
+ }
154
+ }
155
+
156
+ if (taken.length > 0) {
157
+ console.log("\nTAKEN:");
158
+ for (const d of taken) {
159
+ console.log(` ${d.domain}`);
160
+ }
161
+ }
162
+
163
+ if (result.errors?.length) {
164
+ console.log("\nERRORS:");
165
+ for (const e of result.errors) {
166
+ console.log(` ${e.domain}: ${e.message}`);
167
+ }
168
+ }
169
+ }
170
+
171
+ console.log(
172
+ `\nSummary: ${available.length} available, ${taken.length} taken, ${result.errors?.length || 0} errors`
173
+ );
174
+ } catch (error) {
175
+ console.error("Error:", error instanceof Error ? error.message : error);
176
+ process.exit(1);
177
+ }
178
+ });
179
+
180
+ // ============ SEARCH COMMAND (with TLD variations) ============
181
+
182
+ program
183
+ .command("search <name>")
184
+ .description("Search for domain availability across multiple TLDs")
185
+ .option(
186
+ "-e, --extensions <tlds>",
187
+ "Comma-separated TLDs to check",
188
+ "com,net,org,io,co,ai,dev"
189
+ )
190
+ .option("--json", "Output as JSON")
191
+ .option("--available-only", "Show only available domains")
192
+ .action(async (name, options) => {
193
+ try {
194
+ const tlds = options.extensions.split(",").map((t: string) => t.trim());
195
+ const domains = tlds.map((tld: string) => `${name}.${tld}`);
196
+
197
+ console.log(`\nSearching for "${name}" across ${tlds.length} TLDs...\n`);
198
+
199
+ const result = await domainApi.checkBulkAvailability(domains);
200
+
201
+ if (options.json) {
202
+ console.log(JSON.stringify(result, null, 2));
203
+ return;
204
+ }
205
+
206
+ const available = result.domains?.filter((d) => d.available) || [];
207
+ const taken = result.domains?.filter((d) => !d.available) || [];
208
+
209
+ // Sort by price
210
+ available.sort((a, b) => (a.price || 0) - (b.price || 0));
211
+
212
+ if (available.length > 0) {
213
+ console.log("AVAILABLE:");
214
+ for (const d of available) {
215
+ const price = d.price ? formatPrice(d.price, d.currency) : "N/A";
216
+ const premium = d.registryPremiumPricing ? " [PREMIUM]" : "";
217
+ console.log(` ${d.domain.padEnd(30)} ${price}${premium}`);
218
+ }
219
+ }
220
+
221
+ if (!options.availableOnly && taken.length > 0) {
222
+ console.log("\nTAKEN:");
223
+ for (const d of taken) {
224
+ console.log(` ${d.domain}`);
225
+ }
226
+ }
227
+
228
+ if (result.errors?.length) {
229
+ console.log("\nERRORS (TLD not supported):");
230
+ for (const e of result.errors) {
231
+ console.log(` ${e.domain}`);
232
+ }
233
+ }
234
+
235
+ console.log(
236
+ `\nSummary: ${available.length} available, ${taken.length} taken`
237
+ );
238
+ } catch (error) {
239
+ console.error("Error:", error instanceof Error ? error.message : error);
240
+ process.exit(1);
241
+ }
242
+ });
243
+
244
+ // ============ SUGGEST COMMAND ============
245
+
246
+ program
247
+ .command("suggest <query>")
248
+ .description("Get domain name suggestions based on keywords")
249
+ .option("-l, --limit <count>", "Number of suggestions", "20")
250
+ .option("--json", "Output as JSON")
251
+ .action(async (query, options) => {
252
+ try {
253
+ const suggestions = await domainApi.getSuggestions(
254
+ query,
255
+ parseInt(options.limit)
256
+ );
257
+
258
+ if (options.json) {
259
+ console.log(JSON.stringify(suggestions, null, 2));
260
+ return;
261
+ }
262
+
263
+ console.log(`\nSuggestions for "${query}":\n`);
264
+
265
+ for (const s of suggestions) {
266
+ console.log(` ${s.domain}`);
267
+ }
268
+ } catch (error) {
269
+ console.error("Error:", error instanceof Error ? error.message : error);
270
+ process.exit(1);
271
+ }
272
+ });
273
+
274
+ // ============ LIST COMMAND (owned domains) ============
275
+
276
+ program
277
+ .command("list")
278
+ .description("List domains owned by your account")
279
+ .option("-l, --limit <count>", "Maximum domains to list", "100")
280
+ .option("--json", "Output as JSON")
281
+ .action(async (options) => {
282
+ try {
283
+ const domains = await domainApi.listOwnedDomains(parseInt(options.limit));
284
+
285
+ if (options.json) {
286
+ console.log(JSON.stringify(domains, null, 2));
287
+ return;
288
+ }
289
+
290
+ console.log(`\nOwned Domains (${domains.length}):\n`);
291
+
292
+ for (const d of domains) {
293
+ const expires = d.expires
294
+ ? new Date(d.expires).toLocaleDateString()
295
+ : "N/A";
296
+ const autoRenew = d.renewAuto ? "[AUTO]" : "";
297
+ console.log(` ${d.domain.padEnd(35)} expires: ${expires} ${autoRenew}`);
298
+ }
299
+ } catch (error) {
300
+ console.error("Error:", error instanceof Error ? error.message : error);
301
+ process.exit(1);
302
+ }
303
+ });
304
+
305
+ // ============ INFO COMMAND (domain details) ============
306
+
307
+ program
308
+ .command("info <domain>")
309
+ .description("Get detailed information about an owned domain")
310
+ .option("--json", "Output as JSON")
311
+ .action(async (domain, options) => {
312
+ try {
313
+ const details = await domainApi.getDomainDetails(domain);
314
+
315
+ if (options.json) {
316
+ console.log(JSON.stringify(details, null, 2));
317
+ return;
318
+ }
319
+
320
+ console.log(`\nDomain: ${details.domain}`);
321
+ console.log(`Status: ${details.status}`);
322
+ console.log(`Created: ${details.createdAt}`);
323
+ console.log(`Expires: ${details.expires}`);
324
+ console.log(`Auto Renew: ${details.renewAuto ? "Yes" : "No"}`);
325
+ console.log(`Privacy: ${details.privacy ? "Yes" : "No"}`);
326
+
327
+ if (details.nameServers?.length) {
328
+ console.log(`\nNameservers:`);
329
+ for (const ns of details.nameServers) {
330
+ console.log(` - ${ns}`);
331
+ }
332
+ }
333
+ } catch (error) {
334
+ console.error("Error:", error instanceof Error ? error.message : error);
335
+ process.exit(1);
336
+ }
337
+ });
338
+
339
+ // ============ TLDS COMMAND ============
340
+
341
+ program
342
+ .command("tlds")
343
+ .description("List supported TLDs")
344
+ .option("--json", "Output as JSON")
345
+ .option("-l, --limit <count>", "Number of TLDs to show", "50")
346
+ .action(async (options) => {
347
+ try {
348
+ const tlds = await domainApi.listTlds();
349
+
350
+ if (options.json) {
351
+ console.log(JSON.stringify(tlds.slice(0, parseInt(options.limit)), null, 2));
352
+ return;
353
+ }
354
+
355
+ console.log(`\nSupported TLDs (showing ${Math.min(tlds.length, parseInt(options.limit))} of ${tlds.length}):\n`);
356
+
357
+ for (const tld of tlds.slice(0, parseInt(options.limit))) {
358
+ console.log(` .${tld.name} - ${tld.type}`);
359
+ }
360
+ } catch (error) {
361
+ console.error("Error:", error instanceof Error ? error.message : error);
362
+ process.exit(1);
363
+ }
364
+ });
365
+
366
+ // ============ SETUP COMMAND ============
367
+
368
+ program
369
+ .command("setup")
370
+ .description("Interactive setup for service-domainsearch")
371
+ .action(async () => {
372
+ console.log("\nservice-domainsearch Setup\n");
373
+ console.log("This will configure your Brandsight/GoDaddy API credentials.\n");
374
+
375
+ const config = loadConfig();
376
+
377
+ if (!config.apiKey || !config.apiSecret) {
378
+ console.log("API credentials not configured.\n");
379
+ console.log("Get your API key and secret from:");
380
+ console.log(" https://developer.godaddy.com/keys\n");
381
+ console.log("Then run:");
382
+ console.log(" service-domainsearch config --api-key <key> --api-secret <secret>");
383
+ console.log(" service-domainsearch config --customer-id <id>\n");
384
+ } else {
385
+ console.log(`API Key: ***${config.apiKey.slice(-4)}`);
386
+ console.log(`API Secret: ***${config.apiSecret.slice(-4)}`);
387
+ console.log(`Customer ID: ${config.customerId || "(not set)"}`);
388
+ console.log(`API URL: ${config.apiUrl}\n`);
389
+
390
+ // Test connection
391
+ console.log("Testing connection...");
392
+ try {
393
+ const domains = await domainApi.listOwnedDomains(5);
394
+ console.log(` Connected! Found ${domains.length} domains in your account.\n`);
395
+
396
+ console.log("Quick commands:");
397
+ console.log(" service-domainsearch check example.com");
398
+ console.log(" service-domainsearch search mycompany");
399
+ console.log(" service-domainsearch bulk domain1.com domain2.net");
400
+ console.log(" service-domainsearch list");
401
+ } catch (error) {
402
+ console.error(
403
+ " Connection failed:",
404
+ error instanceof Error ? error.message : error
405
+ );
406
+ }
407
+ }
408
+ });
409
+
410
+ program.parse();
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { Command } from "commander";
4
+ import { homedir } from "os";
5
+ import { join } from "path";
6
+
7
+ function getDataDir(): string {
8
+ return process.env.DATA_DIR || join(homedir(), ".skill", "skill-educational-resource-finder");
9
+ }
10
+
11
+ const program = new Command();
12
+
13
+ program
14
+ .name("skill-educational-resource-finder")
15
+ .description("Educational Resource Finder skill")
16
+ .version("0.1.0");
17
+
18
+ program
19
+ .command("run")
20
+ .description("Run the skill")
21
+ .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
+ .allowUnknownOption(true)
23
+ .action(async (options, command) => {
24
+ try {
25
+ const args = command.args;
26
+ process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
+ await import("../src/index.js");
28
+ } catch (err) {
29
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
+ process.exit(1);
31
+ }
32
+ });
33
+
34
+ program.parse();
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { Command } from "commander";
4
+ import { homedir } from "os";
5
+ import { join } from "path";
6
+
7
+ function getDataDir(): string {
8
+ return process.env.DATA_DIR || join(homedir(), ".skill", "skill-email-campaign");
9
+ }
10
+
11
+ const program = new Command();
12
+
13
+ program
14
+ .name("skill-email-campaign")
15
+ .description("Email Campaign skill")
16
+ .version("0.1.0");
17
+
18
+ program
19
+ .command("run")
20
+ .description("Run the skill")
21
+ .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
+ .allowUnknownOption(true)
23
+ .action(async (options, command) => {
24
+ try {
25
+ const args = command.args;
26
+ process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
+ await import("../src/index.js");
28
+ } catch (err) {
29
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
+ process.exit(1);
31
+ }
32
+ });
33
+
34
+ program.parse();
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { Command } from "commander";
4
+ import { homedir } from "os";
5
+ import { join } from "path";
6
+
7
+ function getDataDir(): string {
8
+ return process.env.DATA_DIR || join(homedir(), ".skill", "skill-exam-readiness-check");
9
+ }
10
+
11
+ const program = new Command();
12
+
13
+ program
14
+ .name("skill-exam-readiness-check")
15
+ .description("Exam Readiness Check skill")
16
+ .version("0.1.0");
17
+
18
+ program
19
+ .command("run")
20
+ .description("Run the skill")
21
+ .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
+ .allowUnknownOption(true)
23
+ .action(async (options, command) => {
24
+ try {
25
+ const args = command.args;
26
+ process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
+ await import("../src/index.js");
28
+ } catch (err) {
29
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
+ process.exit(1);
31
+ }
32
+ });
33
+
34
+ program.parse();
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { Command } from "commander";
4
+ import { homedir } from "os";
5
+ import { join } from "path";
6
+
7
+ function getDataDir(): string {
8
+ return process.env.DATA_DIR || join(homedir(), ".skill", "skill-experiment-power-calculator");
9
+ }
10
+
11
+ const program = new Command();
12
+
13
+ program
14
+ .name("skill-experiment-power-calculator")
15
+ .description("Experiment Power Calculator skill")
16
+ .version("0.1.0");
17
+
18
+ program
19
+ .command("run")
20
+ .description("Run the skill")
21
+ .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
+ .allowUnknownOption(true)
23
+ .action(async (options, command) => {
24
+ try {
25
+ const args = command.args;
26
+ process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
+ await import("../src/index.js");
28
+ } catch (err) {
29
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
+ process.exit(1);
31
+ }
32
+ });
33
+
34
+ program.parse();
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from "commander";
3
+
4
+ const program = new Command();
5
+
6
+ program
7
+ .name("skill-extract-audio")
8
+ .description("Extract audio tracks from video files")
9
+ .version("0.1.0");
10
+
11
+ program
12
+ .command("run", { isDefault: true })
13
+ .description("Run the skill")
14
+ .allowUnknownOption(true)
15
+ .action(async () => {
16
+ await import("../src/index.js");
17
+ });
18
+
19
+ program.parse();
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { Command } from "commander";
4
+ import { homedir } from "os";
5
+ import { join } from "path";
6
+
7
+ function getDataDir(): string {
8
+ return process.env.DATA_DIR || join(homedir(), ".skill", "skill-extract-frames");
9
+ }
10
+
11
+ const program = new Command();
12
+
13
+ program
14
+ .name("skill-extract-frames")
15
+ .description("Extract Frames skill")
16
+ .version("0.1.0");
17
+
18
+ program
19
+ .command("run")
20
+ .description("Run the skill")
21
+ .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
+ .allowUnknownOption(true)
23
+ .action(async (options, command) => {
24
+ try {
25
+ const args = command.args;
26
+ process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
+ await import("../src/index.js");
28
+ } catch (err) {
29
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
+ process.exit(1);
31
+ }
32
+ });
33
+
34
+ program.parse();
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { Command } from "commander";
4
+ import { homedir } from "os";
5
+ import { join } from "path";
6
+
7
+ function getDataDir(): string {
8
+ return process.env.DATA_DIR || join(homedir(), ".skill", "skill-extract-invoice");
9
+ }
10
+
11
+ const program = new Command();
12
+
13
+ program
14
+ .name("skill-extract-invoice")
15
+ .description("Extract Invoice skill")
16
+ .version("0.1.0");
17
+
18
+ program
19
+ .command("run")
20
+ .description("Run the skill")
21
+ .option("-o, --output <path>", "Output directory", join(getDataDir(), "output"))
22
+ .allowUnknownOption(true)
23
+ .action(async (options, command) => {
24
+ try {
25
+ const args = command.args;
26
+ process.env.DATA_DIR = process.env.DATA_DIR || getDataDir();
27
+ await import("../src/index.js");
28
+ } catch (err) {
29
+ console.error(`Error: ${err instanceof Error ? err.message : err}`);
30
+ process.exit(1);
31
+ }
32
+ });
33
+
34
+ program.parse();