@miranda0808/maya-codex 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 (270) hide show
  1. package/README.md +30 -0
  2. package/bin/maya-codex.js +36 -0
  3. package/package.json +19 -0
  4. package/payload/.agents/skills/ab-test-setup/SKILL.md +266 -0
  5. package/payload/.agents/skills/ab-test-setup/evals/evals.json +105 -0
  6. package/payload/.agents/skills/ab-test-setup/references/sample-size-guide.md +263 -0
  7. package/payload/.agents/skills/ab-test-setup/references/test-templates.md +277 -0
  8. package/payload/.agents/skills/ad-creative/SKILL.md +362 -0
  9. package/payload/.agents/skills/ad-creative/evals/evals.json +90 -0
  10. package/payload/.agents/skills/ad-creative/references/generative-tools.md +637 -0
  11. package/payload/.agents/skills/ad-creative/references/platform-specs.md +213 -0
  12. package/payload/.agents/skills/ai-seo/SKILL.md +398 -0
  13. package/payload/.agents/skills/ai-seo/evals/evals.json +90 -0
  14. package/payload/.agents/skills/ai-seo/references/content-patterns.md +285 -0
  15. package/payload/.agents/skills/ai-seo/references/platform-ranking-factors.md +152 -0
  16. package/payload/.agents/skills/analytics-tracking/SKILL.md +309 -0
  17. package/payload/.agents/skills/analytics-tracking/evals/evals.json +90 -0
  18. package/payload/.agents/skills/analytics-tracking/references/event-library.md +260 -0
  19. package/payload/.agents/skills/analytics-tracking/references/ga4-implementation.md +300 -0
  20. package/payload/.agents/skills/analytics-tracking/references/gtm-implementation.md +390 -0
  21. package/payload/.agents/skills/churn-prevention/SKILL.md +424 -0
  22. package/payload/.agents/skills/churn-prevention/evals/evals.json +93 -0
  23. package/payload/.agents/skills/churn-prevention/references/cancel-flow-patterns.md +316 -0
  24. package/payload/.agents/skills/churn-prevention/references/dunning-playbook.md +408 -0
  25. package/payload/.agents/skills/cold-email/SKILL.md +158 -0
  26. package/payload/.agents/skills/cold-email/evals/evals.json +94 -0
  27. package/payload/.agents/skills/cold-email/references/benchmarks.md +83 -0
  28. package/payload/.agents/skills/cold-email/references/follow-up-sequences.md +81 -0
  29. package/payload/.agents/skills/cold-email/references/frameworks.md +90 -0
  30. package/payload/.agents/skills/cold-email/references/personalization.md +79 -0
  31. package/payload/.agents/skills/cold-email/references/subject-lines.md +53 -0
  32. package/payload/.agents/skills/competitor-alternatives/SKILL.md +256 -0
  33. package/payload/.agents/skills/competitor-alternatives/evals/evals.json +93 -0
  34. package/payload/.agents/skills/competitor-alternatives/references/content-architecture.md +271 -0
  35. package/payload/.agents/skills/competitor-alternatives/references/templates.md +223 -0
  36. package/payload/.agents/skills/content-strategy/SKILL.md +359 -0
  37. package/payload/.agents/skills/content-strategy/evals/evals.json +90 -0
  38. package/payload/.agents/skills/copy-editing/SKILL.md +447 -0
  39. package/payload/.agents/skills/copy-editing/evals/evals.json +89 -0
  40. package/payload/.agents/skills/copy-editing/references/plain-english-alternatives.md +394 -0
  41. package/payload/.agents/skills/copywriting/SKILL.md +252 -0
  42. package/payload/.agents/skills/copywriting/evals/evals.json +111 -0
  43. package/payload/.agents/skills/copywriting/references/copy-frameworks.md +344 -0
  44. package/payload/.agents/skills/copywriting/references/natural-transitions.md +272 -0
  45. package/payload/.agents/skills/email-sequence/SKILL.md +309 -0
  46. package/payload/.agents/skills/email-sequence/evals/evals.json +93 -0
  47. package/payload/.agents/skills/email-sequence/references/copy-guidelines.md +113 -0
  48. package/payload/.agents/skills/email-sequence/references/email-types.md +515 -0
  49. package/payload/.agents/skills/email-sequence/references/sequence-templates.md +168 -0
  50. package/payload/.agents/skills/form-cro/SKILL.md +429 -0
  51. package/payload/.agents/skills/form-cro/evals/evals.json +90 -0
  52. package/payload/.agents/skills/free-tool-strategy/SKILL.md +178 -0
  53. package/payload/.agents/skills/free-tool-strategy/evals/evals.json +90 -0
  54. package/payload/.agents/skills/free-tool-strategy/references/tool-types.md +217 -0
  55. package/payload/.agents/skills/launch-strategy/SKILL.md +353 -0
  56. package/payload/.agents/skills/launch-strategy/evals/evals.json +91 -0
  57. package/payload/.agents/skills/marketing-ideas/SKILL.md +167 -0
  58. package/payload/.agents/skills/marketing-ideas/evals/evals.json +90 -0
  59. package/payload/.agents/skills/marketing-ideas/references/ideas-by-category.md +366 -0
  60. package/payload/.agents/skills/marketing-psychology/SKILL.md +455 -0
  61. package/payload/.agents/skills/marketing-psychology/evals/evals.json +88 -0
  62. package/payload/.agents/skills/onboarding-cro/SKILL.md +220 -0
  63. package/payload/.agents/skills/onboarding-cro/evals/evals.json +92 -0
  64. package/payload/.agents/skills/onboarding-cro/references/experiments.md +258 -0
  65. package/payload/.agents/skills/page-cro/SKILL.md +182 -0
  66. package/payload/.agents/skills/page-cro/evals/evals.json +111 -0
  67. package/payload/.agents/skills/page-cro/references/experiments.md +248 -0
  68. package/payload/.agents/skills/paid-ads/SKILL.md +315 -0
  69. package/payload/.agents/skills/paid-ads/evals/evals.json +90 -0
  70. package/payload/.agents/skills/paid-ads/references/ad-copy-templates.md +207 -0
  71. package/payload/.agents/skills/paid-ads/references/audience-targeting.md +243 -0
  72. package/payload/.agents/skills/paid-ads/references/platform-setup-checklists.md +277 -0
  73. package/payload/.agents/skills/paywall-upgrade-cro/SKILL.md +227 -0
  74. package/payload/.agents/skills/paywall-upgrade-cro/evals/evals.json +93 -0
  75. package/payload/.agents/skills/paywall-upgrade-cro/references/experiments.md +164 -0
  76. package/payload/.agents/skills/popup-cro/SKILL.md +453 -0
  77. package/payload/.agents/skills/popup-cro/evals/evals.json +94 -0
  78. package/payload/.agents/skills/pricing-strategy/SKILL.md +231 -0
  79. package/payload/.agents/skills/pricing-strategy/evals/evals.json +90 -0
  80. package/payload/.agents/skills/pricing-strategy/references/research-methods.md +152 -0
  81. package/payload/.agents/skills/pricing-strategy/references/tier-structure.md +232 -0
  82. package/payload/.agents/skills/product-marketing-context/SKILL.md +27 -0
  83. package/payload/.agents/skills/product-marketing-context/evals/evals.json +40 -0
  84. package/payload/.agents/skills/programmatic-seo/SKILL.md +238 -0
  85. package/payload/.agents/skills/programmatic-seo/evals/evals.json +94 -0
  86. package/payload/.agents/skills/programmatic-seo/references/playbooks.md +308 -0
  87. package/payload/.agents/skills/referral-program/SKILL.md +255 -0
  88. package/payload/.agents/skills/referral-program/evals/evals.json +89 -0
  89. package/payload/.agents/skills/referral-program/references/affiliate-programs.md +164 -0
  90. package/payload/.agents/skills/referral-program/references/program-examples.md +143 -0
  91. package/payload/.agents/skills/revops/SKILL.md +343 -0
  92. package/payload/.agents/skills/revops/evals/evals.json +91 -0
  93. package/payload/.agents/skills/revops/references/automation-playbooks.md +290 -0
  94. package/payload/.agents/skills/revops/references/lifecycle-definitions.md +278 -0
  95. package/payload/.agents/skills/revops/references/routing-rules.md +203 -0
  96. package/payload/.agents/skills/revops/references/scoring-models.md +247 -0
  97. package/payload/.agents/skills/sales-enablement/SKILL.md +349 -0
  98. package/payload/.agents/skills/sales-enablement/evals/evals.json +91 -0
  99. package/payload/.agents/skills/sales-enablement/references/deck-frameworks.md +263 -0
  100. package/payload/.agents/skills/sales-enablement/references/demo-scripts.md +355 -0
  101. package/payload/.agents/skills/sales-enablement/references/objection-library.md +270 -0
  102. package/payload/.agents/skills/sales-enablement/references/one-pager-templates.md +208 -0
  103. package/payload/.agents/skills/schema-markup/SKILL.md +179 -0
  104. package/payload/.agents/skills/schema-markup/evals/evals.json +87 -0
  105. package/payload/.agents/skills/schema-markup/references/schema-examples.md +398 -0
  106. package/payload/.agents/skills/seo-audit/SKILL.md +412 -0
  107. package/payload/.agents/skills/seo-audit/evals/evals.json +136 -0
  108. package/payload/.agents/skills/seo-audit/references/ai-writing-detection.md +200 -0
  109. package/payload/.agents/skills/signup-flow-cro/SKILL.md +359 -0
  110. package/payload/.agents/skills/signup-flow-cro/evals/evals.json +88 -0
  111. package/payload/.agents/skills/site-architecture/SKILL.md +357 -0
  112. package/payload/.agents/skills/site-architecture/evals/evals.json +88 -0
  113. package/payload/.agents/skills/site-architecture/references/mermaid-templates.md +216 -0
  114. package/payload/.agents/skills/site-architecture/references/navigation-patterns.md +305 -0
  115. package/payload/.agents/skills/site-architecture/references/site-type-templates.md +293 -0
  116. package/payload/.agents/skills/social-content/SKILL.md +278 -0
  117. package/payload/.agents/skills/social-content/evals/evals.json +92 -0
  118. package/payload/.agents/skills/social-content/references/platforms.md +170 -0
  119. package/payload/.agents/skills/social-content/references/post-templates.md +177 -0
  120. package/payload/.agents/skills/social-content/references/reverse-engineering.md +195 -0
  121. package/payload/.maya/executor.md +79 -0
  122. package/payload/.maya/meta-api-agent.md +48 -0
  123. package/payload/.maya/modes/consult.md +63 -0
  124. package/payload/.maya/modes/task.md +97 -0
  125. package/payload/.maya/planner.md +69 -0
  126. package/payload/.maya/researcher.md +51 -0
  127. package/payload/.maya/templates/plan.md +77 -0
  128. package/payload/.maya/templates/state.md +87 -0
  129. package/payload/.maya/templates/task-packet.md +75 -0
  130. package/payload/MAYA-CATALOG.md +115 -0
  131. package/payload/MAYA-DEPENDENCIES.md +58 -0
  132. package/payload/MAYA.md +151 -0
  133. package/payload/campaigns/README.md +14 -0
  134. package/payload/commands/maya-consult.md +28 -0
  135. package/payload/commands/maya-task.md +38 -0
  136. package/payload/commands/product.md +55 -0
  137. package/payload/research/README.md +14 -0
  138. package/payload/templates/README.md +15 -0
  139. package/payload/templates/plan.md +77 -0
  140. package/payload/templates/state.md +87 -0
  141. package/payload/templates/task-packet.md +75 -0
  142. package/payload/tools/REGISTRY.md +368 -0
  143. package/payload/tools/clis/README.md +187 -0
  144. package/payload/tools/clis/activecampaign.js +435 -0
  145. package/payload/tools/clis/adobe-analytics.js +161 -0
  146. package/payload/tools/clis/ahrefs.js +192 -0
  147. package/payload/tools/clis/amplitude.js +182 -0
  148. package/payload/tools/clis/apollo.js +142 -0
  149. package/payload/tools/clis/beehiiv.js +245 -0
  150. package/payload/tools/clis/brevo.js +368 -0
  151. package/payload/tools/clis/buffer.js +260 -0
  152. package/payload/tools/clis/calendly.js +253 -0
  153. package/payload/tools/clis/clearbit.js +163 -0
  154. package/payload/tools/clis/customer-io.js +205 -0
  155. package/payload/tools/clis/dataforseo.js +257 -0
  156. package/payload/tools/clis/demio.js +149 -0
  157. package/payload/tools/clis/dub.js +158 -0
  158. package/payload/tools/clis/g2.js +186 -0
  159. package/payload/tools/clis/ga4.js +194 -0
  160. package/payload/tools/clis/google-ads.js +189 -0
  161. package/payload/tools/clis/google-search-console.js +166 -0
  162. package/payload/tools/clis/hotjar.js +167 -0
  163. package/payload/tools/clis/hunter.js +249 -0
  164. package/payload/tools/clis/instantly.js +270 -0
  165. package/payload/tools/clis/intercom.js +399 -0
  166. package/payload/tools/clis/keywords-everywhere.js +185 -0
  167. package/payload/tools/clis/kit.js +232 -0
  168. package/payload/tools/clis/klaviyo.js +348 -0
  169. package/payload/tools/clis/lemlist.js +221 -0
  170. package/payload/tools/clis/linkedin-ads.js +185 -0
  171. package/payload/tools/clis/livestorm.js +292 -0
  172. package/payload/tools/clis/mailchimp.js +220 -0
  173. package/payload/tools/clis/mention-me.js +161 -0
  174. package/payload/tools/clis/meta-ads.js +181 -0
  175. package/payload/tools/clis/mixpanel.js +248 -0
  176. package/payload/tools/clis/onesignal.js +241 -0
  177. package/payload/tools/clis/optimizely.js +233 -0
  178. package/payload/tools/clis/paddle.js +385 -0
  179. package/payload/tools/clis/partnerstack.js +382 -0
  180. package/payload/tools/clis/plausible.js +249 -0
  181. package/payload/tools/clis/postmark.js +375 -0
  182. package/payload/tools/clis/resend.js +370 -0
  183. package/payload/tools/clis/rewardful.js +160 -0
  184. package/payload/tools/clis/savvycal.js +223 -0
  185. package/payload/tools/clis/segment.js +192 -0
  186. package/payload/tools/clis/semrush.js +207 -0
  187. package/payload/tools/clis/sendgrid.js +211 -0
  188. package/payload/tools/clis/snov.js +237 -0
  189. package/payload/tools/clis/tiktok-ads.js +190 -0
  190. package/payload/tools/clis/tolt.js +153 -0
  191. package/payload/tools/clis/trustpilot.js +276 -0
  192. package/payload/tools/clis/typeform.js +269 -0
  193. package/payload/tools/clis/wistia.js +256 -0
  194. package/payload/tools/clis/zapier.js +160 -0
  195. package/payload/tools/integrations/activecampaign.md +337 -0
  196. package/payload/tools/integrations/adobe-analytics.md +156 -0
  197. package/payload/tools/integrations/ahrefs.md +142 -0
  198. package/payload/tools/integrations/amplitude.md +135 -0
  199. package/payload/tools/integrations/apollo.md +148 -0
  200. package/payload/tools/integrations/beehiiv.md +157 -0
  201. package/payload/tools/integrations/brevo.md +268 -0
  202. package/payload/tools/integrations/buffer.md +138 -0
  203. package/payload/tools/integrations/calendly.md +161 -0
  204. package/payload/tools/integrations/clearbit.md +142 -0
  205. package/payload/tools/integrations/customer-io.md +187 -0
  206. package/payload/tools/integrations/dataforseo.md +165 -0
  207. package/payload/tools/integrations/demio.md +182 -0
  208. package/payload/tools/integrations/dub-co.md +160 -0
  209. package/payload/tools/integrations/g2.md +179 -0
  210. package/payload/tools/integrations/ga4.md +126 -0
  211. package/payload/tools/integrations/google-ads.md +159 -0
  212. package/payload/tools/integrations/google-search-console.md +147 -0
  213. package/payload/tools/integrations/hotjar.md +147 -0
  214. package/payload/tools/integrations/hubspot.md +178 -0
  215. package/payload/tools/integrations/hunter.md +90 -0
  216. package/payload/tools/integrations/instantly.md +104 -0
  217. package/payload/tools/integrations/intercom.md +292 -0
  218. package/payload/tools/integrations/keywords-everywhere.md +207 -0
  219. package/payload/tools/integrations/kit.md +167 -0
  220. package/payload/tools/integrations/klaviyo.md +228 -0
  221. package/payload/tools/integrations/lemlist.md +110 -0
  222. package/payload/tools/integrations/linkedin-ads.md +164 -0
  223. package/payload/tools/integrations/livestorm.md +313 -0
  224. package/payload/tools/integrations/mailchimp.md +150 -0
  225. package/payload/tools/integrations/mention-me.md +160 -0
  226. package/payload/tools/integrations/meta-ads.md +147 -0
  227. package/payload/tools/integrations/mixpanel.md +137 -0
  228. package/payload/tools/integrations/onesignal.md +229 -0
  229. package/payload/tools/integrations/optimizely.md +171 -0
  230. package/payload/tools/integrations/paddle.md +212 -0
  231. package/payload/tools/integrations/partnerstack.md +222 -0
  232. package/payload/tools/integrations/plausible.md +177 -0
  233. package/payload/tools/integrations/posthog.md +151 -0
  234. package/payload/tools/integrations/postmark.md +234 -0
  235. package/payload/tools/integrations/resend.md +168 -0
  236. package/payload/tools/integrations/rewardful.md +147 -0
  237. package/payload/tools/integrations/salesforce.md +150 -0
  238. package/payload/tools/integrations/savvycal.md +181 -0
  239. package/payload/tools/integrations/segment.md +159 -0
  240. package/payload/tools/integrations/semrush.md +121 -0
  241. package/payload/tools/integrations/sendgrid.md +161 -0
  242. package/payload/tools/integrations/shopify.md +176 -0
  243. package/payload/tools/integrations/snov.md +94 -0
  244. package/payload/tools/integrations/stripe.md +148 -0
  245. package/payload/tools/integrations/tiktok-ads.md +161 -0
  246. package/payload/tools/integrations/tolt.md +144 -0
  247. package/payload/tools/integrations/trustpilot.md +191 -0
  248. package/payload/tools/integrations/typeform.md +190 -0
  249. package/payload/tools/integrations/webflow.md +198 -0
  250. package/payload/tools/integrations/wistia.md +164 -0
  251. package/payload/tools/integrations/wordpress.md +175 -0
  252. package/payload/tools/integrations/zapier.md +150 -0
  253. package/payload/tools/meta/README.md +55 -0
  254. package/payload/tools/meta/meta-cache-schema.md +65 -0
  255. package/payload/tools/meta/meta-fetch.ps1 +324 -0
  256. package/payload/tools/meta/meta-fetch.test.ps1 +38 -0
  257. package/vendor/shared-installer/manifests/claude-files.json +13 -0
  258. package/vendor/shared-installer/manifests/codex-files.json +13 -0
  259. package/vendor/shared-installer/manifests/common-files.json +13 -0
  260. package/vendor/shared-installer/package.json +15 -0
  261. package/vendor/shared-installer/src/bootstrap.js +12 -0
  262. package/vendor/shared-installer/src/cli-options.js +53 -0
  263. package/vendor/shared-installer/src/fs.js +105 -0
  264. package/vendor/shared-installer/src/index.js +44 -0
  265. package/vendor/shared-installer/src/install.js +157 -0
  266. package/vendor/shared-installer/src/manifest.js +52 -0
  267. package/vendor/shared-installer/templates/claude/.claude/skills/.gitkeep +1 -0
  268. package/vendor/shared-installer/templates/claude/CLAUDE.md +27 -0
  269. package/vendor/shared-installer/templates/codex/.agent/skills/.gitkeep +1 -0
  270. package/vendor/shared-installer/templates/codex/AGENTS.md +27 -0
