@icebreakers/changelog-github 0.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 ice breaker
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # @icebreakers/changelog-github
2
+
3
+ - [简体中文指南](./README.zh.md)
4
+
5
+ ## Overview
6
+
7
+ `@icebreakers/changelog-github` is a drop-in replacement for `@changesets/changelog-github` that keeps the familiar tuple signature while adding repo-aware formatting tweaks we rely on across Icebreaker workspaces. It renders richer metadata, supports custom summary hints, and boots with dotenv so local CLI runs behave the same as CI.
8
+
9
+ ## Requirements
10
+
11
+ - Node.js 18 or newer
12
+ - A GitHub token exposed via `GITHUB_TOKEN`, `GH_TOKEN`, or `.env`
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ pnpm add -D @changesets/cli @icebreakers/changelog-github
18
+ ```
19
+
20
+ ## Quick Start
21
+
22
+ Point the Changesets config at the Icebreaker formatter and declare your repository slug:
23
+
24
+ ```json
25
+ {
26
+ "changelog": [
27
+ "@icebreakers/changelog-github",
28
+ { "repo": "org/repo" }
29
+ ]
30
+ }
31
+ ```
32
+
33
+ Run `pnpm changeset` as usual—generated changelogs will now use the enhanced formatter.
34
+
35
+ ## Key Differences from `@changesets/changelog-github`
36
+
37
+ - **Summary tags** – recognises leading `pr:`, `commit:`, and `author:` / `user:` directives (case-insensitive) to override GitHub metadata while keeping the rest of the summary intact.
38
+ - **Short commit links** – when you supply a `commit:` tag, the formatter renders the shortened SHA as a hyperlink rather than just the full URL.
39
+ - **Release type callout** – appends a `> MAJOR release` style block for non-`none` releases so changelog readers can scan the impact quickly.
40
+ - **Dotenv bootstrapping** – automatically loads `.env` before hitting the GitHub API, matching local development to CI without extra wiring.
41
+ - **Dependency section** – lists dependency bumps with consistent Markdown indentation and links any backing commits for extra context.
42
+
43
+ All other behaviours (tuple arguments, required `repo` option, rendered layout) remain compatible with the upstream formatter, so migrating simply switches the package name.
44
+
45
+ ## Writing Changeset Summaries
46
+
47
+ Leverage the summary tags to control the metadata the formatter displays:
48
+
49
+ ```
50
+ pr: #42
51
+ commit: 1234567890abcdef1234567890abcdef12345678
52
+ author: @octocat
53
+
54
+ Add optional `tailwind-config` flag to the lint preset
55
+
56
+ - accepts a relative path to `tailwind.config.ts`
57
+ - falls back to the workspace root when unset
58
+ ```
59
+
60
+ The rendered changelog entry becomes:
61
+
62
+ ```
63
+ - Add optional `tailwind-config` flag to the lint preset (sonofmagic/dev-configs#42 · `1234567` · Thanks [@octocat](https://github.com/octocat)!)
64
+ - accepts a relative path to `tailwind.config.ts`
65
+ - falls back to the workspace root when unset
66
+ > MINOR release
67
+ ```
68
+
69
+ ## GitHub Authentication
70
+
71
+ Set `GITHUB_TOKEN` (or `GH_TOKEN`) with a token that can read public repo metadata. During local development you can store it in `.env`; the formatter calls `dotenv/config` automatically, so no extra setup is required.
72
+
73
+ ## Troubleshooting
74
+
75
+ - **Missing repo error** – ensure the tuple includes your `org/repo` string; the formatter throws early when it is absent.
76
+ - **Empty metadata** – verify the GitHub token is available to the process and that the commit/PR exists in the target repo.
77
+ - **Summary tags ignored** – tags must appear at the top of the summary, each on its own line, before the main description content.
package/README.zh.md ADDED
@@ -0,0 +1,75 @@
1
+ # @icebreakers/changelog-github
2
+
3
+ ## 概述
4
+
5
+ `@icebreakers/changelog-github` 是 `@changesets/changelog-github` 的无缝替代版本。它保留原有的元组写法,却额外提供了我们在 Icebreaker 团队常用的格式优化:支持摘要里的自定义指令、更友好的提交链接,并且自动加载 dotenv,确保本地与 CI 的输出一致。
6
+
7
+ ## 环境要求
8
+
9
+ - Node.js 18+
10
+ - 通过 `GITHUB_TOKEN`、`GH_TOKEN` 或 `.env` 暴露 GitHub Token
11
+
12
+ ## 安装
13
+
14
+ ```bash
15
+ pnpm add -D @changesets/cli @icebreakers/changelog-github
16
+ ```
17
+
18
+ ## 快速开始
19
+
20
+ 在 `.changeset/config.json` 中切换 changelog 生成器,并声明仓库地址:
21
+
22
+ ```json
23
+ {
24
+ "changelog": [
25
+ "@icebreakers/changelog-github",
26
+ { "repo": "org/repo" }
27
+ ]
28
+ }
29
+ ```
30
+
31
+ 之后执行 `pnpm changeset` 即可,生成的 changelog 会使用增强版格式器。
32
+
33
+ ## 与 `@changesets/changelog-github` 的差异
34
+
35
+ - **摘要指令**:额外识别位于摘要首部的 `pr:`、`commit:`、`author:` / `user:`(不区分大小写),用于覆盖 GitHub 拉取的元数据,同时保留正文内容。
36
+ - **短哈希链接**:当提供 `commit:` 指令时,会以短 SHA 生成链接,而不是仅展示完整 URL,阅读体验更好。
37
+ - **版本类型提示**:对非 `none` 版本自动附加 `> MAJOR release`、`> MINOR release` 等提示,方便读者快速掌握影响范围。
38
+ - **自动加载 dotenv**:在访问 GitHub API 前调用 `dotenv`,本地 CLI 与 CI 行为保持一致,无需额外手动引入。
39
+ - **依赖更新板块**:列出依赖升级时,会根据变更集补全提交链接,并统一 Markdown 缩进,便于对齐阅读。
40
+
41
+ 其它行为(元组参数、必须提供 `repo` 选项、基础排版)与上游保持兼容,因此迁移仅需替换包名。
42
+
43
+ ## 编写变更摘要的技巧
44
+
45
+ 可以借助摘要指令精准控制展示的元数据:
46
+
47
+ ```
48
+ pr: #42
49
+ commit: 1234567890abcdef1234567890abcdef12345678
50
+ author: @octocat
51
+
52
+ 为 lint preset 新增可选的 `tailwind-config` 配置项
53
+
54
+ - 接受相对路径指向 `tailwind.config.ts`
55
+ - 未设置时默认读取工作区根目录
56
+ ```
57
+
58
+ 最终 changelog 会渲染为:
59
+
60
+ ```
61
+ - 为 lint preset 新增可选的 `tailwind-config` 配置项 (sonofmagic/dev-configs#42 · `1234567` · Thanks [@octocat](https://github.com/octocat)!)
62
+ - 接受相对路径指向 `tailwind.config.ts`
63
+ - 未设置时默认读取工作区根目录
64
+ > MINOR release
65
+ ```
66
+
67
+ ## GitHub 鉴权
68
+
69
+ 设置具备读取公开仓库权限的 `GITHUB_TOKEN`(或 `GH_TOKEN`)。本地开发时可放在 `.env` 中;由于格式器会自动执行 `dotenv/config`,无需额外配置。
70
+
71
+ ## 常见问题
72
+
73
+ - **缺少 repo 报错**:确认元组里包含 `org/repo` 字符串,缺失时格式器会立即抛错。
74
+ - **元数据为空**:检查 GitHub Token 是否生效,以及提交 / PR 是否存在于对应仓库。
75
+ - **摘要指令未生效**:指令需要放在摘要最顶部,并且每行单独书写;正文内容必须位于指令之后。
package/dist/index.cjs ADDED
@@ -0,0 +1,170 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/index.ts
2
+ var _getgithubinfo = require('@changesets/get-github-info');
3
+ var _dotenv = require('dotenv');
4
+ _dotenv.config.call(void 0, );
5
+ var releaseTypeMap = {
6
+ major: { icon: "\u{1F680}", label: "Major" },
7
+ minor: { icon: "\u2728", label: "Minor" },
8
+ patch: { icon: "\u{1F41B}", label: "Patch" },
9
+ none: { icon: "\u{1F4DD}", label: "Update" }
10
+ };
11
+ function resolveReleaseType(type) {
12
+ if (type && type in releaseTypeMap) {
13
+ return type;
14
+ }
15
+ return "none";
16
+ }
17
+ function assertRepo(options) {
18
+ if (!options || !options.repo) {
19
+ throw new Error(
20
+ 'Please provide a repo to this changelog generator like this:\n"changelog": ["@icebreakers/changelog-github", { "repo": "org/repo" }]'
21
+ );
22
+ }
23
+ }
24
+ async function collectDependencyReferences(changesets, repo) {
25
+ const references = await Promise.all(
26
+ changesets.map(async (cs) => {
27
+ if (!cs.commit) {
28
+ return null;
29
+ }
30
+ const { links } = await _getgithubinfo.getInfo.call(void 0, {
31
+ repo,
32
+ commit: cs.commit
33
+ });
34
+ return links.commit;
35
+ })
36
+ );
37
+ return references.filter((link) => Boolean(link));
38
+ }
39
+ function formatDependencyLine(references, dependenciesUpdated) {
40
+ const dependencySummaries = dependenciesUpdated.map(
41
+ (dependency) => `\`${dependency.name}\` @ ${dependency.newVersion}`
42
+ );
43
+ const segments = [];
44
+ if (dependencySummaries.length > 0) {
45
+ segments.push(dependencySummaries.join(", "));
46
+ }
47
+ if (references.length > 0) {
48
+ segments.push(references.join(" \xB7 "));
49
+ }
50
+ const details = segments.join(" \xB7 ");
51
+ return details.length > 0 ? `- \u{1F4E6} Updated dependencies: ${details}` : "- \u{1F4E6} Updated dependencies";
52
+ }
53
+ function parseSummary(summary) {
54
+ let prNumber;
55
+ let commitRef;
56
+ const users = [];
57
+ const cleanedSummary = summary.replace(/^\s*(?:pr|pull|pull\s+request):\s*#?(\d+)/im, (_, pr) => {
58
+ const num = Number(pr);
59
+ if (!Number.isNaN(num)) {
60
+ prNumber = num;
61
+ }
62
+ return "";
63
+ }).replace(/^\s*commit:\s*(\S+)/im, (_, commit) => {
64
+ commitRef = commit;
65
+ return "";
66
+ }).replace(/^\s*(?:author|user):\s*@?(\S+)/gim, (_, user) => {
67
+ users.push(user);
68
+ return "";
69
+ }).trim();
70
+ const [headline = "", ...restLines] = cleanedSummary.split("\n").map((line) => line.trimRight());
71
+ const detailLines = restLines.map((line) => line.trim()).map((line) => line.replace(/^\s*[-*]\s*/, "")).filter((line) => line.length > 0);
72
+ return {
73
+ headline,
74
+ detailLines,
75
+ prNumber,
76
+ commitRef,
77
+ users
78
+ };
79
+ }
80
+ async function resolveLinks(repo, parsed, changesetCommit) {
81
+ if (parsed.prNumber !== void 0) {
82
+ const { links } = await _getgithubinfo.getInfoFromPullRequest.call(void 0, {
83
+ repo,
84
+ pull: parsed.prNumber
85
+ });
86
+ if (parsed.commitRef) {
87
+ const shortCommitId = parsed.commitRef.slice(0, 7);
88
+ links.commit = `[\`${shortCommitId}\`](https://github.com/${repo}/commit/${parsed.commitRef})`;
89
+ }
90
+ return links;
91
+ }
92
+ const commitToUse = _nullishCoalesce(parsed.commitRef, () => ( changesetCommit));
93
+ if (commitToUse) {
94
+ const { links } = await _getgithubinfo.getInfo.call(void 0, {
95
+ repo,
96
+ commit: commitToUse
97
+ });
98
+ return links;
99
+ }
100
+ return {
101
+ commit: null,
102
+ pull: null,
103
+ user: null
104
+ };
105
+ }
106
+ function buildUserMentions(users, fallbackUser) {
107
+ if (users.length > 0) {
108
+ return users.map((username) => `[@${username}](https://github.com/${username})`).join(", ");
109
+ }
110
+ return _nullishCoalesce(fallbackUser, () => ( ""));
111
+ }
112
+ var changelogFunctions = {
113
+ async getDependencyReleaseLine(changesets, dependenciesUpdated, options) {
114
+ assertRepo(options);
115
+ const { repo } = options;
116
+ if (dependenciesUpdated.length === 0) {
117
+ return "";
118
+ }
119
+ const references = await collectDependencyReferences(
120
+ changesets,
121
+ repo
122
+ );
123
+ return formatDependencyLine(references, dependenciesUpdated);
124
+ },
125
+ async getReleaseLine(changeset, type, options) {
126
+ assertRepo(options);
127
+ const { repo } = options;
128
+ const parsedSummary = parseSummary(changeset.summary);
129
+ const resolvedType = resolveReleaseType(type);
130
+ const links = await resolveLinks(
131
+ repo,
132
+ parsedSummary,
133
+ changeset.commit
134
+ );
135
+ const userMentions = buildUserMentions(
136
+ parsedSummary.users,
137
+ links.user
138
+ );
139
+ const headlineText = parsedSummary.headline || "Miscellaneous improvements";
140
+ const detailText = parsedSummary.detailLines.join(" \xB7 ");
141
+ const metaSegments = [];
142
+ if (links.pull) {
143
+ metaSegments.push(links.pull);
144
+ }
145
+ if (links.commit) {
146
+ metaSegments.push(links.commit);
147
+ }
148
+ if (userMentions) {
149
+ metaSegments.push(`Thanks ${userMentions}`);
150
+ }
151
+ if (resolvedType !== "none") {
152
+ metaSegments.push(`${releaseTypeMap[resolvedType].label} release`);
153
+ }
154
+ const trailingSegments = [
155
+ detailText,
156
+ metaSegments.join(" \xB7 ")
157
+ ].filter((segment) => segment.length > 0);
158
+ const suffix = trailingSegments.length ? ` \u2014 ${trailingSegments.join(" \xB7 ")}` : "";
159
+ return `
160
+
161
+ - ${releaseTypeMap[resolvedType].icon} **${headlineText}**${suffix}`;
162
+ }
163
+ };
164
+ var index_default = changelogFunctions;
165
+ var { getDependencyReleaseLine, getReleaseLine } = changelogFunctions;
166
+
167
+
168
+
169
+
170
+ exports.default = index_default; exports.getDependencyReleaseLine = getDependencyReleaseLine; exports.getReleaseLine = getReleaseLine;
@@ -0,0 +1,11 @@
1
+ import * as _changesets_types from '@changesets/types';
2
+ import { ChangelogFunctions } from '@changesets/types';
3
+
4
+ declare const changelogFunctions: ChangelogFunctions;
5
+
6
+ declare const getDependencyReleaseLine: _changesets_types.GetDependencyReleaseLine;
7
+ declare const getReleaseLine: _changesets_types.GetReleaseLine;
8
+
9
+ // @ts-ignore
10
+ export = changelogFunctions;
11
+ export { getDependencyReleaseLine, getReleaseLine };
@@ -0,0 +1,9 @@
1
+ import * as _changesets_types from '@changesets/types';
2
+ import { ChangelogFunctions } from '@changesets/types';
3
+
4
+ declare const changelogFunctions: ChangelogFunctions;
5
+
6
+ declare const getDependencyReleaseLine: _changesets_types.GetDependencyReleaseLine;
7
+ declare const getReleaseLine: _changesets_types.GetReleaseLine;
8
+
9
+ export { changelogFunctions as default, getDependencyReleaseLine, getReleaseLine };
package/dist/index.mjs ADDED
@@ -0,0 +1,170 @@
1
+ // src/index.ts
2
+ import { getInfo, getInfoFromPullRequest } from "@changesets/get-github-info";
3
+ import { config as loadEnv } from "dotenv";
4
+ loadEnv();
5
+ var releaseTypeMap = {
6
+ major: { icon: "\u{1F680}", label: "Major" },
7
+ minor: { icon: "\u2728", label: "Minor" },
8
+ patch: { icon: "\u{1F41B}", label: "Patch" },
9
+ none: { icon: "\u{1F4DD}", label: "Update" }
10
+ };
11
+ function resolveReleaseType(type) {
12
+ if (type && type in releaseTypeMap) {
13
+ return type;
14
+ }
15
+ return "none";
16
+ }
17
+ function assertRepo(options) {
18
+ if (!options || !options.repo) {
19
+ throw new Error(
20
+ 'Please provide a repo to this changelog generator like this:\n"changelog": ["@icebreakers/changelog-github", { "repo": "org/repo" }]'
21
+ );
22
+ }
23
+ }
24
+ async function collectDependencyReferences(changesets, repo) {
25
+ const references = await Promise.all(
26
+ changesets.map(async (cs) => {
27
+ if (!cs.commit) {
28
+ return null;
29
+ }
30
+ const { links } = await getInfo({
31
+ repo,
32
+ commit: cs.commit
33
+ });
34
+ return links.commit;
35
+ })
36
+ );
37
+ return references.filter((link) => Boolean(link));
38
+ }
39
+ function formatDependencyLine(references, dependenciesUpdated) {
40
+ const dependencySummaries = dependenciesUpdated.map(
41
+ (dependency) => `\`${dependency.name}\` @ ${dependency.newVersion}`
42
+ );
43
+ const segments = [];
44
+ if (dependencySummaries.length > 0) {
45
+ segments.push(dependencySummaries.join(", "));
46
+ }
47
+ if (references.length > 0) {
48
+ segments.push(references.join(" \xB7 "));
49
+ }
50
+ const details = segments.join(" \xB7 ");
51
+ return details.length > 0 ? `- \u{1F4E6} Updated dependencies: ${details}` : "- \u{1F4E6} Updated dependencies";
52
+ }
53
+ function parseSummary(summary) {
54
+ let prNumber;
55
+ let commitRef;
56
+ const users = [];
57
+ const cleanedSummary = summary.replace(/^\s*(?:pr|pull|pull\s+request):\s*#?(\d+)/im, (_, pr) => {
58
+ const num = Number(pr);
59
+ if (!Number.isNaN(num)) {
60
+ prNumber = num;
61
+ }
62
+ return "";
63
+ }).replace(/^\s*commit:\s*(\S+)/im, (_, commit) => {
64
+ commitRef = commit;
65
+ return "";
66
+ }).replace(/^\s*(?:author|user):\s*@?(\S+)/gim, (_, user) => {
67
+ users.push(user);
68
+ return "";
69
+ }).trim();
70
+ const [headline = "", ...restLines] = cleanedSummary.split("\n").map((line) => line.trimRight());
71
+ const detailLines = restLines.map((line) => line.trim()).map((line) => line.replace(/^\s*[-*]\s*/, "")).filter((line) => line.length > 0);
72
+ return {
73
+ headline,
74
+ detailLines,
75
+ prNumber,
76
+ commitRef,
77
+ users
78
+ };
79
+ }
80
+ async function resolveLinks(repo, parsed, changesetCommit) {
81
+ if (parsed.prNumber !== void 0) {
82
+ const { links } = await getInfoFromPullRequest({
83
+ repo,
84
+ pull: parsed.prNumber
85
+ });
86
+ if (parsed.commitRef) {
87
+ const shortCommitId = parsed.commitRef.slice(0, 7);
88
+ links.commit = `[\`${shortCommitId}\`](https://github.com/${repo}/commit/${parsed.commitRef})`;
89
+ }
90
+ return links;
91
+ }
92
+ const commitToUse = parsed.commitRef ?? changesetCommit;
93
+ if (commitToUse) {
94
+ const { links } = await getInfo({
95
+ repo,
96
+ commit: commitToUse
97
+ });
98
+ return links;
99
+ }
100
+ return {
101
+ commit: null,
102
+ pull: null,
103
+ user: null
104
+ };
105
+ }
106
+ function buildUserMentions(users, fallbackUser) {
107
+ if (users.length > 0) {
108
+ return users.map((username) => `[@${username}](https://github.com/${username})`).join(", ");
109
+ }
110
+ return fallbackUser ?? "";
111
+ }
112
+ var changelogFunctions = {
113
+ async getDependencyReleaseLine(changesets, dependenciesUpdated, options) {
114
+ assertRepo(options);
115
+ const { repo } = options;
116
+ if (dependenciesUpdated.length === 0) {
117
+ return "";
118
+ }
119
+ const references = await collectDependencyReferences(
120
+ changesets,
121
+ repo
122
+ );
123
+ return formatDependencyLine(references, dependenciesUpdated);
124
+ },
125
+ async getReleaseLine(changeset, type, options) {
126
+ assertRepo(options);
127
+ const { repo } = options;
128
+ const parsedSummary = parseSummary(changeset.summary);
129
+ const resolvedType = resolveReleaseType(type);
130
+ const links = await resolveLinks(
131
+ repo,
132
+ parsedSummary,
133
+ changeset.commit
134
+ );
135
+ const userMentions = buildUserMentions(
136
+ parsedSummary.users,
137
+ links.user
138
+ );
139
+ const headlineText = parsedSummary.headline || "Miscellaneous improvements";
140
+ const detailText = parsedSummary.detailLines.join(" \xB7 ");
141
+ const metaSegments = [];
142
+ if (links.pull) {
143
+ metaSegments.push(links.pull);
144
+ }
145
+ if (links.commit) {
146
+ metaSegments.push(links.commit);
147
+ }
148
+ if (userMentions) {
149
+ metaSegments.push(`Thanks ${userMentions}`);
150
+ }
151
+ if (resolvedType !== "none") {
152
+ metaSegments.push(`${releaseTypeMap[resolvedType].label} release`);
153
+ }
154
+ const trailingSegments = [
155
+ detailText,
156
+ metaSegments.join(" \xB7 ")
157
+ ].filter((segment) => segment.length > 0);
158
+ const suffix = trailingSegments.length ? ` \u2014 ${trailingSegments.join(" \xB7 ")}` : "";
159
+ return `
160
+
161
+ - ${releaseTypeMap[resolvedType].icon} **${headlineText}**${suffix}`;
162
+ }
163
+ };
164
+ var index_default = changelogFunctions;
165
+ var { getDependencyReleaseLine, getReleaseLine } = changelogFunctions;
166
+ export {
167
+ index_default as default,
168
+ getDependencyReleaseLine,
169
+ getReleaseLine
170
+ };
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@icebreakers/changelog-github",
3
+ "type": "module",
4
+ "version": "0.0.1",
5
+ "description": "Changesets GitHub changelog formatter for Icebreaker's dev-configs",
6
+ "author": "ice breaker <1324318532@qq.com>",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/sonofmagic/dev-configs.git",
11
+ "directory": "packages/changelog-github"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/sonofmagic/dev-configs/issues"
15
+ },
16
+ "keywords": [
17
+ "changesets",
18
+ "changelog",
19
+ "dev-configs",
20
+ "icebreakers"
21
+ ],
22
+ "sideEffects": false,
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.mjs",
27
+ "require": "./dist/index.cjs"
28
+ }
29
+ },
30
+ "main": "./dist/index.cjs",
31
+ "module": "./dist/index.mjs",
32
+ "types": "./dist/index.d.ts",
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "dependencies": {
37
+ "@changesets/get-github-info": "^0.6.0",
38
+ "@changesets/types": "^6.1.0",
39
+ "dotenv": "^17.2.3"
40
+ },
41
+ "devDependencies": {
42
+ "@changesets/parse": "^0.4.1"
43
+ },
44
+ "scripts": {
45
+ "stub": "unbuild --stub",
46
+ "dev": "tsup --watch --sourcemap",
47
+ "build": "tsup",
48
+ "test": "vitest run",
49
+ "test:dev": "vitest",
50
+ "release": "pnpm publish",
51
+ "lint": "eslint .",
52
+ "lint:fix": "eslint . --fix"
53
+ }
54
+ }