prsmith 1.0.2 → 2.0.0

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/CHANGELOG.md CHANGED
@@ -2,9 +2,51 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [2.0.0] - 2026-06-01
6
+
7
+ ### Added
8
+
9
+ - **GitHub Integration**: Direct comment posting to PRs and full integrated Review Submission support, featuring auto-detection of repository details from local Git configs.
10
+ - **AI "Rude-to-Polite" Polish**: A unified client supporting Gemini, OpenAI, and Groq over lightweight native HTTP requests, translating harsh or blunt feedback into constructive and polite reviews.
11
+ - **Interactive Batch Review Mode (`prsmith batch`)**: Loop through multiple issues in a single terminal session, compile them into a unified report, and optionally post them as separate native inline review comments on GitHub.
12
+ - **File & Line Context**: Link your comments directly to code files and line numbers, generating clickable GitHub deep links when repo details are available.
13
+ - **Before & After Code Snippets**: Show differences between original and proposed code structures in collapsible `<details>` blocks with syntax highlighting.
14
+
15
+ ## [1.1.0] - 2026-06-01
16
+
17
+ ### Added
18
+
19
+ - **Clipboard Integration**: Automatically copies the generated markdown to your clipboard (`clipboardy`).
20
+ - **Editor Prompts**: The `issue` and `fix` interactive prompts now intelligently launch your default system `$EDITOR` (e.g. VS Code, vim) for a seamless multi-line typing experience.
21
+ - **CLI Arguments**: You can completely bypass the interactive mode by supplying flags: `-s`, `-t`, `-i`, `-f`.
22
+ - **File Output**: Use the `-o` or `--out` flag to directly write the markdown to a file (e.g. `prsmith --out comment.md`).
23
+ - **Update Notifier**: The CLI now checks for updates in the background and notifies you if a newer version is available on NPM.
24
+ - **Custom Configs**: Support for `.prsmith.json` files in your home directory (`~/`) or project directory. Define your own custom severities and intro templates!
25
+
26
+ ## [1.0.2] - 2026-05-31
27
+
28
+ ### Added
29
+
30
+ - Integrated `commander` to provide robust native support for CLI flags (`-h`, `--help`, `-v`, `--version`).
31
+ - Graceful termination handling: Intercepting `ExitPromptError` to display a friendly message when users abort the interactive prompt (e.g., via `Ctrl+C`) instead of throwing stack traces.
32
+ - Custom author branding and detailed bio added to the README footer.
33
+
34
+ ## [1.0.1] - 2026-05-31
35
+
36
+ ### Fixed
37
+
38
+ - Re-configured Git Hooks (Husky) to ensure `npm test` and `npm run lint` run reliably on pre-commit.
39
+ - Resolved invalid path structures in `package.json` for the executable `bin` field.
40
+ - Fixed a bug in `inquirer` by migrating legacy `"list"` prompt types to `"select"` to prevent CLI crashes.
41
+
42
+ ### Changed
43
+
44
+ - Massively overhauled `README.md` for NPM compatibility: Replaced unsupported Mermaid diagrams with elegant ASCII flowcharts, incorporated GitHub/NPM badges, and structured sections with collapsible `<details>` HTML tags for premium rendering on the NPM website.
45
+
5
46
  ## [1.0.0] - 2026-05-31
6
47
 
7
48
  ### Added
49
+
8
50
  - Interactive CLI prompts to generate PR review comments.
9
51
  - Formatter to generate markdown based on severity, title, issue, and fix.
10
52
  - Initial setup for linting, testing, and CI.
