@grunnverk/kodrdriv 1.3.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.
Files changed (84) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.cursor/rules/no-local-dependencies.md +6 -0
  3. package/.gitignore~ +23 -0
  4. package/.kodrdriv-example-branch-targeting.yaml +71 -0
  5. package/BUG_TREE_PUBLISH_CONFIG_DIR.md +79 -0
  6. package/LICENSE +190 -0
  7. package/README.md +218 -0
  8. package/dist/application.js +228 -0
  9. package/dist/application.js.map +1 -0
  10. package/dist/arguments.js +1307 -0
  11. package/dist/arguments.js.map +1 -0
  12. package/dist/constants.js +255 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/logging.js +176 -0
  15. package/dist/logging.js.map +1 -0
  16. package/dist/main.js +24 -0
  17. package/dist/main.js.map +1 -0
  18. package/dist/mcp/prompts/check_development.md +169 -0
  19. package/dist/mcp/prompts/dependency_update.md +62 -0
  20. package/dist/mcp/prompts/fix_and_commit.md +53 -0
  21. package/dist/mcp/prompts/publish.md +100 -0
  22. package/dist/mcp/prompts/tree_fix_and_commit.md +102 -0
  23. package/dist/mcp/prompts/tree_publish.md +118 -0
  24. package/dist/mcp-server.js +15601 -0
  25. package/dist/mcp-server.js.map +7 -0
  26. package/dist/types.js +303 -0
  27. package/dist/types.js.map +1 -0
  28. package/guide/ai-system.md +522 -0
  29. package/guide/architecture.md +349 -0
  30. package/guide/commands.md +383 -0
  31. package/guide/configuration.md +516 -0
  32. package/guide/debugging.md +587 -0
  33. package/guide/development.md +632 -0
  34. package/guide/index.md +224 -0
  35. package/guide/integration.md +510 -0
  36. package/guide/monorepo.md +533 -0
  37. package/guide/quickstart.md +249 -0
  38. package/guide/testing.md +463 -0
  39. package/guide/tree-operations.md +621 -0
  40. package/guide/usage.md +578 -0
  41. package/input/250509-kodrdriv-library-rules.m4a +0 -0
  42. package/package.json +105 -0
  43. package/packages/components/package.json +7 -0
  44. package/packages/tools/package.json +7 -0
  45. package/packages/utils/package.json +7 -0
  46. package/processed/250705-kodrdriv-confirm-editor-for-commit-and-release.m4a +0 -0
  47. package/processed/250705-kodrdriv-confirm-flag-release.m4a +0 -0
  48. package/processed/250705-kodrdriv-context-for-review.m4a +0 -0
  49. package/processed/250705-kodrdriv-feedback-on-publish-pipeline.m4a +0 -0
  50. package/processed/250705-kodrdriv-intelligent-eslint-style.m4a +0 -0
  51. package/processed/250705-kodrdriv-make-review-less-strict.m4a +0 -0
  52. package/processed/250705-kodrdriv-multilevel-transcription.m4a +0 -0
  53. package/processed/250705-kodrdriv-opinionated-review.m4a +0 -0
  54. package/processed/250705-kodrdriv-publish-next-version.m4a +0 -0
  55. package/processed/250705-kodrdriv-release-branches-and-milestones.m4a +0 -0
  56. package/processed/250705-kodrdriv-scope-check-fix-or-ignore.m4a +0 -0
  57. package/processed/250705-kodrdriv-scope-checker.m4a +0 -0
  58. package/processed/250705-kodrdriv-specify-a-release-note-for-publish.m4a +0 -0
  59. package/scripts/build-mcp.js +111 -0
  60. package/scripts/pre-commit-hook.sh +52 -0
  61. package/scripts/test-get-version-tool.js +102 -0
  62. package/scripts/test-mcp-compliance.js +254 -0
  63. package/scripts/update-test-log-assertions.js +73 -0
  64. package/temp-dist/arguments.js +817 -0
  65. package/temp-dist/constants.js +202 -0
  66. package/temp-dist/logging.js +130 -0
  67. package/temp-dist/types.js +112 -0
  68. package/temp-dist/util/stdin.js +132 -0
  69. package/temp-dist/util/storage.js +149 -0
  70. package/temp-dist/util/validation.js +110 -0
  71. package/test-external-unlink/package.json +16 -0
  72. package/test-externals/package.json +8 -0
  73. package/test-increment.js +0 -0
  74. package/test-multiline/cli/package.json +8 -0
  75. package/test-multiline/core/package.json +5 -0
  76. package/test-multiline/mobile/package.json +8 -0
  77. package/test-multiline/web/package.json +8 -0
  78. package/test-project/package-lock.json +21 -0
  79. package/test-project/package.json +1 -0
  80. package/test-review-flow.sh +15 -0
  81. package/test-sort-files/alpha.md +3 -0
  82. package/test-sort-files/middle.txt +3 -0
  83. package/test-sort-files/zebra.txt +3 -0
  84. package/test_output.txt +161 -0
