@releasekit/notes 0.2.0-next.9 → 0.2.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.
@@ -0,0 +1,231 @@
1
+ // ../core/dist/index.js
2
+ import chalk from "chalk";
3
+ var LOG_LEVELS = {
4
+ error: 0,
5
+ warn: 1,
6
+ info: 2,
7
+ debug: 3,
8
+ trace: 4
9
+ };
10
+ var PREFIXES = {
11
+ error: "[ERROR]",
12
+ warn: "[WARN]",
13
+ info: "[INFO]",
14
+ debug: "[DEBUG]",
15
+ trace: "[TRACE]"
16
+ };
17
+ var COLORS = {
18
+ error: chalk.red,
19
+ warn: chalk.yellow,
20
+ info: chalk.blue,
21
+ debug: chalk.gray,
22
+ trace: chalk.dim
23
+ };
24
+ var currentLevel = "info";
25
+ var quietMode = false;
26
+ function setLogLevel(level) {
27
+ currentLevel = level;
28
+ }
29
+ function setQuietMode(quiet) {
30
+ quietMode = quiet;
31
+ }
32
+ function shouldLog(level) {
33
+ if (quietMode && level !== "error") return false;
34
+ return LOG_LEVELS[level] <= LOG_LEVELS[currentLevel];
35
+ }
36
+ function log(message, level = "info") {
37
+ if (!shouldLog(level)) return;
38
+ const formatted = COLORS[level](`${PREFIXES[level]} ${message}`);
39
+ console.error(formatted);
40
+ }
41
+ function error(message) {
42
+ log(message, "error");
43
+ }
44
+ function warn(message) {
45
+ log(message, "warn");
46
+ }
47
+ function info(message) {
48
+ log(message, "info");
49
+ }
50
+ function success(message) {
51
+ if (!shouldLog("info")) return;
52
+ console.error(chalk.green(`[SUCCESS] ${message}`));
53
+ }
54
+ function debug(message) {
55
+ log(message, "debug");
56
+ }
57
+ var ReleaseKitError = class _ReleaseKitError extends Error {
58
+ constructor(message) {
59
+ super(message);
60
+ this.name = this.constructor.name;
61
+ }
62
+ logError() {
63
+ log(this.message, "error");
64
+ if (this.suggestions.length > 0) {
65
+ log("\nSuggested solutions:", "info");
66
+ for (const [i, suggestion] of this.suggestions.entries()) {
67
+ log(`${i + 1}. ${suggestion}`, "info");
68
+ }
69
+ }
70
+ }
71
+ static isReleaseKitError(error2) {
72
+ return error2 instanceof _ReleaseKitError;
73
+ }
74
+ };
75
+ var EXIT_CODES = {
76
+ SUCCESS: 0,
77
+ GENERAL_ERROR: 1,
78
+ CONFIG_ERROR: 2,
79
+ INPUT_ERROR: 3,
80
+ TEMPLATE_ERROR: 4,
81
+ LLM_ERROR: 5,
82
+ GITHUB_ERROR: 6,
83
+ GIT_ERROR: 7,
84
+ VERSION_ERROR: 8,
85
+ PUBLISH_ERROR: 9
86
+ };
87
+
88
+ // src/output/markdown.ts
89
+ import * as fs from "fs";
90
+ import * as path from "path";
91
+ var TYPE_ORDER = ["added", "changed", "deprecated", "removed", "fixed", "security"];
92
+ var TYPE_LABELS = {
93
+ added: "Added",
94
+ changed: "Changed",
95
+ deprecated: "Deprecated",
96
+ removed: "Removed",
97
+ fixed: "Fixed",
98
+ security: "Security"
99
+ };
100
+ function groupEntriesByType(entries) {
101
+ const grouped = /* @__PURE__ */ new Map();
102
+ for (const type of TYPE_ORDER) {
103
+ grouped.set(type, []);
104
+ }
105
+ for (const entry of entries) {
106
+ const existing = grouped.get(entry.type) ?? [];
107
+ existing.push(entry);
108
+ grouped.set(entry.type, existing);
109
+ }
110
+ return grouped;
111
+ }
112
+ function formatEntry(entry) {
113
+ let line;
114
+ if (entry.breaking && entry.scope) {
115
+ line = `- **BREAKING** **${entry.scope}**: ${entry.description}`;
116
+ } else if (entry.breaking) {
117
+ line = `- **BREAKING** ${entry.description}`;
118
+ } else if (entry.scope) {
119
+ line = `- **${entry.scope}**: ${entry.description}`;
120
+ } else {
121
+ line = `- ${entry.description}`;
122
+ }
123
+ if (entry.issueIds && entry.issueIds.length > 0) {
124
+ line += ` (${entry.issueIds.join(", ")})`;
125
+ }
126
+ return line;
127
+ }
128
+ function formatVersion(context, options) {
129
+ const lines = [];
130
+ const versionLabel = options?.includePackageName && context.packageName ? `${context.packageName}@${context.version}` : context.version;
131
+ const versionHeader = context.previousVersion ? `## [${versionLabel}]` : `## ${versionLabel}`;
132
+ lines.push(`${versionHeader} - ${context.date}`);
133
+ lines.push("");
134
+ if (context.compareUrl) {
135
+ lines.push(`[Full Changelog](${context.compareUrl})`);
136
+ lines.push("");
137
+ }
138
+ if (context.enhanced?.summary) {
139
+ lines.push(context.enhanced.summary);
140
+ lines.push("");
141
+ }
142
+ const grouped = groupEntriesByType(context.entries);
143
+ for (const [type, entries] of grouped) {
144
+ if (entries.length === 0) continue;
145
+ lines.push(`### ${TYPE_LABELS[type]}`);
146
+ for (const entry of entries) {
147
+ lines.push(formatEntry(entry));
148
+ }
149
+ lines.push("");
150
+ }
151
+ return lines.join("\n");
152
+ }
153
+ function formatHeader() {
154
+ return `# Changelog
155
+
156
+ All notable changes to this project will be documented in this file.
157
+
158
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
159
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
160
+
161
+ `;
162
+ }
163
+ function renderMarkdown(contexts, options) {
164
+ const sections = [formatHeader()];
165
+ for (const context of contexts) {
166
+ sections.push(formatVersion(context, options));
167
+ }
168
+ return sections.join("\n");
169
+ }
170
+ function prependVersion(existingPath, context, options) {
171
+ let existing = "";
172
+ if (fs.existsSync(existingPath)) {
173
+ existing = fs.readFileSync(existingPath, "utf-8");
174
+ const headerEnd = existing.indexOf("\n## ");
175
+ if (headerEnd >= 0) {
176
+ const header = existing.slice(0, headerEnd);
177
+ const body = existing.slice(headerEnd + 1);
178
+ const newVersion = formatVersion(context, options);
179
+ return `${header}
180
+
181
+ ${newVersion}
182
+ ${body}`;
183
+ }
184
+ }
185
+ return renderMarkdown([context]);
186
+ }
187
+ function writeMarkdown(outputPath, contexts, config, dryRun, options) {
188
+ const content = renderMarkdown(contexts, options);
189
+ const label = /changelog/i.test(outputPath) ? "Changelog" : "Release notes";
190
+ if (dryRun) {
191
+ info(`Would write ${label.toLowerCase()} to ${outputPath}`);
192
+ debug("--- Preview ---");
193
+ debug(content);
194
+ debug("--- End Preview ---");
195
+ return;
196
+ }
197
+ const dir = path.dirname(outputPath);
198
+ if (!fs.existsSync(dir)) {
199
+ fs.mkdirSync(dir, { recursive: true });
200
+ }
201
+ if (outputPath === "-") {
202
+ process.stdout.write(content);
203
+ return;
204
+ }
205
+ if (config.updateStrategy === "prepend" && fs.existsSync(outputPath) && contexts.length === 1) {
206
+ const firstContext = contexts[0];
207
+ if (firstContext) {
208
+ const updated = prependVersion(outputPath, firstContext, options);
209
+ fs.writeFileSync(outputPath, updated, "utf-8");
210
+ }
211
+ } else {
212
+ fs.writeFileSync(outputPath, content, "utf-8");
213
+ }
214
+ success(`${label} written to ${outputPath}`);
215
+ }
216
+
217
+ export {
218
+ setLogLevel,
219
+ setQuietMode,
220
+ error,
221
+ warn,
222
+ info,
223
+ success,
224
+ debug,
225
+ ReleaseKitError,
226
+ EXIT_CODES,
227
+ formatVersion,
228
+ renderMarkdown,
229
+ prependVersion,
230
+ writeMarkdown
231
+ };
package/dist/cli.d.ts CHANGED
@@ -1 +1,9 @@
1
1
  #!/usr/bin/env node
