arkaos 4.26.0 → 4.28.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 (412) hide show
  1. package/README.md +7 -5
  2. package/THE-ARKAOS-GUIDE.md +7 -7
  3. package/VERSION +1 -1
  4. package/arka/SKILL.md +1 -1
  5. package/arka/skills/human-writing/SKILL.md +106 -0
  6. package/arka/skills/human-writing/references/anti-slop-phrases.md +131 -0
  7. package/arka/skills/human-writing/references/checklist.md +66 -0
  8. package/arka/skills/human-writing/references/content-refresh.md +38 -0
  9. package/arka/skills/human-writing/references/plain-english-alternatives.md +394 -0
  10. package/arka/skills/human-writing/references/pt-pt-anti-slop.md +82 -0
  11. package/arka/skills/human-writing/references/stop-slop.LICENSE +21 -0
  12. package/arka/skills/human-writing/references/structural-patterns.md +151 -0
  13. package/config/claude-agents/content-marketer.md +1 -1
  14. package/config/claude-agents/content-strategist.md +1 -1
  15. package/config/claude-agents/eduardo-copy.md +13 -0
  16. package/config/claude-agents/lifecycle-marketer.md +50 -0
  17. package/config/claude-agents/pr-partnerships.md +50 -0
  18. package/config/claude-agents/product-marketer.md +50 -0
  19. package/config/claude-agents/repurpose-distributor.md +1 -1
  20. package/config/claude-agents/sales-copywriter.md +1 -1
  21. package/config/claude-agents/scriptwriter.md +1 -1
  22. package/config/claude-agents/viral-engineer.md +1 -1
  23. package/config/evals/community.yaml +137 -0
  24. package/config/evals/content.yaml +298 -0
  25. package/config/evals/landing.yaml +927 -0
  26. package/config/evals/marketing.yaml +3836 -0
  27. package/config/evals/saas.yaml +616 -0
  28. package/config/evals/sales.yaml +437 -0
  29. package/config/skills-curated.yaml +2 -2
  30. package/config/skills-provenance.yaml +194 -21
  31. package/core/registry/generator.py +7 -0
  32. package/departments/community/SKILL.md +1 -0
  33. package/departments/community/skills/community-marketing/SKILL.md +200 -0
  34. package/departments/content/SKILL.md +1 -0
  35. package/departments/content/agents/content-strategist.yaml +1 -0
  36. package/departments/content/agents/repurpose-distributor.yaml +1 -0
  37. package/departments/content/agents/scriptwriter.yaml +1 -0
  38. package/departments/content/agents/viral-engineer.yaml +1 -0
  39. package/departments/content/skills/image-create/SKILL.md +375 -0
  40. package/departments/content/skills/image-create/references/ai-image-prompting.md +229 -0
  41. package/departments/content/skills/video-produce/SKILL.md +220 -0
  42. package/departments/content/skills/video-produce/references/ai-video-prompting.md +175 -0
  43. package/departments/content/skills/video-produce/references/edit-anatomy.md +84 -0
  44. package/departments/landing/SKILL.md +3 -0
  45. package/departments/landing/agents/sales-copywriter.yaml +1 -0
  46. package/departments/landing/skills/affiliate-bridge/SKILL.md +291 -5
  47. package/departments/landing/skills/affiliate-bridge/references/affiliate-programs.md +167 -0
  48. package/departments/landing/skills/affiliate-bridge/references/program-examples.md +143 -0
  49. package/departments/landing/skills/copy-framework/SKILL.md +241 -0
  50. package/departments/landing/skills/copy-framework/references/copy-frameworks.md +344 -0
  51. package/departments/landing/skills/copy-framework/references/natural-transitions.md +272 -0
  52. package/departments/landing/skills/lead-magnet/SKILL.md +337 -0
  53. package/departments/landing/skills/lead-magnet/references/benchmarks.md +129 -0
  54. package/departments/landing/skills/lead-magnet/references/format-guide.md +196 -0
  55. package/departments/landing/skills/offer-create/SKILL.md +105 -8
  56. package/departments/landing/skills/offer-create/references/bonus-stacking.md +150 -0
  57. package/departments/landing/skills/offer-create/references/examples.md +215 -0
  58. package/departments/landing/skills/offer-create/references/guarantee-design.md +172 -0
  59. package/departments/landing/skills/offer-create/references/offer-anatomy.md +203 -0
  60. package/departments/landing/skills/offer-create/references/offer-formats.md +240 -0
  61. package/departments/landing/skills/offer-create/references/scarcity-urgency.md +175 -0
  62. package/departments/landing/skills/offer-create/references/value-equation.md +134 -0
  63. package/departments/landing/skills/optimize-page/SKILL.md +185 -4
  64. package/departments/landing/skills/optimize-page/references/experiments.md +248 -0
  65. package/departments/landing/skills/optimize-page/references/form.md +422 -0
  66. package/departments/landing/skills/page-architect/SKILL.md +373 -5
  67. package/departments/landing/skills/page-architect/references/mermaid-templates.md +216 -0
  68. package/departments/landing/skills/page-architect/references/navigation-patterns.md +305 -0
  69. package/departments/landing/skills/page-architect/references/site-type-templates.md +293 -0
  70. package/departments/landing/skills/popup-design/SKILL.md +481 -0
  71. package/departments/landing/skills/signup-optimize/SKILL.md +385 -0
  72. package/departments/marketing/SKILL.md +22 -1
  73. package/departments/marketing/agents/content-marketer.yaml +1 -0
  74. package/departments/marketing/agents/growth-marketing/lifecycle-marketer.yaml +75 -0
  75. package/departments/marketing/agents/growth-marketing/pr-partnerships.yaml +74 -0
  76. package/departments/marketing/agents/growth-marketing/product-marketer.yaml +79 -0
  77. package/departments/marketing/agents/marketing-director.yaml +1 -0
  78. package/departments/marketing/skills/ab-test/SKILL.md +322 -3
  79. package/departments/marketing/skills/ab-test/references/sample-size-guide.md +263 -0
  80. package/departments/marketing/skills/ab-test/references/test-templates.md +277 -0
  81. package/departments/marketing/skills/ad-creative/SKILL.md +451 -0
  82. package/departments/marketing/skills/ad-creative/references/creative-review-page.md +106 -0
  83. package/departments/marketing/skills/ad-creative/references/creative-roadmap.md +118 -0
  84. package/departments/marketing/skills/ad-creative/references/generative-tools.md +637 -0
  85. package/departments/marketing/skills/ad-creative/references/hook-system.md +115 -0
  86. package/departments/marketing/skills/ad-creative/references/imessage-video-ads.md +201 -0
  87. package/departments/marketing/skills/ad-creative/references/motion-video-ads.md +126 -0
  88. package/departments/marketing/skills/ad-creative/references/platform-specs.md +213 -0
  89. package/departments/marketing/skills/ad-creative/references/static-ad-templates.md +200 -0
  90. package/departments/marketing/skills/ai-seo/SKILL.md +520 -0
  91. package/departments/marketing/skills/ai-seo/references/citations-vs-recommendations.md +85 -0
  92. package/departments/marketing/skills/ai-seo/references/content-patterns.md +287 -0
  93. package/departments/marketing/skills/ai-seo/references/content-types.md +71 -0
  94. package/departments/marketing/skills/ai-seo/references/okf.md +104 -0
  95. package/departments/marketing/skills/ai-seo/references/platform-ranking-factors.md +154 -0
  96. package/departments/marketing/skills/analytics-report/SKILL.md +310 -1
  97. package/departments/marketing/skills/analytics-report/references/event-library.md +260 -0
  98. package/departments/marketing/skills/analytics-report/references/ga4-implementation.md +300 -0
  99. package/departments/marketing/skills/analytics-report/references/gtm-implementation.md +390 -0
  100. package/departments/marketing/skills/aso/SKILL.md +336 -0
  101. package/departments/marketing/skills/aso/references/apple-specs.md +107 -0
  102. package/departments/marketing/skills/aso/references/benchmarks.md +129 -0
  103. package/departments/marketing/skills/aso/references/google-play-specs.md +131 -0
  104. package/departments/marketing/skills/aso/references/report-template.md +213 -0
  105. package/departments/marketing/skills/aso/references/scoring-criteria.md +213 -0
  106. package/departments/marketing/skills/co-marketing/SKILL.md +316 -0
  107. package/departments/marketing/skills/cold-email/SKILL.md +80 -0
  108. package/departments/marketing/skills/cold-email/references/benchmarks.md +83 -0
  109. package/departments/marketing/skills/cold-email/references/follow-up-sequences.md +81 -0
  110. package/departments/marketing/skills/cold-email/references/frameworks.md +90 -0
  111. package/departments/marketing/skills/cold-email/references/personalization.md +79 -0
  112. package/departments/marketing/skills/cold-email/references/subject-lines.md +53 -0
  113. package/departments/marketing/skills/competitor-analysis/SKILL.md +262 -5
  114. package/departments/marketing/skills/competitor-analysis/references/content-architecture.md +271 -0
  115. package/departments/marketing/skills/competitor-analysis/references/templates.md +223 -0
  116. package/departments/marketing/skills/competitor-profile/SKILL.md +447 -0
  117. package/departments/marketing/skills/competitor-profile/references/templates.md +167 -0
  118. package/departments/marketing/skills/competitor-profile/references/tool-reference.md +179 -0
  119. package/departments/marketing/skills/content-strategy/SKILL.md +398 -0
  120. package/departments/marketing/skills/content-strategy/references/headless-cms.md +194 -0
  121. package/departments/marketing/skills/council/SKILL.md +185 -0
  122. package/departments/marketing/skills/council/references/advisor-template.md +51 -0
  123. package/departments/marketing/skills/council/references/advisors/alex-hormozi.md +43 -0
  124. package/departments/marketing/skills/council/references/advisors/ann-handley.md +43 -0
  125. package/departments/marketing/skills/council/references/advisors/april-dunford.md +41 -0
  126. package/departments/marketing/skills/council/references/advisors/byron-sharp.md +43 -0
  127. package/departments/marketing/skills/council/references/advisors/claude-hopkins.md +42 -0
  128. package/departments/marketing/skills/council/references/advisors/david-ogilvy.md +42 -0
  129. package/departments/marketing/skills/council/references/advisors/eugene-schwartz.md +42 -0
  130. package/departments/marketing/skills/council/references/advisors/gary-halbert.md +43 -0
  131. package/departments/marketing/skills/council/references/advisors/gary-vaynerchuk.md +43 -0
  132. package/departments/marketing/skills/council/references/advisors/rory-sutherland.md +42 -0
  133. package/departments/marketing/skills/council/references/advisors/russell-brunson.md +43 -0
  134. package/departments/marketing/skills/council/references/advisors/seth-godin.md +43 -0
  135. package/departments/marketing/skills/customer-research/SKILL.md +318 -0
  136. package/departments/marketing/skills/customer-research/references/source-guides.md +401 -0
  137. package/departments/marketing/skills/directory-submit/SKILL.md +409 -0
  138. package/departments/marketing/skills/directory-submit/references/directory-list.md +477 -0
  139. package/departments/marketing/skills/directory-submit/references/positioning-variations.md +232 -0
  140. package/departments/marketing/skills/directory-submit/references/submission-tracker-template.csv +266 -0
  141. package/departments/marketing/skills/email-sequence/SKILL.md +309 -2
  142. package/departments/marketing/skills/email-sequence/references/copy-guidelines.md +113 -0
  143. package/departments/marketing/skills/email-sequence/references/email-types.md +515 -0
  144. package/departments/marketing/skills/email-sequence/references/sequence-templates.md +168 -0
  145. package/departments/marketing/skills/free-tools/SKILL.md +203 -0
  146. package/departments/marketing/skills/free-tools/references/tool-types.md +217 -0
  147. package/departments/marketing/skills/marketing-ideas/SKILL.md +191 -0
  148. package/departments/marketing/skills/marketing-ideas/references/ideas-by-category.md +366 -0
  149. package/departments/marketing/skills/marketing-loops/SKILL.md +136 -0
  150. package/departments/marketing/skills/marketing-loops/references/loop-catalog.md +687 -0
  151. package/departments/marketing/skills/marketing-loops/references/loop-guardrails.md +73 -0
  152. package/departments/marketing/skills/marketing-loops/references/loop-orchestration.md +69 -0
  153. package/departments/marketing/skills/marketing-loops/references/loop-state.md +67 -0
  154. package/departments/marketing/skills/marketing-loops/references/loop-template.md +79 -0
  155. package/departments/marketing/skills/marketing-plan/SKILL.md +302 -0
  156. package/departments/marketing/skills/marketing-plan/references/aarrr-framework.md +180 -0
  157. package/departments/marketing/skills/marketing-plan/references/budget-planning.md +168 -0
  158. package/departments/marketing/skills/marketing-plan/references/client-types.md +373 -0
  159. package/departments/marketing/skills/marketing-plan/references/current-state-rubric.md +255 -0
  160. package/departments/marketing/skills/marketing-plan/references/example-quietude.md +972 -0
  161. package/departments/marketing/skills/marketing-plan/references/funding-stage-unlocks.md +230 -0
  162. package/departments/marketing/skills/marketing-plan/references/growth-patterns.md +148 -0
  163. package/departments/marketing/skills/marketing-plan/references/idea-cross-reference.md +265 -0
  164. package/departments/marketing/skills/marketing-plan/references/measurement-framework.md +213 -0
  165. package/departments/marketing/skills/marketing-plan/references/methodology.md +363 -0
  166. package/departments/marketing/skills/marketing-plan/references/ops-stack-mapping.md +197 -0
  167. package/departments/marketing/skills/marketing-plan/references/plan-template.md +494 -0
  168. package/departments/marketing/skills/marketing-plan/references/team-and-agency-model.md +278 -0
  169. package/departments/marketing/skills/marketing-psychology/SKILL.md +479 -0
  170. package/departments/marketing/skills/paid-campaign/SKILL.md +452 -3
  171. package/departments/marketing/skills/paid-campaign/references/abm-playbook.md +93 -0
  172. package/departments/marketing/skills/paid-campaign/references/ad-copy-templates.md +207 -0
  173. package/departments/marketing/skills/paid-campaign/references/audience-targeting.md +243 -0
  174. package/departments/marketing/skills/paid-campaign/references/b2b-paid-playbook.md +115 -0
  175. package/departments/marketing/skills/paid-campaign/references/conversion-tracking.md +361 -0
  176. package/departments/marketing/skills/paid-campaign/references/google-search-playbook.md +120 -0
  177. package/departments/marketing/skills/paid-campaign/references/linkedin-b2b-playbook.md +107 -0
  178. package/departments/marketing/skills/paid-campaign/references/meta-decision-system.md +143 -0
  179. package/departments/marketing/skills/paid-campaign/references/platform-setup-checklists.md +277 -0
  180. package/departments/marketing/skills/paid-campaign/references/rsa-output-spec.md +88 -0
  181. package/departments/marketing/skills/product-marketing/SKILL.md +141 -0
  182. package/departments/marketing/skills/programmatic-seo/SKILL.md +74 -3
  183. package/departments/marketing/skills/programmatic-seo/references/playbooks.md +308 -0
  184. package/departments/marketing/skills/public-relations/SKILL.md +167 -0
  185. package/departments/marketing/skills/public-relations/references/journalist-pitching.md +368 -0
  186. package/departments/marketing/skills/public-relations/references/media-outlets.md +207 -0
  187. package/departments/marketing/skills/public-relations/references/newsjacking.md +218 -0
  188. package/departments/marketing/skills/public-relations/references/press-platforms.md +188 -0
  189. package/departments/marketing/skills/schema-markup/SKILL.md +203 -0
  190. package/departments/marketing/skills/schema-markup/references/schema-examples.md +398 -0
  191. package/departments/marketing/skills/seo-audit/SKILL.md +470 -1
  192. package/departments/marketing/skills/seo-audit/references/ai-writing-detection.md +200 -0
  193. package/departments/marketing/skills/seo-audit/references/international-seo.md +230 -0
  194. package/departments/marketing/skills/sms-campaign/SKILL.md +363 -0
  195. package/departments/marketing/skills/sms-campaign/references/compliance.md +202 -0
  196. package/departments/marketing/skills/sms-campaign/references/platforms.md +318 -0
  197. package/departments/marketing/skills/sms-campaign/references/sequence-templates.md +282 -0
  198. package/departments/marketing/skills/social-strategy/SKILL.md +414 -3
  199. package/departments/marketing/skills/social-strategy/references/carousel-frameworks.md +141 -0
  200. package/departments/marketing/skills/social-strategy/references/listening-sources-template.md +123 -0
  201. package/departments/marketing/skills/social-strategy/references/listening.md +283 -0
  202. package/departments/marketing/skills/social-strategy/references/platform-limits.md +110 -0
  203. package/departments/marketing/skills/social-strategy/references/platforms.md +170 -0
  204. package/departments/marketing/skills/social-strategy/references/post-templates.md +179 -0
  205. package/departments/marketing/skills/social-strategy/references/reverse-engineering.md +195 -0
  206. package/departments/marketing/skills/social-strategy/references/short-form-video.md +237 -0
  207. package/departments/marketing/squad.yaml +10 -1
  208. package/departments/marketing/tools/LICENSE +21 -0
  209. package/departments/marketing/tools/REGISTRY.md +590 -0
  210. package/departments/marketing/tools/clis/README.md +198 -0
  211. package/departments/marketing/tools/clis/activecampaign.js +435 -0
  212. package/departments/marketing/tools/clis/adobe-analytics.js +161 -0
  213. package/departments/marketing/tools/clis/ahrefs.js +192 -0
  214. package/departments/marketing/tools/clis/airops.js +163 -0
  215. package/departments/marketing/tools/clis/amplitude.js +182 -0
  216. package/departments/marketing/tools/clis/apollo.js +142 -0
  217. package/departments/marketing/tools/clis/beehiiv.js +245 -0
  218. package/departments/marketing/tools/clis/brevo.js +368 -0
  219. package/departments/marketing/tools/clis/buffer.js +260 -0
  220. package/departments/marketing/tools/clis/calendly.js +253 -0
  221. package/departments/marketing/tools/clis/clay.js +159 -0
  222. package/departments/marketing/tools/clis/clearbit.js +163 -0
  223. package/departments/marketing/tools/clis/close.js +232 -0
  224. package/departments/marketing/tools/clis/coupler.js +173 -0
  225. package/departments/marketing/tools/clis/crossbeam.js +193 -0
  226. package/departments/marketing/tools/clis/customer-io.js +205 -0
  227. package/departments/marketing/tools/clis/dataforseo.js +257 -0
  228. package/departments/marketing/tools/clis/demio.js +149 -0
  229. package/departments/marketing/tools/clis/dub.js +158 -0
  230. package/departments/marketing/tools/clis/exa.js +147 -0
  231. package/departments/marketing/tools/clis/g2.js +186 -0
  232. package/departments/marketing/tools/clis/ga4.js +194 -0
  233. package/departments/marketing/tools/clis/github-prospects.js +257 -0
  234. package/departments/marketing/tools/clis/google-ads.js +189 -0
  235. package/departments/marketing/tools/clis/google-search-console.js +166 -0
  236. package/departments/marketing/tools/clis/hotjar.js +167 -0
  237. package/departments/marketing/tools/clis/hunter.js +249 -0
  238. package/departments/marketing/tools/clis/instantly.js +270 -0
  239. package/departments/marketing/tools/clis/intercom.js +399 -0
  240. package/departments/marketing/tools/clis/keywords-everywhere.js +185 -0
  241. package/departments/marketing/tools/clis/kit.js +232 -0
  242. package/departments/marketing/tools/clis/klaviyo.js +348 -0
  243. package/departments/marketing/tools/clis/lemlist.js +221 -0
  244. package/departments/marketing/tools/clis/linkedin-ads.js +185 -0
  245. package/departments/marketing/tools/clis/livestorm.js +292 -0
  246. package/departments/marketing/tools/clis/mailchimp.js +220 -0
  247. package/departments/marketing/tools/clis/mention-me.js +161 -0
  248. package/departments/marketing/tools/clis/meta-ads.js +181 -0
  249. package/departments/marketing/tools/clis/mixpanel.js +248 -0
  250. package/departments/marketing/tools/clis/onesignal.js +241 -0
  251. package/departments/marketing/tools/clis/optimizely.js +233 -0
  252. package/departments/marketing/tools/clis/outreach.js +213 -0
  253. package/departments/marketing/tools/clis/paddle.js +385 -0
  254. package/departments/marketing/tools/clis/partnerstack.js +382 -0
  255. package/departments/marketing/tools/clis/pendo.js +221 -0
  256. package/departments/marketing/tools/clis/plausible.js +249 -0
  257. package/departments/marketing/tools/clis/postmark.js +375 -0
  258. package/departments/marketing/tools/clis/rankparse.js +196 -0
  259. package/departments/marketing/tools/clis/resend.js +370 -0
  260. package/departments/marketing/tools/clis/rewardful.js +160 -0
  261. package/departments/marketing/tools/clis/savvycal.js +223 -0
  262. package/departments/marketing/tools/clis/segment.js +192 -0
  263. package/departments/marketing/tools/clis/semrush.js +207 -0
  264. package/departments/marketing/tools/clis/sendgrid.js +211 -0
  265. package/departments/marketing/tools/clis/similarweb.js +214 -0
  266. package/departments/marketing/tools/clis/snov.js +237 -0
  267. package/departments/marketing/tools/clis/supermetrics.js +169 -0
  268. package/departments/marketing/tools/clis/tiktok-ads.js +190 -0
  269. package/departments/marketing/tools/clis/tolt.js +153 -0
  270. package/departments/marketing/tools/clis/trustpilot.js +276 -0
  271. package/departments/marketing/tools/clis/typeform.js +269 -0
  272. package/departments/marketing/tools/clis/wistia.js +301 -0
  273. package/departments/marketing/tools/clis/zapier.js +165 -0
  274. package/departments/marketing/tools/clis/zoominfo.js +223 -0
  275. package/departments/marketing/tools/composio/README.md +105 -0
  276. package/departments/marketing/tools/composio/marketing-tools.md +91 -0
  277. package/departments/marketing/tools/integrations/activecampaign.md +337 -0
  278. package/departments/marketing/tools/integrations/adobe-analytics.md +156 -0
  279. package/departments/marketing/tools/integrations/ahrefs.md +142 -0
  280. package/departments/marketing/tools/integrations/airops.md +128 -0
  281. package/departments/marketing/tools/integrations/amplitude.md +135 -0
  282. package/departments/marketing/tools/integrations/apollo.md +148 -0
  283. package/departments/marketing/tools/integrations/attentive.md +152 -0
  284. package/departments/marketing/tools/integrations/audiencetap.md +125 -0
  285. package/departments/marketing/tools/integrations/beehiiv.md +157 -0
  286. package/departments/marketing/tools/integrations/brevo.md +268 -0
  287. package/departments/marketing/tools/integrations/browserbase.md +111 -0
  288. package/departments/marketing/tools/integrations/buffer.md +138 -0
  289. package/departments/marketing/tools/integrations/calendly.md +161 -0
  290. package/departments/marketing/tools/integrations/clay.md +149 -0
  291. package/departments/marketing/tools/integrations/clearbit.md +142 -0
  292. package/departments/marketing/tools/integrations/close.md +191 -0
  293. package/departments/marketing/tools/integrations/cogny.md +153 -0
  294. package/departments/marketing/tools/integrations/composio.md +190 -0
  295. package/departments/marketing/tools/integrations/contentful.md +160 -0
  296. package/departments/marketing/tools/integrations/coupler.md +142 -0
  297. package/departments/marketing/tools/integrations/crossbeam.md +137 -0
  298. package/departments/marketing/tools/integrations/customer-io.md +187 -0
  299. package/departments/marketing/tools/integrations/dataforseo.md +165 -0
  300. package/departments/marketing/tools/integrations/demio.md +182 -0
  301. package/departments/marketing/tools/integrations/dub-co.md +160 -0
  302. package/departments/marketing/tools/integrations/exa.md +145 -0
  303. package/departments/marketing/tools/integrations/firecrawl.md +144 -0
  304. package/departments/marketing/tools/integrations/firehose.md +159 -0
  305. package/departments/marketing/tools/integrations/g2.md +179 -0
  306. package/departments/marketing/tools/integrations/ga4.md +126 -0
  307. package/departments/marketing/tools/integrations/github.md +182 -0
  308. package/departments/marketing/tools/integrations/gong.md +144 -0
  309. package/departments/marketing/tools/integrations/google-ads.md +159 -0
  310. package/departments/marketing/tools/integrations/google-search-console.md +147 -0
  311. package/departments/marketing/tools/integrations/heygen.md +126 -0
  312. package/departments/marketing/tools/integrations/hotjar.md +147 -0
  313. package/departments/marketing/tools/integrations/hubspot.md +178 -0
  314. package/departments/marketing/tools/integrations/hunter.md +90 -0
  315. package/departments/marketing/tools/integrations/hyperframes.md +180 -0
  316. package/departments/marketing/tools/integrations/instantly.md +104 -0
  317. package/departments/marketing/tools/integrations/intercom.md +292 -0
  318. package/departments/marketing/tools/integrations/introw.md +182 -0
  319. package/departments/marketing/tools/integrations/keywords-everywhere.md +207 -0
  320. package/departments/marketing/tools/integrations/kit.md +167 -0
  321. package/departments/marketing/tools/integrations/klaviyo.md +228 -0
  322. package/departments/marketing/tools/integrations/lemlist.md +110 -0
  323. package/departments/marketing/tools/integrations/linkedin-ads.md +164 -0
  324. package/departments/marketing/tools/integrations/livestorm.md +313 -0
  325. package/departments/marketing/tools/integrations/mailchimp.md +150 -0
  326. package/departments/marketing/tools/integrations/mention-me.md +160 -0
  327. package/departments/marketing/tools/integrations/meta-ads.md +147 -0
  328. package/departments/marketing/tools/integrations/mixpanel.md +137 -0
  329. package/departments/marketing/tools/integrations/nitrosend.md +113 -0
  330. package/departments/marketing/tools/integrations/onesignal.md +229 -0
  331. package/departments/marketing/tools/integrations/optimizely.md +171 -0
  332. package/departments/marketing/tools/integrations/outreach.md +172 -0
  333. package/departments/marketing/tools/integrations/paddle.md +212 -0
  334. package/departments/marketing/tools/integrations/partnerstack.md +222 -0
  335. package/departments/marketing/tools/integrations/pendo.md +208 -0
  336. package/departments/marketing/tools/integrations/plausible.md +177 -0
  337. package/departments/marketing/tools/integrations/plivo.md +140 -0
  338. package/departments/marketing/tools/integrations/posthog.md +151 -0
  339. package/departments/marketing/tools/integrations/postmark.md +234 -0
  340. package/departments/marketing/tools/integrations/postscript.md +126 -0
  341. package/departments/marketing/tools/integrations/rankparse.md +257 -0
  342. package/departments/marketing/tools/integrations/rb2b.md +110 -0
  343. package/departments/marketing/tools/integrations/resend.md +212 -0
  344. package/departments/marketing/tools/integrations/rewardful.md +147 -0
  345. package/departments/marketing/tools/integrations/salesforce.md +150 -0
  346. package/departments/marketing/tools/integrations/sanity.md +148 -0
  347. package/departments/marketing/tools/integrations/savvycal.md +181 -0
  348. package/departments/marketing/tools/integrations/segment.md +159 -0
  349. package/departments/marketing/tools/integrations/semrush.md +121 -0
  350. package/departments/marketing/tools/integrations/sendgrid.md +161 -0
  351. package/departments/marketing/tools/integrations/sequenzy.md +306 -0
  352. package/departments/marketing/tools/integrations/shopify.md +176 -0
  353. package/departments/marketing/tools/integrations/similarweb.md +150 -0
  354. package/departments/marketing/tools/integrations/snov.md +94 -0
  355. package/departments/marketing/tools/integrations/sparktoro.md +127 -0
  356. package/departments/marketing/tools/integrations/strapi.md +167 -0
  357. package/departments/marketing/tools/integrations/stripe.md +148 -0
  358. package/departments/marketing/tools/integrations/supermetrics.md +145 -0
  359. package/departments/marketing/tools/integrations/tiktok-ads.md +161 -0
  360. package/departments/marketing/tools/integrations/tolt.md +144 -0
  361. package/departments/marketing/tools/integrations/truelist.md +184 -0
  362. package/departments/marketing/tools/integrations/trustpilot.md +191 -0
  363. package/departments/marketing/tools/integrations/twilio.md +152 -0
  364. package/departments/marketing/tools/integrations/typeform.md +190 -0
  365. package/departments/marketing/tools/integrations/webflow.md +198 -0
  366. package/departments/marketing/tools/integrations/wistia.md +164 -0
  367. package/departments/marketing/tools/integrations/wordpress.md +175 -0
  368. package/departments/marketing/tools/integrations/zapier.md +244 -0
  369. package/departments/marketing/tools/integrations/zoominfo.md +191 -0
  370. package/departments/quality/agents/copy-director.yaml +1 -0
  371. package/departments/saas/SKILL.md +1 -0
  372. package/departments/saas/skills/churn-analysis/SKILL.md +421 -4
  373. package/departments/saas/skills/churn-analysis/references/cancel-flow-patterns.md +316 -0
  374. package/departments/saas/skills/churn-analysis/references/dunning-playbook.md +408 -0
  375. package/departments/saas/skills/launch-execute/SKILL.md +346 -4
  376. package/departments/saas/skills/onboarding-optimize/SKILL.md +218 -4
  377. package/departments/saas/skills/onboarding-optimize/references/experiments.md +258 -0
  378. package/departments/saas/skills/paywall-design/SKILL.md +256 -0
  379. package/departments/saas/skills/paywall-design/references/experiments.md +164 -0
  380. package/departments/saas/skills/pricing-strategy/SKILL.md +224 -0
  381. package/departments/saas/skills/pricing-strategy/references/research-methods.md +152 -0
  382. package/departments/saas/skills/pricing-strategy/references/tier-structure.md +232 -0
  383. package/departments/sales/SKILL.md +3 -0
  384. package/departments/sales/skills/prospecting/SKILL.md +297 -0
  385. package/departments/sales/skills/prospecting/references/b2b-prospecting.md +106 -0
  386. package/departments/sales/skills/prospecting/references/compliance.md +123 -0
  387. package/departments/sales/skills/prospecting/references/data-sources.md +287 -0
  388. package/departments/sales/skills/prospecting/references/demand-signals.md +129 -0
  389. package/departments/sales/skills/prospecting/references/local-prospecting.md +165 -0
  390. package/departments/sales/skills/prospecting/references/saas-prospecting.md +123 -0
  391. package/departments/sales/skills/revops/SKILL.md +379 -0
  392. package/departments/sales/skills/revops/references/automation-playbooks.md +290 -0
  393. package/departments/sales/skills/revops/references/lifecycle-definitions.md +278 -0
  394. package/departments/sales/skills/revops/references/routing-rules.md +203 -0
  395. package/departments/sales/skills/revops/references/scoring-models.md +247 -0
  396. package/departments/sales/skills/sales-enablement/SKILL.md +396 -0
  397. package/departments/sales/skills/sales-enablement/references/deck-frameworks.md +263 -0
  398. package/departments/sales/skills/sales-enablement/references/demo-scripts.md +355 -0
  399. package/departments/sales/skills/sales-enablement/references/objection-library.md +270 -0
  400. package/departments/sales/skills/sales-enablement/references/one-pager-templates.md +208 -0
  401. package/harness/codex/AGENTS.md +8 -8
  402. package/harness/copilot/copilot-instructions.md +8 -8
  403. package/harness/cursor/rules/arkaos.mdc +9 -9
  404. package/harness/gemini/GEMINI.md +8 -8
  405. package/harness/opencode/AGENTS.md +8 -8
  406. package/harness/zed/.rules +8 -8
  407. package/knowledge/agents-registry-v2.json +170 -8
  408. package/knowledge/commands-registry.json +693 -99
  409. package/knowledge/skills-manifest.json +459 -20
  410. package/package.json +1 -1
  411. package/pyproject.toml +1 -1
  412. package/scripts/tools/evals_import.py +183 -0
