{"id":51673929,"url":"https://github.com/nazmussayad/release-note","last_synced_at":"2026-07-15T03:02:57.637Z","repository":{"id":362478687,"uuid":"1259278436","full_name":"NazmusSayad/release-note","owner":"NazmusSayad","description":"AI-powered CLI that generates release notes between two git tags, with flexible config and output to file or stdout.","archived":false,"fork":false,"pushed_at":"2026-06-13T10:17:56.000Z","size":200,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-13T12:16:19.338Z","etag":null,"topics":["ai","automation","changelog","cli","developer-tools","git","npm","openai","release-notes","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NazmusSayad.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-04T10:56:34.000Z","updated_at":"2026-06-13T10:17:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/NazmusSayad/release-note","commit_stats":null,"previous_names":["nazmussayad/release-note"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/NazmusSayad/release-note","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NazmusSayad%2Frelease-note","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NazmusSayad%2Frelease-note/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NazmusSayad%2Frelease-note/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NazmusSayad%2Frelease-note/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NazmusSayad","download_url":"https://codeload.github.com/NazmusSayad/release-note/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NazmusSayad%2Frelease-note/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35488230,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-15T02:00:06.706Z","response_time":131,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","automation","changelog","cli","developer-tools","git","npm","openai","release-notes","typescript"],"created_at":"2026-07-15T03:02:56.873Z","updated_at":"2026-07-15T03:02:57.632Z","avatar_url":"https://github.com/NazmusSayad.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# release-note\n\nAI-powered release note generator. Point it at a git repository and it automatically drafts user-facing release notes for you — no more writing them by hand.\n\nWorks as a CLI or a programmatic library.\n\n## Installation\n\n```bash\npnpm add release-note\n# or\nnpm install release-note\n# or\nyarn add release-note\n```\n\nDepending on which LLM provider you use, you may need to install an additional package. For example, if you use OpenRouter:\n\n```bash\npnpm add @openrouter/ai-sdk-provider\n```\n\nOther providers each have a corresponding `@ai-sdk/*` package. See the configuration section below for the full list.\n\n## Quick start\n\n1. Create a `release-note.json` in your project root:\n\n   ```json\n   {\n     \"model\": \"gpt-4o\",\n     \"provider\": \"@ai-sdk/openai\",\n     \"apiKeyEnv\": \"OPENAI_API_KEY\",\n     \"match\": { \"tag\": \"v.*\" }\n   }\n   ```\n\n2. Set your API key as an environment variable (`OPENAI_API_KEY` in this example).\n\n3. Run:\n\n   ```bash\n   release-note generate\n   ```\n\nThe tool finds the latest two tags matching `v.*`, collects all commits between them, and generates a release note to stdout.\n\n## CLI\n\n```bash\nrelease-note generate [options]\n```\n\n| Flag        | Description                                       |\n| ----------- | ------------------------------------------------- |\n| `--cwd`     | Working directory (defaults to current directory) |\n| `--config`  | Path to a config file                             |\n| `--outFile` | Write the result to a file instead of stdout      |\n\n```bash\n# Save to a file\nrelease-note generate --outFile RELEASE_NOTES.md\n\n# Use a specific config file\nrelease-note generate --config ./configs/release.json\n```\n\n## Configuration\n\nPlace a `release-note.json` or `release-note.jsonc` file in your project root (or in `.github/`). JSONC allows comments and trailing commas. Use `--config \u003cpath\u003e` to use a different file.\n\n### Schema\n\n| Field       | Required | Description                                                  |\n| ----------- | -------- | ------------------------------------------------------------ |\n| `model`     | Yes      | Model identifier (e.g. `gpt-4o`, `claude-sonnet-4-20250514`) |\n| `provider`  | No       | Provider package (default: `@ai-sdk/openai-compatible`)      |\n| `apiKeyEnv` | No       | Environment variable name holding the API key                |\n| `apiUrl`    | No       | Base URL (required for `@ai-sdk/openai-compatible`)          |\n| `match`     | No       | Commit range to scan (default: `{ \"tag\": \".*\" }`)            |\n| `steps`     | No       | Cap on LLM reasoning steps (auto-calculated if omitted)      |\n| `headers`   | No       | Extra HTTP headers for the provider                          |\n| `options`   | No       | Extra options passed to the provider factory                 |\n\n**Supported providers:** `@ai-sdk/openai`, `@ai-sdk/openai-compatible`, `@ai-sdk/anthropic`, `@ai-sdk/google`, `@ai-sdk/xai`, `@ai-sdk/azure`, `@ai-sdk/amazon-bedrock`, `@ai-sdk/groq`, `@ai-sdk/mistral`, `@ai-sdk/deepseek`, `@ai-sdk/cohere`, `@ai-sdk/fireworks`, `@ai-sdk/perplexity`, `@ai-sdk/togetherai`, `@ai-sdk/deepinfra`, `@ai-sdk/cerebras`, `@ai-sdk/fal`, `@ai-sdk/luma`, `@ai-sdk/baseten`, `@ai-sdk/google-vertex`, `@openrouter/ai-sdk-provider`\n\n### Examples\n\n**OpenRouter:**\n\n```json\n{\n  \"model\": \"nvidia/nemotron-3-ultra-550b-a55b:free\",\n  \"provider\": \"@openrouter/ai-sdk-provider\",\n  \"apiKeyEnv\": \"OPENROUTER_API_KEY\",\n  \"match\": { \"tag\": \"v.*\" }\n}\n```\n\n**Local model (LM Studio, vLLM, etc.):**\n\n```json\n{\n  \"model\": \"local-model\",\n  \"provider\": \"@ai-sdk/openai-compatible\",\n  \"apiUrl\": \"http://localhost:1234/v1\",\n  \"apiKeyEnv\": \"LLM_API_KEY\"\n}\n```\n\n**Single commit:**\n\n```json\n{\n  \"model\": \"gpt-4o\",\n  \"provider\": \"@ai-sdk/openai\",\n  \"apiKeyEnv\": \"OPENAI_API_KEY\",\n  \"match\": { \"commit\": \"HEAD\" }\n}\n```\n\n\u003e With `match.tag`, the most recent matching tag is the upper bound and the next-most-recent is the lower bound. With `match.commit`, only that single commit is covered.\n\n## Programmatic API\n\n```ts\nimport releaseNote from 'release-note'\n\nconst { note, commits, provider } = await releaseNote(process.cwd(), {\n  model: 'gpt-4o',\n  provider: '@ai-sdk/openai',\n  apiKeyEnv: 'OPENAI_API_KEY',\n  match: { tag: 'v.*' },\n})\n\nconsole.log(note)\n```\n\nThe default export and the named `releaseNote` export are both available:\n\n```ts\nimport { releaseNote } from 'release-note'\n```\n\n### Return value\n\n| Field      | Type              | Description                           |\n| ---------- | ----------------- | ------------------------------------- |\n| `note`     | `string`          | The generated release note text       |\n| `commits`  | `GitCommitInfo[]` | The commits included in the range     |\n| `provider` | `object`          | Raw provider response and token usage |\n\n**`GitCommitInfo`:**\n\n```ts\ntype GitCommitInfo = {\n  hash: string\n  date: string\n  message: string\n  author_name: string\n  author_email: string\n}\n```\n\n## Output style\n\nGenerated release notes are written for end users and product managers, not engineers:\n\n- **Grouped by category** — New Features, Bug Fixes, Improvements, Breaking Changes\n- **No internal identifiers** — file paths, class names, function names, env keys are filtered out\n- **No trivial changes** — formatting-only commits, refactors, and dependency bumps with no user impact are skipped\n- **Clean markdown** — section headings via `##`, no top-level title wrapping\n\n## Requirements\n\n- Node.js 18+\n- A git repository\n- An API key for your chosen LLM provider\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnazmussayad%2Frelease-note","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnazmussayad%2Frelease-note","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnazmussayad%2Frelease-note/lists"}