2
+ import './core/config.ts';
3
+ import './core/pipeline.ts';
4
+ import './core/types.ts';
5
+ import './errors/index.ts';
6
+ import './input/package-versioner.ts';
7
+ import './monorepo/aggregator.ts';
8
+ import './output/json.ts';
9
+ import './output/markdown.ts';
package/dist/cli.js CHANGED
@@ -1,22 +1,25 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- EXIT_CODES,
4
3
  NotesError,
5
- createTemplateContext,
6
- detectMonorepo,
7
4
  getDefaultConfig,
8
5
  getExitCode,
9
6
  loadConfig,
10
7
  parsePackageVersioner,
11
8
  runPipeline,
12
- saveAuth,
13
- writeMonorepoChangelogs
14
- } from "./chunk-BLWJTLRD.js";
9
+ saveAuth
10
+ } from "./chunk-IKER5VME.js";
11
+ import {
12
+ EXIT_CODES,
13
+ error,
14
+ info,
15
+ setLogLevel,
16
+ setQuietMode,
17
+ success
18
+ } from "./chunk-SAUES3BF.js";
15
19
 
16
20
  // src/cli.ts
17
21
  import * as fs from "fs";
18
22
  import * as readline from "readline";
19
- import { error, info, setLogLevel, setQuietMode, success } from "@releasekit/core";
20
23
  import { Command } from "commander";