package/README.md CHANGED
@@ -5,16 +5,16 @@
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](https://opensource.org/licenses/MIT)
6
6
  [![CI](https://img.shields.io/github/actions/workflow/status/TarunyaProgrammer/PRSmith_NPMPackage/ci.yml?branch=main&style=flat-square)](https://github.com/TarunyaProgrammer/PRSmith_NPMPackage/actions)
7
7
 
8
- <p><b>Forge professional pull request review comments directly from the terminal.</b></p>
8
+ <p><b>Forge professional pull request review comments and submit integrated reviews directly from the terminal.</b></p>
9
9
  </div>
10
10
 
11
11
  ---
12
12
 
13
- PRSmith streamlines the process of writing code reviews by providing an interactive prompt that generates consistently formatted, polite, and actionable Markdown comments.
13
+ PRSmith streamlines the process of writing code reviews by providing an interactive prompt that generates consistently formatted, polite, and actionable Markdown comments. With **v2.0.0**, PRSmith evolves into an **intelligent, automated, production-grade Code Review suite** featuring AI-powered tone polishing, direct GitHub integrations, file context, and batch review loops.
14
14
 
15
15
  ## Architecture Flow
16
16
 
17
- The tool operates via a straightforward interactive flow, generating structured markdown from your inputs.
17
+ The tool operates via a straightforward interactive flow, generating structured markdown from your inputs and supporting remote integrations.
18
18
 
19
19
  ```text
20
20
  ┌──────────────────────────┐
@@ -23,7 +23,12 @@ The tool operates via a straightforward interactive flow, generating structured
23
23
 
24
24
  ┌──────────────────────────┐
25
25
  │ Interactive Prompts │
26
- │ (Severity, Title, Issue)
26
+ │ (File, Snippets, Issue)
27
+ └────────────┬─────────────┘
28
+
29
+ ┌──────────────────────────┐
30
+ │ AI Polish (Optional) │
31
+ │ (Gemini, OpenAI, Groq) │
27
32
  └────────────┬─────────────┘
28
33
 
29
34
  ┌──────────────────────────┐
@@ -31,7 +36,8 @@ The tool operates via a straightforward interactive flow, generating structured
31
36
  └────────────┬─────────────┘
32
37
 
33
38
  ┌──────────────────────────┐
34
- Print Formatted Comment
39
+ Export / Direct Post
40
+ │ (GitHub, Clipboard, File)│
35
41
  └──────────────────────────┘
36
42
  ```
37
43
 
@@ -45,61 +51,158 @@ Install globally to use it anywhere on your machine.
45
51
  npm install -g prsmith
46
52
  ```
47
53
 
48
- ## Features
54
+ ---
55
+
56
+ ## ⚡ Key Features (v2.0.0)
57
+
58
+ PRSmith has been completely overhauled with a set of powerful new features:
59
+
60
+ 1. **🚀 GitHub Integration (PR Comments & Reviews)**:
61
+ - Post your generated review comment directly to a Pull Request as an issue comment, or as a native GitHub code review.
62
+ - **Zero-Config Repo Auto-Detection**: Auto-detects the repository owner and name from your local `.git/config` remotes.
63
+ 2. **✨ AI "Rude-to-Polite" Polish**:
64
+ - Polishes blunt or harsh descriptions into constructive, professional, and empathetic reviews.
65
+ - Built-in support for **Gemini** (default), **OpenAI**, and **Groq** via lightweight native HTTP requests.
66
+ 3. **📁 File & Line Number Context**:
67
+ - Link your feedback directly to code files and line ranges (e.g. `src/utils.js:45-50`).
68
+ - If GitHub integration is active, PRSmith generates **clickable GitHub deep links** straight to the code!
69
+ 4. **🔍 Before/After Code Snippet Comparisons**:
70
+ - Provide original and proposed code blocks. Outputs collapsible `<details>` blocks featuring gorgeous syntax highlighting.
71
+ 5. **📦 Batch Review Mode (`prsmith batch`)**:
72
+ - Run a single review runner loop to review multiple files or issues in one go.
73
+ - Export all bundled reviews together: copy them, save to a report, or **submit a native multi-comment review on GitHub** in a single click!
49
74
 
50
- - **Interactive Prompts:** No need to memorize complex flags. Just run the tool and answer the prompts.
51
- - **Smart Formatting:** Automatically generates perfectly structured Markdown.
52
- - **Graceful Exits:** Hit `Ctrl+C` anytime to exit safely without stack traces.
53
- - **Built-in Help:** Run `prsmith --help` to view documentation directly in your terminal.
75
+ ---
76
+
77
+ ## 💻 Usage
54
78
 
55
- ## Usage
79
+ ### 1. Fully Interactive Mode
56
80
 
57
- ### Standard Mode
58
- The primary way to use PRSmith is via its interactive mode. Simply run:
81
+ The simplest way to use PRSmith:
59
82
 
60
83
  ```bash
61
84
  prsmith
62
85
  ```
63
- This will launch the interactive prompt asking for Severity, Title, Issue, and Fix.
64
86
 
65
- ### Commands & Flags
87
+ This starts the wizard, prompting you for:
66
88
 
67
- | Command | Description |
68
- | :--- | :--- |
69
- | `prsmith` | Launch the interactive generator |
70
- | `prsmith -h`, `--help` | Display the help menu and commands |
71
- | `prsmith -v`, `--version` | Print the current installed version |
89
+ - Severity level & Title
90
+ - Problem description & Suggested fix (opens your system's default `$EDITOR` like VS Code, Vim, or Nano for comfortable multi-line editing)
91
+ - Optional File & Line context
92
+ - Optional Before & After code snippets
93
+ - Optional AI Polish toggle
72
94
 
73
- <details>
74
- <summary><b>Click to view an Example Interaction</b></summary>
95
+ ### 2. Interactive Batch Mode (New)
75
96
 
76
- <br/>
97
+ Review multiple issues in a single terminal session and compile them into a unified report:
98
+
99
+ ```bash
100
+ prsmith batch
101
+ ```
102
+
103
+ At the end of the batch review, an interactive menu allows you to copy the unified report, save it to a file, or **submit all comments at once as native inline review threads** on a GitHub PR.
104
+
105
+ ### 3. Non-Interactive CLI Flags
106
+
107
+ Bypass the prompts entirely for fast operations or CI/CD pipelines:
77
108
 
78
- **Input Data:**
109
+ ```bash
110
+ prsmith -s Critical -t "Resource Leak" -i "The connection is never closed." -f "Add a finally block." -p "src/db.js" -l "12-15" --ai --github --pr 42
111
+ ```
79
112
 
80
- | Field | Input |
81
- | :--- | :--- |
82
- | **Severity** | `<kbd>Critical</kbd>` |
83
- | **Title** | `Scope Issue` |
84
- | **Issue** | `Utility functions are nested incorrectly.` |
85
- | **Suggested Fix** | `Move them to module scope.` |
113
+ | Flag | Full | Description |
114
+ | :--------- | :----------- | :----------------------------------------------------------------- |
115
+ | `-s` | `--severity` | Severity level (e.g., Critical, Suggestion) |
116
+ | `-t` | `--title` | The review title |
117
+ | `-i` | `--issue` | Description of the problem |
118
+ | `-f` | `--fix` | Suggested solution |
119
+ | `-o` | `--out` | Save generated markdown to a specific file |
120
+ | `-p` | `--path` | File path context of code under review |
121
+ | `-l` | `--line` | Line number or range (e.g. `12` or `45-50`) |
122
+ | `--lang` | `--lang` | Programming language for code highlighting (default: `javascript`) |
123
+ | `--before` | `--before` | Original code snippet (Before) |
124
+ | `--after` | `--after` | Proposed code snippet (After) |
125
+ | `--ai` | `--ai` | Toggle AI-assisted polishing for constructive tone |
126
+ | `--github` | `--github` | Post comments directly to GitHub |
127
+ | `--pr` | `--pr` | The GitHub Pull Request number |
128
+ | `--repo` | `--repo` | GitHub repository in `owner/repo` format |
86
129
 
87
- **Output Markdown:**
130
+ ---
131
+
132
+ ## 🛠️ Configuration (`.prsmith.json`)
133
+
134
+ To enable AI polishing and GitHub integration, create a `.prsmith.json` file in your home directory (`~/`) or current project working directory:
135
+
136
+ ```json
137
+ {
138
+ "githubToken": "ghp_yourGitHubPersonalAccessToken",
139
+ "aiProvider": "gemini",
140
+ "aiApiKey": "AI_PROVIDER_API_KEY",
141
+ "aiModel": "gemini-1.5-flash",
142
+ "defaultBranch": "main",
143
+ "templates": {
144
+ "Nitpick": "This is just a tiny nitpick, no pressure to fix.",
145
+ "Security": "CRITICAL SECURITY VULNERABILITY DETECTED."
146
+ }
147
+ }
148
+ ```
88
149
 
89
- ```md
90
- ### Critical: Scope Issue
150
+ ### AI Configuration Mappings:
91
151
 
92
- The current implementation introduces a critical issue.
152
+ - **`aiProvider`**: `gemini` (default), `openai`, or `groq`.
153
+ - **`aiModel`**:
154
+ - Gemini default: `gemini-1.5-flash`
155
+ - OpenAI default: `gpt-4o-mini`
156
+ - Groq default: `llama-3.3-70b-versatile`
157
+ - Credentials can also be supplied via **Environment Variables**:
158
+ - `GITHUB_TOKEN`
159
+ - `GEMINI_API_KEY`
160
+ - `OPENAI_API_KEY`
161
+ - `GROQ_API_KEY`
162
+
163
+ ---
164
+
165
+ <details>
166
+ <summary><b>Click to view an Example Markdown Output</b></summary>
167
+
168
+ <br/>
169
+
170
+ ### Suggestion: Optimized Loop
171
+
172
+ The implementation works, but there may be a cleaner approach.
173
+
174
+ 📁 **File:** [`src/utils/math.js:15-20`](https://github.com/tarunyaprogrammer/PRSmith/blob/main/src/utils/math.js#L15)
93
175
 
94
176
  **Problem**
95
177
 
96
- Utility functions are nested incorrectly.
178
+ The current `forEach` iteration is performing multiple lookups on a large array, which has a noticeable performance overhead in hot paths.
97
179
 
98
180
  **Suggested Fix**
99
181
 
100
- Move them to module scope.
182
+ We can optimize this by storing the length in a local variable and utilizing a standard `for-i` loop.
183
+
184
+ <details>
185
+ <summary>🔍 View Code Diff / Comparison</summary>
186
+
187
+ **Before:**
188
+
189
+ ```javascript
190
+ items.forEach((item) => {
191
+ doCalculation(item);
192
+ });
101
193
  ```
102
194
 
195
+ **After:**
196
+
197
+ ```javascript
198
+ const len = items.length;
199
+ for (let i = 0; i < len; i++) {
200
+ doCalculation(items[i]);
201
+ }
202
+ ```
203
+
204
+ </details>
205
+
103
206
  </details>
104
207
 
105
208
  ---
@@ -129,6 +232,7 @@ npm run lint
129
232
  # Format the code
130
233
  npm run format
131
234
  ```
235
+
132
236
  </details>
133
237
 
134
238
  ## License
package/bin/cli.js CHANGED
@@ -1,36 +1,216 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import chalk from "chalk";
4
- import { program } from "commander";
5
- import { getReviewData } from "../src/prompts.js";
6
- import { generateMarkdown } from "../src/formatter.js";
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import chalk from 'chalk';
7
+ import { program } from 'commander';
8
+ import clipboardy from 'clipboardy';
9
+ import updateNotifier from 'update-notifier';
10
+ import inquirer from 'inquirer';
11
+ import { getReviewData } from '../src/prompts.js';
12
+ import { generateMarkdown } from '../src/formatter.js';
13
+ import { loadConfig } from '../src/config.js';
14
+ import { polishText } from '../src/ai.js';
15
+ import { detectGithubRepo, postPRComment } from '../src/github.js';
16
+ import { runBatchReview } from '../src/batch.js';
7
17
 
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const __dirname = path.dirname(__filename);
20
+ const pkg = JSON.parse(
21
+ fs.readFileSync(path.join(__dirname, '../package.json'), 'utf8')
22
+ );
23
+
24
+ updateNotifier({ pkg }).notify();
25
+
26
+ // Define 'batch' command
8
27
  program
9
- .name("prsmith")
10
- .description("Forge professional pull request review comments directly from the terminal.")
11
- .version("1.0.1", "-v, --version", "Output the current version")
12
- .helpOption("-h, --help", "Display help for command")
28
+ .command('batch')
29
+ .description(
30
+ 'Start an interactive batch review loop to bundle multiple comments.'
31
+ )
13
32
  .action(async () => {
33
+ try {
34
+ const config = loadConfig();
35
+ await runBatchReview(config);
36
+ } catch (error) {
37
+ if (error.name === 'ExitPromptError') {
38
+ console.log(chalk.yellow('\nYou have quit Batch Review Mode :) \n'));
39
+ process.exit(0);
40
+ }
41
+ console.error(chalk.red('\nSomething went wrong in Batch Mode.\n'));
42
+ console.error(error);
43
+ process.exit(1);
44
+ }
45
+ });
46
+
47
+ // Main program CLI options
48
+ program
49
+ .name('prsmith')
50
+ .description(
51
+ 'Forge professional pull request review comments directly from the terminal.'
52
+ )
53
+ .version(pkg.version, '-v, --version', 'Output the current version')
54
+ .helpOption('-h, --help', 'Display help for command')
55
+
56
+ // Existing Options
57
+ .option(
58
+ '-s, --severity <level>',
59
+ 'Severity of the issue (e.g. Critical, Major, Minor, Suggestion)'
60
+ )
61
+ .option('-t, --title <title>', 'Title of the review')
62
+ .option('-i, --issue <issue>', 'Description of the issue')
63
+ .option('-f, --fix <fix>', 'Suggested fix')
64
+ .option('-o, --out <file>', 'Save the output to a markdown file')
65
+
66
+ // New Options (v2.0.0)
67
+ .option(
68
+ '-p, --path <filepath>',
69
+ 'File path context of the code being reviewed'
70
+ )
71
+ .option('-l, --line <range>', 'Line number or range (e.g. 12 or 45-50)')
72
+ .option(
73
+ '--lang <language>',
74
+ 'Programming language for code syntax highlighting',
75
+ 'javascript'
76
+ )
77
+ .option('--before <code>', 'Original code snippet (Before)')
78
+ .option('--after <code>', 'Proposed code snippet (After)')
79
+ .option('--ai', 'Automatically polish description and fix with AI for tone')
80
+ .option(
81
+ '--github',
82
+ 'Post the review comment directly to a GitHub Pull Request'
83
+ )
84
+ .option('--pr <prNumber>', 'The Pull Request number to post comment to')
85
+ .option(
86
+ '--repo <owner/repo>',
87
+ "GitHub repository in 'owner/repo' format (otherwise auto-detected)"
88
+ )
89
+
90
+ .action(async (options) => {
91
+ // If the subcommand 'batch' is run, this main action is skipped automatically by Commander
14
92
  try {
15
93
  console.log(
16
- chalk.cyan("\nPRSmith - Professional PR Review Comment Generator\n")
94
+ chalk.cyan('\nPRSmith - Professional PR Review Comment Generator\n')
17
95
  );
18
96
 
19
- const data = await getReviewData();
97
+ const config = loadConfig();
98
+
99
+ // Get the rest of review data interactively or via flags
100
+ let data = await getReviewData(options, config);
20
101
 
21
- const markdown = generateMarkdown(data);
102
+ // Perform AI Polish if requested
103
+ if (data.ai) {
104
+ console.log(chalk.yellow('\n✨ Polishing comments with AI...'));
105
+ data.issue = await polishText(
106
+ data.issue,
107
+ 'Problem Description',
108
+ config
109
+ );
110
+ data.fix = await polishText(data.fix, 'Suggested Fix', config);
111
+ }
112
+
113
+ // Generate the markdown block
114
+ const markdown = generateMarkdown(data, config);
22
115
 
23
- console.log(chalk.green("\nGenerated Comment:\n"));
116
+ console.log(chalk.green('\nGenerated Comment:\n'));
24
117
  console.log(markdown);
118
+
119
+ // Clipboard integration
120
+ try {
121
+ clipboardy.writeSync(markdown);
122
+ console.log(chalk.green('✅ Comment copied to clipboard!'));
123
+ } catch {
124
+ console.warn(
125
+ chalk.yellow('⚠️ Could not write to clipboard automatically.')
126
+ );
127
+ }
128
+
129
+ // Save to file if output specified
130
+ if (options.out) {
131
+ const outPath = path.resolve(process.cwd(), options.out);
132
+ fs.writeFileSync(outPath, markdown, 'utf8');
133
+ console.log(chalk.green(`✅ Comment saved to ${outPath}`));
134
+ }
135
+
136
+ // Post to GitHub if specified
137
+ if (options.github || options.pr || options.repo) {
138
+ const detectedRepo = detectGithubRepo();
139
+ let owner = '';
140
+ let repoName = '';
141
+
142
+ if (options.repo) {
143
+ const parts = options.repo.split('/');
144
+ if (parts.length === 2) {
145
+ owner = parts[0];
146
+ repoName = parts[1];
147
+ }
148
+ } else if (detectedRepo) {
149
+ owner = detectedRepo.owner;
150
+ repoName = detectedRepo.repo;
151
+ }
152
+
153
+ const prQuestions = [];
154
+ if (!owner || !repoName) {
155
+ prQuestions.push(
156
+ {
157
+ type: 'input',
158
+ name: 'owner',
159
+ message: 'GitHub repository owner:',
160
+ validate: (val) => val.trim() !== '' || 'Owner is required.',
161
+ },
162
+ {
163
+ type: 'input',
164
+ name: 'repoName',
165
+ message: 'GitHub repository name:',
166
+ validate: (val) => val.trim() !== '' || 'Repo name is required.',
167
+ }
168
+ );
169
+ }
170
+
171
+ if (!options.pr) {
172
+ prQuestions.push({
173
+ type: 'input',
174
+ name: 'prNumber',
175
+ message: 'Pull Request Number:',
176
+ validate: (val) =>
177
+ /^\d+$/.test(val.trim()) || 'PR number must be an integer.',
178
+ });
179
+ }
180
+
181
+ const prAnswers =
182
+ prQuestions.length > 0 ? await inquirer.prompt(prQuestions) : {};
183
+
184
+ const finalOwner = owner || prAnswers.owner;
185
+ const finalRepo = repoName || prAnswers.repoName;
186
+ const finalPr = options.pr || prAnswers.prNumber;
187
+
188
+ console.log(
189
+ chalk.yellow('\n🚀 Posting comment directly to GitHub PR...')
190
+ );
191
+
192
+ const commentUrl = await postPRComment(
193
+ finalOwner,
194
+ finalRepo,
195
+ finalPr,
196
+ markdown,
197
+ config
198
+ );
199
+
200
+ console.log(
201
+ chalk.green(`🎉 Success! Comment posted to GitHub PR #${finalPr}`)
202
+ );
203
+ console.log(chalk.green(`🔗 Comment Link: ${commentUrl}\n`));
204
+ }
25
205
  } catch (error) {
26
- if (error.name === "ExitPromptError") {
27
- console.log(chalk.yellow("\nYou have quit in b/w :) \n"));
206
+ if (error.name === 'ExitPromptError') {
207
+ console.log(chalk.yellow('\nYou have quit in b/w :) \n'));
28
208
  process.exit(0);
29
209
  }
30
- console.error(chalk.red("\nSomething went wrong.\n"));
210
+ console.error(chalk.red('\nSomething went wrong.\n'));
31
211
  console.error(error);
32
212
  process.exit(1);
33
213
  }
34
214
  });