@@ -0,0 +1,249 @@
1
+ #!/usr/bin/env node
2
+
3
+ const API_KEY = process.env.HUNTER_API_KEY
4
+ const BASE_URL = 'https://api.hunter.io/v2'
5
+
6
+ if (!API_KEY) {
7
+ console.error(JSON.stringify({ error: 'HUNTER_API_KEY environment variable required' }))
8
+ process.exit(1)
9
+ }
10
+
11
+ async function api(method, path, body) {
12
+ const separator = path.includes('?') ? '&' : '?'
13
+ const url = `${BASE_URL}${path}${separator}api_key=${API_KEY}`
14
+ if (args['dry-run']) {
15
+ return { _dry_run: true, method, url: url.replace(API_KEY, '***'), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: body || undefined }
16
+ }
17
+ const res = await fetch(url, {
18
+ method,
19
+ headers: {
20
+ 'Content-Type': 'application/json',
21
+ 'Accept': 'application/json',
22
+ },
23
+ body: body ? JSON.stringify(body) : undefined,
24
+ })
25
+ const text = await res.text()
26
+ try {
27
+ return JSON.parse(text)
28
+ } catch {
29
+ return { status: res.status, body: text }
30
+ }
31
+ }
32
+
33
+ function parseArgs(args) {
34
+ const result = { _: [] }
35
+ for (let i = 0; i < args.length; i++) {
36
+ const arg = args[i]
37
+ if (arg.startsWith('--')) {
38
+ const key = arg.slice(2)
39
+ const next = args[i + 1]
40
+ if (next && !next.startsWith('--')) {
41
+ result[key] = next
42
+ i++
43
+ } else {
44
+ result[key] = true
45
+ }
46
+ } else {
47
+ result._.push(arg)
48
+ }
49
+ }
50
+ return result
51
+ }
52
+
53
+ const args = parseArgs(process.argv.slice(2))
54
+ const [cmd, sub, ...rest] = args._
55
+
56
+ async function main() {
57
+ let result
58
+
59
+ switch (cmd) {
60
+ case 'domain':
61
+ switch (sub) {
62
+ case 'search': {
63
+ const domain = args.domain
64
+ if (!domain) { result = { error: '--domain required' }; break }
65
+ const params = new URLSearchParams({ domain })
66
+ if (args.limit) params.set('limit', args.limit)
67
+ if (args.type) params.set('type', args.type)
68
+ result = await api('GET', `/domain-search?${params.toString()}`)
69
+ break
70
+ }
71
+ case 'count': {
72
+ const domain = args.domain
73
+ if (!domain) { result = { error: '--domain required' }; break }
74
+ const params = new URLSearchParams({ domain })
75
+ if (args.type) params.set('type', args.type)
76
+ result = await api('GET', `/email-count?${params.toString()}`)
77
+ break
78
+ }
79
+ default:
80
+ result = { error: 'Unknown domain subcommand. Use: search, count' }
81
+ }
82
+ break
83
+
84
+ case 'email':
85
+ switch (sub) {
86
+ case 'find': {
87
+ const domain = args.domain
88
+ const firstName = args['first-name']
89
+ const lastName = args['last-name']
90
+ if (!domain) { result = { error: '--domain required' }; break }
91
+ if (!firstName) { result = { error: '--first-name required' }; break }
92
+ if (!lastName) { result = { error: '--last-name required' }; break }
93
+ const params = new URLSearchParams({ domain, first_name: firstName, last_name: lastName })
94
+ result = await api('GET', `/email-finder?${params.toString()}`)
95
+ break
96
+ }
97
+ case 'verify': {
98
+ const email = args.email
99
+ if (!email) { result = { error: '--email required' }; break }
100
+ const params = new URLSearchParams({ email })
101
+ result = await api('GET', `/email-verifier?${params.toString()}`)
102
+ break
103
+ }
104
+ default:
105
+ result = { error: 'Unknown email subcommand. Use: find, verify' }
106
+ }
107
+ break
108
+
109
+ case 'account':
110
+ switch (sub) {
111
+ case 'info':
112
+ result = await api('GET', '/account')
113
+ break
114
+ default:
115
+ result = { error: 'Unknown account subcommand. Use: info' }
116
+ }
117
+ break
118
+
119
+ case 'leads':
120
+ switch (sub) {
121
+ case 'list': {
122
+ const params = new URLSearchParams()
123
+ if (args.limit) params.set('limit', args.limit)
124
+ if (args.offset) params.set('offset', args.offset)
125
+ const qs = params.toString()
126
+ result = await api('GET', `/leads${qs ? '?' + qs : ''}`)
127
+ break
128
+ }
129
+ case 'get': {
130
+ const id = args.id
131
+ if (!id) { result = { error: '--id required' }; break }
132
+ result = await api('GET', `/leads/${id}`)
133
+ break
134
+ }
135
+ case 'create': {
136
+ const email = args.email
137
+ if (!email) { result = { error: '--email required' }; break }
138
+ const body = { email }
139
+ if (args['first-name']) body.first_name = args['first-name']
140
+ if (args['last-name']) body.last_name = args['last-name']
141
+ if (args.company) body.company = args.company
142
+ result = await api('POST', '/leads', body)
143
+ break
144
+ }
145
+ case 'delete': {
146
+ const id = args.id
147
+ if (!id) { result = { error: '--id required' }; break }
148
+ result = await api('DELETE', `/leads/${id}`)
149
+ break
150
+ }
151
+ default:
152
+ result = { error: 'Unknown leads subcommand. Use: list, get, create, delete' }
153
+ }
154
+ break
155
+
156
+ case 'campaigns':
157
+ switch (sub) {
158
+ case 'list': {
159
+ const params = new URLSearchParams()
160
+ if (args.limit) params.set('limit', args.limit)
161
+ if (args.offset) params.set('offset', args.offset)
162
+ const qs = params.toString()
163
+ result = await api('GET', `/campaigns${qs ? '?' + qs : ''}`)
164
+ break
165
+ }
166
+ case 'get': {
167
+ const id = args.id
168
+ if (!id) { result = { error: '--id required' }; break }
169
+ result = await api('GET', `/campaigns/${id}`)
170
+ break
171
+ }
172
+ case 'start': {
173
+ const id = args.id
174
+ if (!id) { result = { error: '--id required' }; break }
175
+ result = await api('POST', `/campaigns/${id}/start`)
176
+ break
177
+ }
178
+ case 'pause': {
179
+ const id = args.id
180
+ if (!id) { result = { error: '--id required' }; break }
181
+ result = await api('POST', `/campaigns/${id}/pause`)
182
+ break
183
+ }
184
+ default:
185
+ result = { error: 'Unknown campaigns subcommand. Use: list, get, start, pause' }
186
+ }
187
+ break
188
+
189
+ case 'leads-lists':
190
+ switch (sub) {
191
+ case 'list': {
192
+ const params = new URLSearchParams()
193
+ if (args.limit) params.set('limit', args.limit)
194
+ if (args.offset) params.set('offset', args.offset)
195
+ const qs = params.toString()
196
+ result = await api('GET', `/leads_lists${qs ? '?' + qs : ''}`)
197
+ break
198
+ }
199
+ case 'get': {
200
+ const id = args.id
201
+ if (!id) { result = { error: '--id required' }; break }
202
+ result = await api('GET', `/leads_lists/${id}`)
203
+ break
204
+ }
205
+ default:
206
+ result = { error: 'Unknown leads-lists subcommand. Use: list, get' }
207
+ }
208
+ break
209
+
210
+ default:
211
+ result = {
212
+ error: 'Unknown command',
213
+ usage: {
214
+ domain: {
215
+ search: 'domain search --domain <domain> [--limit <n>] [--type personal|generic]',
216
+ count: 'domain count --domain <domain> [--type personal|generic]',
217
+ },
218
+ email: {
219
+ find: 'email find --domain <domain> --first-name <name> --last-name <name>',
220
+ verify: 'email verify --email <email>',
221
+ },
222
+ account: 'account info',
223
+ leads: {
224
+ list: 'leads list [--limit <n>] [--offset <n>]',
225
+ get: 'leads get --id <id>',
226
+ create: 'leads create --email <email> [--first-name <name>] [--last-name <name>] [--company <company>]',
227
+ delete: 'leads delete --id <id>',
228
+ },
229
+ campaigns: {
230
+ list: 'campaigns list [--limit <n>] [--offset <n>]',
231
+ get: 'campaigns get --id <id>',
232
+ start: 'campaigns start --id <id>',
233
+ pause: 'campaigns pause --id <id>',
234
+ },
235
+ 'leads-lists': {
236
+ list: 'leads-lists list [--limit <n>] [--offset <n>]',
237
+ get: 'leads-lists get --id <id>',
238
+ },
239
+ }
240
+ }
241
+ }
242
+
243
+ console.log(JSON.stringify(result, null, 2))
244
+ }
245
+
246
+ main().catch(err => {
247
+ console.error(JSON.stringify({ error: err.message }))
248
+ process.exit(1)
249
+ })
@@ -0,0 +1,270 @@
1
+ #!/usr/bin/env node
2
+
3
+ const API_KEY = process.env.INSTANTLY_API_KEY
4
+ const BASE_URL = 'https://api.instantly.ai/api/v1'
5
+
6
+ if (!API_KEY) {
7
+ console.error(JSON.stringify({ error: 'INSTANTLY_API_KEY environment variable required' }))
8
+ process.exit(1)
9
+ }
10
+
11
+ async function api(method, path, body) {
12
+ const separator = path.includes('?') ? '&' : '?'
13
+ const url = `${BASE_URL}${path}${separator}api_key=${API_KEY}`
14
+ if (args['dry-run']) {
15
+ const maskedUrl = url.replace(API_KEY, '***')
16
+ const maskedBody = body ? JSON.parse(JSON.stringify(body)) : undefined
17
+ if (maskedBody && maskedBody.api_key) maskedBody.api_key = '***'
18
+ return { _dry_run: true, method, url: maskedUrl, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: maskedBody }
19
+ }
20
+ const res = await fetch(url, {
21
+ method,
22
+ headers: {
23
+ 'Content-Type': 'application/json',
24
+ 'Accept': 'application/json',
25
+ },
26
+ body: body ? JSON.stringify(body) : undefined,
27
+ })
28
+ const text = await res.text()
29
+ try {
30
+ return JSON.parse(text)
31
+ } catch {
32
+ return { status: res.status, body: text }
33
+ }
34
+ }
35
+
36
+ function parseArgs(args) {
37
+ const result = { _: [] }
38
+ for (let i = 0; i < args.length; i++) {
39
+ const arg = args[i]
40
+ if (arg.startsWith('--')) {
41
+ const key = arg.slice(2)
42
+ const next = args[i + 1]
43
+ if (next && !next.startsWith('--')) {
44
+ result[key] = next
45
+ i++
46
+ } else {
47
+ result[key] = true
48
+ }
49
+ } else {
50
+ result._.push(arg)
51
+ }
52
+ }
53
+ return result
54
+ }
55
+
56
+ const args = parseArgs(process.argv.slice(2))
57
+ const [cmd, sub, ...rest] = args._
58
+
59
+ async function main() {
60
+ let result
61
+
62
+ switch (cmd) {
63
+ case 'campaigns':
64
+ switch (sub) {
65
+ case 'list': {
66
+ const params = new URLSearchParams()
67
+ if (args.limit) params.set('limit', args.limit)
68
+ if (args.skip) params.set('skip', args.skip)
69
+ const qs = params.toString()
70
+ result = await api('GET', `/campaign/list${qs ? '?' + qs : ''}`)
71
+ break
72
+ }
73
+ case 'get': {
74
+ const id = args.id
75
+ if (!id) { result = { error: '--id required' }; break }
76
+ const params = new URLSearchParams({ campaign_id: id })
77
+ result = await api('GET', `/campaign/get?${params.toString()}`)
78
+ break
79
+ }
80
+ case 'status': {
81
+ const id = args.id
82
+ if (!id) { result = { error: '--id required' }; break }
83
+ const params = new URLSearchParams({ campaign_id: id })
84
+ result = await api('GET', `/campaign/get/status?${params.toString()}`)
85
+ break
86
+ }
87
+ case 'launch': {
88
+ const id = args.id
89
+ if (!id) { result = { error: '--id required' }; break }
90
+ result = await api('POST', '/campaign/launch', { api_key: API_KEY, campaign_id: id })
91
+ break
92
+ }
93
+ case 'pause': {
94
+ const id = args.id
95
+ if (!id) { result = { error: '--id required' }; break }
96
+ result = await api('POST', '/campaign/pause', { api_key: API_KEY, campaign_id: id })
97
+ break
98
+ }
99
+ default:
100
+ result = { error: 'Unknown campaigns subcommand. Use: list, get, status, launch, pause' }
101
+ }
102
+ break
103
+
104
+ case 'leads':
105
+ switch (sub) {
106
+ case 'list': {
107
+ const campaignId = args['campaign-id']
108
+ if (!campaignId) { result = { error: '--campaign-id required' }; break }
109
+ const params = new URLSearchParams({ campaign_id: campaignId })
110
+ if (args.limit) params.set('limit', args.limit)
111
+ if (args.skip) params.set('skip', args.skip)
112
+ result = await api('GET', `/lead/get?${params.toString()}`)
113
+ break
114
+ }
115
+ case 'add': {
116
+ const campaignId = args['campaign-id']
117
+ const email = args.email
118
+ if (!campaignId) { result = { error: '--campaign-id required' }; break }
119
+ if (!email) { result = { error: '--email required' }; break }
120
+ const lead = { email }
121
+ if (args['first-name']) lead.first_name = args['first-name']
122
+ if (args['last-name']) lead.last_name = args['last-name']
123
+ if (args.company) lead.company_name = args.company
124
+ result = await api('POST', '/lead/add', { api_key: API_KEY, campaign_id: campaignId, leads: [lead] })
125
+ break
126
+ }
127
+ case 'delete': {
128
+ const campaignId = args['campaign-id']
129
+ const email = args.email
130
+ if (!campaignId) { result = { error: '--campaign-id required' }; break }
131
+ if (!email) { result = { error: '--email required' }; break }
132
+ result = await api('POST', '/lead/delete', { api_key: API_KEY, campaign_id: campaignId, delete_list: [email] })
133
+ break
134
+ }
135
+ case 'status': {
136
+ const campaignId = args['campaign-id']
137
+ const email = args.email
138
+ if (!campaignId) { result = { error: '--campaign-id required' }; break }
139
+ if (!email) { result = { error: '--email required' }; break }
140
+ const params = new URLSearchParams({ campaign_id: campaignId, email })
141
+ result = await api('GET', `/lead/get/status?${params.toString()}`)
142
+ break
143
+ }
144
+ default:
145
+ result = { error: 'Unknown leads subcommand. Use: list, add, delete, status' }
146
+ }
147
+ break
148
+
149
+ case 'accounts':
150
+ switch (sub) {
151
+ case 'list': {
152
+ const params = new URLSearchParams()
153
+ if (args.limit) params.set('limit', args.limit)
154
+ if (args.skip) params.set('skip', args.skip)
155
+ const qs = params.toString()
156
+ result = await api('GET', `/account/list${qs ? '?' + qs : ''}`)
157
+ break
158
+ }
159
+ case 'status': {
160
+ const accountId = args['account-id']
161
+ if (!accountId) { result = { error: '--account-id required' }; break }
162
+ const params = new URLSearchParams({ email: accountId })
163
+ result = await api('GET', `/account/get/status?${params.toString()}`)
164
+ break
165
+ }
166
+ case 'warmup-status': {
167
+ const accountId = args['account-id']
168
+ if (!accountId) { result = { error: '--account-id required' }; break }
169
+ const params = new URLSearchParams({ email: accountId })
170
+ result = await api('GET', `/account/get/warmup?${params.toString()}`)
171
+ break
172
+ }
173
+ default:
174
+ result = { error: 'Unknown accounts subcommand. Use: list, status, warmup-status' }
175
+ }
176
+ break
177
+
178
+ case 'analytics':
179
+ switch (sub) {
180
+ case 'campaign': {
181
+ const campaignId = args['campaign-id']
182
+ if (!campaignId) { result = { error: '--campaign-id required' }; break }
183
+ const body = { api_key: API_KEY, campaign_id: campaignId }
184
+ if (args['start-date']) body.start_date = args['start-date']
185
+ if (args['end-date']) body.end_date = args['end-date']
186
+ result = await api('POST', '/analytics/campaign/summary', body)
187
+ break
188
+ }
189
+ case 'steps': {
190
+ const campaignId = args['campaign-id']
191
+ if (!campaignId) { result = { error: '--campaign-id required' }; break }
192
+ const body = { api_key: API_KEY, campaign_id: campaignId }
193
+ if (args['start-date']) body.start_date = args['start-date']
194
+ if (args['end-date']) body.end_date = args['end-date']
195
+ result = await api('POST', '/analytics/campaign/step', body)
196
+ break
197
+ }
198
+ case 'account': {
199
+ const startDate = args['start-date']
200
+ const endDate = args['end-date']
201
+ if (!startDate) { result = { error: '--start-date required' }; break }
202
+ if (!endDate) { result = { error: '--end-date required' }; break }
203
+ result = await api('POST', '/analytics/campaign/count', { api_key: API_KEY, start_date: startDate, end_date: endDate })
204
+ break
205
+ }
206
+ default:
207
+ result = { error: 'Unknown analytics subcommand. Use: campaign, steps, account' }
208
+ }
209
+ break
210
+
211
+ case 'blocklist':
212
+ switch (sub) {
213
+ case 'list':
214
+ result = await api('GET', '/blocklist')
215
+ break
216
+ case 'add': {
217
+ const entries = args.entries
218
+ if (!entries) { result = { error: '--entries required (comma-separated emails or domains)' }; break }
219
+ const entryList = entries.split(',').map(e => e.trim())
220
+ result = await api('POST', '/blocklist/add', { api_key: API_KEY, entries: entryList })
221
+ break
222
+ }
223
+ default:
224
+ result = { error: 'Unknown blocklist subcommand. Use: list, add' }
225
+ }
226
+ break
227
+
228
+ default:
229
+ result = {
230
+ error: 'Unknown command',
231
+ usage: {
232
+ campaigns: {
233
+ list: 'campaigns list [--limit <n>] [--skip <n>]',
234
+ get: 'campaigns get --id <id>',
235
+ status: 'campaigns status --id <id>',
236
+ launch: 'campaigns launch --id <id>',
237
+ pause: 'campaigns pause --id <id>',
238
+ },
239
+ leads: {
240
+ list: 'leads list --campaign-id <id> [--limit <n>] [--skip <n>]',
241
+ add: 'leads add --campaign-id <id> --email <email> [--first-name <name>] [--last-name <name>] [--company <name>]',
242
+ delete: 'leads delete --campaign-id <id> --email <email>',
243
+ status: 'leads status --campaign-id <id> --email <email>',
244
+ },
245
+ accounts: {
246
+ list: 'accounts list [--limit <n>] [--skip <n>]',
247
+ status: 'accounts status --account-id <email>',
248
+ 'warmup-status': 'accounts warmup-status --account-id <email>',
249
+ },
250
+ analytics: {
251
+ campaign: 'analytics campaign --campaign-id <id> [--start-date YYYY-MM-DD] [--end-date YYYY-MM-DD]',
252
+ steps: 'analytics steps --campaign-id <id> [--start-date YYYY-MM-DD] [--end-date YYYY-MM-DD]',
253
+ account: 'analytics account --start-date YYYY-MM-DD --end-date YYYY-MM-DD',
254
+ },
255
+ blocklist: {
256
+ list: 'blocklist list',
257
+ add: 'blocklist add --entries <email-or-domain,email-or-domain>',
258
+ },
259
+ options: '--dry-run (show request without executing)',
260
+ }
261
+ }
262
+ }
263
+
264
+ console.log(JSON.stringify(result, null, 2))
265
+ }
266
+
267
+ main().catch(err => {
268
+ console.error(JSON.stringify({ error: err.message }))
269
+ process.exit(1)
270
+ })