21
24
  var program = new Command();
22
25
  program.name("releasekit-notes").description("Generate changelogs with LLM-powered enhancement and flexible templating").version("0.1.0");
@@ -82,29 +85,10 @@ program.command("generate", { isDefault: true }).description("Generate changelog
82
85
  }
83
86
  info(`Filtered to package: ${options.target}`);
84
87
  }
85
- if (options.monorepo || config.monorepo) {
86
- const monorepoMode = options.monorepo ?? config.monorepo?.mode ?? "both";
87
- const detected = detectMonorepo(process.cwd());
88
- if (!detected.isMonorepo) {
89
- info("No monorepo detected, using single package mode");
90
- await runPipeline(input, config, options.dryRun ?? false);
91
- } else {
92
- info(`Monorepo detected with packages at ${detected.packagesPath}`);
93
- const contexts = input.packages.map(createTemplateContext);
94
- writeMonorepoChangelogs(
95
- contexts,
96
- {
97
- rootPath: config.monorepo?.rootPath ?? process.cwd(),
98
- packagesPath: config.monorepo?.packagesPath ?? detected.packagesPath,
99
- mode: monorepoMode
100
- },
101
- config,
102
- options.dryRun ?? false
103
- );
104
- }
105
- } else {
106
- await runPipeline(input, config, options.dryRun ?? false);
88
+ if (options.monorepo) {
89
+ config.monorepo = { ...config.monorepo, mode: options.monorepo };
107
90
  }
91
+ await runPipeline(input, config, options.dryRun ?? false);
108
92
  if (options.dryRun) {
109
93
  info("Dry run complete - no files were written");
110
94
  } else {
package/dist/index.d.ts CHANGED
@@ -1,182 +1,8 @@
1
- import { NotesConfig } from '@releasekit/config';
2
- export { loadAuth, saveAuth } from '@releasekit/config';
3
- import { ReleaseKitError } from '@releasekit/core';
4
- export { EXIT_CODES } from '@releasekit/core';
5
-
6
- declare function loadConfig(projectDir?: string, configFile?: string): NotesConfig;
7
- declare function getDefaultConfig(): NotesConfig;
8
-
9
- interface RetryOptions {
10
- maxAttempts?: number;
11
- initialDelay?: number;
12
- maxDelay?: number;
13
- backoffFactor?: number;
14
- }
15
-
16
- type ChangelogType = 'added' | 'changed' | 'deprecated' | 'removed' | 'fixed' | 'security';
17
- interface ChangelogEntry {
18
- type: ChangelogType;
19
- description: string;
20
- issueIds?: string[];
21
- scope?: string;
22
- originalType?: string;
23
- breaking?: boolean;
24
- }
25
- interface PackageChangelog {
26
- packageName: string;
27
- version: string;
28
- previousVersion: string | null;
29
- revisionRange: string;
30
- repoUrl: string | null;
31
- date: string;
32
- entries: ChangelogEntry[];
33
- }
34
- type InputSource = 'package-versioner' | 'conventional-changelog' | 'git-log' | 'manual';
35
- interface ChangelogInput {
36
- source: InputSource;
37
- packages: PackageChangelog[];
38
- metadata?: {
39
- repoUrl?: string;
40
- defaultBranch?: string;
41
- };
42
- }
43
- interface EnhancedData {
44
- entries: ChangelogEntry[];
45
- summary?: string;
46
- categories?: Record<string, ChangelogEntry[]>;
47
- releaseNotes?: string;
48
- }
49
- interface TemplateContext {
50
- packageName: string;
51
- version: string;
52
- previousVersion: string | null;
53
- date: string;
54
- repoUrl: string | null;
55
- entries: ChangelogEntry[];
56
- compareUrl?: string;
57
- enhanced?: EnhancedData;
58
- }
59
- interface DocumentContext {
60
- project: {
61
- name: string;
62
- repoUrl?: string;
63
- };
64
- versions: TemplateContext[];
65
- unreleased?: TemplateContext;
66
- compareUrls?: Record<string, string>;
67
- }
68
- interface LLMOptions {
69
- timeout?: number;
70
- maxTokens?: number;
71
- temperature?: number;
72
- }
73
- interface LLMConfig {
74
- provider: string;
75
- model: string;
76
- baseURL?: string;
77
- apiKey?: string;
78
- options?: LLMOptions;
79
- concurrency?: number;
80
- retry?: RetryOptions;
81
- tasks?: {
82
- summarize?: boolean;
83
- enhance?: boolean;
84
- categorize?: boolean;
85
- releaseNotes?: boolean;
86
- };
87
- categories?: Array<{
88
- name: string;
89
- description: string;
90
- }>;
91
- style?: string;
92
- }
93
- type OutputFormat = 'markdown' | 'github-release' | 'json';
94
- interface OutputConfig {
95
- format: OutputFormat;
96
- file?: string;
97
- options?: Record<string, unknown>;
98
- }
99
- type MonorepoMode = 'root' | 'packages' | 'both';
100
- interface MonorepoConfig {
101
- mode?: MonorepoMode;
102
- rootPath?: string;
103
- packagesPath?: string;
104
- }
105
- type UpdateStrategy = 'prepend' | 'regenerate';
106
- type TemplateEngine = 'handlebars' | 'liquid' | 'ejs';
107
- interface TemplateConfig {
108
- path?: string;
109
- engine?: TemplateEngine;
110
- }
111
- interface Config {
112
- input?: {
113
- source?: string;
114
- file?: string;
115
- };
116
- output: OutputConfig[];
117
- monorepo?: MonorepoConfig;
118
- templates?: TemplateConfig;
119
- llm?: LLMConfig;
120
- updateStrategy?: UpdateStrategy;
121
- }
122
- interface CompleteOptions {
123
- maxTokens?: number;
124
- temperature?: number;
125
- timeout?: number;
126
- }
127
-
128
- declare function createTemplateContext(pkg: PackageChangelog): TemplateContext;
129
- declare function runPipeline(input: ChangelogInput, config: Config, dryRun: boolean): Promise<void>;
130
- declare function processInput(inputJson: string, config: Config, dryRun: boolean): Promise<void>;
131
-
132
- declare abstract class NotesError extends ReleaseKitError {
133
- }
134
-
135
- declare class InputParseError extends NotesError {
136
- readonly code = "INPUT_PARSE_ERROR";
137
- readonly suggestions: string[];
138
- }
139
- declare class TemplateError extends NotesError {
140
- readonly code = "TEMPLATE_ERROR";
141
- readonly suggestions: string[];
142
- }
143
- declare class LLMError extends NotesError {
144
- readonly code = "LLM_ERROR";
145
- readonly suggestions: string[];
146
- }
147
- declare class GitHubError extends NotesError {
148
- readonly code = "GITHUB_ERROR";
149
- readonly suggestions: string[];
150
- }
151
- declare class ConfigError extends NotesError {
152
- readonly code = "CONFIG_ERROR";
153
- readonly suggestions: string[];
154
- }
155
- declare function getExitCode(error: NotesError): number;
156
-
157
- declare function parsePackageVersioner(json: string): ChangelogInput;
158
- declare function parsePackageVersionerFile(filePath: string): ChangelogInput;
159
- declare function parsePackageVersionerStdin(): Promise<ChangelogInput>;
160
-
161
- interface MonorepoOptions {
162
- rootPath: string;
163
- packagesPath: string;
164
- mode: 'root' | 'packages' | 'both';
165
- }
166
- declare function aggregateToRoot(contexts: TemplateContext[]): TemplateContext;
167
-
168
- declare function writeMonorepoChangelogs(contexts: TemplateContext[], options: MonorepoOptions, config: {
169
- updateStrategy?: 'prepend' | 'regenerate';
170
- }, dryRun: boolean): void;
171
- declare function detectMonorepo(cwd: string): {
172
- isMonorepo: boolean;
173
- packagesPath: string;
174
- };
175
-
176
- declare function renderJson(contexts: TemplateContext[]): string;
177
- declare function writeJson(outputPath: string, contexts: TemplateContext[], dryRun: boolean): void;
178
-
179
- declare function renderMarkdown(contexts: TemplateContext[]): string;
180
- declare function writeMarkdown(outputPath: string, contexts: TemplateContext[], config: Config, dryRun: boolean): void;
181
-
182
- export { NotesError as ChangelogCreatorError, type ChangelogEntry, type ChangelogInput, type ChangelogType, type CompleteOptions, type Config, ConfigError, type DocumentContext, type EnhancedData, GitHubError, InputParseError, type InputSource, type LLMConfig, LLMError, type LLMOptions, type MonorepoConfig, type MonorepoMode, NotesError, type OutputConfig, type OutputFormat, type PackageChangelog, type RetryOptions, type TemplateConfig, type TemplateContext, type TemplateEngine, TemplateError, type UpdateStrategy, aggregateToRoot, createTemplateContext, detectMonorepo, getDefaultConfig, getExitCode, loadConfig, parsePackageVersioner, parsePackageVersionerFile, parsePackageVersionerStdin, processInput, renderJson, renderMarkdown, runPipeline, writeJson, writeMarkdown, writeMonorepoChangelogs };
1
+ export { getDefaultConfig, loadAuth, loadConfig, saveAuth } from './core/config.ts';
2
+ export { PipelineResult, createTemplateContext, processInput, runPipeline } from './core/pipeline.ts';
3
+ export * from './core/types.ts';
4
+ export * from './errors/index.ts';
5
+ export { parsePackageVersioner, parsePackageVersionerFile, parsePackageVersionerStdin } from './input/package-versioner.ts';
6
+ export { aggregateToRoot, detectMonorepo, writeMonorepoChangelogs } from './monorepo/aggregator.ts';
7
+ export { renderJson, writeJson } from './output/json.ts';
8
+ export { formatVersion, renderMarkdown, writeMarkdown } from './output/markdown.ts';
package/dist/index.js CHANGED
@@ -1,14 +1,11 @@
1
1
  import {
2
2
  ConfigError,
3
- EXIT_CODES,
4
3
  GitHubError,
5
4
  InputParseError,
6
5
  LLMError,
7
6
  NotesError,
8
7
  TemplateError,
9
- aggregateToRoot,
10
8
  createTemplateContext,
11
- detectMonorepo,
12
9
  getDefaultConfig,
13
10
  getExitCode,
14
11
  loadAuth,
@@ -18,13 +15,21 @@ import {
18
15
  parsePackageVersionerStdin,
19
16
  processInput,
20
17
  renderJson,
21
- renderMarkdown,
22
18
  runPipeline,
23
19
  saveAuth,
24
- writeJson,
25
- writeMarkdown,
20
+ writeJson
21
+ } from "./chunk-IKER5VME.js";
22
+ import {
23
+ aggregateToRoot,
24
+ detectMonorepo,
26
25
  writeMonorepoChangelogs
27
- } from "./chunk-BLWJTLRD.js";
26
+ } from "./chunk-ATNNRK62.js";
27
+ import {
28
+ EXIT_CODES,
29
+ formatVersion,
30
+ renderMarkdown,
31
+ writeMarkdown
32
+ } from "./chunk-SAUES3BF.js";
28
33
  export {
29
34
  NotesError as ChangelogCreatorError,
30
35
  ConfigError,
@@ -37,6 +42,7 @@ export {
37
42
  aggregateToRoot,
38
43
  createTemplateContext,
39
44
  detectMonorepo,
45
+ formatVersion,
40
46
  getDefaultConfig,
41
47
  getExitCode,
42
48
  loadAuth,
package/package.json CHANGED
@@ -1,9 +1,8 @@
1
1
  {
2
2
  "name": "@releasekit/notes",
3
- "version": "0.2.0-next.9",
4
- "description": "Changelog generation with LLM-powered enhancement and flexible templating",
3
+ "version": "0.2.1",
4
+ "description": "Release notes and changelog generation with LLM-powered enhancement and flexible templating",
5
5
  "type": "module",
6
- "main": "./dist/index.cjs",
7
6
  "module": "./dist/index.js",
8
7
  "types": "./dist/index.d.ts",
9
8
  "exports": {
@@ -11,27 +10,19 @@
11
10
  "import": {
12
11
  "types": "./dist/index.d.ts",
13
12
  "default": "./dist/index.js"
14
- },
15
- "require": {
16
- "types": "./dist/index.d.cts",
17
- "default": "./dist/index.cjs"
18
13
  }
19
14
  }
20
15
  },
21
16
  "bin": {
22
17
  "releasekit-notes": "dist/cli.js"
23
18
  },
24
- "scripts": {
25
- "build": "tsup src/index.ts src/cli.ts --format esm,cjs --dts",
26
- "dev": "tsup src/index.ts src/cli.ts --format esm,cjs --watch --dts",
27
- "clean": "rm -rf dist coverage .turbo",
28
- "test": "vitest run",
29
- "test:unit": "vitest run --coverage",
30
- "test:coverage": "vitest run --coverage",
31
- "lint": "biome check .",
32
- "typecheck": "tsc --noEmit"
33
- },
34
- "keywords": ["changelog", "release-notes", "llm", "template", "cli"],
19
+ "keywords": [
20
+ "changelog",
21
+ "release-notes",
22
+ "llm",
23
+ "template",
24
+ "cli"
25
+ ],
35
26
  "author": "Sam Maister <goosewobbler@protonmail.com>",
36
27
  "license": "MIT",
37
28
  "repository": {
@@ -39,33 +30,49 @@
39
30
  "url": "git+https://github.com/goosewobbler/releasekit.git",
40
31
  "directory": "packages/notes"
41
32
  },
42
- "files": ["dist", "templates", "README.md", "LICENSE"],
33
+ "files": [
34
+ "dist",
35
+ "templates",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
43
39
  "publishConfig": {
44
40
  "access": "public"
45
41
  },
46
42
  "dependencies": {
47
- "@anthropic-ai/sdk": "^0.39.0",
48
- "@octokit/rest": "^21.1.1",
49
- "@releasekit/config": "workspace:*",
50
- "@releasekit/core": "workspace:*",
51
- "chalk": "catalog:",
52
- "commander": "catalog:",
53
- "ejs": "^3.1.10",
43
+ "@anthropic-ai/sdk": "^0.78.0",
44
+ "@octokit/rest": "^22.0.1",
45
+ "chalk": "^5.6.2",
46
+ "commander": "^14.0.3",
47
+ "ejs": "^4.0.1",
54
48
  "handlebars": "^4.7.8",
55
- "liquidjs": "^10.21.0",
56
- "openai": "^4.87.0",
57
- "zod": "catalog:"
49
+ "liquidjs": "^10.25.0",
50
+ "openai": "^6.27.0",
51
+ "smol-toml": "^1.6.0",
52
+ "zod": "^4.3.6"
58
53
  },
59
54
  "devDependencies": {
60
- "@biomejs/biome": "catalog:",
55
+ "@biomejs/biome": "^2.4.6",
61
56
  "@types/ejs": "^3.1.5",
62
- "@types/node": "catalog:",
63
- "@vitest/coverage-v8": "catalog:",
64
- "tsup": "catalog:",
65
- "typescript": "catalog:",
66
- "vitest": "catalog:"
57
+ "@types/node": "^22.19.15",
58
+ "@vitest/coverage-v8": "^4.1.0",
59
+ "tsup": "^8.5.1",
60
+ "typescript": "^5.9.3",
61
+ "vitest": "^4.1.0",
62
+ "@releasekit/core": "0.0.0",
63
+ "@releasekit/config": "0.0.0"
67
64
  },
68
65
  "engines": {
69
66
  "node": ">=20"
67
+ },
68
+ "scripts": {
69
+ "build": "tsup",
70
+ "dev": "tsup --watch",
71
+ "clean": "rm -rf dist coverage .turbo",
72
+ "test": "vitest run",
73
+ "test:unit": "vitest run --coverage",
74
+ "test:coverage": "vitest run --coverage",
75
+ "lint": "biome check .",
76
+ "typecheck": "tsc --noEmit"
70
77
  }
71
- }
78
+ }