@hasna/skills 0.1.13 → 0.1.15
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.
- package/bin/index.js +1743 -420
- package/bin/mcp.js +791 -259
- package/dist/index.d.ts +5 -2
- package/dist/index.js +533 -75
- package/dist/lib/config.d.ts +27 -0
- package/dist/lib/config.test.d.ts +1 -0
- package/dist/lib/installer.d.ts +36 -2
- package/dist/lib/registry.d.ts +16 -0
- package/dist/lib/scheduler.d.ts +47 -0
- package/dist/types/api.d.ts +74 -0
- package/package.json +5 -2
- package/skills/_common/index.ts +4 -0
- package/skills/_common/vision.ts +374 -0
- package/skills/skill-academic-journal-matcher/bin/cli.ts +34 -0
- package/skills/skill-action-item-router/bin/cli.ts +34 -0
- package/skills/skill-ad-creative-generator/bin/cli.ts +34 -0
- package/skills/skill-advanced-math/bin/cli.ts +34 -0
- package/skills/skill-analyze-data/bin/cli.ts +19 -0
- package/skills/skill-anomaly-investigator/bin/cli.ts +34 -0
- package/skills/skill-api-test-suite/bin/cli.ts +34 -0
- package/skills/skill-apidocs/bin/cli.ts +87 -0
- package/skills/skill-audio-cleanup-lab/bin/cli.ts +6 -0
- package/skills/skill-audiobook-chapter-proofer/bin/cli.ts +34 -0
- package/skills/skill-banner-ad-suite/bin/cli.ts +34 -0
- package/skills/skill-benchmark-finder/bin/cli.ts +34 -0
- package/skills/skill-bio-sequence-tool/bin/cli.ts +34 -0
- package/skills/skill-blog-topic-cluster/bin/cli.ts +34 -0
- package/skills/skill-brand-style-guide/bin/cli.ts +19 -0
- package/skills/skill-brand-voice-audit/bin/cli.ts +34 -0
- package/skills/skill-budget-variance-analyzer/bin/cli.ts +6 -0
- package/skills/skill-businessactivity/bin/cli.ts +28 -0
- package/skills/skill-calendar-events/bin/cli.ts +34 -0
- package/skills/skill-campaign-metric-brief/bin/cli.ts +34 -0
- package/skills/skill-campaign-moodboard/bin/cli.ts +34 -0
- package/skills/skill-caption-style-stylist/bin/cli.ts +34 -0
- package/skills/skill-chemistry-calculator/bin/cli.ts +34 -0
- package/skills/skill-churn-risk-notifier/bin/cli.ts +34 -0
- package/skills/skill-citation-formatter/bin/cli.ts +34 -0
- package/skills/skill-classroom-newsletter-kit/bin/cli.ts +34 -0
- package/skills/skill-color-palette-harmonizer/bin/cli.ts +34 -0
- package/skills/skill-colorextract/SKILL.md +35 -0
- package/skills/skill-colorextract/bun.lock +102 -0
- package/skills/skill-colorextract/package.json +13 -0
- package/skills/skill-colorextract/src/index.ts +405 -0
- package/skills/skill-competitor-ad-analyzer/bin/cli.ts +34 -0
- package/skills/skill-compliance-copy-check/bin/cli.ts +34 -0
- package/skills/skill-compliance-report-pack/bin/cli.ts +34 -0
- package/skills/skill-compress-video/bin/cli.ts +19 -0
- package/skills/skill-consolelog/bin/cli.ts +884 -0
- package/skills/skill-contract-plainlanguage/bin/cli.ts +34 -0
- package/skills/skill-copytone-translator/bin/cli.ts +34 -0
- package/skills/skill-create-blog-article/bin/cli.ts +34 -0
- package/skills/skill-create-ebook/bin/cli.ts +34 -0
- package/skills/skill-crm-note-enhancer/bin/cli.ts +34 -0
- package/skills/skill-customer-journey-mapper/bin/cli.ts +34 -0
- package/skills/skill-dashboard-builder/bin/cli.ts +34 -0
- package/skills/skill-dashboard-narrator/bin/cli.ts +34 -0
- package/skills/skill-data-anonymizer/bin/cli.ts +34 -0
- package/skills/skill-database-explorer/bin/cli.ts +34 -0
- package/skills/skill-dataset-health-check/bin/cli.ts +34 -0
- package/skills/skill-decision-journal/bin/cli.ts +34 -0
- package/skills/skill-delegation-brief-writer/bin/cli.ts +34 -0
- package/skills/skill-destination-briefing/bin/cli.ts +34 -0
- package/skills/skill-diff-viewer/bin/cli.ts +34 -0
- package/skills/skill-domainpurchase/SKILL.md +46 -0
- package/skills/skill-domainpurchase/bin/cli.ts +683 -0
- package/skills/skill-domainsearch/SKILL.md +41 -0
- package/skills/skill-domainsearch/bin/cli.ts +410 -0
- package/skills/skill-educational-resource-finder/bin/cli.ts +34 -0
- package/skills/skill-email-campaign/bin/cli.ts +34 -0
- package/skills/skill-exam-readiness-check/bin/cli.ts +34 -0
- package/skills/skill-experiment-power-calculator/bin/cli.ts +34 -0
- package/skills/skill-extract-audio/bin/cli.ts +19 -0
- package/skills/skill-extract-frames/bin/cli.ts +34 -0
- package/skills/skill-extract-invoice/bin/cli.ts +34 -0
- package/skills/skill-family-activity-curator/bin/cli.ts +34 -0
- package/skills/skill-faq-packager/bin/cli.ts +34 -0
- package/skills/skill-feedback-survey-designer/bin/cli.ts +34 -0
- package/skills/skill-field-trip-planner/bin/cli.ts +34 -0
- package/skills/skill-file-organizer/bin/cli.ts +34 -0
- package/skills/skill-folder-tree/bin/cli.ts +34 -0
- package/skills/skill-forecast-scenario-lab/bin/cli.ts +34 -0
- package/skills/skill-form-filler/bin/cli.ts +34 -0
- package/skills/skill-generate-api-client/bin/cli.ts +34 -0
- package/skills/skill-generate-book-cover/bin/cli.ts +34 -0
- package/skills/skill-generate-chart/bin/cli.ts +34 -0
- package/skills/skill-generate-diagram/bin/cli.ts +34 -0
- package/skills/skill-generate-dockerfile/bin/cli.ts +34 -0
- package/skills/skill-generate-documentation/bin/cli.ts +34 -0
- package/skills/skill-generate-docx/bin/cli.ts +6 -0
- package/skills/skill-generate-env/bin/cli.ts +34 -0
- package/skills/skill-generate-excel/bin/cli.ts +34 -0
- package/skills/skill-generate-favicon/bin/cli.ts +34 -0
- package/skills/skill-generate-mock-data/bin/cli.ts +34 -0
- package/skills/skill-generate-pdf/bin/cli.ts +6 -0
- package/skills/skill-generate-pr-description/bin/cli.ts +34 -0
- package/skills/skill-generate-presentation/bin/cli.ts +34 -0
- package/skills/skill-generate-qrcode/bin/cli.ts +34 -0
- package/skills/skill-generate-regex/bin/cli.ts +34 -0
- package/skills/skill-generate-resume/bin/cli.ts +34 -0
- package/skills/skill-generate-sitemap/bin/cli.ts +34 -0
- package/skills/skill-generate-social-posts/bin/cli.ts +34 -0
- package/skills/skill-generate-sql/bin/cli.ts +34 -0
- package/skills/skill-gif-maker/bin/cli.ts +34 -0
- package/skills/skill-github-manager/bin/cli.ts +34 -0
- package/skills/skill-gmail/bin/cli.ts +34 -0
- package/skills/skill-goal-quarterly-roadmap/bin/cli.ts +34 -0
- package/skills/skill-grant-application-drafter/bin/cli.ts +34 -0
- package/skills/skill-grocery-basket-optimizer/bin/cli.ts +34 -0
- package/skills/skill-guest-communication-suite/bin/cli.ts +34 -0
- package/skills/skill-habit-reflection-digest/bin/cli.ts +34 -0
- package/skills/skill-highlight-reel-generator/bin/cli.ts +34 -0
- package/skills/skill-homework-feedback-coach/bin/cli.ts +34 -0
- package/skills/skill-hook/bunfig.toml +5 -0
- package/skills/skill-household-maintenance-mgr/bin/cli.ts +34 -0
- package/skills/skill-http-server/bin/cli.ts +34 -0
- package/skills/skill-implementation/bunfig.toml +5 -0
- package/skills/skill-implementation-agent/bin/cli.ts +34 -0
- package/skills/skill-implementation-plan/bin/cli.ts +34 -0
- package/skills/skill-implementation-todo/bin/cli.ts +34 -0
- package/skills/skill-inbox-priority-planner/bin/cli.ts +34 -0
- package/skills/skill-invoice/bin/cli.ts +20 -0
- package/skills/skill-invoice-dispute-helper/bin/cli.ts +34 -0
- package/skills/skill-itinerary-architect/bin/cli.ts +34 -0
- package/skills/skill-jingle-composer/bin/cli.ts +34 -0
- package/skills/skill-kpi-digest-generator/bin/cli.ts +34 -0
- package/skills/skill-lab-notebook-formatter/bin/cli.ts +34 -0
- package/skills/skill-landing-page-copy/bin/cli.ts +34 -0
- package/skills/skill-latex-table-generator/bin/cli.ts +34 -0
- package/skills/skill-learning-style-profiler/bin/cli.ts +34 -0
- package/skills/skill-lesson-plan-customizer/bin/cli.ts +34 -0
- package/skills/skill-livestream-runofshow/bin/cli.ts +34 -0
- package/skills/skill-longform-structurer/bin/cli.ts +34 -0
- package/skills/skill-lorem-generator/bin/cli.ts +34 -0
- package/skills/skill-managehook/bin/cli.ts +241 -0
- package/skills/skill-managemcp/bin/cli.ts +241 -0
- package/skills/skill-manageskill/bin/cli.ts +241 -0
- package/skills/skill-markdown-validator/bin/cli.ts +34 -0
- package/skills/skill-mcp-builder/bin/cli.ts +34 -0
- package/skills/skill-meal-plan-designer/bin/cli.ts +34 -0
- package/skills/skill-meeting-insight-summarizer/bin/cli.ts +34 -0
- package/skills/skill-merge-pdfs/bin/cli.ts +34 -0
- package/skills/skill-microcopy-generator/bin/cli.ts +34 -0
- package/skills/skill-mindfulness-prompt-cache/bin/cli.ts +34 -0
- package/skills/skill-notion-manager/bin/cli.ts +34 -0
- package/skills/skill-onboarding-sequence-builder/bin/cli.ts +34 -0
- package/skills/skill-onsite-ops-checklist/bin/cli.ts +34 -0
- package/skills/skill-outreach-cadence-designer/bin/cli.ts +34 -0
- package/skills/skill-packaging-concept-studio/bin/cli.ts +34 -0
- package/skills/skill-packing-plan-pro/bin/cli.ts +34 -0
- package/skills/skill-parent-teacher-brief/bin/cli.ts +34 -0
- package/skills/skill-partner-kit-assembler/bin/cli.ts +34 -0
- package/skills/skill-payroll-change-prepper/bin/cli.ts +34 -0
- package/skills/skill-persona-based-adwriter/bin/cli.ts +34 -0
- package/skills/skill-persona-generator/bin/cli.ts +34 -0
- package/skills/skill-personal-daily-ops/bin/cli.ts +34 -0
- package/skills/skill-pet-care-scheduler/bin/cli.ts +34 -0
- package/skills/skill-podcast-show-notes/bin/cli.ts +34 -0
- package/skills/skill-presentation-theme-maker/bin/cli.ts +34 -0
- package/skills/skill-press-release-drafter/bin/cli.ts +34 -0
- package/skills/skill-print-collateral-designer/bin/cli.ts +34 -0
- package/skills/skill-procurement-scorecard/bin/cli.ts +34 -0
- package/skills/skill-product-demo-script/bin/cli.ts +34 -0
- package/skills/skill-product-mockup/bin/cli.ts +34 -0
- package/skills/skill-project-retro-companion/bin/cli.ts +34 -0
- package/skills/skill-proposal-redline-advisor/bin/cli.ts +34 -0
- package/skills/skill-regex-tester/bin/cli.ts +34 -0
- package/skills/skill-remove-background/bin/cli.ts +34 -0
- package/skills/skill-risk-disclosure-kit/bin/cli.ts +34 -0
- package/skills/skill-roi-comparison-tool/bin/cli.ts +34 -0
- package/skills/skill-sales-call-recapper/bin/cli.ts +34 -0
- package/skills/skill-salescopy/bin/cli.ts +20 -0
- package/skills/skill-scaffold-project/bin/cli.ts +34 -0
- package/skills/skill-scholarship-tracker/bin/cli.ts +34 -0
- package/skills/skill-scientific-figure-check/bin/cli.ts +34 -0
- package/skills/skill-seating-chart-maker/bin/cli.ts +34 -0
- package/skills/skill-security-audit/bin/cli.ts +34 -0
- package/skills/skill-seo-brief-builder/bin/cli.ts +34 -0
- package/skills/skill-siteanalyze/SKILL.md +25 -0
- package/skills/skill-siteanalyze/package.json +13 -0
- package/skills/skill-siteanalyze/src/index.ts +592 -0
- package/skills/skill-slack-assistant/bin/cli.ts +34 -0
- package/skills/skill-sleep-routine-analyzer/bin/cli.ts +34 -0
- package/skills/skill-social-media-kit/bin/cli.ts +34 -0
- package/skills/skill-split-pdf/bin/cli.ts +34 -0
- package/skills/skill-sponsorship-proposal-lab/bin/cli.ts +34 -0
- package/skills/skill-spreadsheet-cleanroom/bin/cli.ts +34 -0
- package/skills/skill-statistical-test-selector/bin/cli.ts +34 -0
- package/skills/skill-stress-relief-playbook/bin/cli.ts +34 -0
- package/skills/skill-study-guide-builder/bin/cli.ts +34 -0
- package/skills/skill-subscription-spend-watcher/bin/cli.ts +34 -0
- package/skills/skill-subtitle/bin/cli.ts +20 -0
- package/skills/skill-survey-insight-extractor/bin/cli.ts +34 -0
- package/skills/skill-terraform-generator/bin/cli.ts +34 -0
- package/skills/skill-testimonial-graphics/bin/cli.ts +34 -0
- package/skills/skill-timesheet/bin/cli.ts +47 -0
- package/skills/skill-travel-budget-balancer/bin/cli.ts +34 -0
- package/skills/skill-validate-config/bin/cli.ts +34 -0
- package/skills/skill-video-cut-suggester/bin/cli.ts +34 -0
- package/skills/skill-video-downloader/bin/cli.ts +34 -0
- package/skills/skill-video-thumbnail/bin/cli.ts +34 -0
- package/skills/skill-voiceover-casting-assistant/bin/cli.ts +34 -0
- package/skills/skill-watermark/bin/cli.ts +34 -0
- package/skills/skill-webcrawling/bin/cli.ts +21 -0
- package/skills/skill-webinar-script-coach/bin/cli.ts +34 -0
- package/skills/skill-wellness-progress-reporter/bin/cli.ts +34 -0
- 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();
|