{"_id":"@doruksahin/jira-markdown-exporter","_rev":"5-1c8057a149055ac0ed110ce50fdd6061","name":"@doruksahin/jira-markdown-exporter","dist-tags":{"latest":"0.7.0"},"versions":{"0.4.0":{"name":"@doruksahin/jira-markdown-exporter","version":"0.4.0","license":"MIT","_id":"@doruksahin/jira-markdown-exporter@0.4.0","maintainers":[{"name":"doruksahin","email":"doruksahin98@gmail.com"}],"homepage":"https://github.com/doruksahin/jira-markdown-exporter#readme","bugs":{"url":"https://github.com/doruksahin/jira-markdown-exporter/issues"},"bin":{"jira-markdown-export":"dist/cli/main.js"},"dist":{"shasum":"f1594cf8d9f8f3b626a22bbb6c7d0cefdb1aa938","tarball":"https://registry.npmjs.org/@doruksahin/jira-markdown-exporter/-/jira-markdown-exporter-0.4.0.tgz","fileCount":54,"integrity":"sha512-1h2zWXxLR+jvfZ4sCG1QjTDQPY+H/bGtqu2VzbHR0ShJzqVX2SP5puOY0CxyQKztKZQvhmmS9g6/g4EUX7WibQ==","signatures":[{"sig":"MEUCIQCEb1bxt1F9LvLS3QfyXi1kSVZjY2dlprwUlwS8SAgxHAIgMixK+Tt1JbIgKfCat+xnifdnnTvFmHDfJamSfxJsCvg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140721},"type":"module","_from":"file:/var/folders/2d/z1vzz2gd3xg3hhyz394247dh0000gn/T/jira-npm-release.9O3rwIi3mf/doruksahin-jira-markdown-exporter-0.4.0.tgz","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./embedded":{"types":"./dist/embedded.d.ts","import":"./dist/embedded.js"},"./profiles/*":"./profiles/*"},"scripts":{"test":"pnpm build && vitest run --exclude test/release-artifact.test.ts && vitest run test/release-artifact.test.ts","build":"node scripts/clean-dist.mjs && tsc -p tsconfig.json","check":"pnpm typecheck && pnpm test","export":"tsx src/cli/main.ts","prepack":"pnpm build","typecheck":"tsc -p tsconfig.json --noEmit","release:check":"pnpm check && npm pack --dry-run --ignore-scripts","release:artifact":"node scripts/build-release-artifact.mjs","release:smoke-install":"node scripts/smoke-installed-artifact.mjs"},"_npmUser":{"name":"doruksahin","email":"doruksahin98@gmail.com"},"_resolved":"/var/folders/2d/z1vzz2gd3xg3hhyz394247dh0000gn/T/jira-npm-release.9O3rwIi3mf/doruksahin-jira-markdown-exporter-0.4.0.tgz","_integrity":"sha512-1h2zWXxLR+jvfZ4sCG1QjTDQPY+H/bGtqu2VzbHR0ShJzqVX2SP5puOY0CxyQKztKZQvhmmS9g6/g4EUX7WibQ==","repository":{"url":"git+https://github.com/doruksahin/jira-markdown-exporter.git","type":"git"},"_npmVersion":"11.12.1","description":"Read-only Jira issue snapshots as deterministic Markdown packets.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"axios":"^1.19.0","jira.js":"^5.3.1","liquidjs":"^10.28.0","commander":"^14.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.21.0","vitest":"^3.1.2","typescript":"^5.8.3","@types/node":"^22.15.3"},"_npmOperationalInternal":{"tmp":"tmp/jira-markdown-exporter_0.4.0_1788426465912_0.22452696351481216","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@doruksahin/jira-markdown-exporter","version":"0.4.1","license":"MIT","_id":"@doruksahin/jira-markdown-exporter@0.4.1","maintainers":[{"name":"doruksahin","email":"doruksahin98@gmail.com"}],"homepage":"https://github.com/doruksahin/jira-markdown-exporter#readme","bugs":{"url":"https://github.com/doruksahin/jira-markdown-exporter/issues"},"bin":{"jira-markdown-export":"dist/cli/main.js"},"dist":{"shasum":"bc02e757016342868b1c161e601d2e73ad5d0e0e","tarball":"https://registry.npmjs.org/@doruksahin/jira-markdown-exporter/-/jira-markdown-exporter-0.4.1.tgz","fileCount":54,"integrity":"sha512-iwgG6e3dIyUdvC+Boq1O62saRwiFAONxiM7ZqlNRd36WmBQdNKgs42XsqKyjnhlimPeL9nq97wXCD4Msfh1cOQ==","signatures":[{"sig":"MEUCIAcH9E991gs6uJPSdD4ImEntBX0PmF5yN6TWG6f7LO9VAiEA+GD5DJBGF/tRbmGPjgKJ2fKuSDZjQRDdwsshFFB6mu4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@doruksahin%2fjira-markdown-exporter@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":140721},"type":"module","_from":"file:/home/runner/work/_temp/jira-markdown-exporter-release/doruksahin-jira-markdown-exporter-0.4.1.tgz","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./embedded":{"types":"./dist/embedded.d.ts","import":"./dist/embedded.js"},"./profiles/*":"./profiles/*"},"scripts":{"test":"pnpm build && vitest run --exclude test/release-artifact.test.ts && vitest run test/release-artifact.test.ts","build":"node scripts/clean-dist.mjs && tsc -p tsconfig.json","check":"pnpm typecheck && pnpm test","export":"tsx src/cli/main.ts","prepack":"pnpm build","typecheck":"tsc -p tsconfig.json --noEmit","release:check":"pnpm check && npm pack --dry-run --ignore-scripts","release:artifact":"node scripts/build-release-artifact.mjs","release:smoke-install":"node scripts/smoke-installed-artifact.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8ff465ce-ad44-4950-8c89-7997a0962bf7"}},"_resolved":"/home/runner/work/_temp/jira-markdown-exporter-release/doruksahin-jira-markdown-exporter-0.4.1.tgz","_integrity":"sha512-iwgG6e3dIyUdvC+Boq1O62saRwiFAONxiM7ZqlNRd36WmBQdNKgs42XsqKyjnhlimPeL9nq97wXCD4Msfh1cOQ==","repository":{"url":"git+https://github.com/doruksahin/jira-markdown-exporter.git","type":"git"},"_npmVersion":"11.12.1","description":"Read-only Jira issue snapshots as deterministic Markdown packets.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"axios":"^1.19.0","jira.js":"^5.3.1","liquidjs":"^10.28.0","commander":"^14.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.21.0","vitest":"^3.1.2","typescript":"^5.8.3","@types/node":"^22.15.3"},"_npmOperationalInternal":{"tmp":"tmp/jira-markdown-exporter_0.4.1_1788426933176_0.16108383765888523","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@doruksahin/jira-markdown-exporter","version":"0.5.0","license":"MIT","_id":"@doruksahin/jira-markdown-exporter@0.5.0","maintainers":[{"name":"doruksahin","email":"doruksahin98@gmail.com"}],"homepage":"https://github.com/doruksahin/jira-markdown-exporter#readme","bugs":{"url":"https://github.com/doruksahin/jira-markdown-exporter/issues"},"bin":{"jira-markdown-export":"dist/cli/main.js"},"dist":{"shasum":"5f59949854c542315d6a575956a772d8673f483f","tarball":"https://registry.npmjs.org/@doruksahin/jira-markdown-exporter/-/jira-markdown-exporter-0.5.0.tgz","fileCount":56,"integrity":"sha512-w6CXYQi/kr38194/vGrK0QV+Xl1mukmm4nJBvCZyV5CrEtfHXuIokjo8pgAmmYMzQ2Uef7eZGgGEP2x19viFfg==","signatures":[{"sig":"MEUCIQCiAfE1vnwgqJy3EVrY9oP3N0YGrobhcHA+wr+fDhEe7gIgeeDoNW1pQJSazsAxCycAIVAG4pC8DYtP+HAeUtfSfd0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@doruksahin%2fjira-markdown-exporter@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":143072},"type":"module","_from":"file:/home/runner/work/_temp/jira-markdown-exporter-release/doruksahin-jira-markdown-exporter-0.5.0.tgz","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./embedded":{"types":"./dist/embedded.d.ts","import":"./dist/embedded.js","default":"./dist/embedded.js"},"./profiles/*":"./profiles/*"},"scripts":{"test":"pnpm build && vitest run --exclude test/release-artifact.test.ts && vitest run test/release-artifact.test.ts","build":"node scripts/clean-dist.mjs && tsc -p tsconfig.json","check":"pnpm typecheck && pnpm test","export":"tsx src/cli/main.ts","prepack":"pnpm build","typecheck":"tsc -p tsconfig.json --noEmit","release:check":"pnpm check && npm pack --dry-run --ignore-scripts","release:artifact":"node scripts/build-release-artifact.mjs","release:smoke-install":"node scripts/smoke-installed-artifact.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8ff465ce-ad44-4950-8c89-7997a0962bf7"}},"_resolved":"/home/runner/work/_temp/jira-markdown-exporter-release/doruksahin-jira-markdown-exporter-0.5.0.tgz","_integrity":"sha512-w6CXYQi/kr38194/vGrK0QV+Xl1mukmm4nJBvCZyV5CrEtfHXuIokjo8pgAmmYMzQ2Uef7eZGgGEP2x19viFfg==","repository":{"url":"git+https://github.com/doruksahin/jira-markdown-exporter.git","type":"git"},"_npmVersion":"11.12.1","description":"Read-only Jira issue snapshots as deterministic Markdown packets.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.20.0","axios":"^1.19.0","jira.js":"^5.3.1","liquidjs":"^10.28.0","commander":"^14.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.21.0","vitest":"^3.1.2","typescript":"^5.8.3","@types/node":"^22.15.3"},"_npmOperationalInternal":{"tmp":"tmp/jira-markdown-exporter_0.5.0_1788433279815_0.12735688610544127","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@doruksahin/jira-markdown-exporter","version":"0.6.0","license":"MIT","_id":"@doruksahin/jira-markdown-exporter@0.6.0","maintainers":[{"name":"doruksahin","email":"doruksahin98@gmail.com"}],"homepage":"https://github.com/doruksahin/jira-markdown-exporter#readme","bugs":{"url":"https://github.com/doruksahin/jira-markdown-exporter/issues"},"bin":{"jira-markdown-export":"dist/cli/main.js"},"dist":{"shasum":"900100b4690748b79f0ac407d1b59fdca0455024","tarball":"https://registry.npmjs.org/@doruksahin/jira-markdown-exporter/-/jira-markdown-exporter-0.6.0.tgz","fileCount":56,"integrity":"sha512-RYyeb5mHTY6zAZkqMx8ircaufSt5Kdt/yXgXQ7FnbZzSTwoOMDbA+NmCAZddJvG2956H22TjpGP8I3jqlPQafw==","signatures":[{"sig":"MEYCIQD28fhv2g5uPy2kofd++4nP+bUMG6cqQKCzVmDpzOGtogIhAJSPRiyTvu5/XEZc3Ybv4D5si+ZKn5ccnQ+s2Wgcp+0K","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@doruksahin%2fjira-markdown-exporter@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":146432},"type":"module","_from":"file:/home/runner/work/_temp/jira-markdown-exporter-release/doruksahin-jira-markdown-exporter-0.6.0.tgz","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./embedded":{"types":"./dist/embedded.d.ts","import":"./dist/embedded.js","default":"./dist/embedded.js"},"./profiles/*":"./profiles/*"},"scripts":{"test":"pnpm build && vitest run --exclude test/release-artifact.test.ts && vitest run test/release-artifact.test.ts","build":"node scripts/clean-dist.mjs && tsc -p tsconfig.json","check":"pnpm typecheck && pnpm test","export":"tsx src/cli/main.ts","prepack":"pnpm build","typecheck":"tsc -p tsconfig.json --noEmit","release:check":"pnpm check && npm pack --dry-run --ignore-scripts","release:artifact":"node scripts/build-release-artifact.mjs","release:smoke-install":"node scripts/smoke-installed-artifact.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8ff465ce-ad44-4950-8c89-7997a0962bf7"}},"_resolved":"/home/runner/work/_temp/jira-markdown-exporter-release/doruksahin-jira-markdown-exporter-0.6.0.tgz","_integrity":"sha512-RYyeb5mHTY6zAZkqMx8ircaufSt5Kdt/yXgXQ7FnbZzSTwoOMDbA+NmCAZddJvG2956H22TjpGP8I3jqlPQafw==","repository":{"url":"git+https://github.com/doruksahin/jira-markdown-exporter.git","type":"git"},"_npmVersion":"11.12.1","description":"Read-only Jira issue snapshots as deterministic Markdown packets.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.20.0","axios":"^1.19.0","jira.js":"^5.3.1","liquidjs":"^10.28.0","commander":"^14.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.21.0","vitest":"^3.1.2","typescript":"^5.8.3","@types/node":"^22.15.3"},"_npmOperationalInternal":{"tmp":"tmp/jira-markdown-exporter_0.6.0_1788879863140_0.6976786241621176","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"_id":"@doruksahin/jira-markdown-exporter@0.7.0","bin":{"jira-markdown-export":"dist/cli/main.js"},"bugs":{"url":"https://github.com/doruksahin/jira-markdown-exporter/issues"},"dist":{"shasum":"a004f0a73abf9592da2c65d3b2bbbd13f8bf3f83","tarball":"https://registry.npmjs.org/@doruksahin/jira-markdown-exporter/-/jira-markdown-exporter-0.7.0.tgz","fileCount":58,"integrity":"sha512-AIKJ9vsV52j9FAzjdLiTxY5x1nbXlVXsb61JFWKirP6984yDoCF+N/MQf4/CtMFMs6B/Z15Ju5rozYfSbyLdbg==","signatures":[{"sig":"MEQCIH25Jrhi0r+7oU2+1y6KtpkG06H5VvY1qg9zs0tFA7nrAiAuzNwDGVVQVB1Lxp77N0ZKch7F2e9JO9XQ2pHLicShOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDU13qt7/sECL8RCSYTR5VIFePVGbm8s8rU4x6y8QG4VgIhANlGrctPKUeO/WER9/AIgrIrCKzKMBB/OHa291Is6tny"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@doruksahin%2fjira-markdown-exporter@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":162447},"name":"@doruksahin/jira-markdown-exporter","type":"module","_from":"file:/home/runner/work/_temp/jira-markdown-exporter-release/doruksahin-jira-markdown-exporter-0.7.0.tgz","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./embedded":{"types":"./dist/embedded.d.ts","import":"./dist/embedded.js","default":"./dist/embedded.js"},"./profiles/*":"./profiles/*"},"license":"MIT","scripts":{"demo":"pnpm build && node examples/offline-demo.mjs","test":"pnpm build && vitest run --exclude test/release-artifact.test.ts && vitest run test/release-artifact.test.ts","build":"node scripts/clean-dist.mjs && tsc -p tsconfig.json","check":"pnpm typecheck && pnpm test","export":"tsx src/cli/main.ts","prepack":"pnpm build","typecheck":"tsc -p tsconfig.json --noEmit","release:check":"pnpm check && npm pack --dry-run --ignore-scripts","release:artifact":"node scripts/build-release-artifact.mjs","release:smoke-install":"node scripts/smoke-installed-artifact.mjs"},"version":"0.7.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8ff465ce-ad44-4950-8c89-7997a0962bf7"}},"homepage":"https://github.com/doruksahin/jira-markdown-exporter#readme","_resolved":"/home/runner/work/_temp/jira-markdown-exporter-release/doruksahin-jira-markdown-exporter-0.7.0.tgz","_integrity":"sha512-AIKJ9vsV52j9FAzjdLiTxY5x1nbXlVXsb61JFWKirP6984yDoCF+N/MQf4/CtMFMs6B/Z15Ju5rozYfSbyLdbg==","repository":{"url":"git+https://github.com/doruksahin/jira-markdown-exporter.git","type":"git"},"_npmVersion":"11.12.1","description":"Read-only Jira issue snapshots as deterministic Markdown packets.","directories":{},"maintainers":[{"name":"doruksahin","email":"doruksahin98@gmail.com"}],"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.20.0","axios":"^1.19.0","jira.js":"^5.3.1","liquidjs":"^10.28.0","commander":"^14.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.23.13","vitest":"^3.2.7","typescript":"^5.9.3","@types/node":"^22.20.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jira-markdown-exporter_0.7.0_1789895755300_0.7897603620985738"}}},"time":{"created":"2026-09-03T09:07:45.677Z","modified":"2026-09-20T09:15:55.741Z","0.4.0":"2026-09-03T09:07:46.055Z","0.4.1":"2026-09-03T09:15:33.311Z","0.5.0":"2026-09-03T11:01:19.923Z","0.6.0":"2026-09-08T15:04:23.269Z","0.7.0":"2026-09-20T09:15:55.386Z"},"bugs":{"url":"https://github.com/doruksahin/jira-markdown-exporter/issues"},"license":"MIT","homepage":"https://github.com/doruksahin/jira-markdown-exporter#readme","repository":{"url":"git+https://github.com/doruksahin/jira-markdown-exporter.git","type":"git"},"description":"Read-only Jira issue snapshots as deterministic Markdown packets.","maintainers":[{"name":"doruksahin","email":"doruksahin98@gmail.com"}],"readme":"# Jira Markdown Exporter\n\n`@doruksahin/jira-markdown-exporter` is a standalone, read-only Jira Cloud exporter. It\nselects issues by key or JQL, normalizes Jira data, and renders deterministic\nMarkdown through a caller-selected output profile.\n\nThe package has no knowledge of a consuming repository. A profile chooses the\ngenerated directory and Markdown filenames; the exporter owns only that\ndirectory beneath each issue key.\n\nSee [Repository architecture](docs/architecture/README.md) for the current\nresponsibility, interface, dependency, execution, storage, and failure\nboundaries.\n\n## Requirements\n\n- Node.js 20 or newer\n- pnpm 10 when running from source\n- A Jira Cloud account with read access and an API token\n- A local output-profile directory, or the built-in `generic-v1` profile\n\nThe CLI reads credentials only from the process environment:\n\n```text\nJIRA_HOST=https://your-company.atlassian.net\nJIRA_EMAIL=you@example.com\nJIRA_API_TOKEN=your-api-token\n```\n\nDo not put these values in profile files, command arguments, generated output,\nor source control.\n\n## Discover the command contract\n\n```sh\njira-markdown-export --help\n```\n\nThe generated plain-text help is the self-contained interface reference for\nboth unattended operators and language models. It includes every option, the\nthree required environment variables, selector exclusivity, receipt and output\nsemantics, exit statuses, and copyable examples.\n\n## Install\n\nFor a repository or GitHub Actions job, install an exact version as a local\ndevelopment dependency and commit both the manifest and lockfile:\n\n```sh\npnpm add --save-dev --save-exact @doruksahin/jira-markdown-exporter@X.Y.Z\npnpm exec jira-markdown-export --help\n```\n\nReplace `X.Y.Z` with a version that exists on npm. Do not use `latest`, `^`, or\n`~` in unattended jobs. The committed lockfile fixes the resolved dependency\ngraph, while the exact direct dependency makes exporter upgrades explicit in\ncode review.\n\nFor a one-off, non-locked invocation, npm can download and run one exact\nversion without a global installation:\n\n```sh\nnpm exec --yes \\\n  --package=@doruksahin/jira-markdown-exporter@X.Y.Z \\\n  -- jira-markdown-export --help\n```\n\nThe public package is available from npm. Confirm the requested version exists\nbefore using it in unattended work; the checksummed GitHub Release `.tgz`\nremains the independent artifact-verification and fallback installation path.\nSee [Stateless server operation](docs/server-operation.md) for both procedures.\n\n## Run from source\n\nA pinned source checkout is useful for development and for independently\nrebuilding a release:\n\n```sh\ngit clone https://github.com/doruksahin/jira-markdown-exporter.git\ncd jira-markdown-exporter\nexporter_ref=\"FULL_40_CHARACTER_COMMIT_SHA\"\nprintf '%s\\n' \"$exporter_ref\" | grep -Eq '^[0-9a-f]{40}$' || {\n  echo \"Replace exporter_ref with a full lowercase commit SHA\" >&2\n  exit 1\n}\ngit fetch origin\ngit checkout --detach \"$exporter_ref\"\ntest \"$(git rev-parse HEAD)\" = \"$exporter_ref\"\ncorepack enable\npnpm install --frozen-lockfile\npnpm check\nnode dist/cli/main.js --help\n```\n\nExport one or more explicit issues with the built-in generic profile:\n\n```sh\nJIRA_HOST=https://your-company.atlassian.net \\\nJIRA_EMAIL=you@example.com \\\nJIRA_API_TOKEN=your-api-token \\\nnode dist/cli/main.js \\\n  --issue-keys PROJ-123,PROJ-124 \\\n  --output-dir /tmp/jira-export \\\n  --profile generic-v1 \\\n  --json\n```\n\nSelect with JQL instead:\n\n```sh\nJIRA_HOST=https://your-company.atlassian.net \\\nJIRA_EMAIL=you@example.com \\\nJIRA_API_TOKEN=your-api-token \\\nnode dist/cli/main.js \\\n  --jql 'project = PROJ AND statusCategory != Done ORDER BY key' \\\n  --output-dir /tmp/jira-export \\\n  --profile generic-v1 \\\n  --json\n```\n\nUse `--jql-file /absolute/path/to/scope.jql` when the query is already stored\nas a runner input. Exactly one of `--issue-keys`, `--jql`, and `--jql-file` is\nrequired. `--output-dir` is also required. `generic-v1` is the default, so its\n`--profile` flag may be omitted.\n\n## Try an offline demo\n\nFrom a source checkout with dependencies installed:\n\n```sh\npnpm demo\n```\n\nThis builds the package and exports a synthetic `DEMO-1` task through the public\nlibrary API with the built-in `generic-v1` profile. No Jira credentials or network\nrequests are used. The demo prints the generated `issue.md` and leaves all four\nMarkdown files and a validated JSON receipt in a fresh temporary directory for\ninspection. The operating system chooses the temporary root; paths vary per run.\n\nExample output, omitting build output and the Markdown preview:\n\n```text\nOffline demo: synthetic data; no Jira requests.\nRun directory: /tmp/jira-exporter-demo-ABC123\nDemo export success: 1/1 synced, 0 failed\n- DEMO-1: synced · /tmp/jira-exporter-demo-ABC123/output/DEMO-1/jira-snapshot\nReceipt: /tmp/jira-exporter-demo-ABC123/export-receipt.json\n```\n\nUse `pnpm demo --partial` to simulate a second issue failing. It retains the\nsuccessful issue's Markdown, records the failure in the receipt, and exits `2`:\n\n```text\nDemo export partial: 1/2 synced, 1 failed\n- DEMO-1: synced · /tmp/jira-exporter-demo-ABC123/output/DEMO-1/jira-snapshot\n- DEMO-404: failed · Synthetic failure: issue unavailable\n```\n\nThe demo uses an injected reader with already-normalized data. It demonstrates\nrendering and receipt behavior; it does not verify CLI parsing, Jira authentication,\npagination, ADF conversion, or attachment downloads. The example is source-checkout\ntooling and is not included in the npm package.\n\n## Try one real issue and capture its run output\n\nWith `JIRA_HOST`, `JIRA_EMAIL`, and `JIRA_API_TOKEN` already injected into your\nenvironment, run this from the source checkout. Replace `PROJ-123` with an issue\nyou can read:\n\n```sh\npnpm build\nexport_demo_root=\"$(mktemp -d)\"\nif node dist/cli/main.js \\\n  --issue-keys PROJ-123 \\\n  --output-dir \"$export_demo_root/output\" \\\n  --receipt \"$export_demo_root/export-receipt.json\" \\\n  > \"$export_demo_root/stdout.log\" \\\n  2> \"$export_demo_root/stderr.log\"\nthen\n  export_demo_status=0\nelse\n  export_demo_status=$?\nfi\ncat \"$export_demo_root/stdout.log\" \"$export_demo_root/stderr.log\"\nprintf 'Exit: %s\\nRun directory: %s\\n' \"$export_demo_status\" \"$export_demo_root\"\n```\n\nA successful CLI run prints the following final summary (paths vary):\n\n```text\nJira export success: 1/1 synced, 0 failed\n- PROJ-123: synced · /tmp/example/output/PROJ-123/jira-snapshot\n```\n\nThe receipt records counts, provenance, paths, warnings, and failures. `stdout.log`\nand `stderr.log` are captured by the shell in this example; the exporter does not\ncreate log files or retain run history automatically. Output is a final result,\nnot live progress. Each attempt gets its own directory so previous receipts and\nlogs remain available. Keep real Jira output and receipts out of source control.\n\n## Run as a stateless server job\n\nThe exporter is a one-shot process. It receives credentials from the\nenvironment and selection/profile paths from arguments, writes into a unique\nwork directory, emits a receipt, and exits. It keeps no database, cache,\nscheduler, selected board, selected person, or previous-run state.\n\n```sh\nrun_root=\"$(mktemp -d)\"\nmkdir \"$run_root/output\"\n\nJIRA_HOST=\"$JIRA_HOST\" \\\nJIRA_EMAIL=\"$JIRA_EMAIL\" \\\nJIRA_API_TOKEN=\"$JIRA_API_TOKEN\" \\\nnode dist/cli/main.js \\\n  --jql-file /read-only-inputs/scope.jql \\\n  --template-dir /read-only-inputs/profile \\\n  --output-dir \"$run_root/output\" \\\n  --receipt \"$run_root/export-receipt.json\"\n```\n\nThe runner remains responsible for secret injection, scheduling, retries,\nretention, and publishing the output. See [Stateless server operation](docs/server-operation.md)\nfor the complete artifact-build, checksum, installation, execution, and\nverification playbook.\n\n## Read board configuration as a library\n\nBoth public entrypoints export `createJiraReadApi`. The caller supplies a Jira\nhost and an authenticated JSON GET transport; endpoint construction and\nnormalization stay inside the package. No native network fallback or cache is\nused by this API.\n\n```ts\nimport { createJiraReadApi } from '@doruksahin/jira-markdown-exporter/embedded';\n\nconst jira = createJiraReadApi({ host: jiraHost }, { jiraGet });\nconst layout = await jira.readBoardLayout(boardId);\n// layout: { id, name, columns: [{ name, statusIds }] }\n```\n\n`readBoardLayout` reads the board configuration and returns deeply frozen\n`JiraBoardLayout` data, preserving Jira's column order, names, status ID order,\nand columns with no statuses. The response must identify the requested board,\ncontain at least one named column, and use nonempty decimal string status IDs.\nMalformed data or repeated status IDs (within or across columns) reject with\n`JIRA_TRANSPORT_INVALID_RESPONSE`, operation `jira-board-layout`. Transport\nfailures retain bounded error codes and HTTP status, including permission\nfailures; response bodies are excluded.\n\nAll `JiraIssueRecord` reads retain `fields.status.id` as `statusId` alongside\nthe existing status name and category. A missing ID becomes an empty string.\nConsumers own issue selection, joining IDs to columns, unmapped-issue behavior,\nrefresh policy, and presentation. Board configuration is independent of\nMarkdown snapshot export and does not change its files or receipt.\n\n## Use an external output profile\n\nUse `--template-dir` when a consuming repository owns its Markdown layout:\n\n```sh\nJIRA_HOST=https://your-company.atlassian.net \\\nJIRA_EMAIL=you@example.com \\\nJIRA_API_TOKEN=your-api-token \\\nnode dist/cli/main.js \\\n  --issue-keys PROJ-123 \\\n  --output-dir /tmp/jira-export \\\n  --template-dir /absolute/path/to/profile \\\n  --json\n```\n\n`--profile` and `--template-dir` are mutually exclusive. A local profile is\ndata, not executable code: `profile.json` maps Liquid templates to Markdown\noutputs. See [Output profiles](docs/output-profiles.md) for the complete\nmanifest and template contract.\n\nFor the built-in profile, `PROJ-123` produces:\n\n```text\n/tmp/jira-export/PROJ-123/jira-snapshot/\n├── issue.md\n├── comments.md\n├── attachments.md\n└── metadata.md\n```\n\nThe writer stages and atomically replaces only\n`<output-dir>/<issue-key>/<ownedDirectory>`. Files beside that directory are\nnot owned or changed by the exporter. A successful repeat export is\nbyte-identical, and stale files inside the owned directory are removed.\n\n## Attachments\n\nWithout `--download-attachments`, templates receive attachment metadata but no\nbinary files are written. Add the flag to download binaries into the profile's\n`attachmentsDirectory`:\n\n```sh\nnode dist/cli/main.js \\\n  --issue-keys PROJ-123 \\\n  --output-dir /tmp/jira-export \\\n  --template-dir /absolute/path/to/profile \\\n  --download-attachments \\\n  --json\n```\n\nAttachment filenames are prefixed with the Jira attachment ID to prevent\ncollisions. Downloads are restricted to the configured Jira origin and the\nofficial Atlassian media origin. A failed attachment download becomes a\nbounded warning; it does not expose the remote content URL or credentials.\n\n## Receipt and exit status\n\nWith `--receipt /path/to/export-receipt.json`, the exporter atomically writes\nthe machine result. A completed export result conforms to\n[`schemas/export-receipt.schema.json`](schemas/export-receipt.schema.json) and\nincludes `exporterVersion`, `profileId`, and `profileDigest` so a downstream\nprocess can verify which executable and rendering profile produced the staged\nfiles. If validation fails before the profile is available, the file contains\na preflight error envelope without profile provenance; it is not a completed\nexport receipt.\n\nExisting callers can continue to send JSON to stdout with `--json`:\n\n```sh\nnode dist/cli/main.js \\\n  --issue-keys PROJ-123 \\\n  --output-dir /tmp/jira-export \\\n  --profile generic-v1 \\\n  --json > /tmp/jira-export-receipt.json\n```\n\n`--receipt` and `--json` are mutually exclusive. Without either option, stdout\ncontains human-readable status.\n\nA completed receipt records the schema version, exporter and profile\nprovenance, overall status, counts, output root, and one result per issue. A\nsynced issue includes its generated directory, counts, and attachment warnings.\nA failed issue includes an error string and may also include a structured\n`failure` object. Only the structured failure facts are allowlisted and\nbounded; filenames, warnings, and unclassified error strings can originate\nfrom Jira or the local runtime.\n\nLibrary consumers can validate unknown JSON with the same schemas used by the\nexporter instead of maintaining a second receipt or manifest decoder:\n\n```ts\nimport {\n  calculateOutputProfileDigest,\n  parseExportReceipt,\n  parseOutputProfileManifest,\n} from '@doruksahin/jira-markdown-exporter/embedded';\n\nconst manifest = parseOutputProfileManifest(JSON.parse(profileJson));\nconst profile = { manifest, templates };\nconst expectedDigest = await calculateOutputProfileDigest(profile);\nconst receipt = parseExportReceipt(JSON.parse(receiptJson));\n\nif (receipt.profileId !== manifest.id || receipt.profileDigest !== expectedDigest) {\n  throw new Error('Export receipt does not match the selected output profile');\n}\n```\n\nThe parse functions perform structural validation against the published JSON\nSchemas. Consumers remain responsible for cross-document policy such as the\nexpected exporter version, profile identity, digest, issue selection, and\nallowed publication destination. The digest helper validates the complete\nprofile and hashes its normalized manifest and template content using the same\nimplementation as the exporter.\n\nTreat the complete receipt as potentially sensitive operational output. Keep it\nin local or runner-temporary storage, do not publish it by default, and sanitize\nit before sharing. Credentials and attachment content URLs are not intentional\nreceipt fields, but callers must not rely on arbitrary error text being safe.\n\nExit statuses are:\n\n| Status | Meaning |\n| --- | --- |\n| `0` | Every selected issue was exported. |\n| `2` | Some issues were exported and some failed. Successful output remains available. |\n| `1` | Argument/configuration failure, or no selected issue was exported. |\n\nShells treat `2` as failure. A caller that intentionally accepts partial\nresults must capture the status, validate the receipt, and publish only entries\nwhose status is `synced`.\n\n## Safety and behavior guarantees\n\n- Jira access is GET-only; this package never creates, edits, comments on, or\n  transitions an issue.\n- Issue keys, profile paths, output paths, and profile symlinks are validated.\n- Templates cannot access Jira credentials or attachment content URLs.\n- Issues are written independently, so one failed issue does not roll back a\n  completed issue.\n- Generated Markdown has stable whitespace and one final newline.\n- Final human-readable results go to stdout when `--json` is not selected;\n  JSON mode emits the machine result instead. The CLI does not emit live progress.\n\n## Troubleshooting\n\n| Symptom | Check |\n| --- | --- |\n| `JIRA_HOST/JIRA_EMAIL/JIRA_API_TOKEN is required` | Export the named variable in the same process that launches the CLI. |\n| `Use exactly one of --issue-keys, --jql, or --jql-file` | Keep one selector and remove the others, or add the missing selector. |\n| `Unknown built-in output profile` | Use `generic-v1`, or pass an absolute `--template-dir`. |\n| `Could not load output profile` | Confirm `profile.json` exists and every referenced `.liquid` file is present. |\n| `unsafe ... path` | Remove absolute paths, empty segments, backslashes, or `..` from the profile. |\n| Exit `2` | Inspect the receipt's failed issue entries; successful issue directories are still valid. |\n| Attachment warning | Confirm the account can read the attachment and that the URL belongs to Jira or Atlassian Media. |\n\nRe-run the same command after fixing a transient failure. The owned snapshot\ndirectory is replaced atomically and deterministic output should produce no\ncontent change.\n\n## Development and release proof\n\nUse the [maintainer change map](docs/maintenance.md#change-map) to select the\nowning source and contract test. For documentation or architecture changes,\nrun the [architecture and link checks](docs/maintenance.md#verification).\n\nRun the complete check:\n\n```sh\npnpm check\n```\n\nBefore publishing a package candidate, also run:\n\n```sh\npnpm release:check\n```\n\n`release:check` typechecks, builds, runs all tests, and previews the exact npm\narchive. To create the versioned `.tgz` and `SHA256SUMS` without publishing:\n\n```sh\nartifact_dir=\"$(mktemp -d)/release\"\npnpm release:artifact \"$artifact_dir\"\n```\n\nRepeated unchanged builds are required to produce the same archive SHA-256.\nThe checksum identifies the package payload; it does not lock the transitive\nruntime dependencies that `npm install` resolves. A pinned source commit plus\n`pnpm-lock.yaml` and `pnpm install --frozen-lockfile` remains the reproducible\nbuild path. See [Stateless server operation](docs/server-operation.md) for the\nseparate, network-dependent installed-package smoke.\n\n## GitHub releases\n\nRelease Please owns version bumps, `CHANGELOG.md`, `vX.Y.Z` tags, and GitHub\nReleases. The release workflow builds and verifies one `.tgz`; that exact file\nis the payload for both the GitHub Release and npm publication. Changes reach a\nrelease through a normal Conventional Commit PR followed by the generated\n`chore(main): release X.Y.Z` PR; neither version files nor tags are created\nmanually.\n\nSee [the release playbook](https://github.com/doruksahin/jira-markdown-exporter/blob/main/docs/releasing.md)\nfor the exact merge, verification, artifact-download, checksum, installation,\nand recovery commands.\n\n## Development information\n\nIssue exports include linked branches and pull requests in the built-in issue\nnote. External profiles can use the [development template model](docs/output-profiles.md#template-model).\nBoth the Node and embedded exporter read the numeric issue ID, discover providers\nfrom Jira development summary, then fetch branch and pull-request details. All reads\nuse the configured Jira GET transport and existing authentication.\n\nThese are [internal Jira Cloud endpoints](https://jira.atlassian.com/browse/JSWCLOUD-16901),\nnot a stable public API. Missing permissions, malformed responses, or unavailable\nproviders produce bounded warnings and an explicit unavailable/partial state, while\nissue and comment export continues. A source branch reported on a PR remains on\nthat PR; no workflow stage or canonical working branch is inferred.\n","readmeFilename":"README.md"}