@hasna/connectors 0.3.16 → 0.4.1
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 +246 -1
- package/bin/mcp.js +246 -1
- package/bin/serve.js +245 -0
- package/connectors/connect-airtable/.env.example +11 -0
- package/connectors/connect-airtable/CLAUDE.md +121 -0
- package/connectors/connect-airtable/README.md +193 -0
- package/connectors/connect-airtable/package.json +50 -0
- package/connectors/connect-airtable/src/api/client.ts +139 -0
- package/connectors/connect-airtable/src/api/index.ts +405 -0
- package/connectors/connect-airtable/src/cli/index.ts +637 -0
- package/connectors/connect-airtable/src/index.ts +20 -0
- package/connectors/connect-airtable/src/types/index.ts +349 -0
- package/connectors/connect-airtable/src/utils/config.ts +197 -0
- package/connectors/connect-airtable/tsconfig.json +16 -0
- package/connectors/connect-amplitude/.env.example +11 -0
- package/connectors/connect-amplitude/CLAUDE.md +121 -0
- package/connectors/connect-amplitude/README.md +193 -0
- package/connectors/connect-amplitude/package.json +51 -0
- package/connectors/connect-amplitude/src/api/client.ts +144 -0
- package/connectors/connect-amplitude/src/api/index.ts +215 -0
- package/connectors/connect-amplitude/src/cli/index.ts +532 -0
- package/connectors/connect-amplitude/src/index.ts +22 -0
- package/connectors/connect-amplitude/src/types/index.ts +329 -0
- package/connectors/connect-amplitude/src/utils/config.ts +208 -0
- package/connectors/connect-amplitude/tsconfig.json +16 -0
- package/connectors/connect-asana/.env.example +11 -0
- package/connectors/connect-asana/CLAUDE.md +128 -0
- package/connectors/connect-asana/README.md +193 -0
- package/connectors/connect-asana/package.json +52 -0
- package/connectors/connect-asana/src/api/client.ts +119 -0
- package/connectors/connect-asana/src/api/index.ts +319 -0
- package/connectors/connect-asana/src/cli/index.ts +731 -0
- package/connectors/connect-asana/src/index.ts +19 -0
- package/connectors/connect-asana/src/types/index.ts +270 -0
- package/connectors/connect-asana/src/utils/config.ts +171 -0
- package/connectors/connect-asana/src/utils/output.ts +119 -0
- package/connectors/connect-asana/tsconfig.json +16 -0
- package/connectors/connect-calendly/.env.example +11 -0
- package/connectors/connect-calendly/CLAUDE.md +272 -0
- package/connectors/connect-calendly/README.md +193 -0
- package/connectors/connect-calendly/package.json +51 -0
- package/connectors/connect-calendly/scripts/release.ts +179 -0
- package/connectors/connect-calendly/src/api/client.ts +213 -0
- package/connectors/connect-calendly/src/api/example.ts +48 -0
- package/connectors/connect-calendly/src/api/index.ts +51 -0
- package/connectors/connect-calendly/src/cli/index.ts +254 -0
- package/connectors/connect-calendly/src/index.ts +103 -0
- package/connectors/connect-calendly/src/types/index.ts +237 -0
- package/connectors/connect-calendly/src/utils/auth.ts +274 -0
- package/connectors/connect-calendly/src/utils/bulk.ts +212 -0
- package/connectors/connect-calendly/src/utils/config.ts +326 -0
- package/connectors/connect-calendly/src/utils/output.ts +175 -0
- package/connectors/connect-calendly/src/utils/settings.ts +114 -0
- package/connectors/connect-calendly/src/utils/storage.ts +198 -0
- package/connectors/connect-calendly/tsconfig.json +16 -0
- package/connectors/connect-clickup/.env.example +11 -0
- package/connectors/connect-clickup/CLAUDE.md +128 -0
- package/connectors/connect-clickup/README.md +193 -0
- package/connectors/connect-clickup/package.json +52 -0
- package/connectors/connect-clickup/src/api/client.ts +116 -0
- package/connectors/connect-clickup/src/api/index.ts +400 -0
- package/connectors/connect-clickup/src/cli/index.ts +625 -0
- package/connectors/connect-clickup/src/index.ts +19 -0
- package/connectors/connect-clickup/src/types/index.ts +591 -0
- package/connectors/connect-clickup/src/utils/config.ts +157 -0
- package/connectors/connect-clickup/src/utils/output.ts +119 -0
- package/connectors/connect-clickup/tsconfig.json +16 -0
- package/connectors/connect-confluence/.env.example +11 -0
- package/connectors/connect-confluence/CLAUDE.md +272 -0
- package/connectors/connect-confluence/README.md +193 -0
- package/connectors/connect-confluence/package.json +53 -0
- package/connectors/connect-confluence/scripts/release.ts +179 -0
- package/connectors/connect-confluence/src/api/client.ts +213 -0
- package/connectors/connect-confluence/src/api/example.ts +48 -0
- package/connectors/connect-confluence/src/api/index.ts +51 -0
- package/connectors/connect-confluence/src/cli/index.ts +254 -0
- package/connectors/connect-confluence/src/index.ts +103 -0
- package/connectors/connect-confluence/src/types/index.ts +237 -0
- package/connectors/connect-confluence/src/utils/auth.ts +274 -0
- package/connectors/connect-confluence/src/utils/bulk.ts +212 -0
- package/connectors/connect-confluence/src/utils/config.ts +326 -0
- package/connectors/connect-confluence/src/utils/output.ts +175 -0
- package/connectors/connect-confluence/src/utils/settings.ts +114 -0
- package/connectors/connect-confluence/src/utils/storage.ts +198 -0
- package/connectors/connect-confluence/tsconfig.json +16 -0
- package/connectors/connect-convertkit/.env.example +11 -0
- package/connectors/connect-convertkit/CLAUDE.md +272 -0
- package/connectors/connect-convertkit/README.md +193 -0
- package/connectors/connect-convertkit/package.json +51 -0
- package/connectors/connect-convertkit/scripts/release.ts +179 -0
- package/connectors/connect-convertkit/src/api/client.ts +213 -0
- package/connectors/connect-convertkit/src/api/example.ts +48 -0
- package/connectors/connect-convertkit/src/api/index.ts +51 -0
- package/connectors/connect-convertkit/src/cli/index.ts +254 -0
- package/connectors/connect-convertkit/src/index.ts +103 -0
- package/connectors/connect-convertkit/src/types/index.ts +237 -0
- package/connectors/connect-convertkit/src/utils/auth.ts +274 -0
- package/connectors/connect-convertkit/src/utils/bulk.ts +212 -0
- package/connectors/connect-convertkit/src/utils/config.ts +326 -0
- package/connectors/connect-convertkit/src/utils/output.ts +175 -0
- package/connectors/connect-convertkit/src/utils/settings.ts +114 -0
- package/connectors/connect-convertkit/src/utils/storage.ts +198 -0
- package/connectors/connect-convertkit/tsconfig.json +16 -0
- package/connectors/connect-crisp/.env.example +11 -0
- package/connectors/connect-crisp/CLAUDE.md +272 -0
- package/connectors/connect-crisp/README.md +193 -0
- package/connectors/connect-crisp/package.json +51 -0
- package/connectors/connect-crisp/scripts/release.ts +179 -0
- package/connectors/connect-crisp/src/api/client.ts +213 -0
- package/connectors/connect-crisp/src/api/example.ts +48 -0
- package/connectors/connect-crisp/src/api/index.ts +51 -0
- package/connectors/connect-crisp/src/cli/index.ts +254 -0
- package/connectors/connect-crisp/src/index.ts +103 -0
- package/connectors/connect-crisp/src/types/index.ts +237 -0
- package/connectors/connect-crisp/src/utils/auth.ts +274 -0
- package/connectors/connect-crisp/src/utils/bulk.ts +212 -0
- package/connectors/connect-crisp/src/utils/config.ts +326 -0
- package/connectors/connect-crisp/src/utils/output.ts +175 -0
- package/connectors/connect-crisp/src/utils/settings.ts +114 -0
- package/connectors/connect-crisp/src/utils/storage.ts +198 -0
- package/connectors/connect-crisp/tsconfig.json +16 -0
- package/connectors/connect-docusign/.env.example +11 -0
- package/connectors/connect-docusign/CLAUDE.md +128 -0
- package/connectors/connect-docusign/README.md +193 -0
- package/connectors/connect-docusign/package.json +52 -0
- package/connectors/connect-docusign/src/api/client.ts +133 -0
- package/connectors/connect-docusign/src/api/index.ts +178 -0
- package/connectors/connect-docusign/src/cli/index.ts +381 -0
- package/connectors/connect-docusign/src/index.ts +23 -0
- package/connectors/connect-docusign/src/types/index.ts +208 -0
- package/connectors/connect-docusign/src/utils/config.ts +125 -0
- package/connectors/connect-docusign/src/utils/output.ts +119 -0
- package/connectors/connect-docusign/tsconfig.json +16 -0
- package/connectors/connect-drift/.env.example +11 -0
- package/connectors/connect-drift/CLAUDE.md +272 -0
- package/connectors/connect-drift/README.md +193 -0
- package/connectors/connect-drift/package.json +51 -0
- package/connectors/connect-drift/scripts/release.ts +179 -0
- package/connectors/connect-drift/src/api/client.ts +213 -0
- package/connectors/connect-drift/src/api/example.ts +48 -0
- package/connectors/connect-drift/src/api/index.ts +51 -0
- package/connectors/connect-drift/src/cli/index.ts +254 -0
- package/connectors/connect-drift/src/index.ts +103 -0
- package/connectors/connect-drift/src/types/index.ts +237 -0
- package/connectors/connect-drift/src/utils/auth.ts +274 -0
- package/connectors/connect-drift/src/utils/bulk.ts +212 -0
- package/connectors/connect-drift/src/utils/config.ts +326 -0
- package/connectors/connect-drift/src/utils/output.ts +175 -0
- package/connectors/connect-drift/src/utils/settings.ts +114 -0
- package/connectors/connect-drift/src/utils/storage.ts +198 -0
- package/connectors/connect-drift/tsconfig.json +16 -0
- package/connectors/connect-freshdesk/.env.example +11 -0
- package/connectors/connect-freshdesk/CLAUDE.md +272 -0
- package/connectors/connect-freshdesk/README.md +193 -0
- package/connectors/connect-freshdesk/package.json +51 -0
- package/connectors/connect-freshdesk/scripts/release.ts +179 -0
- package/connectors/connect-freshdesk/src/api/client.ts +213 -0
- package/connectors/connect-freshdesk/src/api/example.ts +48 -0
- package/connectors/connect-freshdesk/src/api/index.ts +51 -0
- package/connectors/connect-freshdesk/src/cli/index.ts +254 -0
- package/connectors/connect-freshdesk/src/index.ts +103 -0
- package/connectors/connect-freshdesk/src/types/index.ts +237 -0
- package/connectors/connect-freshdesk/src/utils/auth.ts +274 -0
- package/connectors/connect-freshdesk/src/utils/bulk.ts +212 -0
- package/connectors/connect-freshdesk/src/utils/config.ts +326 -0
- package/connectors/connect-freshdesk/src/utils/output.ts +175 -0
- package/connectors/connect-freshdesk/src/utils/settings.ts +114 -0
- package/connectors/connect-freshdesk/src/utils/storage.ts +198 -0
- package/connectors/connect-freshdesk/tsconfig.json +16 -0
- package/connectors/connect-gumroad/.env.example +11 -0
- package/connectors/connect-gumroad/CLAUDE.md +272 -0
- package/connectors/connect-gumroad/README.md +193 -0
- package/connectors/connect-gumroad/package.json +51 -0
- package/connectors/connect-gumroad/scripts/release.ts +179 -0
- package/connectors/connect-gumroad/src/api/client.ts +213 -0
- package/connectors/connect-gumroad/src/api/example.ts +48 -0
- package/connectors/connect-gumroad/src/api/index.ts +51 -0
- package/connectors/connect-gumroad/src/cli/index.ts +254 -0
- package/connectors/connect-gumroad/src/index.ts +103 -0
- package/connectors/connect-gumroad/src/types/index.ts +237 -0
- package/connectors/connect-gumroad/src/utils/auth.ts +274 -0
- package/connectors/connect-gumroad/src/utils/bulk.ts +212 -0
- package/connectors/connect-gumroad/src/utils/config.ts +326 -0
- package/connectors/connect-gumroad/src/utils/output.ts +175 -0
- package/connectors/connect-gumroad/src/utils/settings.ts +114 -0
- package/connectors/connect-gumroad/src/utils/storage.ts +198 -0
- package/connectors/connect-gumroad/tsconfig.json +16 -0
- package/connectors/connect-hubspot/.env.example +11 -0
- package/connectors/connect-hubspot/CLAUDE.md +128 -0
- package/connectors/connect-hubspot/README.md +193 -0
- package/connectors/connect-hubspot/package.json +52 -0
- package/connectors/connect-hubspot/src/api/client.ts +136 -0
- package/connectors/connect-hubspot/src/api/index.ts +379 -0
- package/connectors/connect-hubspot/src/cli/index.ts +589 -0
- package/connectors/connect-hubspot/src/index.ts +21 -0
- package/connectors/connect-hubspot/src/types/index.ts +285 -0
- package/connectors/connect-hubspot/src/utils/config.ts +205 -0
- package/connectors/connect-hubspot/src/utils/output.ts +119 -0
- package/connectors/connect-hubspot/tsconfig.json +16 -0
- package/connectors/connect-intercom/.env.example +11 -0
- package/connectors/connect-intercom/CLAUDE.md +131 -0
- package/connectors/connect-intercom/README.md +193 -0
- package/connectors/connect-intercom/package.json +52 -0
- package/connectors/connect-intercom/src/api/client.ts +132 -0
- package/connectors/connect-intercom/src/api/index.ts +366 -0
- package/connectors/connect-intercom/src/cli/index.ts +831 -0
- package/connectors/connect-intercom/src/index.ts +21 -0
- package/connectors/connect-intercom/src/types/index.ts +650 -0
- package/connectors/connect-intercom/src/utils/config.ts +157 -0
- package/connectors/connect-intercom/src/utils/output.ts +119 -0
- package/connectors/connect-intercom/tsconfig.json +16 -0
- package/connectors/connect-jira/.env.example +11 -0
- package/connectors/connect-jira/CLAUDE.md +128 -0
- package/connectors/connect-jira/README.md +193 -0
- package/connectors/connect-jira/package.json +53 -0
- package/connectors/connect-jira/src/api/client.ts +131 -0
- package/connectors/connect-jira/src/api/index.ts +266 -0
- package/connectors/connect-jira/src/cli/index.ts +653 -0
- package/connectors/connect-jira/src/index.ts +23 -0
- package/connectors/connect-jira/src/types/index.ts +448 -0
- package/connectors/connect-jira/src/utils/config.ts +179 -0
- package/connectors/connect-jira/src/utils/output.ts +119 -0
- package/connectors/connect-jira/tsconfig.json +16 -0
- package/connectors/connect-lemonsqueezy/.env.example +11 -0
- package/connectors/connect-lemonsqueezy/CLAUDE.md +128 -0
- package/connectors/connect-lemonsqueezy/README.md +193 -0
- package/connectors/connect-lemonsqueezy/package.json +52 -0
- package/connectors/connect-lemonsqueezy/src/api/client.ts +133 -0
- package/connectors/connect-lemonsqueezy/src/api/index.ts +502 -0
- package/connectors/connect-lemonsqueezy/src/cli/index.ts +723 -0
- package/connectors/connect-lemonsqueezy/src/index.ts +21 -0
- package/connectors/connect-lemonsqueezy/src/types/index.ts +353 -0
- package/connectors/connect-lemonsqueezy/src/utils/config.ts +205 -0
- package/connectors/connect-lemonsqueezy/src/utils/output.ts +119 -0
- package/connectors/connect-lemonsqueezy/tsconfig.json +16 -0
- package/connectors/connect-linear/CLAUDE.md +88 -0
- package/connectors/connect-linear/README.md +201 -0
- package/connectors/connect-linear/package.json +45 -0
- package/connectors/connect-linear/src/api/client.ts +62 -0
- package/connectors/connect-linear/src/api/index.ts +46 -0
- package/connectors/connect-linear/src/api/issues.ts +247 -0
- package/connectors/connect-linear/src/api/projects.ts +179 -0
- package/connectors/connect-linear/src/api/teams.ts +125 -0
- package/connectors/connect-linear/src/api/users.ts +112 -0
- package/connectors/connect-linear/src/cli/index.ts +560 -0
- package/connectors/connect-linear/src/index.ts +27 -0
- package/connectors/connect-linear/src/types/index.ts +275 -0
- package/connectors/connect-linear/src/utils/config.ts +249 -0
- package/connectors/connect-linear/src/utils/output.ts +119 -0
- package/connectors/connect-linear/tsconfig.json +16 -0
- package/connectors/connect-linkedin/.env.example +11 -0
- package/connectors/connect-linkedin/CLAUDE.md +124 -0
- package/connectors/connect-linkedin/README.md +193 -0
- package/connectors/connect-linkedin/package.json +52 -0
- package/connectors/connect-linkedin/src/api/client.ts +132 -0
- package/connectors/connect-linkedin/src/api/index.ts +313 -0
- package/connectors/connect-linkedin/src/cli/index.ts +548 -0
- package/connectors/connect-linkedin/src/index.ts +21 -0
- package/connectors/connect-linkedin/src/types/index.ts +472 -0
- package/connectors/connect-linkedin/src/utils/config.ts +157 -0
- package/connectors/connect-linkedin/src/utils/output.ts +119 -0
- package/connectors/connect-linkedin/tsconfig.json +16 -0
- package/connectors/connect-mailchimp/.env.example +11 -0
- package/connectors/connect-mailchimp/CLAUDE.md +127 -0
- package/connectors/connect-mailchimp/README.md +193 -0
- package/connectors/connect-mailchimp/package.json +52 -0
- package/connectors/connect-mailchimp/src/api/client.ts +162 -0
- package/connectors/connect-mailchimp/src/api/index.ts +580 -0
- package/connectors/connect-mailchimp/src/cli/index.ts +822 -0
- package/connectors/connect-mailchimp/src/index.ts +23 -0
- package/connectors/connect-mailchimp/src/types/index.ts +585 -0
- package/connectors/connect-mailchimp/src/utils/config.ts +208 -0
- package/connectors/connect-mailchimp/src/utils/output.ts +119 -0
- package/connectors/connect-mailchimp/tsconfig.json +16 -0
- package/connectors/connect-mongodb/.env.example +11 -0
- package/connectors/connect-mongodb/CLAUDE.md +272 -0
- package/connectors/connect-mongodb/README.md +193 -0
- package/connectors/connect-mongodb/package.json +51 -0
- package/connectors/connect-mongodb/scripts/release.ts +179 -0
- package/connectors/connect-mongodb/src/api/client.ts +213 -0
- package/connectors/connect-mongodb/src/api/example.ts +48 -0
- package/connectors/connect-mongodb/src/api/index.ts +51 -0
- package/connectors/connect-mongodb/src/cli/index.ts +254 -0
- package/connectors/connect-mongodb/src/index.ts +103 -0
- package/connectors/connect-mongodb/src/types/index.ts +237 -0
- package/connectors/connect-mongodb/src/utils/auth.ts +274 -0
- package/connectors/connect-mongodb/src/utils/bulk.ts +212 -0
- package/connectors/connect-mongodb/src/utils/config.ts +326 -0
- package/connectors/connect-mongodb/src/utils/output.ts +175 -0
- package/connectors/connect-mongodb/src/utils/settings.ts +114 -0
- package/connectors/connect-mongodb/src/utils/storage.ts +198 -0
- package/connectors/connect-mongodb/tsconfig.json +16 -0
- package/connectors/connect-netlify/.env.example +11 -0
- package/connectors/connect-netlify/CLAUDE.md +170 -0
- package/connectors/connect-netlify/README.md +193 -0
- package/connectors/connect-netlify/package.json +53 -0
- package/connectors/connect-netlify/src/api/client.ts +132 -0
- package/connectors/connect-netlify/src/api/index.ts +533 -0
- package/connectors/connect-netlify/src/cli/index.ts +985 -0
- package/connectors/connect-netlify/src/index.ts +22 -0
- package/connectors/connect-netlify/src/types/index.ts +423 -0
- package/connectors/connect-netlify/src/utils/config.ts +171 -0
- package/connectors/connect-netlify/src/utils/output.ts +119 -0
- package/connectors/connect-netlify/tsconfig.json +16 -0
- package/connectors/connect-paypal/.env.example +11 -0
- package/connectors/connect-paypal/CLAUDE.md +128 -0
- package/connectors/connect-paypal/README.md +193 -0
- package/connectors/connect-paypal/package.json +51 -0
- package/connectors/connect-paypal/src/api/client.ts +182 -0
- package/connectors/connect-paypal/src/api/index.ts +235 -0
- package/connectors/connect-paypal/src/cli/index.ts +559 -0
- package/connectors/connect-paypal/src/index.ts +23 -0
- package/connectors/connect-paypal/src/types/index.ts +377 -0
- package/connectors/connect-paypal/src/utils/config.ts +125 -0
- package/connectors/connect-paypal/src/utils/output.ts +119 -0
- package/connectors/connect-paypal/tsconfig.json +16 -0
- package/connectors/connect-pinterest/.env.example +11 -0
- package/connectors/connect-pinterest/CLAUDE.md +115 -0
- package/connectors/connect-pinterest/README.md +193 -0
- package/connectors/connect-pinterest/package.json +52 -0
- package/connectors/connect-pinterest/src/api/client.ts +125 -0
- package/connectors/connect-pinterest/src/api/index.ts +203 -0
- package/connectors/connect-pinterest/src/cli/index.ts +653 -0
- package/connectors/connect-pinterest/src/index.ts +21 -0
- package/connectors/connect-pinterest/src/types/index.ts +268 -0
- package/connectors/connect-pinterest/src/utils/config.ts +157 -0
- package/connectors/connect-pinterest/src/utils/output.ts +119 -0
- package/connectors/connect-pinterest/tsconfig.json +16 -0
- package/connectors/connect-posthog/.env.example +11 -0
- package/connectors/connect-posthog/CLAUDE.md +272 -0
- package/connectors/connect-posthog/README.md +193 -0
- package/connectors/connect-posthog/package.json +51 -0
- package/connectors/connect-posthog/scripts/release.ts +179 -0
- package/connectors/connect-posthog/src/api/client.ts +213 -0
- package/connectors/connect-posthog/src/api/example.ts +48 -0
- package/connectors/connect-posthog/src/api/index.ts +51 -0
- package/connectors/connect-posthog/src/cli/index.ts +254 -0
- package/connectors/connect-posthog/src/index.ts +103 -0
- package/connectors/connect-posthog/src/types/index.ts +237 -0
- package/connectors/connect-posthog/src/utils/auth.ts +274 -0
- package/connectors/connect-posthog/src/utils/bulk.ts +212 -0
- package/connectors/connect-posthog/src/utils/config.ts +326 -0
- package/connectors/connect-posthog/src/utils/output.ts +175 -0
- package/connectors/connect-posthog/src/utils/settings.ts +114 -0
- package/connectors/connect-posthog/src/utils/storage.ts +198 -0
- package/connectors/connect-posthog/tsconfig.json +16 -0
- package/connectors/connect-salesforce/.env.example +11 -0
- package/connectors/connect-salesforce/CLAUDE.md +128 -0
- package/connectors/connect-salesforce/README.md +193 -0
- package/connectors/connect-salesforce/package.json +53 -0
- package/connectors/connect-salesforce/src/api/client.ts +150 -0
- package/connectors/connect-salesforce/src/api/index.ts +367 -0
- package/connectors/connect-salesforce/src/cli/index.ts +594 -0
- package/connectors/connect-salesforce/src/index.ts +21 -0
- package/connectors/connect-salesforce/src/types/index.ts +292 -0
- package/connectors/connect-salesforce/src/utils/config.ts +208 -0
- package/connectors/connect-salesforce/src/utils/output.ts +119 -0
- package/connectors/connect-salesforce/tsconfig.json +16 -0
- package/connectors/connect-segment/.env.example +11 -0
- package/connectors/connect-segment/CLAUDE.md +272 -0
- package/connectors/connect-segment/README.md +193 -0
- package/connectors/connect-segment/package.json +51 -0
- package/connectors/connect-segment/scripts/release.ts +179 -0
- package/connectors/connect-segment/src/api/client.ts +213 -0
- package/connectors/connect-segment/src/api/example.ts +48 -0
- package/connectors/connect-segment/src/api/index.ts +51 -0
- package/connectors/connect-segment/src/cli/index.ts +254 -0
- package/connectors/connect-segment/src/index.ts +103 -0
- package/connectors/connect-segment/src/types/index.ts +237 -0
- package/connectors/connect-segment/src/utils/auth.ts +274 -0
- package/connectors/connect-segment/src/utils/bulk.ts +212 -0
- package/connectors/connect-segment/src/utils/config.ts +326 -0
- package/connectors/connect-segment/src/utils/output.ts +175 -0
- package/connectors/connect-segment/src/utils/settings.ts +114 -0
- package/connectors/connect-segment/src/utils/storage.ts +198 -0
- package/connectors/connect-segment/tsconfig.json +16 -0
- package/connectors/connect-sendgrid/.env.example +11 -0
- package/connectors/connect-sendgrid/CLAUDE.md +125 -0
- package/connectors/connect-sendgrid/README.md +193 -0
- package/connectors/connect-sendgrid/package.json +53 -0
- package/connectors/connect-sendgrid/src/api/client.ts +137 -0
- package/connectors/connect-sendgrid/src/api/index.ts +588 -0
- package/connectors/connect-sendgrid/src/cli/index.ts +764 -0
- package/connectors/connect-sendgrid/src/index.ts +21 -0
- package/connectors/connect-sendgrid/src/types/index.ts +403 -0
- package/connectors/connect-sendgrid/src/utils/config.ts +197 -0
- package/connectors/connect-sendgrid/src/utils/output.ts +119 -0
- package/connectors/connect-sendgrid/tsconfig.json +16 -0
- package/connectors/connect-slack/.env.example +7 -0
- package/connectors/connect-slack/CLAUDE.md +69 -0
- package/connectors/connect-slack/README.md +150 -0
- package/connectors/connect-slack/package.json +44 -0
- package/connectors/connect-slack/src/api/channels.ts +112 -0
- package/connectors/connect-slack/src/api/client.ts +97 -0
- package/connectors/connect-slack/src/api/index.ts +42 -0
- package/connectors/connect-slack/src/api/messages.ts +127 -0
- package/connectors/connect-slack/src/api/users.ts +110 -0
- package/connectors/connect-slack/src/cli/index.ts +494 -0
- package/connectors/connect-slack/src/index.ts +21 -0
- package/connectors/connect-slack/src/types/index.ts +263 -0
- package/connectors/connect-slack/src/utils/config.ts +297 -0
- package/connectors/connect-slack/src/utils/output.ts +119 -0
- package/connectors/connect-slack/tsconfig.json +16 -0
- package/connectors/connect-supabase/.env.example +11 -0
- package/connectors/connect-supabase/CLAUDE.md +132 -0
- package/connectors/connect-supabase/README.md +193 -0
- package/connectors/connect-supabase/package.json +52 -0
- package/connectors/connect-supabase/src/api/client.ts +231 -0
- package/connectors/connect-supabase/src/api/index.ts +439 -0
- package/connectors/connect-supabase/src/cli/index.ts +691 -0
- package/connectors/connect-supabase/src/index.ts +24 -0
- package/connectors/connect-supabase/src/types/index.ts +215 -0
- package/connectors/connect-supabase/src/utils/config.ts +219 -0
- package/connectors/connect-supabase/tsconfig.json +16 -0
- package/connectors/connect-telegram/.env.example +2 -0
- package/connectors/connect-telegram/package.json +49 -0
- package/connectors/connect-todoist/.env.example +11 -0
- package/connectors/connect-todoist/CLAUDE.md +104 -0
- package/connectors/connect-todoist/README.md +193 -0
- package/connectors/connect-todoist/package.json +52 -0
- package/connectors/connect-todoist/src/api/client.ts +117 -0
- package/connectors/connect-todoist/src/api/index.ts +188 -0
- package/connectors/connect-todoist/src/cli/index.ts +990 -0
- package/connectors/connect-todoist/src/index.ts +21 -0
- package/connectors/connect-todoist/src/types/index.ts +240 -0
- package/connectors/connect-todoist/src/utils/config.ts +157 -0
- package/connectors/connect-todoist/src/utils/output.ts +119 -0
- package/connectors/connect-todoist/tsconfig.json +16 -0
- package/connectors/connect-trello/.env.example +11 -0
- package/connectors/connect-trello/CLAUDE.md +128 -0
- package/connectors/connect-trello/README.md +193 -0
- package/connectors/connect-trello/package.json +53 -0
- package/connectors/connect-trello/src/api/client.ts +128 -0
- package/connectors/connect-trello/src/api/index.ts +278 -0
- package/connectors/connect-trello/src/cli/index.ts +737 -0
- package/connectors/connect-trello/src/index.ts +21 -0
- package/connectors/connect-trello/src/types/index.ts +314 -0
- package/connectors/connect-trello/src/utils/config.ts +182 -0
- package/connectors/connect-trello/src/utils/output.ts +119 -0
- package/connectors/connect-trello/tsconfig.json +16 -0
- package/connectors/connect-vercel/.env.example +11 -0
- package/connectors/connect-vercel/CLAUDE.md +142 -0
- package/connectors/connect-vercel/README.md +193 -0
- package/connectors/connect-vercel/package.json +52 -0
- package/connectors/connect-vercel/src/api/client.ts +139 -0
- package/connectors/connect-vercel/src/api/index.ts +384 -0
- package/connectors/connect-vercel/src/cli/index.ts +740 -0
- package/connectors/connect-vercel/src/index.ts +24 -0
- package/connectors/connect-vercel/src/types/index.ts +350 -0
- package/connectors/connect-vercel/src/utils/config.ts +182 -0
- package/connectors/connect-vercel/src/utils/output.ts +119 -0
- package/connectors/connect-vercel/tsconfig.json +16 -0
- package/connectors/connect-whatsapp/.env.example +11 -0
- package/connectors/connect-whatsapp/CLAUDE.md +113 -0
- package/connectors/connect-whatsapp/README.md +193 -0
- package/connectors/connect-whatsapp/package.json +53 -0
- package/connectors/connect-whatsapp/src/api/client.ts +133 -0
- package/connectors/connect-whatsapp/src/api/index.ts +365 -0
- package/connectors/connect-whatsapp/src/cli/index.ts +686 -0
- package/connectors/connect-whatsapp/src/index.ts +25 -0
- package/connectors/connect-whatsapp/src/types/index.ts +502 -0
- package/connectors/connect-whatsapp/src/utils/config.ts +179 -0
- package/connectors/connect-whatsapp/src/utils/output.ts +119 -0
- package/connectors/connect-whatsapp/tsconfig.json +16 -0
- package/connectors/connect-zendesk/.env.example +10 -0
- package/connectors/connect-zendesk/.github/workflows/deploy.yml +51 -0
- package/connectors/connect-zendesk/CLAUDE.md +78 -0
- package/connectors/connect-zendesk/Makefile +129 -0
- package/connectors/connect-zendesk/README.md +295 -0
- package/connectors/connect-zendesk/SCAFFOLD.md +178 -0
- package/connectors/connect-zendesk/nginx-connector.conf +218 -0
- package/connectors/connect-zendesk/nginx.conf +61 -0
- package/connectors/connect-zendesk/package.json +71 -0
- package/connectors/connect-zendesk/scripts/init.sh +62 -0
- package/connectors/connect-zendesk/scripts/publish.ts +210 -0
- package/connectors/connect-zendesk/server/index.js +142 -0
- package/connectors/connect-zendesk/src/api/automations.ts +95 -0
- package/connectors/connect-zendesk/src/api/brands.ts +80 -0
- package/connectors/connect-zendesk/src/api/bulk.ts +838 -0
- package/connectors/connect-zendesk/src/api/client.test.ts +315 -0
- package/connectors/connect-zendesk/src/api/client.ts +173 -0
- package/connectors/connect-zendesk/src/api/example.ts +59 -0
- package/connectors/connect-zendesk/src/api/groups.ts +60 -0
- package/connectors/connect-zendesk/src/api/index.test.ts +111 -0
- package/connectors/connect-zendesk/src/api/index.ts +131 -0
- package/connectors/connect-zendesk/src/api/macros.ts +124 -0
- package/connectors/connect-zendesk/src/api/organizations.ts +85 -0
- package/connectors/connect-zendesk/src/api/slas.ts +80 -0
- package/connectors/connect-zendesk/src/api/ticket-fields.ts +98 -0
- package/connectors/connect-zendesk/src/api/tickets.test.ts +215 -0
- package/connectors/connect-zendesk/src/api/tickets.ts +103 -0
- package/connectors/connect-zendesk/src/api/triggers.test.ts +204 -0
- package/connectors/connect-zendesk/src/api/triggers.ts +125 -0
- package/connectors/connect-zendesk/src/api/users.test.ts +180 -0
- package/connectors/connect-zendesk/src/api/users.ts +108 -0
- package/connectors/connect-zendesk/src/api/views.test.ts +223 -0
- package/connectors/connect-zendesk/src/api/views.ts +145 -0
- package/connectors/connect-zendesk/src/api/webhooks.test.ts +208 -0
- package/connectors/connect-zendesk/src/api/webhooks.ts +118 -0
- package/connectors/connect-zendesk/src/cli/index.ts +1478 -0
- package/connectors/connect-zendesk/src/index.ts +36 -0
- package/connectors/connect-zendesk/src/server/index.ts +204 -0
- package/connectors/connect-zendesk/src/types/index.ts +910 -0
- package/connectors/connect-zendesk/src/utils/config.test.ts +193 -0
- package/connectors/connect-zendesk/src/utils/config.ts +526 -0
- package/connectors/connect-zendesk/src/utils/export.ts +338 -0
- package/connectors/connect-zendesk/src/utils/logger.ts +105 -0
- package/connectors/connect-zendesk/src/utils/output.test.ts +137 -0
- package/connectors/connect-zendesk/src/utils/output.ts +119 -0
- package/connectors/connect-zendesk/tsconfig.json +31 -0
- package/dist/index.js +245 -0
- package/package.json +1 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code when working with this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
connect-linear is a TypeScript CLI and library for Linear's GraphQL API. It provides issue management, project management, team operations, and user operations with multi-profile support for managing multiple Linear workspaces.
|
|
8
|
+
|
|
9
|
+
## Build & Run Commands
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
bun install # Install dependencies
|
|
13
|
+
bun run dev # Run CLI in development
|
|
14
|
+
bun run build # Build for distribution
|
|
15
|
+
bun run typecheck # Type check
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Code Style
|
|
19
|
+
|
|
20
|
+
- TypeScript with strict mode
|
|
21
|
+
- ESM modules (type: module)
|
|
22
|
+
- Async/await for all async operations
|
|
23
|
+
- Minimal dependencies: commander, chalk
|
|
24
|
+
|
|
25
|
+
## Project Structure
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
src/
|
|
29
|
+
├── api/
|
|
30
|
+
│ ├── client.ts # GraphQL client with Bearer auth
|
|
31
|
+
│ ├── issues.ts # Issues API
|
|
32
|
+
│ ├── projects.ts # Projects API
|
|
33
|
+
│ ├── teams.ts # Teams API
|
|
34
|
+
│ ├── users.ts # Users API
|
|
35
|
+
│ └── index.ts # Main Linear class
|
|
36
|
+
├── cli/
|
|
37
|
+
│ └── index.ts # CLI commands
|
|
38
|
+
├── types/
|
|
39
|
+
│ └── index.ts # TypeScript types
|
|
40
|
+
├── utils/
|
|
41
|
+
│ ├── config.ts # Multi-profile configuration
|
|
42
|
+
│ └── output.ts # CLI output formatting
|
|
43
|
+
└── index.ts # Library exports
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## API Architecture
|
|
47
|
+
|
|
48
|
+
The Linear API uses GraphQL. The client architecture:
|
|
49
|
+
|
|
50
|
+
1. `LinearClient` - Base GraphQL client that handles authentication and requests
|
|
51
|
+
2. API modules (Issues, Projects, Teams, Users) - Use the client to make specific queries/mutations
|
|
52
|
+
3. `Linear` class - Main entry point that combines all API modules
|
|
53
|
+
|
|
54
|
+
## Environment Variables
|
|
55
|
+
|
|
56
|
+
| Variable | Description |
|
|
57
|
+
|----------|-------------|
|
|
58
|
+
| `LINEAR_API_KEY` | Linear API key |
|
|
59
|
+
|
|
60
|
+
## Multi-Profile Configuration
|
|
61
|
+
|
|
62
|
+
Configuration stored in `~/.connect/connect-linear/`:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
~/.connect/connect-linear/
|
|
66
|
+
├── current_profile
|
|
67
|
+
└── profiles/
|
|
68
|
+
└── default/
|
|
69
|
+
└── config.json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## GraphQL Endpoint
|
|
73
|
+
|
|
74
|
+
- Base URL: https://api.linear.app/graphql
|
|
75
|
+
- Auth: Bearer token (API key sent directly as Authorization header)
|
|
76
|
+
|
|
77
|
+
## Dependencies
|
|
78
|
+
|
|
79
|
+
- commander: CLI framework
|
|
80
|
+
- chalk: Terminal styling
|
|
81
|
+
|
|
82
|
+
## Priority Values
|
|
83
|
+
|
|
84
|
+
- 0: No priority
|
|
85
|
+
- 1: Urgent
|
|
86
|
+
- 2: High
|
|
87
|
+
- 3: Normal
|
|
88
|
+
- 4: Low
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# @hasna/connect-linear
|
|
2
|
+
|
|
3
|
+
Linear API connector with CLI and library support. Provides a TypeScript-first interface for interacting with the Linear GraphQL API.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @hasna/connect-linear
|
|
9
|
+
# or
|
|
10
|
+
bun add @hasna/connect-linear
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
For CLI usage, install globally:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g @hasna/connect-linear
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Configuration
|
|
20
|
+
|
|
21
|
+
### Environment Variable
|
|
22
|
+
|
|
23
|
+
Set your Linear API key as an environment variable:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
export LINEAR_API_KEY="lin_api_xxxxx"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### CLI Configuration
|
|
30
|
+
|
|
31
|
+
Or use the CLI to save your API key:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
connect-linear config set-api-key lin_api_xxxxx
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Configuration is stored in `~/.connect/connect-linear/`.
|
|
38
|
+
|
|
39
|
+
## CLI Usage
|
|
40
|
+
|
|
41
|
+
### Authentication
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Test authentication
|
|
45
|
+
connect-linear test
|
|
46
|
+
|
|
47
|
+
# Show current user
|
|
48
|
+
connect-linear whoami
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Issues
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# List issues
|
|
55
|
+
connect-linear issues list
|
|
56
|
+
connect-linear issues list --team <team-id>
|
|
57
|
+
connect-linear issues list --project <project-id>
|
|
58
|
+
connect-linear issues list --assignee <user-id>
|
|
59
|
+
|
|
60
|
+
# Get issue details
|
|
61
|
+
connect-linear issues get <issue-id>
|
|
62
|
+
|
|
63
|
+
# Create issue
|
|
64
|
+
connect-linear issues create --title "Bug fix" --team <team-id>
|
|
65
|
+
connect-linear issues create --title "Feature" --team <team-id> --description "Details here" --priority 2
|
|
66
|
+
|
|
67
|
+
# Update issue
|
|
68
|
+
connect-linear issues update <issue-id> --title "New title"
|
|
69
|
+
connect-linear issues update <issue-id> --state <state-id>
|
|
70
|
+
connect-linear issues update <issue-id> --assignee <user-id>
|
|
71
|
+
|
|
72
|
+
# Archive issue
|
|
73
|
+
connect-linear issues archive <issue-id>
|
|
74
|
+
|
|
75
|
+
# Search issues
|
|
76
|
+
connect-linear issues search "bug"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Projects
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# List projects
|
|
83
|
+
connect-linear projects list
|
|
84
|
+
|
|
85
|
+
# Get project details
|
|
86
|
+
connect-linear projects get <project-id>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Teams
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# List teams
|
|
93
|
+
connect-linear teams list
|
|
94
|
+
|
|
95
|
+
# Get team details
|
|
96
|
+
connect-linear teams get <team-id>
|
|
97
|
+
|
|
98
|
+
# List workflow states for a team
|
|
99
|
+
connect-linear teams states <team-id>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Users
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# List users
|
|
106
|
+
connect-linear users list
|
|
107
|
+
connect-linear users list --all # Include inactive users
|
|
108
|
+
|
|
109
|
+
# Get user details
|
|
110
|
+
connect-linear users get <user-id>
|
|
111
|
+
|
|
112
|
+
# Current user
|
|
113
|
+
connect-linear users me
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Multi-Profile Support
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# Create a profile
|
|
120
|
+
connect-linear profile create work
|
|
121
|
+
|
|
122
|
+
# Switch profiles
|
|
123
|
+
connect-linear profile use work
|
|
124
|
+
|
|
125
|
+
# List profiles
|
|
126
|
+
connect-linear profile list
|
|
127
|
+
|
|
128
|
+
# Use profile for a single command
|
|
129
|
+
connect-linear --profile work issues list
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Output Formats
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# JSON output
|
|
136
|
+
connect-linear issues list --format json
|
|
137
|
+
|
|
138
|
+
# Table output
|
|
139
|
+
connect-linear issues list --format table
|
|
140
|
+
|
|
141
|
+
# Pretty output (default)
|
|
142
|
+
connect-linear issues list --format pretty
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Library Usage
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
import { Linear } from '@hasna/connect-linear';
|
|
149
|
+
|
|
150
|
+
const linear = new Linear({
|
|
151
|
+
apiKey: process.env.LINEAR_API_KEY!,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// List issues
|
|
155
|
+
const issues = await linear.issues.list({ teamId: 'team-id' });
|
|
156
|
+
|
|
157
|
+
// Create issue
|
|
158
|
+
const issue = await linear.issues.create({
|
|
159
|
+
title: 'New feature',
|
|
160
|
+
teamId: 'team-id',
|
|
161
|
+
description: 'Feature description',
|
|
162
|
+
priority: 2,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// Update issue
|
|
166
|
+
await linear.issues.update(issue.id, {
|
|
167
|
+
stateId: 'done-state-id',
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// Get current user
|
|
171
|
+
const me = await linear.users.me();
|
|
172
|
+
|
|
173
|
+
// List teams
|
|
174
|
+
const teams = await linear.teams.list();
|
|
175
|
+
|
|
176
|
+
// Get workflow states
|
|
177
|
+
const states = await linear.teams.getWorkflowStates('team-id');
|
|
178
|
+
|
|
179
|
+
// Search issues
|
|
180
|
+
const results = await linear.issues.search('bug');
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Environment Variables
|
|
184
|
+
|
|
185
|
+
| Variable | Description |
|
|
186
|
+
|----------|-------------|
|
|
187
|
+
| `LINEAR_API_KEY` | Linear API key (required) |
|
|
188
|
+
|
|
189
|
+
## Priority Values
|
|
190
|
+
|
|
191
|
+
| Value | Label |
|
|
192
|
+
|-------|-------|
|
|
193
|
+
| 0 | No priority |
|
|
194
|
+
| 1 | Urgent |
|
|
195
|
+
| 2 | High |
|
|
196
|
+
| 3 | Normal |
|
|
197
|
+
| 4 | Low |
|
|
198
|
+
|
|
199
|
+
## License
|
|
200
|
+
|
|
201
|
+
Apache-2.0
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hasna/connect-linear",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Linear API connector with CLI and library support",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"connect-linear": "bin/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"dev": "bun run ./src/cli/index.ts",
|
|
13
|
+
"build": "bun build ./src/index.ts --outdir ./dist --target bun && bun build ./src/cli/index.ts --outdir ./bin --target bun",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"prepublishOnly": "bun run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"linear",
|
|
19
|
+
"api",
|
|
20
|
+
"cli",
|
|
21
|
+
"connector",
|
|
22
|
+
"graphql"
|
|
23
|
+
],
|
|
24
|
+
"author": "Hasna",
|
|
25
|
+
"license": "Apache-2.0",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"chalk": "^5.3.0",
|
|
28
|
+
"commander": "^12.1.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/bun": "latest",
|
|
32
|
+
"typescript": "^5.0.0"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"registry": "https://registry.npmjs.org",
|
|
36
|
+
"access": "restricted"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"bin",
|
|
41
|
+
"src",
|
|
42
|
+
"README.md",
|
|
43
|
+
"CLAUDE.md"
|
|
44
|
+
]
|
|
45
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { LinearConfig, GraphQLResponse } from '../types';
|
|
2
|
+
import { LinearApiError } from '../types';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_BASE_URL = 'https://api.linear.app/graphql';
|
|
5
|
+
|
|
6
|
+
export class LinearClient {
|
|
7
|
+
private readonly apiKey: string;
|
|
8
|
+
private readonly baseUrl: string;
|
|
9
|
+
|
|
10
|
+
constructor(config: LinearConfig) {
|
|
11
|
+
if (!config.apiKey) {
|
|
12
|
+
throw new Error('Linear API key is required');
|
|
13
|
+
}
|
|
14
|
+
this.apiKey = config.apiKey;
|
|
15
|
+
this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Execute a GraphQL query
|
|
20
|
+
*/
|
|
21
|
+
async query<T>(query: string, variables?: Record<string, unknown>): Promise<T> {
|
|
22
|
+
const response = await fetch(this.baseUrl, {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: {
|
|
25
|
+
'Content-Type': 'application/json',
|
|
26
|
+
'Authorization': this.apiKey,
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify({ query, variables }),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new LinearApiError(
|
|
33
|
+
`HTTP ${response.status}: ${response.statusText}`,
|
|
34
|
+
'http_error',
|
|
35
|
+
response.status
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const result = await response.json() as GraphQLResponse<T>;
|
|
40
|
+
|
|
41
|
+
if (result.errors && result.errors.length > 0) {
|
|
42
|
+
const error = result.errors[0];
|
|
43
|
+
throw new LinearApiError(
|
|
44
|
+
error.message,
|
|
45
|
+
error.extensions?.code as string || 'graphql_error'
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!result.data) {
|
|
50
|
+
throw new LinearApiError('No data returned', 'no_data');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return result.data;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Execute a GraphQL mutation
|
|
58
|
+
*/
|
|
59
|
+
async mutate<T>(mutation: string, variables?: Record<string, unknown>): Promise<T> {
|
|
60
|
+
return this.query<T>(mutation, variables);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { LinearConfig } from '../types';
|
|
2
|
+
import { LinearClient } from './client';
|
|
3
|
+
import { IssuesApi } from './issues';
|
|
4
|
+
import { ProjectsApi } from './projects';
|
|
5
|
+
import { TeamsApi } from './teams';
|
|
6
|
+
import { UsersApi } from './users';
|
|
7
|
+
|
|
8
|
+
export { LinearClient } from './client';
|
|
9
|
+
export { IssuesApi } from './issues';
|
|
10
|
+
export { ProjectsApi } from './projects';
|
|
11
|
+
export { TeamsApi } from './teams';
|
|
12
|
+
export { UsersApi } from './users';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Main Linear API class
|
|
16
|
+
*/
|
|
17
|
+
export class Linear {
|
|
18
|
+
private readonly client: LinearClient;
|
|
19
|
+
|
|
20
|
+
public readonly issues: IssuesApi;
|
|
21
|
+
public readonly projects: ProjectsApi;
|
|
22
|
+
public readonly teams: TeamsApi;
|
|
23
|
+
public readonly users: UsersApi;
|
|
24
|
+
|
|
25
|
+
constructor(config: LinearConfig) {
|
|
26
|
+
this.client = new LinearClient(config);
|
|
27
|
+
this.issues = new IssuesApi(this.client);
|
|
28
|
+
this.projects = new ProjectsApi(this.client);
|
|
29
|
+
this.teams = new TeamsApi(this.client);
|
|
30
|
+
this.users = new UsersApi(this.client);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Test authentication and return current user
|
|
35
|
+
*/
|
|
36
|
+
async test() {
|
|
37
|
+
return this.users.me();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get the GraphQL client for custom queries
|
|
42
|
+
*/
|
|
43
|
+
getClient(): LinearClient {
|
|
44
|
+
return this.client;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import type { LinearClient } from './client';
|
|
2
|
+
import type {
|
|
3
|
+
LinearIssue,
|
|
4
|
+
IssueListOptions,
|
|
5
|
+
CreateIssueInput,
|
|
6
|
+
UpdateIssueInput,
|
|
7
|
+
IssuesResponse,
|
|
8
|
+
IssueResponse,
|
|
9
|
+
CreateIssueResponse,
|
|
10
|
+
UpdateIssueResponse,
|
|
11
|
+
ArchiveIssueResponse,
|
|
12
|
+
IssueFilter,
|
|
13
|
+
} from '../types';
|
|
14
|
+
|
|
15
|
+
const ISSUE_FRAGMENT = `
|
|
16
|
+
fragment IssueFragment on Issue {
|
|
17
|
+
id
|
|
18
|
+
identifier
|
|
19
|
+
title
|
|
20
|
+
description
|
|
21
|
+
priority
|
|
22
|
+
priorityLabel
|
|
23
|
+
estimate
|
|
24
|
+
sortOrder
|
|
25
|
+
boardOrder
|
|
26
|
+
startedAt
|
|
27
|
+
completedAt
|
|
28
|
+
canceledAt
|
|
29
|
+
dueDate
|
|
30
|
+
createdAt
|
|
31
|
+
updatedAt
|
|
32
|
+
archivedAt
|
|
33
|
+
url
|
|
34
|
+
number
|
|
35
|
+
team {
|
|
36
|
+
id
|
|
37
|
+
name
|
|
38
|
+
key
|
|
39
|
+
}
|
|
40
|
+
state {
|
|
41
|
+
id
|
|
42
|
+
name
|
|
43
|
+
color
|
|
44
|
+
type
|
|
45
|
+
}
|
|
46
|
+
assignee {
|
|
47
|
+
id
|
|
48
|
+
name
|
|
49
|
+
displayName
|
|
50
|
+
email
|
|
51
|
+
}
|
|
52
|
+
creator {
|
|
53
|
+
id
|
|
54
|
+
name
|
|
55
|
+
displayName
|
|
56
|
+
}
|
|
57
|
+
labels {
|
|
58
|
+
nodes {
|
|
59
|
+
id
|
|
60
|
+
name
|
|
61
|
+
color
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
project {
|
|
65
|
+
id
|
|
66
|
+
name
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
`;
|
|
70
|
+
|
|
71
|
+
export class IssuesApi {
|
|
72
|
+
constructor(private readonly client: LinearClient) {}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* List issues with optional filters
|
|
76
|
+
*/
|
|
77
|
+
async list(options: IssueListOptions = {}): Promise<LinearIssue[]> {
|
|
78
|
+
const { first = 50, after, teamId, projectId, assigneeId, filter } = options;
|
|
79
|
+
|
|
80
|
+
// Build filter object
|
|
81
|
+
const filterObj: IssueFilter = filter || {};
|
|
82
|
+
if (teamId) {
|
|
83
|
+
filterObj.team = { id: { eq: teamId } };
|
|
84
|
+
}
|
|
85
|
+
if (projectId) {
|
|
86
|
+
filterObj.project = { id: { eq: projectId } };
|
|
87
|
+
}
|
|
88
|
+
if (assigneeId) {
|
|
89
|
+
filterObj.assignee = { id: { eq: assigneeId } };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const query = `
|
|
93
|
+
${ISSUE_FRAGMENT}
|
|
94
|
+
query Issues($first: Int, $after: String, $filter: IssueFilter) {
|
|
95
|
+
issues(first: $first, after: $after, filter: $filter) {
|
|
96
|
+
nodes {
|
|
97
|
+
...IssueFragment
|
|
98
|
+
}
|
|
99
|
+
pageInfo {
|
|
100
|
+
hasNextPage
|
|
101
|
+
endCursor
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
`;
|
|
106
|
+
|
|
107
|
+
const result = await this.client.query<IssuesResponse>(query, {
|
|
108
|
+
first,
|
|
109
|
+
after,
|
|
110
|
+
filter: Object.keys(filterObj).length > 0 ? filterObj : undefined,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return result.issues.nodes;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Get a single issue by ID
|
|
118
|
+
*/
|
|
119
|
+
async get(id: string): Promise<LinearIssue> {
|
|
120
|
+
const query = `
|
|
121
|
+
${ISSUE_FRAGMENT}
|
|
122
|
+
query Issue($id: String!) {
|
|
123
|
+
issue(id: $id) {
|
|
124
|
+
...IssueFragment
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
`;
|
|
128
|
+
|
|
129
|
+
const result = await this.client.query<IssueResponse>(query, { id });
|
|
130
|
+
return result.issue;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Create a new issue
|
|
135
|
+
*/
|
|
136
|
+
async create(input: CreateIssueInput): Promise<LinearIssue> {
|
|
137
|
+
const mutation = `
|
|
138
|
+
${ISSUE_FRAGMENT}
|
|
139
|
+
mutation CreateIssue($input: IssueCreateInput!) {
|
|
140
|
+
issueCreate(input: $input) {
|
|
141
|
+
success
|
|
142
|
+
issue {
|
|
143
|
+
...IssueFragment
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
`;
|
|
148
|
+
|
|
149
|
+
const result = await this.client.mutate<CreateIssueResponse>(mutation, {
|
|
150
|
+
input,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
if (!result.issueCreate.success || !result.issueCreate.issue) {
|
|
154
|
+
throw new Error('Failed to create issue');
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return result.issueCreate.issue;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Update an existing issue
|
|
162
|
+
*/
|
|
163
|
+
async update(id: string, input: UpdateIssueInput): Promise<LinearIssue> {
|
|
164
|
+
const mutation = `
|
|
165
|
+
${ISSUE_FRAGMENT}
|
|
166
|
+
mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {
|
|
167
|
+
issueUpdate(id: $id, input: $input) {
|
|
168
|
+
success
|
|
169
|
+
issue {
|
|
170
|
+
...IssueFragment
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
`;
|
|
175
|
+
|
|
176
|
+
const result = await this.client.mutate<UpdateIssueResponse>(mutation, {
|
|
177
|
+
id,
|
|
178
|
+
input,
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
if (!result.issueUpdate.success || !result.issueUpdate.issue) {
|
|
182
|
+
throw new Error('Failed to update issue');
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return result.issueUpdate.issue;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Archive an issue (soft delete)
|
|
190
|
+
*/
|
|
191
|
+
async archive(id: string): Promise<boolean> {
|
|
192
|
+
const mutation = `
|
|
193
|
+
mutation ArchiveIssue($id: String!) {
|
|
194
|
+
issueArchive(id: $id) {
|
|
195
|
+
success
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
`;
|
|
199
|
+
|
|
200
|
+
const result = await this.client.mutate<ArchiveIssueResponse>(mutation, { id });
|
|
201
|
+
return result.issueArchive.success;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Change issue state by state ID
|
|
206
|
+
*/
|
|
207
|
+
async changeState(id: string, stateId: string): Promise<LinearIssue> {
|
|
208
|
+
return this.update(id, { stateId });
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Assign issue to a user
|
|
213
|
+
*/
|
|
214
|
+
async assign(id: string, assigneeId: string): Promise<LinearIssue> {
|
|
215
|
+
return this.update(id, { assigneeId });
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Add issue to a project
|
|
220
|
+
*/
|
|
221
|
+
async addToProject(id: string, projectId: string): Promise<LinearIssue> {
|
|
222
|
+
return this.update(id, { projectId });
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Search issues by query text
|
|
227
|
+
*/
|
|
228
|
+
async search(query: string, first = 20): Promise<LinearIssue[]> {
|
|
229
|
+
const gqlQuery = `
|
|
230
|
+
${ISSUE_FRAGMENT}
|
|
231
|
+
query SearchIssues($query: String!, $first: Int) {
|
|
232
|
+
issueSearch(query: $query, first: $first) {
|
|
233
|
+
nodes {
|
|
234
|
+
...IssueFragment
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
`;
|
|
239
|
+
|
|
240
|
+
const result = await this.client.query<{ issueSearch: { nodes: LinearIssue[] } }>(
|
|
241
|
+
gqlQuery,
|
|
242
|
+
{ query, first }
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
return result.issueSearch.nodes;
|
|
246
|
+
}
|
|
247
|
+
}
|