@mikulgohil/ai-kit 1.3.1 → 1.4.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/README.md +131 -147
- package/agents/ci-debugger.md +136 -0
- package/commands/learn-from-pr.md +174 -0
- package/commands/pr-description.md +134 -0
- package/commands/release-notes.md +212 -0
- package/commands/scaffold-spec.md +167 -0
- package/commands/standup.md +131 -0
- package/commands/test-gaps.md +182 -0
- package/commands/upgrade.md +186 -0
- package/dist/index.js +903 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/github-action-ai-review.yml +279 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Morning Standup Summary
|
|
2
|
+
|
|
3
|
+
> **Role**: You are a team lead preparing a concise standup update. You extract meaningful work summaries from git history, identify what components were touched, flag any work in progress, and surface blockers from TODO comments and uncommitted changes.
|
|
4
|
+
> **Goal**: Generate a structured standup report covering yesterday's completed work, current in-progress items, and any blockers or TODOs found in the codebase.
|
|
5
|
+
|
|
6
|
+
## Mandatory Steps
|
|
7
|
+
|
|
8
|
+
You MUST follow these steps in order. Do not skip any step.
|
|
9
|
+
|
|
10
|
+
1. **Determine Time Range** — If `$ARGUMENTS` specifies a date range (e.g., "since Monday", "last 3 days"), use that. Otherwise default to `--since="yesterday"` for daily standup.
|
|
11
|
+
2. **Get Recent Commits** — Run `git log --since="yesterday" --oneline --no-merges --all` to get all recent commits. Also run `git log --since="yesterday" --format="%h %an %s" --no-merges` to include author info.
|
|
12
|
+
3. **Identify Changed Components** — Run `git diff --name-only HEAD~$(git rev-list --count --since="yesterday" HEAD)..HEAD 2>/dev/null || git diff --name-only HEAD~5..HEAD` to get all files changed in the time range. Group by directory/component.
|
|
13
|
+
4. **Check Uncommitted Work** — Run `git status --short` to find any staged or unstaged changes that represent work in progress.
|
|
14
|
+
5. **Read Uncommitted Changes** — Run `git diff --stat` for unstaged changes and `git diff --cached --stat` for staged changes. Read modified files to understand what is being worked on.
|
|
15
|
+
6. **Scan for Blockers** — Search for TODO, FIXME, HACK, and XXX comments in recently changed files. Run a targeted search:
|
|
16
|
+
- `git diff HEAD~5..HEAD -U0` and look for added lines containing TODO/FIXME
|
|
17
|
+
- Check for any failing test indicators in recent commits
|
|
18
|
+
7. **Check Branch Context** — Run `git branch --show-current` and `git log --oneline -1` to identify the current feature/task context.
|
|
19
|
+
8. **Produce the Standup Report** — Generate the output in the exact format specified below.
|
|
20
|
+
|
|
21
|
+
## Analysis Checklist
|
|
22
|
+
|
|
23
|
+
### Commit Analysis
|
|
24
|
+
- Group commits by feature/scope (from conventional commit prefixes or branch names)
|
|
25
|
+
- Identify whether work was feature development, bug fixing, refactoring, or maintenance
|
|
26
|
+
- Note any reverts or fix-up commits (indicates struggles or issues)
|
|
27
|
+
- Count commits per author if multiple contributors
|
|
28
|
+
|
|
29
|
+
### Work Classification
|
|
30
|
+
- **Completed**: Commits with clear completion signals (feat:, fix: that close an issue)
|
|
31
|
+
- **In Progress**: Uncommitted changes, WIP commits, partial implementations
|
|
32
|
+
- **Blocked**: TODO/FIXME comments added recently, failing tests, unresolved merge conflicts
|
|
33
|
+
|
|
34
|
+
### Component Mapping
|
|
35
|
+
- Map changed files to their component/module names
|
|
36
|
+
- Identify cross-cutting changes (shared utils, types, configs)
|
|
37
|
+
- Note if changes span multiple features (might indicate scope creep)
|
|
38
|
+
|
|
39
|
+
## Output Format
|
|
40
|
+
|
|
41
|
+
You MUST structure your response exactly as follows:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
## Standup Summary — [YYYY-MM-DD]
|
|
45
|
+
|
|
46
|
+
**Branch**: `feature/JIRA-123-order-page`
|
|
47
|
+
**Period**: [Yesterday | Last 3 days | Since Monday]
|
|
48
|
+
**Commits**: X commits by [author(s)]
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Yesterday (Completed Work)
|
|
53
|
+
|
|
54
|
+
### [Feature/Scope from commit prefix]
|
|
55
|
+
- [Human-readable summary of what was done — not raw commit message]
|
|
56
|
+
- [Another completed item]
|
|
57
|
+
- Commits: `abc1234`, `def5678`
|
|
58
|
+
- Files: `OrderForm.tsx`, `useOrder.ts`, `orders.api.ts`
|
|
59
|
+
|
|
60
|
+
### [Bug Fixes]
|
|
61
|
+
- Fixed [description of bug fix]
|
|
62
|
+
- Commits: `ghi9012`
|
|
63
|
+
- Files: `Cart.tsx`
|
|
64
|
+
|
|
65
|
+
### [Maintenance/Refactoring]
|
|
66
|
+
- [Description of refactoring or chore work]
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Changed Components
|
|
71
|
+
|
|
72
|
+
| Component / Module | Files Changed | Type of Change |
|
|
73
|
+
|--------------------|--------------|----------------|
|
|
74
|
+
| OrderForm | 3 files | New feature (form + hook + API) |
|
|
75
|
+
| Cart | 1 file | Bug fix (quantity calc) |
|
|
76
|
+
| Shared Types | 1 file | Added `OrderStatus` enum |
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## In Progress (Uncommitted Changes)
|
|
81
|
+
|
|
82
|
+
| File | Status | What's Being Worked On |
|
|
83
|
+
|------|--------|----------------------|
|
|
84
|
+
| `src/components/Checkout/Payment.tsx` | Modified | Adding Stripe integration |
|
|
85
|
+
| `src/lib/api/payments.ts` | New file | Payment API client (partially implemented) |
|
|
86
|
+
|
|
87
|
+
> [If no uncommitted changes: "Working tree is clean — no in-progress items."]
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Blockers & TODOs
|
|
92
|
+
|
|
93
|
+
### New TODOs Added
|
|
94
|
+
- `src/components/OrderForm.tsx:45` — `// TODO(JIRA-456): Add address validation`
|
|
95
|
+
- `src/lib/api/orders.ts:23` — `// FIXME: Race condition when rapid-fire submissions`
|
|
96
|
+
|
|
97
|
+
### Potential Blockers
|
|
98
|
+
- [e.g., "Payment.tsx is half-implemented — may need Stripe API keys in .env"]
|
|
99
|
+
- [e.g., "2 TODO items without ticket numbers — need to file tickets"]
|
|
100
|
+
|
|
101
|
+
> [If no blockers: "No blockers identified."]
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Today's Suggested Focus
|
|
106
|
+
1. [Based on in-progress work: "Complete Stripe payment integration"]
|
|
107
|
+
2. [Based on TODOs: "Address FIXME in orders.ts — race condition"]
|
|
108
|
+
3. [Based on context: "Add tests for OrderForm before PR"]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Self-Check
|
|
112
|
+
|
|
113
|
+
Before responding, verify:
|
|
114
|
+
- [ ] You ran `git log` with the correct time range
|
|
115
|
+
- [ ] You summarized commits in human-readable language, not raw commit messages
|
|
116
|
+
- [ ] You checked for uncommitted changes (both staged and unstaged)
|
|
117
|
+
- [ ] You scanned for TODO/FIXME/HACK comments in recently changed files
|
|
118
|
+
- [ ] You grouped changes by component/module, not just listed files
|
|
119
|
+
- [ ] You included the current branch name for context
|
|
120
|
+
- [ ] Today's suggested focus is based on actual in-progress work, not generic advice
|
|
121
|
+
|
|
122
|
+
## Constraints
|
|
123
|
+
|
|
124
|
+
- Do NOT dump raw commit messages — translate them into human-readable summaries.
|
|
125
|
+
- Do NOT include merge commits in the summary — use `--no-merges`.
|
|
126
|
+
- Do NOT fabricate work items — if there are no commits in the time range, say so clearly.
|
|
127
|
+
- Do NOT list every file individually when they belong to the same component — group them.
|
|
128
|
+
- If the git history is empty for the time range, adjust: try `--since="2 days ago"` and note the adjustment.
|
|
129
|
+
- Keep the report scannable — a team lead should be able to read it in under 60 seconds.
|
|
130
|
+
|
|
131
|
+
Target: $ARGUMENTS
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Test Gap Finder
|
|
2
|
+
|
|
3
|
+
> **Role**: You are a QA engineer with deep knowledge of React testing patterns. You systematically identify untested code, missing edge case coverage, and components that have no test files at all — then prioritize what to test first based on risk and complexity.
|
|
4
|
+
> **Goal**: Scan the target directory for components and utilities, check which ones have corresponding test files, analyze existing tests for coverage gaps, and produce a prioritized action plan with test stubs for the most critical untested code.
|
|
5
|
+
|
|
6
|
+
## Mandatory Steps
|
|
7
|
+
|
|
8
|
+
You MUST follow these steps in order. Do not skip any step.
|
|
9
|
+
|
|
10
|
+
1. **Identify Scope** — If `$ARGUMENTS` specifies a directory or file, use that. Otherwise default to `src/components/` and `src/lib/`. List all `.tsx`, `.ts` files (excluding test files, stories, and type-only files).
|
|
11
|
+
2. **Map Test Files** — For each source file, check if a corresponding `.test.tsx`, `.test.ts`, `.spec.tsx`, or `.spec.ts` file exists in the same directory or a `__tests__/` subdirectory.
|
|
12
|
+
3. **Check Coverage Report** — Run `npx vitest run --coverage --reporter=json` or check for an existing `coverage/` directory. If a coverage report exists, read it. If not, note that coverage data is unavailable.
|
|
13
|
+
4. **Analyze Existing Tests** — For files that DO have tests, read the test file and check:
|
|
14
|
+
- Are all exported functions/components tested?
|
|
15
|
+
- Are error states tested?
|
|
16
|
+
- Are edge cases covered (empty arrays, null values, boundary conditions)?
|
|
17
|
+
- Are user interactions tested (clicks, form submissions, keyboard events)?
|
|
18
|
+
5. **Identify Critical Gaps** — Prioritize untested code by:
|
|
19
|
+
- **P0**: Components with user interaction (forms, buttons, modals) and no tests
|
|
20
|
+
- **P0**: Utility functions used by 3+ files and no tests
|
|
21
|
+
- **P1**: Components with complex conditional rendering and no tests
|
|
22
|
+
- **P1**: API integration code with no tests
|
|
23
|
+
- **P2**: Simple presentational components with no tests
|
|
24
|
+
- **P2**: Type-only files or config files
|
|
25
|
+
6. **Generate Test Stubs** — Create ready-to-use test stubs for the top 5 highest-priority untested files.
|
|
26
|
+
7. **Produce the Report** — Generate the output in the exact format specified below.
|
|
27
|
+
|
|
28
|
+
## Analysis Checklist
|
|
29
|
+
|
|
30
|
+
### Test File Detection
|
|
31
|
+
- `.test.tsx` / `.test.ts` adjacent to source file
|
|
32
|
+
- `.spec.tsx` / `.spec.ts` adjacent to source file
|
|
33
|
+
- `__tests__/` subdirectory with matching filename
|
|
34
|
+
- Test files in a top-level `tests/` directory matching the source path
|
|
35
|
+
|
|
36
|
+
### Coverage Quality (for existing tests)
|
|
37
|
+
- Happy path: Does the test verify the primary use case?
|
|
38
|
+
- Error handling: Does the test verify error/failure states?
|
|
39
|
+
- Edge cases: Empty data, null/undefined, boundary values, long strings
|
|
40
|
+
- User interaction: Click handlers, form submissions, keyboard navigation
|
|
41
|
+
- Async behavior: Loading states, API call mocking, race conditions
|
|
42
|
+
- Props variations: Required vs optional, different combinations
|
|
43
|
+
|
|
44
|
+
### Risk Assessment
|
|
45
|
+
- How many files import this module? (wider usage = higher risk)
|
|
46
|
+
- Does it handle user input? (forms, search, filters)
|
|
47
|
+
- Does it make API calls? (data integrity risk)
|
|
48
|
+
- Does it manage state? (complex state = more edge cases)
|
|
49
|
+
- Is it a shared utility? (bug here affects everything)
|
|
50
|
+
|
|
51
|
+
## Output Format
|
|
52
|
+
|
|
53
|
+
You MUST structure your response exactly as follows:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
## Test Gap Analysis
|
|
57
|
+
|
|
58
|
+
**Scope**: [directory or files analyzed]
|
|
59
|
+
**Coverage Data**: [Available — X% overall | Not available — file-based analysis only]
|
|
60
|
+
**Summary**: X files analyzed, Y have tests, Z have no tests (W% coverage by file count)
|
|
61
|
+
|
|
62
|
+
## Test Status Overview
|
|
63
|
+
|
|
64
|
+
| Component / Module | Test File | Status | Priority | Reason |
|
|
65
|
+
|--------------------|-----------|--------|----------|--------|
|
|
66
|
+
| `Button.tsx` | `Button.test.tsx` | Full | — | All exports tested |
|
|
67
|
+
| `Modal.tsx` | `Modal.test.tsx` | Partial | P1 | Missing keyboard dismiss test |
|
|
68
|
+
| `OrderForm.tsx` | — | None | P0 | Form with validation, no tests |
|
|
69
|
+
| `formatDate.ts` | — | None | P0 | Used by 8 components, no tests |
|
|
70
|
+
| `Badge.tsx` | — | None | P2 | Simple presentational component |
|
|
71
|
+
|
|
72
|
+
## Priority Action Plan
|
|
73
|
+
|
|
74
|
+
### P0 — Must Test (high risk, no coverage)
|
|
75
|
+
1. **`OrderForm.tsx`** — Form with validation logic, user input handling, and API submission
|
|
76
|
+
2. **`formatDate.ts`** — Shared utility used by 8 components, date edge cases are common bugs
|
|
77
|
+
|
|
78
|
+
### P1 — Should Test (moderate risk or partial coverage)
|
|
79
|
+
3. **`Modal.tsx`** — Has tests but missing keyboard dismiss, focus trap, and escape key handling
|
|
80
|
+
4. **`DataTable.tsx`** — Complex conditional rendering for sort, filter, and pagination states
|
|
81
|
+
|
|
82
|
+
### P2 — Nice to Have (low risk)
|
|
83
|
+
5. **`Badge.tsx`** — Simple presentational, but tests would document the API
|
|
84
|
+
|
|
85
|
+
## Coverage Gaps in Existing Tests
|
|
86
|
+
|
|
87
|
+
### `Modal.test.tsx`
|
|
88
|
+
- Missing: Keyboard dismiss (Escape key)
|
|
89
|
+
- Missing: Focus trap behavior
|
|
90
|
+
- Missing: Click outside to close
|
|
91
|
+
- Missing: Body scroll lock when open
|
|
92
|
+
|
|
93
|
+
### `Button.test.tsx`
|
|
94
|
+
- Missing: Disabled state prevents click handler
|
|
95
|
+
- Missing: Loading state shows spinner and disables interaction
|
|
96
|
+
|
|
97
|
+
## Test Stubs
|
|
98
|
+
|
|
99
|
+
### 1. `OrderForm.test.tsx`
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
103
|
+
import userEvent from '@testing-library/user-event';
|
|
104
|
+
import { OrderForm } from './OrderForm';
|
|
105
|
+
|
|
106
|
+
describe('OrderForm', () => {
|
|
107
|
+
it('renders all form fields', () => {
|
|
108
|
+
render(<OrderForm />);
|
|
109
|
+
expect(screen.getByLabelText(/name/i)).toBeInTheDocument();
|
|
110
|
+
// Add assertions for each field
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('shows validation errors on empty submit', async () => {
|
|
114
|
+
render(<OrderForm />);
|
|
115
|
+
await userEvent.click(screen.getByRole('button', { name: /submit/i }));
|
|
116
|
+
expect(screen.getByText(/required/i)).toBeInTheDocument();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('submits successfully with valid data', async () => {
|
|
120
|
+
const onSubmit = vi.fn();
|
|
121
|
+
render(<OrderForm onSubmit={onSubmit} />);
|
|
122
|
+
await userEvent.type(screen.getByLabelText(/name/i), 'John Doe');
|
|
123
|
+
// Fill other fields...
|
|
124
|
+
await userEvent.click(screen.getByRole('button', { name: /submit/i }));
|
|
125
|
+
await waitFor(() => expect(onSubmit).toHaveBeenCalledWith(expect.objectContaining({ name: 'John Doe' })));
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('handles submission failure gracefully', async () => {
|
|
129
|
+
// Mock API failure
|
|
130
|
+
render(<OrderForm />);
|
|
131
|
+
// Submit and verify error message
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 2. `formatDate.test.ts`
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
import { formatDate } from './formatDate';
|
|
140
|
+
|
|
141
|
+
describe('formatDate', () => {
|
|
142
|
+
it('formats a valid date string', () => {
|
|
143
|
+
expect(formatDate('2024-01-15')).toBe('January 15, 2024');
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('handles null/undefined input', () => {
|
|
147
|
+
expect(formatDate(null)).toBe('');
|
|
148
|
+
expect(formatDate(undefined)).toBe('');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('handles invalid date string', () => {
|
|
152
|
+
expect(formatDate('not-a-date')).toBe('Invalid Date');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('handles timezone edge cases', () => {
|
|
156
|
+
// Test dates near midnight UTC
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
[Continue for top 5 untested files...]
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Self-Check
|
|
165
|
+
|
|
166
|
+
Before responding, verify:
|
|
167
|
+
- [ ] You listed every source file in the target scope
|
|
168
|
+
- [ ] You checked for test files using all naming conventions (.test, .spec, __tests__)
|
|
169
|
+
- [ ] You read existing test files to assess coverage quality, not just existence
|
|
170
|
+
- [ ] Priority assignments are based on risk, not just file size
|
|
171
|
+
- [ ] Test stubs are specific to the actual component API, not generic templates
|
|
172
|
+
- [ ] You generated stubs for the top 5 highest-priority untested files
|
|
173
|
+
|
|
174
|
+
## Constraints
|
|
175
|
+
|
|
176
|
+
- Do NOT mark a file as "tested" just because a test file exists — read the test file and verify it actually tests the key behaviors.
|
|
177
|
+
- Do NOT generate generic test stubs — read the source file and write stubs specific to its exports, props, and behavior.
|
|
178
|
+
- Do NOT prioritize simple presentational components over complex interactive ones.
|
|
179
|
+
- Do NOT include type-only files (`.d.ts`, `types.ts` with only interfaces) in the untested count.
|
|
180
|
+
- If the project uses a specific test runner (vitest, jest), match the import style in generated stubs.
|
|
181
|
+
|
|
182
|
+
Target: $ARGUMENTS
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Dependency Upgrade Assistant
|
|
2
|
+
|
|
3
|
+
> **Role**: You are a senior engineer who plans dependency upgrades carefully. You understand that blindly running `npm update` causes breakage, and that a structured upgrade plan — with the right order, breaking change awareness, and rollback strategy — is essential for safe upgrades.
|
|
4
|
+
> **Goal**: Analyze outdated dependencies, categorize them by risk and type, identify known breaking changes, and produce a step-by-step upgrade plan with rollback instructions.
|
|
5
|
+
|
|
6
|
+
## Mandatory Steps
|
|
7
|
+
|
|
8
|
+
You MUST follow these steps in order. Do not skip any step.
|
|
9
|
+
|
|
10
|
+
1. **Detect Package Manager** — Check for `pnpm-lock.yaml`, `yarn.lock`, or `package-lock.json` to determine the package manager in use.
|
|
11
|
+
2. **List Outdated Dependencies** — Run the appropriate outdated command:
|
|
12
|
+
- pnpm: `pnpm outdated --format=json` or `pnpm outdated`
|
|
13
|
+
- npm: `npm outdated`
|
|
14
|
+
- yarn: `yarn outdated`
|
|
15
|
+
3. **Read package.json** — Read the project's `package.json` to understand current version constraints (exact, caret, tilde) and whether the project uses workspaces.
|
|
16
|
+
4. **Categorize by Severity** — Group outdated packages into:
|
|
17
|
+
- **Major** (breaking): e.g., `15.0.0` → `16.0.0`
|
|
18
|
+
- **Minor** (features): e.g., `15.0.0` → `15.1.0`
|
|
19
|
+
- **Patch** (fixes): e.g., `15.0.0` → `15.0.1`
|
|
20
|
+
5. **Categorize by Type** — Group packages by their role:
|
|
21
|
+
- Framework (Next.js, React, Sitecore SDKs)
|
|
22
|
+
- Build tools (TypeScript, ESLint, Vite, Webpack)
|
|
23
|
+
- UI libraries (Tailwind, Radix, Headless UI)
|
|
24
|
+
- Utilities (lodash, date-fns, zod)
|
|
25
|
+
- Dev dependencies (testing libs, linters, formatters)
|
|
26
|
+
6. **Check for Breaking Changes** — For each major version bump, search for migration guides or changelogs. Note specific breaking changes relevant to this project.
|
|
27
|
+
7. **Determine Upgrade Order** — Plan the order considering:
|
|
28
|
+
- Peer dependency requirements (e.g., React must upgrade before React-dependent libs)
|
|
29
|
+
- Patch/minor first (safe wins), then major (risky changes)
|
|
30
|
+
- Group related packages (e.g., `@testing-library/*` together)
|
|
31
|
+
8. **Generate the Upgrade Plan** — Produce the output in the exact format specified below.
|
|
32
|
+
|
|
33
|
+
## Analysis Checklist
|
|
34
|
+
|
|
35
|
+
### Version Analysis
|
|
36
|
+
- Current version vs latest version vs recommended version
|
|
37
|
+
- Is the current version constraint allowing auto-updates? (^ vs ~ vs exact)
|
|
38
|
+
- Are there peer dependency conflicts with the latest version?
|
|
39
|
+
- Is a specific version pinned for a known reason (check for comments in package.json)?
|
|
40
|
+
|
|
41
|
+
### Breaking Change Research
|
|
42
|
+
- Does the package have a CHANGELOG.md or migration guide?
|
|
43
|
+
- Are there renamed exports, removed APIs, or changed defaults?
|
|
44
|
+
- Does the major bump require a new Node.js version?
|
|
45
|
+
- Does it require changes to config files (e.g., next.config.js, tsconfig.json)?
|
|
46
|
+
|
|
47
|
+
### Risk Assessment
|
|
48
|
+
- **High risk**: Framework upgrades (Next.js, React), packages with many dependents
|
|
49
|
+
- **Medium risk**: Build tools, UI libraries with custom theme/config
|
|
50
|
+
- **Low risk**: Patch updates, dev-only dependencies, utilities with stable APIs
|
|
51
|
+
|
|
52
|
+
### Dependency Graph Awareness
|
|
53
|
+
- Which packages share peer dependencies?
|
|
54
|
+
- Are there packages that must upgrade together (e.g., `react` + `react-dom` + `@types/react`)?
|
|
55
|
+
- Will upgrading one package force upgrades in others?
|
|
56
|
+
|
|
57
|
+
## Output Format
|
|
58
|
+
|
|
59
|
+
You MUST structure your response exactly as follows:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
## Dependency Upgrade Report
|
|
63
|
+
|
|
64
|
+
**Package Manager**: [pnpm | npm | yarn]
|
|
65
|
+
**Total Outdated**: X packages (Y major, Z minor, W patch)
|
|
66
|
+
**Estimated Risk**: [Low | Medium | High]
|
|
67
|
+
**Estimated Time**: [X hours for safe upgrades, Y hours including major upgrades]
|
|
68
|
+
|
|
69
|
+
## Outdated Dependencies
|
|
70
|
+
|
|
71
|
+
### Major Updates (Breaking — requires migration)
|
|
72
|
+
|
|
73
|
+
| Package | Current | Latest | Type | Risk | Notes |
|
|
74
|
+
|---------|---------|--------|------|------|-------|
|
|
75
|
+
| `next` | 14.1.0 | 15.0.0 | Framework | High | App Router changes, see migration guide |
|
|
76
|
+
| `eslint` | 8.57.0 | 9.0.0 | Build Tool | Medium | Flat config required |
|
|
77
|
+
|
|
78
|
+
### Minor Updates (Features — generally safe)
|
|
79
|
+
|
|
80
|
+
| Package | Current | Latest | Type |
|
|
81
|
+
|---------|---------|--------|------|
|
|
82
|
+
| `tailwindcss` | 3.4.0 | 3.5.0 | UI Library |
|
|
83
|
+
| `zod` | 3.22.0 | 3.23.0 | Utility |
|
|
84
|
+
|
|
85
|
+
### Patch Updates (Fixes — safe to apply)
|
|
86
|
+
|
|
87
|
+
| Package | Current | Latest | Type |
|
|
88
|
+
|---------|---------|--------|------|
|
|
89
|
+
| `typescript` | 5.3.2 | 5.3.3 | Build Tool |
|
|
90
|
+
|
|
91
|
+
## Breaking Change Warnings
|
|
92
|
+
|
|
93
|
+
### `next` 14.x → 15.x
|
|
94
|
+
- **Config**: `next.config.js` must use new `experimental` format
|
|
95
|
+
- **API**: `getServerSideProps` deprecated in favor of Server Components
|
|
96
|
+
- **Migration guide**: https://nextjs.org/docs/upgrading
|
|
97
|
+
- **Files affected in this project**: `next.config.js`, any pages using `getServerSideProps`
|
|
98
|
+
|
|
99
|
+
### `eslint` 8.x → 9.x
|
|
100
|
+
- **Config**: `.eslintrc` replaced with `eslint.config.js` (flat config)
|
|
101
|
+
- **Plugins**: Some plugins may not support v9 yet — check compatibility
|
|
102
|
+
- **Files affected in this project**: `.eslintrc.json`, `package.json` scripts
|
|
103
|
+
|
|
104
|
+
## Upgrade Plan
|
|
105
|
+
|
|
106
|
+
Execute these steps in order. Run tests after each step.
|
|
107
|
+
|
|
108
|
+
### Step 1: Patch Updates (Low risk, ~15 min)
|
|
109
|
+
```bash
|
|
110
|
+
# Apply all patch updates at once
|
|
111
|
+
pnpm update typescript@5.3.3 [other-patch-packages]
|
|
112
|
+
|
|
113
|
+
# Verify
|
|
114
|
+
pnpm run build && pnpm run test:run
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Step 2: Minor Updates (Low-Medium risk, ~30 min)
|
|
118
|
+
```bash
|
|
119
|
+
# Group 1: UI libraries
|
|
120
|
+
pnpm update tailwindcss@3.5.0
|
|
121
|
+
|
|
122
|
+
# Group 2: Utilities
|
|
123
|
+
pnpm update zod@3.23.0
|
|
124
|
+
|
|
125
|
+
# Verify after each group
|
|
126
|
+
pnpm run build && pnpm run test:run
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Step 3: Major Updates (High risk, ~2-4 hours each)
|
|
130
|
+
```bash
|
|
131
|
+
# 3a: ESLint 9 (do this BEFORE framework upgrades)
|
|
132
|
+
pnpm update eslint@9.0.0
|
|
133
|
+
# Then: migrate .eslintrc to eslint.config.js
|
|
134
|
+
# Then: verify all lint rules still apply
|
|
135
|
+
pnpm run lint && pnpm run test:run
|
|
136
|
+
|
|
137
|
+
# 3b: Next.js 15 (do this LAST — biggest blast radius)
|
|
138
|
+
pnpm update next@15.0.0 react@19.0.0 react-dom@19.0.0 @types/react@19.0.0
|
|
139
|
+
# Then: follow migration guide for config and API changes
|
|
140
|
+
pnpm run build && pnpm run test:run
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Rollback Instructions
|
|
144
|
+
|
|
145
|
+
If any step causes failures:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# Option 1: Revert package.json and lockfile
|
|
149
|
+
git checkout -- package.json pnpm-lock.yaml
|
|
150
|
+
pnpm install
|
|
151
|
+
|
|
152
|
+
# Option 2: Pin to the previous working version
|
|
153
|
+
pnpm add [package]@[previous-version]
|
|
154
|
+
|
|
155
|
+
# Option 3: If multiple packages were updated, bisect
|
|
156
|
+
# Revert all, then apply one at a time to find the culprit
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Packages to Skip (and why)
|
|
160
|
+
|
|
161
|
+
| Package | Reason |
|
|
162
|
+
|---------|--------|
|
|
163
|
+
| `[package]` | [Reason, e.g., "Waiting for plugin compatibility with v9"] |
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Self-Check
|
|
167
|
+
|
|
168
|
+
Before responding, verify:
|
|
169
|
+
- [ ] You ran the actual outdated command and read real version numbers
|
|
170
|
+
- [ ] You categorized every outdated package (none left unclassified)
|
|
171
|
+
- [ ] You identified peer dependency groups that must upgrade together
|
|
172
|
+
- [ ] Breaking change warnings include specific files affected in THIS project
|
|
173
|
+
- [ ] The upgrade order respects dependency relationships
|
|
174
|
+
- [ ] Rollback instructions are included for every step
|
|
175
|
+
- [ ] You noted any packages that should be skipped with a clear reason
|
|
176
|
+
|
|
177
|
+
## Constraints
|
|
178
|
+
|
|
179
|
+
- Do NOT recommend upgrading all packages at once — always use a phased approach.
|
|
180
|
+
- Do NOT skip breaking change research for major version bumps — always check for migration guides.
|
|
181
|
+
- Do NOT recommend `npm update` or `pnpm update` without specifying exact target versions.
|
|
182
|
+
- Do NOT ignore peer dependency conflicts — flag them explicitly.
|
|
183
|
+
- If the project uses a monorepo, check if dependency versions must be consistent across workspaces.
|
|
184
|
+
- Always include the verification command (`build && test`) after each upgrade step.
|
|
185
|
+
|
|
186
|
+
Target: $ARGUMENTS
|