{"_id":"@adobe/spacecat-shared-ticket-client","_rev":"6-981848de8a5adbfe531733d0a5a2a8be","name":"@adobe/spacecat-shared-ticket-client","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.1":{"name":"@adobe/spacecat-shared-ticket-client","version":"1.0.1","author":"","license":"Apache-2.0","_id":"@adobe/spacecat-shared-ticket-client@1.0.1","maintainers":[{"name":"marbec","email":"mabecker@adobe.com"},{"name":"tripod","email":"tripod@bocanegra.ch"},{"name":"garthdb","email":"garthdb@gmail.com"},{"name":"lazd","email":"lazdnet@gmail.com"},{"name":"adobe-admin","email":"grp-opensourceoffice@adobe.com"},{"name":"patrickfulton","email":"patrickfulton@gmail.com"},{"name":"trieloff","email":"lars@trieloff.net"},{"name":"shazron","email":"shazron@gmail.com"},{"name":"krisnye","email":"krisnye@gmail.com"},{"name":"dcpfsdk","email":"dcpfsdk@adobe.com"},{"name":"natebaldwin","email":"natebaldwindesign@gmail.com"},{"name":"devongovett","email":"devongovett@gmail.com"},{"name":"aspro83","email":"danniintheus@gmail.com"},{"name":"symanovi","email":"symanovi@adobe.com"},{"name":"dpfister","email":"dominique.pfister@gmail.com"},{"name":"stefan-guggisberg","email":"sg@adobe.com"},{"name":"rofe","email":"npm@rofe.com"},{"name":"kptdobe","email":"kptdobe@gmail.com"},{"name":"adobehalls","email":"halls@adobe.com"},{"name":"fullcolorcoder","email":"bradjohn@adobe.com"},{"name":"djaeggi","email":"djaeggi@adobe.com"},{"name":"dylandepass","email":"dylandepass@gmail.com"},{"name":"mhaack","email":"mhaack@adobe.com"},{"name":"amol-anand","email":"amol@adobe.com"},{"name":"stopp-adobe","email":"stopp@adobe.com"},{"name":"namarora","email":"namarora@adobe.com"},{"name":"doten","email":"doten@adobe.com"},{"name":"prithipalpatwal","email":"ppatwal@adobe.com"},{"name":"duh_schmidt","email":"schmidt@adobe.com"},{"name":"asthabh23","email":"astha.bhargava23@gmail.com"},{"name":"zdahbi","email":"zouhir.dahbi@outlook.com"},{"name":"tuicu","email":"tuicu@adobe.com"},{"name":"fmeschbe","email":"fmeschbe@adobe.com"}],"homepage":"https://github.com/adobe/spacecat-shared#readme","bugs":{"url":"https://github.com/adobe/spacecat-shared/issues"},"dist":{"shasum":"a48bf009445f85caab91123e02ec93d640b6f5e0","tarball":"https://registry.npmjs.org/@adobe/spacecat-shared-ticket-client/-/spacecat-shared-ticket-client-1.0.1.tgz","fileCount":12,"integrity":"sha512-3Uzwf4lf/YYU1qPgnHqG+XBUB5jLszOz0hRmOSzmUY8UguoqS56FDuaLblzdpsCJQPYmNKOVE9DZSIsTXCFGIw==","signatures":[{"sig":"MEUCIQDdPYrcS/n6s4b5FFoPx/Fhokh4yAqn08MjSpaJdLVQHQIgSMvSRsl5HZKvUokBjUwh0ZoxOy4mXaKI728Gz7TVkHk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89918},"main":"src/index.js","type":"module","mocha":{"spec":"test/**/*.test.js","require":"test/setup-env.js","reporter":"mocha-multi-reporters","reporter-options":"configFile=.mocha-multi.json"},"types":"src/index.d.ts","engines":{"npm":">=10.9.0 <12.0.0","node":">=22.0.0 <25.0.0"},"gitHead":"78cca2c3b96bd1df8efb1020d322024e619a4579","scripts":{"lint":"eslint .","test":"c8 mocha","clean":"rm -rf package-lock.json node_modules"},"_npmUser":{"name":"prithipalpatwal","email":"ppatwal@adobe.com"},"repository":{"url":"git+https://github.com/adobe/spacecat-shared.git","type":"git"},"_npmVersion":"11.13.0","description":"Shared modules of the SpaceCat Services - Ticket Client","directories":{},"_nodeVersion":"24.11.1","dependencies":{"marked":"^18.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"11.0.0","chai":"6.2.2","nock":"14.0.15","mocha":"11.7.6","sinon":"22.0.0","sinon-chai":"4.0.1","typescript":"6.0.3","chai-as-promised":"8.0.2","mocha-multi-reporters":"1.5.1"},"_npmOperationalInternal":{"tmp":"tmp/spacecat-shared-ticket-client_1.0.1_1783443883793_0.11540774233731121","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@adobe/spacecat-shared-ticket-client","version":"1.0.2","author":"","license":"Apache-2.0","_id":"@adobe/spacecat-shared-ticket-client@1.0.2","maintainers":[{"name":"marbec","email":"mabecker@adobe.com"},{"name":"tripod","email":"tripod@bocanegra.ch"},{"name":"garthdb","email":"garthdb@gmail.com"},{"name":"lazd","email":"lazdnet@gmail.com"},{"name":"adobe-admin","email":"grp-opensourceoffice@adobe.com"},{"name":"patrickfulton","email":"patrickfulton@gmail.com"},{"name":"trieloff","email":"lars@trieloff.net"},{"name":"krisnye","email":"krisnye@gmail.com"},{"name":"dcpfsdk","email":"dcpfsdk@adobe.com"},{"name":"natebaldwin","email":"natebaldwindesign@gmail.com"},{"name":"devongovett","email":"devongovett@gmail.com"},{"name":"aspro83","email":"danniintheus@gmail.com"},{"name":"symanovi","email":"symanovi@adobe.com"},{"name":"dpfister","email":"dominique.pfister@gmail.com"},{"name":"stefan-guggisberg","email":"sg@adobe.com"},{"name":"rofe","email":"npm@rofe.com"},{"name":"kptdobe","email":"kptdobe@gmail.com"},{"name":"adobehalls","email":"halls@adobe.com"},{"name":"fullcolorcoder","email":"bradjohn@adobe.com"},{"name":"djaeggi","email":"djaeggi@adobe.com"},{"name":"dylandepass","email":"dylandepass@gmail.com"},{"name":"mhaack","email":"mhaack@adobe.com"},{"name":"amol-anand","email":"amol@adobe.com"},{"name":"stopp-adobe","email":"stopp@adobe.com"},{"name":"namarora","email":"namarora@adobe.com"},{"name":"doten","email":"doten@adobe.com"},{"name":"prithipalpatwal","email":"ppatwal@adobe.com"},{"name":"duh_schmidt","email":"schmidt@adobe.com"},{"name":"asthabh23","email":"astha.bhargava23@gmail.com"},{"name":"zdahbi","email":"zouhir.dahbi@outlook.com"},{"name":"tuicu","email":"tuicu@adobe.com"},{"name":"fmeschbe","email":"fmeschbe@adobe.com"}],"homepage":"https://github.com/adobe/spacecat-shared#readme","bugs":{"url":"https://github.com/adobe/spacecat-shared/issues"},"dist":{"shasum":"10da2df17600e78cf5eaf8ba5a4db93610e78056","tarball":"https://registry.npmjs.org/@adobe/spacecat-shared-ticket-client/-/spacecat-shared-ticket-client-1.0.2.tgz","fileCount":12,"integrity":"sha512-XD/dL3Rk4QeaALKRAKSJCOYgJTqB53sb9r860D4g+lka3zgADPLzCmKKuzklqSO/NDvqvDjOSdE2V55lEtK6Yw==","signatures":[{"sig":"MEYCIQDpGE9G1gXc2Co6+kgktCIOOuvezIotV9xIA7uFjDlIwwIhAMU6+xxhZDtfx+V3IMAFuYrLpauZNA+Rwh2VCd+XRHsv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adobe%2fspacecat-shared-ticket-client@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":90361},"main":"src/index.js","type":"module","mocha":{"spec":"test/**/*.test.js","require":"test/setup-env.js","reporter":"mocha-multi-reporters","reporter-options":"configFile=.mocha-multi.json"},"types":"src/index.d.ts","engines":{"npm":">=10.9.0 <12.0.0","node":">=22.0.0 <25.0.0"},"gitHead":"35fcb9536c1bae020a42c600d1508f236a1a5cb9","scripts":{"lint":"eslint .","test":"c8 mocha","clean":"rm -rf package-lock.json node_modules"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bdb44fe1-9bc2-4ffa-9979-fb050a79bfb4"}},"repository":{"url":"git+https://github.com/adobe/spacecat-shared.git","type":"git"},"_npmVersion":"11.12.1","description":"Shared modules of the SpaceCat Services - Ticket Client","directories":{},"_nodeVersion":"24.16.0","dependencies":{"marked":"^18.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"11.0.0","chai":"6.2.2","nock":"14.0.15","mocha":"11.7.6","sinon":"22.0.0","sinon-chai":"4.0.1","typescript":"6.0.3","chai-as-promised":"8.0.2","mocha-multi-reporters":"1.5.1"},"_npmOperationalInternal":{"tmp":"tmp/spacecat-shared-ticket-client_1.0.2_1783492895631_0.528857723825453","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@adobe/spacecat-shared-ticket-client","version":"1.0.3","author":"","license":"Apache-2.0","_id":"@adobe/spacecat-shared-ticket-client@1.0.3","maintainers":[{"name":"marbec","email":"mabecker@adobe.com"},{"name":"tripod","email":"tripod@bocanegra.ch"},{"name":"garthdb","email":"garthdb@gmail.com"},{"name":"lazd","email":"lazdnet@gmail.com"},{"name":"adobe-admin","email":"grp-opensourceoffice@adobe.com"},{"name":"patrickfulton","email":"patrickfulton@gmail.com"},{"name":"trieloff","email":"lars@trieloff.net"},{"name":"krisnye","email":"krisnye@gmail.com"},{"name":"dcpfsdk","email":"dcpfsdk@adobe.com"},{"name":"natebaldwin","email":"natebaldwindesign@gmail.com"},{"name":"devongovett","email":"devongovett@gmail.com"},{"name":"aspro83","email":"danniintheus@gmail.com"},{"name":"symanovi","email":"symanovi@adobe.com"},{"name":"dpfister","email":"dominique.pfister@gmail.com"},{"name":"stefan-guggisberg","email":"sg@adobe.com"},{"name":"rofe","email":"npm@rofe.com"},{"name":"kptdobe","email":"kptdobe@gmail.com"},{"name":"adobehalls","email":"halls@adobe.com"},{"name":"fullcolorcoder","email":"bradjohn@adobe.com"},{"name":"djaeggi","email":"djaeggi@adobe.com"},{"name":"dylandepass","email":"dylandepass@gmail.com"},{"name":"mhaack","email":"mhaack@adobe.com"},{"name":"amol-anand","email":"amol@adobe.com"},{"name":"stopp-adobe","email":"stopp@adobe.com"},{"name":"namarora","email":"namarora@adobe.com"},{"name":"doten","email":"doten@adobe.com"},{"name":"duh_schmidt","email":"schmidt@adobe.com"},{"name":"asthabh23","email":"astha.bhargava23@gmail.com"},{"name":"zdahbi","email":"zouhir.dahbi@outlook.com"},{"name":"tuicu","email":"tuicu@adobe.com"},{"name":"fmeschbe","email":"fmeschbe@adobe.com"}],"homepage":"https://github.com/adobe/spacecat-shared#readme","bugs":{"url":"https://github.com/adobe/spacecat-shared/issues"},"dist":{"shasum":"427abb147acd1c79976a4d9de68b64803de2fd89","tarball":"https://registry.npmjs.org/@adobe/spacecat-shared-ticket-client/-/spacecat-shared-ticket-client-1.0.3.tgz","fileCount":12,"integrity":"sha512-FWNT0aagNMtL+DLk++9fT1dZzy4wP+GIvf0p7RJQ16k0Ssl/3ovPwXw3JMUOW8L6FgZe5bW/CIR1rGNGrk2aTQ==","signatures":[{"sig":"MEUCIQD04h7B2cIS07HhcpE4kmVxOSj+2sjrpretKcnuLlnS+QIgNq/u5EeC2Kbb7ZVYmqu9QqO1VSs+Xru7VtpeacgkuVM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adobe%2fspacecat-shared-ticket-client@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":91874},"main":"src/index.js","type":"module","mocha":{"spec":"test/**/*.test.js","require":"test/setup-env.js","reporter":"mocha-multi-reporters","reporter-options":"configFile=.mocha-multi.json"},"types":"src/index.d.ts","engines":{"npm":">=10.9.0 <12.0.0","node":">=22.0.0 <25.0.0"},"gitHead":"b853b9384fe418744dff67e55423ad241f7d1775","scripts":{"lint":"eslint .","test":"c8 mocha","clean":"rm -rf package-lock.json node_modules"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bdb44fe1-9bc2-4ffa-9979-fb050a79bfb4"}},"repository":{"url":"git+https://github.com/adobe/spacecat-shared.git","type":"git"},"_npmVersion":"11.12.1","description":"Shared modules of the SpaceCat Services - Ticket Client","directories":{},"_nodeVersion":"24.16.0","dependencies":{"marked":"^18.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"11.0.0","chai":"6.2.2","nock":"14.0.15","mocha":"11.7.6","sinon":"22.0.0","sinon-chai":"4.0.1","typescript":"6.0.3","chai-as-promised":"8.0.2","mocha-multi-reporters":"1.5.1"},"_npmOperationalInternal":{"tmp":"tmp/spacecat-shared-ticket-client_1.0.3_1783540220571_0.9156807011478152","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@adobe/spacecat-shared-ticket-client","version":"1.0.4","description":"Shared modules of the SpaceCat Services - Ticket Client","type":"module","engines":{"node":">=22.0.0 <25.0.0","npm":">=10.9.0 <12.0.0"},"main":"src/index.js","types":"src/index.d.ts","scripts":{"test":"c8 mocha","lint":"eslint .","clean":"rm -rf package-lock.json node_modules"},"mocha":{"require":"test/setup-env.js","reporter":"mocha-multi-reporters","reporter-options":"configFile=.mocha-multi.json","spec":"test/**/*.test.js"},"repository":{"type":"git","url":"git+https://github.com/adobe/spacecat-shared.git"},"author":"","license":"Apache-2.0","bugs":{"url":"https://github.com/adobe/spacecat-shared/issues"},"homepage":"https://github.com/adobe/spacecat-shared#readme","publishConfig":{"access":"public"},"devDependencies":{"c8":"11.0.0","chai":"6.2.2","chai-as-promised":"8.0.2","mocha":"11.7.6","mocha-multi-reporters":"1.5.1","nock":"14.0.15","sinon":"22.0.0","sinon-chai":"4.0.1","typescript":"6.0.3"},"dependencies":{"marked":"^18.0.5"},"gitHead":"51ea70f08c6ae2ae556006e39e785f3a5dcaa1d5","_id":"@adobe/spacecat-shared-ticket-client@1.0.4","_nodeVersion":"24.16.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-EZrf/X2oacFfN7b3unVwoZzDE756Z1jbVjNXuZPqbMrAPCHmdws+enRaDXPoirDBbThtl9nlncxa+2kAXZxsLw==","shasum":"db24b7261c5731c5f796a58a91116d79a302dad5","tarball":"https://registry.npmjs.org/@adobe/spacecat-shared-ticket-client/-/spacecat-shared-ticket-client-1.0.4.tgz","fileCount":12,"unpackedSize":96136,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adobe%2fspacecat-shared-ticket-client@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFe313DSwd9rNuym5SDxIjCDq+LFVifntgrF1Q285oCHAiEA4+wdhG5js4egYv3wLixgVzgwoQ7fuf/QwcUOk/0FYiE="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:bdb44fe1-9bc2-4ffa-9979-fb050a79bfb4"}},"directories":{},"maintainers":[{"name":"marbec","email":"mabecker@adobe.com"},{"name":"tripod","email":"tripod@bocanegra.ch"},{"name":"garthdb","email":"garthdb@gmail.com"},{"name":"lazd","email":"lazdnet@gmail.com"},{"name":"adobe-admin","email":"grp-opensourceoffice@adobe.com"},{"name":"patrickfulton","email":"patrickfulton@gmail.com"},{"name":"trieloff","email":"lars@trieloff.net"},{"name":"krisnye","email":"krisnye@gmail.com"},{"name":"dcpfsdk","email":"dcpfsdk@adobe.com"},{"name":"natebaldwin","email":"natebaldwindesign@gmail.com"},{"name":"devongovett","email":"devongovett@gmail.com"},{"name":"aspro83","email":"danniintheus@gmail.com"},{"name":"symanovi","email":"symanovi@adobe.com"},{"name":"dpfister","email":"dominique.pfister@gmail.com"},{"name":"stefan-guggisberg","email":"sg@adobe.com"},{"name":"rofe","email":"npm@rofe.com"},{"name":"kptdobe","email":"kptdobe@gmail.com"},{"name":"adobehalls","email":"halls@adobe.com"},{"name":"fullcolorcoder","email":"bradjohn@adobe.com"},{"name":"djaeggi","email":"djaeggi@adobe.com"},{"name":"dylandepass","email":"dylandepass@gmail.com"},{"name":"mhaack","email":"mhaack@adobe.com"},{"name":"amol-anand","email":"amol@adobe.com"},{"name":"stopp-adobe","email":"stopp@adobe.com"},{"name":"namarora","email":"namarora@adobe.com"},{"name":"doten","email":"doten@adobe.com"},{"name":"duh_schmidt","email":"schmidt@adobe.com"},{"name":"asthabh23","email":"astha.bhargava23@gmail.com"},{"name":"zdahbi","email":"zouhir.dahbi@outlook.com"},{"name":"tuicu","email":"tuicu@adobe.com"},{"name":"fmeschbe","email":"fmeschbe@adobe.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spacecat-shared-ticket-client_1.0.4_1783917226750_0.13499760090692825"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-07T17:04:43.680Z","modified":"2026-07-13T04:33:47.593Z","1.0.1":"2026-07-07T17:04:43.996Z","1.0.2":"2026-07-08T06:41:35.802Z","1.0.3":"2026-07-08T19:50:20.715Z","1.0.4":"2026-07-13T04:33:46.887Z"},"bugs":{"url":"https://github.com/adobe/spacecat-shared/issues"},"license":"Apache-2.0","homepage":"https://github.com/adobe/spacecat-shared#readme","repository":{"type":"git","url":"git+https://github.com/adobe/spacecat-shared.git"},"description":"Shared modules of the SpaceCat Services - Ticket Client","maintainers":[{"name":"marbec","email":"mabecker@adobe.com"},{"name":"tripod","email":"tripod@bocanegra.ch"},{"name":"garthdb","email":"garthdb@gmail.com"},{"name":"lazd","email":"lazdnet@gmail.com"},{"name":"adobe-admin","email":"grp-opensourceoffice@adobe.com"},{"name":"patrickfulton","email":"patrickfulton@gmail.com"},{"name":"trieloff","email":"lars@trieloff.net"},{"name":"krisnye","email":"krisnye@gmail.com"},{"name":"dcpfsdk","email":"dcpfsdk@adobe.com"},{"name":"natebaldwin","email":"natebaldwindesign@gmail.com"},{"name":"devongovett","email":"devongovett@gmail.com"},{"name":"aspro83","email":"danniintheus@gmail.com"},{"name":"symanovi","email":"symanovi@adobe.com"},{"name":"dpfister","email":"dominique.pfister@gmail.com"},{"name":"stefan-guggisberg","email":"sg@adobe.com"},{"name":"rofe","email":"npm@rofe.com"},{"name":"kptdobe","email":"kptdobe@gmail.com"},{"name":"adobehalls","email":"halls@adobe.com"},{"name":"fullcolorcoder","email":"bradjohn@adobe.com"},{"name":"djaeggi","email":"djaeggi@adobe.com"},{"name":"dylandepass","email":"dylandepass@gmail.com"},{"name":"mhaack","email":"mhaack@adobe.com"},{"name":"amol-anand","email":"amol@adobe.com"},{"name":"stopp-adobe","email":"stopp@adobe.com"},{"name":"namarora","email":"namarora@adobe.com"},{"name":"doten","email":"doten@adobe.com"},{"name":"duh_schmidt","email":"schmidt@adobe.com"},{"name":"asthabh23","email":"astha.bhargava23@gmail.com"},{"name":"zdahbi","email":"zouhir.dahbi@outlook.com"},{"name":"tuicu","email":"tuicu@adobe.com"},{"name":"fmeschbe","email":"fmeschbe@adobe.com"}],"readme":"# Spacecat Shared - Ticket Client\n\n## Overview\n\nThe `spacecat-shared-ticket-client` package provides a provider-agnostic interface for creating and managing tickets in external task-management systems. The v1 implementation ships a fully-featured Jira Cloud client (`JiraCloudClient`) that targets the Jira REST API v3, handling OAuth 2.0 token lifecycle, ADF description formatting, file attachments, and rate-limit backoff automatically.\n\n## Architecture\n\n```\nTicketClientFactory.create(connection, smClient, httpClient, log)\n  └─ JiraCloudClient          ← implements BaseTicketClient\n       ├─ OAuthCredentialManager  ← reads/refreshes tokens from AWS Secrets Manager\n       └─ RateLimitAwareHttpClient ← wraps httpClient with 429 retry + backoff\n```\n\nAdding a new provider (e.g. Zendesk) requires only:\n1. Implement a class extending `BaseTicketClient`\n2. Add one entry to `CLIENT_MAP` in `ticket-client-factory.js`\n3. Implement a `CredentialManager` if the auth model differs from OAuth 3LO\n\n## Environment Setup\n\nThe following environment variables must be present at Lambda runtime. They are stored in HashiCorp Vault and injected at deploy time.\n\n| Variable | Description |\n|---|---|\n| `JIRA_OAUTH_CLIENT_ID` | Client ID of your Jira OAuth 2.0 (3LO) app |\n| `JIRA_OAUTH_CLIENT_SECRET` | Client secret of your Jira OAuth 2.0 (3LO) app |\n\nThe constructor throws immediately if either variable is missing — fail-fast prevents silent 401 errors at call time.\n\nPer-connection OAuth tokens (`access_token`, `refresh_token`, `expiresAt`) are stored separately in AWS Secrets Manager at:\n\n```\n/mysticat/task-management/{organizationId}/{connectionId}\n```\n\n## Installation\n\n```bash\nnpm install @adobe/spacecat-shared-ticket-client\n```\n\n## Usage\n\n### Creating a client via the factory\n\nThe factory resolves the correct client and credential manager for a connection record automatically.\n\n```javascript\nimport { TicketClientFactory } from '@adobe/spacecat-shared-ticket-client';\n\nconst client = TicketClientFactory.create(\n  connection,   // DB connection record: { id, organizationId, provider, metadata }\n  smClient,     // AWS Secrets Manager client\n  httpClient,   // fetch-compatible HTTP client (e.g. @adobe/fetch)\n  log,          // logger\n);\n```\n\n### Creating a ticket\n\n```javascript\nconst result = await client.createTicket({\n  projectKey: 'ASO',\n  issueType: 'Task',            // required — resolve a valid type via listIssueTypes()\n  summary: 'Fix colour contrast on homepage hero',\n  description: 'The hero banner fails WCAG AA contrast ratio.\\n\\nSee https://example.com/audit for details.',\n  labels: ['a11y', 'mysticat'],  // optional\n});\n\nconsole.log(result);\n// {\n//   ticketId: '10042',              ← Jira internal numeric ID\n//   ticketKey: 'ASO-42',\n//   ticketUrl: 'https://yourorg.atlassian.net/browse/ASO-42',\n//   ticketStatus: 'To Do',\n// }\n```\n\n`description` accepts **markdown**. The client converts it to Atlassian Document Format (ADF) automatically using `marked.lexer()` for tokenization and a built-in `tokensToAdf` converter.\n\n#### Supported markdown features\n\n| Markdown | Jira renders as |\n|---|---|\n| `**bold**` | **bold** |\n| `*italic*` | *italic* |\n| `` `code` `` | `inline code` |\n| `[text](url)` | clickable link |\n| `~~strike~~` | ~~strikethrough~~ |\n| `***bold italic***` | ***bold italic*** |\n| `# Heading` … `###### H6` | heading levels 1–6 |\n| `- item` | bullet list |\n| `1. item` | numbered list |\n| `` ```lang … ``` `` | syntax-highlighted code block |\n| `> quote` | blockquote |\n| `---` | horizontal rule |\n| `\\| A \\| B \\|` | table with headers |\n\n#### Example with rich formatting\n\n```javascript\nconst result = await client.createTicket({\n  projectKey: 'ASO',\n  summary: 'Fix colour contrast on homepage hero',\n  description: [\n    '## Accessibility Issues',\n    '',\n    'The following **critical** issues were detected:',\n    '',\n    '- Missing `alt` text on hero image',\n    '- Low contrast ratio on [CTA button](https://example.com/audit)',\n    '',\n    '> These affect WCAG 2.1 Level AA compliance',\n    '',\n    '```html',\n    '<img src=\"hero.jpg\">',\n    '```',\n  ].join('\\n'),\n});\n```\n\n#### Behaviour notes\n\n- Blank or whitespace-only description omits the field entirely (Jira treats missing and empty-ADF differently)\n- Bare URLs are auto-linked by the markdown parser\n- Empty table cells are padded with a space (ADF requires non-empty cell content)\n- Empty text nodes are filtered out before sending to Jira\n- Marks follow ADF constraints — inline code disallows all marks except link\n\n### Listing projects\n\n```javascript\nconst projects = await client.listProjects();\n// [{ id: '10001', key: 'ASO', name: 'ASO Project' }, ...]\n```\n\n### Uploading an attachment\n\n`uploadAttachment` is available on `JiraCloudClient` only (not all providers support attachments).\n\n```javascript\nimport { JiraCloudClient } from '@adobe/spacecat-shared-ticket-client';\n\n// client must be a JiraCloudClient instance\nawait client.uploadAttachment('ASO-42', {\n  content: Buffer.from('...'),          // raw file bytes, 1 byte – 3 MB\n  mimeType: 'image/png',                // must be in the allowed list\n  filename: 'screenshot.png',           // sanitized automatically\n});\n```\n\nAllowed MIME types: `image/png`, `image/jpeg`, `image/gif`, `image/webp`, `application/pdf`, `text/csv`, `text/plain`.\n\n### Rate limiting\n\n`RateLimitAwareHttpClient` is applied automatically by `TicketClientFactory`. It retries HTTP 429 responses up to 4 times, honouring the `Retry-After` header when present and falling back to exponential backoff (2 s, 4 s, 8 s, 16 s) with ±30% jitter. Transient 5xx responses are also retried. Per-attempt timeout: 30 s.\n\n## Error Handling\n\nAll methods return promises and throw on failure. Errors include a `status` property for HTTP-level failures.\n\n```javascript\ntry {\n  const result = await client.createTicket(ticketData);\n} catch (err) {\n  if (err.status === 429) { /* rate limited beyond retries */ }\n  if (err.message.includes('requires re-authorization')) {\n    // OAuth refresh token is revoked — user must re-connect\n  }\n}\n```\n\nSensitive response bodies (which may contain tokens or PII) are never logged. Only the HTTP status code and operation name are included in error logs.\n\n## Development\n\n### Testing\n\n```bash\nnpm test\n```\n\n100% statement, function, and line coverage is enforced; 97% branch coverage per repo convention.\n\n### Linting\n\n```bash\nnpm run lint\n```\n\n### Cleaning\n\n```bash\nnpm run clean\n```\n\n## Additional Information\n\n- **Repository**: [GitHub](https://github.com/adobe/spacecat-shared.git)\n- **Issue Tracking**: [GitHub Issues](https://github.com/adobe/spacecat-shared/issues)\n- **License**: Apache-2.0\n","readmeFilename":"README.md"}