@@ -0,0 +1,301 @@
1
+ #!/usr/bin/env node
2
+
3
+ const API_KEY = process.env.WISTIA_API_KEY
4
+ const BASE_URL = 'https://api.wistia.com/v1'
5
+
6
+ if (!API_KEY) {
7
+ console.error(JSON.stringify({ error: 'WISTIA_API_KEY environment variable required' }))
8
+ process.exit(1)
9
+ }
10
+
11
+ async function api(method, path, body) {
12
+ const auth = 'Basic ' + Buffer.from(`${API_KEY}:`).toString('base64')
13
+ if (args['dry-run']) {
14
+ return { _dry_run: true, method, url: `${BASE_URL}${path}`, headers: { 'Authorization': '***', 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: body || undefined }
15
+ }
16
+ const res = await fetch(`${BASE_URL}${path}`, {
17
+ method,
18
+ headers: {
19
+ 'Authorization': auth,
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
+ const page = args.page ? Number(args.page) : 1
56
+ const perPage = args['per-page'] ? Number(args['per-page']) : 25
57
+
58
+ async function main() {
59
+ let result
60
+
61
+ switch (cmd) {
62
+ case 'projects':
63
+ switch (sub) {
64
+ case 'list':
65
+ result = await api('GET', `/projects.json?page=${page}&per_page=${perPage}`)
66
+ break
67
+ case 'get': {
68
+ const id = args.id
69
+ if (!id) { result = { error: '--id required (project hashed ID)' }; break }
70
+ result = await api('GET', `/projects/${id}.json`)
71
+ break
72
+ }
73
+ case 'create': {
74
+ const name = args.name
75
+ if (!name) { result = { error: '--name required' }; break }
76
+ const body = { name }
77
+ if (args.public) body.public = true
78
+ result = await api('POST', '/projects.json', body)
79
+ break
80
+ }
81
+ case 'update': {
82
+ const id = args.id
83
+ if (!id) { result = { error: '--id required (project hashed ID)' }; break }
84
+ const body = {}
85
+ if (args.name) body.name = args.name
86
+ result = await api('PUT', `/projects/${id}.json`, body)
87
+ break
88
+ }
89
+ case 'delete': {
90
+ const id = args.id
91
+ if (!id) { result = { error: '--id required (project hashed ID)' }; break }
92
+ result = await api('DELETE', `/projects/${id}.json`)
93
+ break
94
+ }
95
+ default:
96
+ result = { error: 'Unknown projects subcommand. Use: list, get, create, update, delete' }
97
+ }
98
+ break
99
+
100
+ case 'medias':
101
+ switch (sub) {
102
+ case 'list': {
103
+ const params = new URLSearchParams({ page: String(page), per_page: String(perPage) })
104
+ if (args.project) params.set('project_id', args.project)
105
+ if (args.name) params.set('name', args.name)
106
+ if (args.type) params.set('type', args.type)
107
+ result = await api('GET', `/medias.json?${params.toString()}`)
108
+ break
109
+ }
110
+ case 'get': {
111
+ const id = args.id
112
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
113
+ result = await api('GET', `/medias/${id}.json`)
114
+ break
115
+ }
116
+ case 'update': {
117
+ const id = args.id
118
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
119
+ const body = {}
120
+ if (args.name) body.name = args.name
121
+ if (args.description) body.description = args.description
122
+ result = await api('PUT', `/medias/${id}.json`, body)
123
+ break
124
+ }
125
+ case 'delete': {
126
+ const id = args.id
127
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
128
+ result = await api('DELETE', `/medias/${id}.json`)
129
+ break
130
+ }
131
+ case 'copy': {
132
+ const id = args.id
133
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
134
+ const body = {}
135
+ if (args['target-project']) body.project_id = args['target-project']
136
+ result = await api('POST', `/medias/${id}/copy.json`, body)
137
+ break
138
+ }
139
+ case 'stats': {
140
+ const id = args.id
141
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
142
+ result = await api('GET', `/medias/${id}/stats.json`)
143
+ break
144
+ }
145
+ default:
146
+ result = { error: 'Unknown medias subcommand. Use: list, get, update, delete, copy, stats' }
147
+ }
148
+ break
149
+
150
+ case 'stats':
151
+ switch (sub) {
152
+ case 'account':
153
+ result = await api('GET', '/stats/account.json')
154
+ break
155
+ case 'project': {
156
+ const id = args.id
157
+ if (!id) { result = { error: '--id required (project hashed ID)' }; break }
158
+ result = await api('GET', `/stats/projects/${id}.json`)
159
+ break
160
+ }
161
+ case 'media': {
162
+ const id = args.id
163
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
164
+ result = await api('GET', `/stats/medias/${id}.json`)
165
+ break
166
+ }
167
+ case 'media-by-date': {
168
+ const id = args.id
169
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
170
+ const params = new URLSearchParams()
171
+ if (args.start) params.set('start_date', args.start)
172
+ if (args.end) params.set('end_date', args.end)
173
+ const qs = params.toString() ? `?${params.toString()}` : ''
174
+ result = await api('GET', `/stats/medias/${id}/by_date.json${qs}`)
175
+ break
176
+ }
177
+ case 'engagement': {
178
+ const id = args.id
179
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
180
+ result = await api('GET', `/stats/medias/${id}/engagement.json`)
181
+ break
182
+ }
183
+ case 'visitors': {
184
+ const params = new URLSearchParams({ page: String(page), per_page: String(perPage) })
185
+ if (args.search) params.set('search', args.search)
186
+ result = await api('GET', `/stats/visitors.json?${params.toString()}`)
187
+ break
188
+ }
189
+ case 'visitor': {
190
+ const key = args.key
191
+ if (!key) { result = { error: '--key required (visitor key)' }; break }
192
+ result = await api('GET', `/stats/visitors/${key}.json`)
193
+ break
194
+ }
195
+ case 'events': {
196
+ const params = new URLSearchParams({ page: String(page), per_page: String(perPage) })
197
+ if (args['media-id']) params.set('media_id', args['media-id'])
198
+ result = await api('GET', `/stats/events.json?${params.toString()}`)
199
+ break
200
+ }
201
+ default:
202
+ result = { error: 'Unknown stats subcommand. Use: account, project, media, media-by-date, engagement, visitors, visitor, events' }
203
+ }
204
+ break
205
+
206
+ case 'account':
207
+ result = await api('GET', '/account.json')
208
+ break
209
+
210
+ case 'captions':
211
+ switch (sub) {
212
+ case 'list': {
213
+ const id = args.id
214
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
215
+ result = await api('GET', `/medias/${id}/captions.json`)
216
+ break
217
+ }
218
+ case 'create': {
219
+ const id = args.id
220
+ const language = args.language
221
+ if (!id) { result = { error: '--id required (media hashed ID)' }; break }
222
+ if (!language) { result = { error: '--language required (e.g. eng)' }; break }
223
+ const body = { language }
224
+ if (args['srt-file']) {
225
+ // Dynamic import: this tree lives under a "type": "module"
226
+ // package, so the upstream require() form does not resolve here.
227
+ const fs = await import('node:fs')
228
+ const path = await import('node:path')
229
+ // Agent-invoked CLI: a prompt-injected --srt-file must not be
230
+ // able to read a secret and POST it as caption text. Defence:
231
+ // 1. realpathSync so a symlink cannot point somewhere else —
232
+ // path.resolve is lexical and does NOT follow links.
233
+ // 2. confine the real, link-resolved path to the real cwd.
234
+ // 3. allowlist the extension of the RESOLVED path — checking
235
+ // the argument alone is defeated by an in-cwd .srt symlink
236
+ // that resolves to an in-cwd secret; both the name AND the
237
+ // final target must be a caption file.
238
+ // 4. reject hard links (see below) — realpath does not resolve
239
+ // them, so they need their own check.
240
+ const isCaption = (p) => /\.(srt|vtt)$/i.test(p)
241
+ if (!isCaption(args['srt-file'])) {
242
+ result = { error: '--srt-file must be a .srt or .vtt caption file' }
243
+ break
244
+ }
245
+ let real
246
+ try {
247
+ real = fs.realpathSync(path.resolve(args['srt-file']))
248
+ } catch {
249
+ result = { error: '--srt-file not found or unreadable' }
250
+ break
251
+ }
252
+ const root = fs.realpathSync(process.cwd()) + path.sep
253
+ if (!(real + path.sep).startsWith(root)) {
254
+ result = { error: '--srt-file must point inside the current working directory' }
255
+ break
256
+ }
257
+ if (!isCaption(real)) {
258
+ result = { error: '--srt-file must resolve to a .srt or .vtt caption file' }
259
+ break
260
+ }
261
+ // 4. reject hard links: they share an inode with the target
262
+ // but realpath does NOT resolve them, so a .srt hard link
263
+ // to an in-cwd secret would slip past checks 1-3. A plain
264
+ // caption file has nlink === 1; rejecting nlink > 1 also
265
+ // refuses a legit but hard-linked .srt (conservative, but
266
+ // hard-linked caption files are not a real workflow).
267
+ if (fs.lstatSync(real).nlink > 1) {
268
+ result = { error: '--srt-file must not be a hard link' }
269
+ break
270
+ }
271
+ body.caption_file = fs.readFileSync(real, 'utf8')
272
+ }
273
+ result = await api('POST', `/medias/${id}/captions.json`, body)
274
+ break
275
+ }
276
+ default:
277
+ result = { error: 'Unknown captions subcommand. Use: list, create' }
278
+ }
279
+ break
280
+
281
+ default:
282
+ result = {
283
+ error: 'Unknown command',
284
+ usage: {
285
+ projects: 'projects [list | get --id <id> | create --name <name> | update --id <id> --name <name> | delete --id <id>]',
286
+ medias: 'medias [list [--project <id>] | get --id <id> | update --id <id> --name <name> | delete --id <id> | copy --id <id> [--target-project <id>] | stats --id <id>]',
287
+ stats: 'stats [account | project --id <id> | media --id <id> | media-by-date --id <id> [--start <date> --end <date>] | engagement --id <id> | visitors | visitor --key <key> | events [--media-id <id>]]',
288
+ account: 'account',
289
+ captions: 'captions [list --id <media-id> | create --id <media-id> --language <lang>]',
290
+ options: '--page <n> --per-page <n>',
291
+ }
292
+ }
293
+ }
294
+
295
+ console.log(JSON.stringify(result, null, 2))
296
+ }
297
+
298
+ main().catch(err => {
299
+ console.error(JSON.stringify({ error: err.message }))
300
+ process.exit(1)
301
+ })
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env node
2
+
3
+ const API_KEY = process.env.ZAPIER_API_KEY
4
+ const BASE_URL = 'https://api.zapier.com/v1'
5
+
6
+ if (!API_KEY) {
7
+ console.error(JSON.stringify({ error: 'ZAPIER_API_KEY environment variable required' }))
8
+ process.exit(1)
9
+ }
10
+
11
+ async function api(method, path, body) {
12
+ if (args['dry-run']) {
13
+ return { _dry_run: true, method, url: `${BASE_URL}${path}`, headers: { 'X-API-Key': '***', 'Content-Type': 'application/json' }, body: body || undefined }
14
+ }
15
+ const res = await fetch(`${BASE_URL}${path}`, {
16
+ method,
17
+ headers: {
18
+ 'X-API-Key': API_KEY,
19
+ 'Content-Type': 'application/json',
20
+ },
21
+ body: body ? JSON.stringify(body) : undefined,
22
+ })
23
+ const text = await res.text()
24
+ try {
25
+ return JSON.parse(text)
26
+ } catch {
27
+ return { status: res.status, body: text }
28
+ }
29
+ }
30
+
31
+ async function webhookPost(url, data) {
32
+ if (args['dry-run']) {
33
+ return { _dry_run: true, method: 'POST', url, headers: { 'Content-Type': 'application/json' }, body: data || undefined }
34
+ }
35
+ const res = await fetch(url, {
36
+ method: 'POST',
37
+ headers: { 'Content-Type': 'application/json' },
38
+ body: JSON.stringify(data),
39
+ })
40
+ const text = await res.text()
41
+ try {
42
+ return JSON.parse(text)
43
+ } catch {
44
+ return { status: res.status, body: text }
45
+ }
46
+ }
47
+
48
+ function parseArgs(args) {
49
+ const result = { _: [] }
50
+ for (let i = 0; i < args.length; i++) {
51
+ const arg = args[i]
52
+ if (arg.startsWith('--')) {
53
+ const key = arg.slice(2)
54
+ const next = args[i + 1]
55
+ if (next && !next.startsWith('--')) {
56
+ result[key] = next
57
+ i++
58
+ } else {
59
+ result[key] = true
60
+ }
61
+ } else {
62
+ result._.push(arg)
63
+ }
64
+ }
65
+ return result
66
+ }
67
+
68
+ const args = parseArgs(process.argv.slice(2))
69
+ const [cmd, sub, ...rest] = args._
70
+
71
+ async function main() {
72
+ let result
73
+
74
+ switch (cmd) {
75
+ case 'zaps':
76
+ switch (sub) {
77
+ case 'list':
78
+ result = await api('GET', '/zaps')
79
+ break
80
+ case 'get': {
81
+ if (!args.id) { result = { error: '--id required' }; break }
82
+ result = await api('GET', `/zaps/${args.id}`)
83
+ break
84
+ }
85
+ case 'on': {
86
+ if (!args.id) { result = { error: '--id required' }; break }
87
+ result = await api('POST', `/zaps/${args.id}/on`)
88
+ break
89
+ }
90
+ case 'off': {
91
+ if (!args.id) { result = { error: '--id required' }; break }
92
+ result = await api('POST', `/zaps/${args.id}/off`)
93
+ break
94
+ }
95
+ default:
96
+ result = { error: 'Unknown zaps subcommand. Use: list, get, on, off' }
97
+ }
98
+ break
99
+
100
+ case 'tasks':
101
+ switch (sub) {
102
+ case 'list': {
103
+ if (!args['zap-id']) { result = { error: '--zap-id required' }; break }
104
+ result = await api('GET', `/zaps/${args['zap-id']}/tasks`)
105
+ break
106
+ }
107
+ default:
108
+ result = { error: 'Unknown tasks subcommand. Use: list' }
109
+ }
110
+ break
111
+
112
+ case 'profile':
113
+ switch (sub) {
114
+ case 'me':
115
+ result = await api('GET', '/profiles/me')
116
+ break
117
+ default:
118
+ result = { error: 'Unknown profile subcommand. Use: me' }
119
+ }
120
+ break
121
+
122
+ case 'hooks':
123
+ switch (sub) {
124
+ case 'send': {
125
+ // Sends a POST to a Zapier webhook catch hook URL (e.g. https://hooks.zapier.com/hooks/catch/...)
126
+ // SECURITY: unlike every other CLI here, the destination host is
127
+ // caller-controlled — this sends arbitrary --data to ANY https URL.
128
+ // Review the URL before invoking from an agent context.
129
+ if (!args.url) { result = { error: '--url required' }; break }
130
+ if (!args.url.startsWith('https://')) { result = { error: '--url must use https://' }; break }
131
+ if (!args.data) { result = { error: '--data required (JSON string)' }; break }
132
+ let data
133
+ try {
134
+ data = JSON.parse(args.data)
135
+ } catch {
136
+ result = { error: 'Invalid JSON for --data' }
137
+ break
138
+ }
139
+ result = await webhookPost(args.url, data)
140
+ break
141
+ }
142
+ default:
143
+ result = { error: 'Unknown hooks subcommand. Use: send' }
144
+ }
145
+ break
146
+
147
+ default:
148
+ result = {
149
+ error: 'Unknown command',
150
+ usage: {
151
+ zaps: 'zaps [list|get|on|off] [--id <zap_id>]',
152
+ tasks: 'tasks [list] --zap-id <zap_id>',
153
+ profile: 'profile [me]',
154
+ hooks: 'hooks [send] --url <webhook_url> --data <json>',
155
+ },
156
+ }
157
+ }
158
+
159
+ console.log(JSON.stringify(result, null, 2))
160
+ }
161
+
162
+ main().catch(err => {
163
+ console.error(JSON.stringify({ error: err.message }))
164
+ process.exit(1)
165
+ })
@@ -0,0 +1,223 @@
1
+ #!/usr/bin/env node
2
+
3
+ const BASE_URL = 'https://api.zoominfo.com'
4
+
5
+ let ACCESS_TOKEN = process.env.ZOOMINFO_ACCESS_TOKEN
6
+
7
+ if (!ACCESS_TOKEN && !process.env.ZOOMINFO_USERNAME) {
8
+ console.error(JSON.stringify({ error: 'ZOOMINFO_ACCESS_TOKEN or ZOOMINFO_USERNAME + ZOOMINFO_PRIVATE_KEY environment variables required' }))
9
+ process.exit(1)
10
+ }
11
+
12
+ async function authenticate() {
13
+ if (ACCESS_TOKEN) return ACCESS_TOKEN
14
+ const username = process.env.ZOOMINFO_USERNAME
15
+ const password = process.env.ZOOMINFO_PRIVATE_KEY
16
+ if (!username || !password) {
17
+ throw new Error('ZOOMINFO_USERNAME and ZOOMINFO_PRIVATE_KEY required for authentication')
18
+ }
19
+ const res = await fetch(`${BASE_URL}/authenticate`, {
20
+ method: 'POST',
21
+ headers: { 'Content-Type': 'application/json' },
22
+ body: JSON.stringify({ username, password }),
23
+ })
24
+ const text = await res.text()
25
+ if (!res.ok) {
26
+ throw new Error(`Authentication failed (${res.status}): ${text}`)
27
+ }
28
+ try {
29
+ const data = JSON.parse(text)
30
+ if (!data.jwt) throw new Error('No JWT in response')
31
+ ACCESS_TOKEN = data.jwt
32
+ return ACCESS_TOKEN
33
+ } catch (e) {
34
+ if (e.message === 'No JWT in response') throw e
35
+ throw new Error(`Authentication failed: ${text}`)
36
+ }
37
+ }
38
+
39
+ async function api(method, path, body) {
40
+ if (args['dry-run']) {
41
+ return { _dry_run: true, method, url: `${BASE_URL}${path}`, headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ***' }, body }
42
+ }
43
+ const token = await authenticate()
44
+ const res = await fetch(`${BASE_URL}${path}`, {
45
+ method,
46
+ headers: {
47
+ 'Content-Type': 'application/json',
48
+ Authorization: `Bearer ${token}`,
49
+ },
50
+ body: body ? JSON.stringify(body) : undefined,
51
+ })
52
+ const text = await res.text()
53
+ try {
54
+ return JSON.parse(text)
55
+ } catch {
56
+ return { status: res.status, body: text }
57
+ }
58
+ }
59
+
60
+ function parseArgs(args) {
61
+ const result = { _: [] }
62
+ for (let i = 0; i < args.length; i++) {
63
+ const arg = args[i]
64
+ if (arg.startsWith('--')) {
65
+ const key = arg.slice(2)
66
+ const next = args[i + 1]
67
+ if (next && !next.startsWith('--')) {
68
+ result[key] = next
69
+ i++
70
+ } else {
71
+ result[key] = true
72
+ }
73
+ } else {
74
+ result._.push(arg)
75
+ }
76
+ }
77
+ return result
78
+ }
79
+
80
+ const args = parseArgs(process.argv.slice(2))
81
+ const [cmd, sub, ...rest] = args._
82
+
83
+ async function main() {
84
+ let result
85
+ const page = args.page ? Number(args.page) : 1
86
+ const perPage = args['per-page'] ? Number(args['per-page']) : 25
87
+
88
+ switch (cmd) {
89
+ case 'auth': {
90
+ if (args['dry-run']) {
91
+ result = { _dry_run: true, action: 'authenticate', url: `${BASE_URL}/authenticate`, jwt: '***' }
92
+ break
93
+ }
94
+ const token = await authenticate()
95
+ if (args['show-token']) {
96
+ result = { jwt: token }
97
+ } else {
98
+ const masked = token.length > 12
99
+ ? token.slice(0, 6) + '…' + token.slice(-6)
100
+ : '***'
101
+ result = { jwt: masked, hint: 'Use --show-token to reveal full JWT' }
102
+ }
103
+ break
104
+ }
105
+
106
+ case 'contacts':
107
+ switch (sub) {
108
+ case 'search': {
109
+ const body = { rpp: perPage, page }
110
+ if (args['job-title']) body.jobTitle = [args['job-title']]
111
+ if (args.company) body.companyName = [args.company]
112
+ if (args.location) body.locationSearchType = 'PersonLocation', body.personLocationCity = [args.location]
113
+ if (args.seniority) body.managementLevel = [args.seniority]
114
+ if (args.department) body.department = [args.department]
115
+ result = await api('POST', '/search/contact', body)
116
+ break
117
+ }
118
+ case 'enrich': {
119
+ const body = {}
120
+ if (args.email) body.matchEmail = [args.email]
121
+ if (args['person-id']) body.personId = [args['person-id']]
122
+ if (!args.email && !args['person-id']) {
123
+ result = { error: '--email or --person-id required' }
124
+ break
125
+ }
126
+ result = await api('POST', '/enrich/contact', body)
127
+ break
128
+ }
129
+ default:
130
+ result = { error: 'Unknown contacts subcommand. Use: search, enrich' }
131
+ }
132
+ break
133
+
134
+ case 'companies':
135
+ switch (sub) {
136
+ case 'search': {
137
+ const body = { rpp: perPage, page }
138
+ if (args.name) body.companyName = [args.name]
139
+ if (args.industry) body.industry = [args.industry]
140
+ if (args['revenue-min']) body.revenueMin = Number(args['revenue-min'])
141
+ if (args['revenue-max']) body.revenueMax = Number(args['revenue-max'])
142
+ if (args['employees-min']) body.employeeCountMin = Number(args['employees-min'])
143
+ if (args['employees-max']) body.employeeCountMax = Number(args['employees-max'])
144
+ result = await api('POST', '/search/company', body)
145
+ break
146
+ }
147
+ case 'enrich': {
148
+ const body = {}
149
+ if (args.domain) body.matchCompanyWebsite = [args.domain]
150
+ if (args['company-id']) body.companyId = [args['company-id']]
151
+ if (!args.domain && !args['company-id']) {
152
+ result = { error: '--domain or --company-id required' }
153
+ break
154
+ }
155
+ result = await api('POST', '/enrich/company', body)
156
+ break
157
+ }
158
+ default:
159
+ result = { error: 'Unknown companies subcommand. Use: search, enrich' }
160
+ }
161
+ break
162
+
163
+ case 'intent':
164
+ switch (sub) {
165
+ case 'search': {
166
+ if (!args.topic) {
167
+ result = { error: '--topic required' }
168
+ break
169
+ }
170
+ const body = { topicId: [args.topic] }
171
+ if (args['company-id']) body.companyId = [args['company-id']]
172
+ result = await api('POST', '/lookup/intent', body)
173
+ break
174
+ }
175
+ default:
176
+ result = { error: 'Unknown intent subcommand. Use: search' }
177
+ }
178
+ break
179
+
180
+ case 'scoops':
181
+ switch (sub) {
182
+ case 'search': {
183
+ const body = { rpp: perPage, page }
184
+ if (args['company-id']) body.companyId = [args['company-id']]
185
+ if (args.topic) body.topicId = [args.topic]
186
+ result = await api('POST', '/lookup/scoops', body)
187
+ break
188
+ }
189
+ default:
190
+ result = { error: 'Unknown scoops subcommand. Use: search' }
191
+ }
192
+ break
193
+
194
+ default:
195
+ result = {
196
+ error: 'Unknown command',
197
+ usage: {
198
+ auth: 'auth [--show-token] — authenticate and get JWT token (masked by default)',
199
+ contacts: {
200
+ search: 'contacts search [--job-title <t>] [--company <c>] [--location <l>] [--seniority <s>] [--department <d>] [--page <n>]',
201
+ enrich: 'contacts enrich --email <email> | --person-id <id>',
202
+ },
203
+ companies: {
204
+ search: 'companies search [--name <n>] [--industry <i>] [--revenue-min <n>] [--employees-min <n>] [--page <n>]',
205
+ enrich: 'companies enrich --domain <domain> | --company-id <id>',
206
+ },
207
+ intent: {
208
+ search: 'intent search --topic <topic> [--company-id <id>]',
209
+ },
210
+ scoops: {
211
+ search: 'scoops search [--company-id <id>] [--topic <topic>] [--page <n>]',
212
+ },
213
+ }
214
+ }
215
+ }
216
+
217
+ console.log(JSON.stringify(result, null, 2))
218
+ }
219
+
220
+ main().catch(err => {
221
+ console.error(JSON.stringify({ error: err.message }))
222
+ process.exit(1)
223
+ })