Creating Changesets (LLM Guide)
This guide is specifically for LLMs (like Claude Code) to help generate changesets for the Denji project.
When to Create a Changeset
Create a changeset for user-facing changes:
- •✅ New features
- •✅ Bug fixes
- •✅ Breaking changes
- •✅ Performance improvements
- •✅ User-facing documentation changes
- •❌ Internal refactoring (no user impact)
- •❌ Test-only changes
- •❌ CI/CD configuration
How to Create a Changeset (Manual Method)
Since bun changeset is an interactive CLI tool (not suitable for LLMs), create changeset files manually:
File Location
Create a new file in .changeset/ directory with a descriptive kebab-case name:
code
.changeset/add-forward-ref-option.md .changeset/fix-icon-name-collision.md .changeset/breaking-change-config-schema.md
File Format
markdown
--- "denji": <change-type> --- <Short summary (one line)> <Detailed description with examples and migration guides if needed>
Change Types (Semantic Versioning)
- •
patch- Bug fixes, minor improvements, no API changes- •Version bump:
0.2.0→0.2.1 - •Example: "Fix icon name sanitization for special characters"
- •Version bump:
- •
minor- New features, backward-compatible additions- •Version bump:
0.2.0→0.3.0 - •Example: "Add forwardRef option for React components"
- •Version bump:
- •
major- Breaking changes, API removals/changes- •Version bump:
0.2.0→1.0.0 - •Example: "Remove support for Node.js 14"
- •Version bump:
Changeset Template
For Minor Changes (New Features)
markdown
---
"denji": minor
---
Add `featureName` option
This release introduces a new `featureName` configuration option that allows users to [describe benefit].
**New Configuration:**
- `config.featureName` - [description] (defaults to `[value]`)
- CLI flags: `--feature-name` / `--no-feature-name` for `init` command
**Example:**
\`\`\`json
{
"framework": "react",
"featureName": true
}
\`\`\`
**Usage:**
\`\`\`tsx
// Example code showing the feature in action
\`\`\`
For Patch Changes (Bug Fixes)
markdown
--- "denji": patch --- Fix [specific issue description] Resolves an issue where [describe the bug]. The [component/feature] now correctly [describe fix]. **Before:** \`\`\`tsx // Code showing the bug \`\`\` **After:** \`\`\`tsx // Code showing the fix \`\`\` Fixes #[issue-number] (if applicable)
For Major Changes (Breaking Changes)
markdown
--- "denji": major --- BREAKING: [Change description] This is a breaking change that [explain what changed and why]. **Migration Guide:** **Before:** \`\`\`tsx // Old API usage \`\`\` **After:** \`\`\`tsx // New API usage \`\`\` **Breaking Changes:** - [List each breaking change] - [Explain how to migrate] **Rationale:** [Explain why this breaking change was necessary]
Real-World Examples
Example 1: New Feature (forwardRef)
markdown
---
"denji": minor
---
Add `forwardRef` option for React icon components
This release adds a new `forwardRef` configuration option for React projects that wraps icon components with `React.forwardRef`, enabling ref forwarding to the underlying SVG element.
**New Configuration Options:**
- `react.forwardRef` - Boolean option to enable forwardRef wrapping (defaults to `false`)
- CLI flags: `--forward-ref` / `--no-forward-ref` for the `init` command
**Changes:**
- Enhanced config schema with framework-specific options using discriminated unions
- Added interactive prompt during `denji init` for React projects
- Updated TypeScript types to reflect `ForwardRefExoticComponent` when enabled
- Framework-agnostic architecture that supports future framework-specific options
**Example Configuration:**
\`\`\`json
{
"framework": "react",
"output": "./src/icons.tsx",
"react": {
"forwardRef": true
}
}
\`\`\`
**Usage:**
\`\`\`tsx
import { useRef } from "react";
import { Icons } from "./icons";
function App() {
const iconRef = useRef<SVGSVGElement>(null);
return <Icons.Check ref={iconRef} className="size-4" />;
}
\`\`\`
Example 2: Bug Fix
markdown
--- "denji": patch --- Fix icon name collision when adding icons with same base name Resolves an issue where adding icons like `lucide:check` and `mdi:check` would overwrite each other. Icon names now include the collection prefix to prevent collisions. **Before:** Both icons would be named `Check`, causing the second to override the first. **After:** Icons are named `LucideCheck` and `MdiCheck` respectively. Fixes #42
Example 3: Performance Improvement
markdown
--- "denji": patch --- Improve icon generation performance by 40% Optimized SVG parsing and template generation to significantly reduce build times for projects with many icons. Large icon sets (100+ icons) now generate ~40% faster. **Technical Details:** - Parallelized icon fetching from Iconify API - Cached parsed SVG structures - Reduced redundant file system operations
Best Practices for LLMs
- •Always analyze git diff to understand the full scope of changes
- •Choose the correct semver type:
- •Breaking change? →
major - •New feature? →
minor - •Bug fix or small improvement? →
patch
- •Breaking change? →
- •Write user-focused descriptions (avoid implementation details unless relevant)
- •Include code examples when changes affect API usage
- •Use descriptive filenames that match the change (e.g.,
add-forward-ref-option.md) - •Format code blocks properly using triple backticks with language hints
- •Reference issues/PRs when applicable using
Fixes #123orCloses #456
What NOT to Include
- •Internal refactoring details (unless user-facing)
- •Test implementation specifics
- •Build system changes
- •Development tooling updates
- •Overly technical jargon
Publishing
DO NOT include bun changeset publish commands or instructions. Publishing is automated via GitHub Actions when changes are pushed to main.
The workflow:
- •LLM creates changeset file →
.changeset/feature-name.md - •User commits and pushes to main
- •GitHub Actions automatically versions and publishes
Validation Checklist
Before creating a changeset, verify:
- • File is in
.changeset/directory - • Filename is descriptive and kebab-case
- • YAML frontmatter is correct:
"denji": minor - • Summary is clear and user-focused
- • Code examples are properly formatted
- • Semver type matches the change scope
- • No implementation details that don't affect users