35
215
 
36
- program.parse(process.argv);
216
+ program.parse(process.argv);
package/eslint.config.js CHANGED
@@ -1,18 +1,20 @@
1
- import js from "@eslint/js";
1
+ import js from '@eslint/js';
2
2
 
3
3
  export default [
4
4
  js.configs.recommended,
5
5
  {
6
6
  languageOptions: {
7
- ecmaVersion: "latest",
8
- sourceType: "module",
7
+ ecmaVersion: 'latest',
8
+ sourceType: 'module',
9
9
  globals: {
10
- process: "readonly",
11
- console: "readonly",
10
+ process: 'readonly',
11
+ console: 'readonly',
12
+ fetch: 'readonly',
13
+ global: 'readonly',
12
14
  },
13
15
  },
14
16
  rules: {
15
- "no-unused-vars": "warn",
17
+ 'no-unused-vars': 'warn',
16
18
  },
17
19
  },
18
20
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prsmith",
3
- "version": "1.0.2",
3
+ "version": "2.0.0",
4
4
  "description": "Forge professional pull request review comments from simple prompts.",
5
5
  "keywords": [
6
6
  "pull-request",
@@ -25,8 +25,10 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "chalk": "^5.6.2",
28
+ "clipboardy": "^5.3.1",
28
29
  "commander": "^15.0.0",
29
- "inquirer": "^14.0.1"
30
+ "inquirer": "^14.0.1",
31
+ "update-notifier": "^7.3.1"
30
32
  },
31
33
  "devDependencies": {
32
34
  "@eslint/js": "^10.0.1",