@@ -0,0 +1,249 @@
1
+ # Quick Start Guide
2
+
3
+ Get kodrdriv working in 5 minutes.
4
+
5
+ ## Prerequisites
6
+
7
+ - Node.js v18+ installed
8
+ - Git repository with changes
9
+ - OpenAI API key
10
+ - (Optional) GitHub token for publish features
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ npm install -g @grunnverk/kodrdriv
16
+ ```
17
+
18
+ ## Setup
19
+
20
+ ### 1. Set Environment Variables
21
+
22
+ ```bash
23
+ export OPENAI_API_KEY="sk-your-openai-key-here"
24
+ export GITHUB_TOKEN="ghp-your-github-token-here" # Optional, for publish
25
+
26
+ # If your API key starts with sk-proj-, you must also set:
27
+ export OPENAI_PROJECT_ID="proj-your-project-id"
28
+ ```
29
+
30
+ **Important:** Project-scoped API keys (starting with `sk-proj-`) require the `OPENAI_PROJECT_ID` environment variable. You can find your project ID at https://platform.openai.com/settings/organization/projects
31
+
32
+ Add to your shell profile (~/.zshrc, ~/.bashrc) to persist.
33
+
34
+ ### 2. Initialize Configuration
35
+
36
+ ```bash
37
+ # Create config files
38
+ kodrdriv --init-config
39
+
40
+ # Verify setup
41
+ kodrdriv --check-config
42
+ ```
43
+
44
+ This creates `.kodrdriv/config.yaml` in your project.
45
+
46
+ ## First Commands
47
+
48
+ ### Generate a Commit Message
49
+
50
+ ```bash
51
+ # Make some changes
52
+ echo "test" >> README.md
53
+
54
+ # Stage changes
55
+ git add README.md
56
+
57
+ # Generate commit message
58
+ kodrdriv commit
59
+ ```
60
+
61
+ **Output**: AI-generated commit message based on your changes.
62
+
63
+ **To auto-commit**:
64
+ ```bash
65
+ kodrdriv commit --sendit
66
+ ```
67
+
68
+ ### Generate Release Notes
69
+
70
+ ```bash
71
+ # Generate notes for changes since last tag
72
+ kodrdriv release
73
+
74
+ # Preview without saving
75
+ kodrdriv release --dry-run
76
+ ```
77
+
78
+ **Output**: Comprehensive release notes in Markdown format.
79
+
80
+ ### Try Self-Reflection
81
+
82
+ ```bash
83
+ # See how the AI analyzed your changes
84
+ kodrdriv commit --self-reflection
85
+
86
+ # Check the report
87
+ cat output/agentic-reflection-commit-*.md
88
+ ```
89
+
90
+ **Output**: Detailed report showing which tools were used and how effective they were.
91
+
92
+ ## Basic Configuration
93
+
94
+ Edit `.kodrdriv/config.yaml`:
95
+
96
+ ```yaml
97
+ # Global settings
98
+ model: gpt-4o
99
+ outputDirectory: output
100
+
101
+ # Commit settings
102
+ commit:
103
+ selfReflection: true
104
+ maxAgenticIterations: 10
105
+
106
+ # Release settings
107
+ release:
108
+ selfReflection: true
109
+ maxAgenticIterations: 30
110
+ ```
111
+
112
+ ## Common Workflows
113
+
114
+ ### Daily Development
115
+
116
+ ```bash
117
+ # Work on features
118
+ # ... make changes ...
119
+
120
+ # When ready to commit
121
+ git add .
122
+ kodrdriv commit --sendit
123
+ ```
124
+
125
+ ### Before a Release
126
+
127
+ ```bash
128
+ # Generate release notes
129
+ kodrdriv release --context-files CHANGELOG.md
130
+
131
+ # Review and refine
132
+ kodrdriv release --interactive
133
+ ```
134
+
135
+ ### Automated Release
136
+
137
+ ```bash
138
+ # Complete workflow (notes, PR, merge, tag, release)
139
+ kodrdriv publish
140
+ ```
141
+
142
+ ## Verification
143
+
144
+ ### Test Your Setup
145
+
146
+ ```bash
147
+ # Dry run mode (no changes made)
148
+ kodrdriv commit --dry-run
149
+
150
+ # Verbose logging
151
+ kodrdriv commit --verbose
152
+
153
+ # Debug logging (very detailed)
154
+ kodrdriv commit --debug
155
+ ```
156
+
157
+ ### Check Configuration
158
+
159
+ ```bash
160
+ # Show merged configuration
161
+ kodrdriv --check-config
162
+
163
+ # Test with a small change
164
+ echo "test" >> test.txt
165
+ git add test.txt
166
+ kodrdriv commit --dry-run
167
+ git reset HEAD test.txt
168
+ rm test.txt
169
+ ```
170
+
171
+ ## Next Steps
172
+
173
+ You now have kodrdriv working! Learn more:
174
+
175
+ - **[Usage Guide](./usage.md)** - Common patterns and workflows
176
+ - **[Commands Reference](./commands.md)** - All available commands
177
+ - **[Configuration Guide](./configuration.md)** - Advanced configuration
178
+ - **[Integration Guide](./integration.md)** - Integrate into your project
179
+
180
+ ## Troubleshooting
181
+
182
+ ### "OpenAI API key is required"
183
+ ```bash
184
+ # Check if set
185
+ echo $OPENAI_API_KEY
186
+
187
+ # Set it
188
+ export OPENAI_API_KEY="your-key"
189
+
190
+ # If using project-scoped key (sk-proj-*), also set:
191
+ export OPENAI_PROJECT_ID="proj-your-project-id"
192
+ ```
193
+
194
+ ### "401 You do not have access to the project tied to the API key"
195
+
196
+ This error occurs when using a project-scoped API key without setting `OPENAI_PROJECT_ID`:
197
+
198
+ ```bash
199
+ # Check if your key is project-scoped
200
+ echo $OPENAI_API_KEY | grep "sk-proj"
201
+
202
+ # If it is, set the project ID:
203
+ export OPENAI_PROJECT_ID="proj-your-project-id"
204
+
205
+ # Find your project ID at:
206
+ # https://platform.openai.com/settings/organization/projects
207
+ ```
208
+
209
+ ### "No changes to commit"
210
+ ```bash
211
+ # Make sure you've staged changes
212
+ git add .
213
+
214
+ # Or use --add to auto-stage
215
+ kodrdriv commit --add --sendit
216
+ ```
217
+
218
+ ### "Cannot find module"
219
+ ```bash
220
+ # Reinstall globally
221
+ npm install -g @grunnverk/kodrdriv
222
+
223
+ # Or link for development
224
+ cd /path/to/kodrdriv
225
+ npm link
226
+ ```
227
+
228
+ ### Command Times Out
229
+ ```bash
230
+ # Increase iteration limit
231
+ kodrdriv commit --max-agentic-iterations 15
232
+
233
+ # Or use simpler model
234
+ kodrdriv commit --model gpt-4o-mini
235
+ ```
236
+
237
+ ## Tips
238
+
239
+ 1. **Start with dry-run** to see what will happen
240
+ 2. **Use --verbose** to understand what's going on
241
+ 3. **Enable self-reflection** to improve results
242
+ 4. **Pass context files** for complex changes
243
+ 5. **Check output directory** for generated files
244
+
245
+ You're ready to use kodrdriv! 🚀
246
+
247
+
248
+
249
+
@@ -0,0 +1,463 @@
1
+ # Testing Guide
2
+
3
+ Understanding and running kodrdriv tests.
4
+
5
+ ## Test Suite Overview
6
+
7
+ ### Coverage Statistics
8
+
9
+ - **kodrdriv**: ~60% coverage, 1,344 tests
10
+ - **ai-service**: ~66% coverage, 318 tests
11
+ - **tree-core**: ~94% coverage, 25 tests
12
+ - **tree-execution**: ~78% coverage, 177 tests
13
+ - **shared**: ~86% coverage
14
+ - **git-tools**: ~86% coverage, 284 tests
15
+ - **github-tools**: ~85% coverage, 393 tests
16
+
17
+ **Total**: ~2,500 tests across ecosystem
18
+
19
+ ## Running Tests
20
+
21
+ ### Basic Commands
22
+
23
+ ```bash
24
+ # All tests
25
+ npm test
26
+
27
+ # Watch mode (recommended for development)
28
+ npm run test:watch
29
+
30
+ # Coverage report
31
+ npm run test:coverage
32
+
33
+ # Specific test file
34
+ npm test tests/commands/commit.test.ts
35
+
36
+ # Pattern matching
37
+ npm test -- commit
38
+ ```
39
+
40
+ ### Test Modes
41
+
42
+ ```bash
43
+ # Run once
44
+ npm test
45
+
46
+ # Watch for changes
47
+ npm run test:watch
48
+
49
+ # UI mode (interactive)
50
+ npm run test:ui
51
+
52
+ # Verbose output
53
+ npm test -- --reporter=verbose
54
+ ```
55
+
56
+ ## Test Structure
57
+
58
+ ### By Component
59
+
60
+ **Commands** (`tests/commands/`):
61
+ - `commit.test.ts` - Commit message generation
62
+ - `release.test.ts` - Release notes generation
63
+ - `release-agentic.test.ts` - Agentic analysis
64
+ - `publish.test.ts` - Publish workflows
65
+ - `tree.test.ts` - Tree operations
66
+ - `audio-*.test.ts` - Audio processing
67
+
68
+ **Utilities** (`tests/util/`):
69
+ - `general.test.ts` - General utilities
70
+ - `stopContext.test.ts` - Content filtering
71
+ - `validation.test.ts` - Validation functions
72
+
73
+ **Integration** (`tests/integration/`):
74
+ - End-to-end workflow tests
75
+
76
+ ### By Type
77
+
78
+ **Unit Tests**:
79
+ - Individual function testing
80
+ - Mocked dependencies
81
+ - Fast execution (<1s per file)
82
+
83
+ **Integration Tests**:
84
+ - Multi-component workflows
85
+ - Real file system operations
86
+ - Moderate speed (1-5s per file)
87
+
88
+ **End-to-End Tests**:
89
+ - Complete command execution
90
+ - External API mocking
91
+ - Slower (5-10s per file)
92
+
93
+ ## Writing Tests
94
+
95
+ ### Test Template
96
+
97
+ ```typescript
98
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
99
+ import { execute } from '../src/commands/my-command';
100
+ import type { Config } from '../src/types';
101
+
102
+ describe('MyCommand', () => {
103
+ beforeEach(() => {
104
+ // Setup
105
+ });
106
+
107
+ afterEach(() => {
108
+ vi.clearAllMocks();
109
+ });
110
+
111
+ it('should handle basic case', async () => {
112
+ const config: Partial<Config> = {
113
+ dryRun: true
114
+ };
115
+
116
+ const result = await execute(config);
117
+
118
+ expect(result).toBeDefined();
119
+ });
120
+
121
+ it('should handle error case', async () => {
122
+ // Test error handling
123
+ await expect(execute(invalidConfig)).rejects.toThrow();
124
+ });
125
+ });
126
+ ```
127
+
128
+ ### Mocking Strategies
129
+
130
+ **Mock External APIs**:
131
+ ```typescript
132
+ // Mock OpenAI
133
+ vi.mock('@grunnverk/ai-service', () => ({
134
+ runAgenticCommit: vi.fn().mockResolvedValue({
135
+ commitMessage: 'mock message'
136
+ })
137
+ }));
138
+
139
+ // Mock Git
140
+ vi.mock('@grunnverk/git-tools', () => ({
141
+ run: vi.fn().mockResolvedValue({ stdout: 'output' })
142
+ }));
143
+
144
+ // Mock GitHub
145
+ vi.mock('@grunnverk/github-tools', () => ({
146
+ createPullRequest: vi.fn().mockResolvedValue({
147
+ number: 123,
148
+ html_url: 'https://github.com/...'
149
+ })
150
+ }));
151
+ ```
152
+
153
+ **Mock File System**:
154
+ ```typescript
155
+ vi.mock('@grunnverk/shared', () => ({
156
+ createStorage: vi.fn().mockReturnValue({
157
+ readFile: vi.fn(),
158
+ writeFile: vi.fn(),
159
+ ensureDirectory: vi.fn()
160
+ })
161
+ }));
162
+ ```
163
+
164
+ ### Test Assertions
165
+
166
+ ```typescript
167
+ // Basic assertions
168
+ expect(result).toBe('expected');
169
+ expect(result).toEqual({ key: 'value' });
170
+ expect(result).toContain('substring');
171
+ expect(result).toMatch(/regex/);
172
+
173
+ // Mock call verification
174
+ expect(mockFunction).toHaveBeenCalled();
175
+ expect(mockFunction).toHaveBeenCalledWith('arg1', 'arg2');
176
+ expect(mockFunction).toHaveBeenCalledTimes(2);
177
+
178
+ // Complex objects
179
+ expect(result).toEqual(expect.objectContaining({
180
+ key: 'value'
181
+ }));
182
+ ```
183
+
184
+ ## Test Coverage
185
+
186
+ ### View Coverage
187
+
188
+ ```bash
189
+ # Generate coverage report
190
+ npm run test:coverage
191
+
192
+ # Open in browser
193
+ open coverage/index.html
194
+ ```
195
+
196
+ ### Coverage Goals
197
+
198
+ - **Utilities**: 80%+ coverage
199
+ - **Commands**: 60%+ coverage (harder to test)
200
+ - **Critical paths**: 90%+ coverage
201
+
202
+ ### Improving Coverage
203
+
204
+ ```typescript
205
+ // Test happy path
206
+ it('should work with valid input', async () => {
207
+ const result = await function(validInput);
208
+ expect(result).toBeDefined();
209
+ });
210
+
211
+ // Test error path
212
+ it('should handle invalid input', async () => {
213
+ await expect(function(invalidInput)).rejects.toThrow();
214
+ });
215
+
216
+ // Test edge cases
217
+ it('should handle empty input', async () => {
218
+ const result = await function('');
219
+ expect(result).toBe('');
220
+ });
221
+ ```
222
+
223
+ ## Testing Commands
224
+
225
+ ### commit Command Tests
226
+
227
+ Key scenarios:
228
+ - Generate commit message
229
+ - Handle interactive mode
230
+ - Process context files
231
+ - Detect file: dependencies
232
+ - Handle git errors
233
+ - Split commit suggestions
234
+
235
+ ### release Command Tests
236
+
237
+ Key scenarios:
238
+ - Generate release notes
239
+ - Handle milestone integration
240
+ - Process context files
241
+ - Compare refs correctly
242
+ - Handle large releases
243
+ - Interactive refinement
244
+
245
+ ### tree Command Tests
246
+
247
+ Key scenarios:
248
+ - Dependency graph building
249
+ - Sequential execution
250
+ - Parallel execution
251
+ - Recovery from failures
252
+ - Checkpoint management
253
+ - Package filtering
254
+
255
+ ## Continuous Integration
256
+
257
+ ### Local Precommit
258
+
259
+ ```bash
260
+ npm run precommit
261
+ ```
262
+
263
+ Runs:
264
+ 1. `npm run lint` - ESLint
265
+ 2. `npx tsc --noEmit` - Type check
266
+ 3. `npm run build` - Build
267
+ 4. `npm test` - Tests
268
+
269
+ ### GitHub Actions
270
+
271
+ Automated on push:
272
+ - Lint checking
273
+ - Type checking
274
+ - Test execution
275
+ - Build verification
276
+ - Coverage reporting
277
+
278
+ ## Test Development Workflow
279
+
280
+ ### 1. Write Failing Test
281
+
282
+ ```typescript
283
+ it('should support new feature', async () => {
284
+ const result = await newFeature();
285
+ expect(result).toBe('expected');
286
+ });
287
+ ```
288
+
289
+ ### 2. Run Test (Fails)
290
+
291
+ ```bash
292
+ npm test -- new-feature
293
+ # Test fails ✗
294
+ ```
295
+
296
+ ### 3. Implement Feature
297
+
298
+ ```typescript
299
+ export async function newFeature() {
300
+ // Implementation
301
+ return 'expected';
302
+ }
303
+ ```
304
+
305
+ ### 4. Run Test (Passes)
306
+
307
+ ```bash
308
+ npm test -- new-feature
309
+ # Test passes ✓
310
+ ```
311
+
312
+ ### 5. Check Coverage
313
+
314
+ ```bash
315
+ npm run test:coverage
316
+ # Verify new code is covered
317
+ ```
318
+
319
+ ## Debugging Tests
320
+
321
+ ### Debug Single Test
322
+
323
+ ```bash
324
+ # With node inspector
325
+ node --inspect node_modules/.bin/vitest run tests/my-test.test.ts
326
+
327
+ # With console.log
328
+ # Add console.log in test or code
329
+ npm test -- my-test.test.ts
330
+
331
+ # With debugger
332
+ # Add `debugger;` statement
333
+ node --inspect-brk node_modules/.bin/vitest run tests/my-test.test.ts
334
+ ```
335
+
336
+ ### Test-Specific Logging
337
+
338
+ ```typescript
339
+ it('should work', async () => {
340
+ // Enable logging in test
341
+ const logger = {
342
+ info: console.log,
343
+ debug: console.log,
344
+ error: console.error,
345
+ warn: console.warn
346
+ };
347
+
348
+ const result = await execute({ logger });
349
+ });
350
+ ```
351
+
352
+ ## Test Best Practices
353
+
354
+ ### 1. Test Behavior, Not Implementation
355
+
356
+ **Bad**:
357
+ ```typescript
358
+ it('should call function', () => {
359
+ expect(internalFunction).toHaveBeenCalled();
360
+ });
361
+ ```
362
+
363
+ **Good**:
364
+ ```typescript
365
+ it('should generate commit message', async () => {
366
+ const result = await commit();
367
+ expect(result).toContain('feat:');
368
+ });
369
+ ```
370
+
371
+ ### 2. Use Descriptive Names
372
+
373
+ **Bad**:
374
+ ```typescript
375
+ it('test1', () => {});
376
+ ```
377
+
378
+ **Good**:
379
+ ```typescript
380
+ it('should generate conventional commit format for new features', () => {});
381
+ ```
382
+
383
+ ### 3. One Assertion Focus
384
+
385
+ **Bad**:
386
+ ```typescript
387
+ it('should do everything', () => {
388
+ expect(a).toBe(1);
389
+ expect(b).toBe(2);
390
+ expect(c).toBe(3);
391
+ });
392
+ ```
393
+
394
+ **Good**:
395
+ ```typescript
396
+ it('should set value a', () => expect(a).toBe(1));
397
+ it('should set value b', () => expect(b).toBe(2));
398
+ it('should set value c', () => expect(c).toBe(3));
399
+ ```
400
+
401
+ ### 4. Clean Up After Tests
402
+
403
+ ```typescript
404
+ afterEach(() => {
405
+ vi.clearAllMocks();
406
+ // Clean up files
407
+ // Reset state
408
+ });
409
+ ```
410
+
411
+ ## Test Data
412
+
413
+ ### Fixtures
414
+
415
+ Located in `tests/fixtures/`:
416
+ - Sample diffs
417
+ - Sample commit logs
418
+ - Mock API responses
419
+ - Test configurations
420
+
421
+ ### Using Fixtures
422
+
423
+ ```typescript
424
+ import { readFileSync } from 'fs';
425
+ import { join } from 'path';
426
+
427
+ const sampleDiff = readFileSync(
428
+ join(__dirname, 'fixtures', 'sample-diff.txt'),
429
+ 'utf8'
430
+ );
431
+ ```
432
+
433
+ ## Performance Testing
434
+
435
+ ### Measure Test Performance
436
+
437
+ ```bash
438
+ # Run with timing
439
+ npm test -- --reporter=verbose
440
+
441
+ # Find slow tests
442
+ npm test -- --reporter=verbose | grep -E "[0-9]+ms" | sort -n
443
+ ```
444
+
445
+ ### Optimize Slow Tests
446
+
447
+ - Mock expensive operations
448
+ - Use smaller fixtures
449
+ - Parallelize where possible
450
+ - Skip slow tests in watch mode
451
+
452
+ ## Next Steps
453
+
454
+ - **[Development Guide](./development.md)** - Build and extend
455
+ - **[Debugging Guide](./debugging.md)** - Troubleshoot issues
456
+ - **[Architecture Guide](./architecture.md)** - Understand design
457
+ - **[Commands Reference](./commands.md)** - Test specific commands
458
+
459
+ Keep the tests green! 🟢
460
+
461
+
462
+
463
+