@grunnverk/kodrdriv 1.5.0 → 1.5.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,649 @@
1
+ # Configuring Kodrdriv via MCP
2
+
3
+ Kodrdriv supports first-class configuration through Model Context Protocol (MCP), powered by [CardiganTime](https://utilarium.github.io/cardigantime/). This allows AI assistants to configure Kodrdriv directly through MCP invocations without needing configuration files.
4
+
5
+ ## Overview
6
+
7
+ When Kodrdriv is invoked via MCP, configuration can be provided in three ways (in priority order):
8
+
9
+ 1. **MCP Configuration** - Provided in the MCP server configuration (highest priority)
10
+ 2. **File-Based Configuration** - Discovered from the working directory
11
+ 3. **Default Configuration** - Built-in defaults
12
+
13
+ ## The Simplifying Assumption
14
+
15
+ **If MCP configuration is provided, it is the complete configuration.**
16
+
17
+ This means:
18
+ - MCP config takes exclusive precedence
19
+ - No merging with file-based config
20
+ - No fallback to file config
21
+ - Predictable and debuggable behavior
22
+
23
+ ## Basic MCP Configuration
24
+
25
+ ### Cursor MCP Configuration
26
+
27
+ Add Kodrdriv to your `~/.cursor/mcp.json`:
28
+
29
+ ```json
30
+ {
31
+ "mcpServers": {
32
+ "kodrdriv": {
33
+ "command": "node",
34
+ "args": ["/Users/tobrien/gitw/grunnverk/kodrdriv/dist/mcp-server.js"]
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ This basic configuration uses file-based configuration discovery. Kodrdriv will look for `.kodrdriv.yaml`, `.kodrdriv.json`, or other configuration files in your project directory.
41
+
42
+ ## Advanced MCP Configuration
43
+
44
+ To provide configuration directly through MCP (bypassing file-based configuration), add a `config` field:
45
+
46
+ ```json
47
+ {
48
+ "mcpServers": {
49
+ "kodrdriv": {
50
+ "command": "node",
51
+ "args": ["/Users/tobrien/gitw/grunnverk/kodrdriv/dist/mcp-server.js"],
52
+ "config": {
53
+ "dryRun": false,
54
+ "verbose": true,
55
+ "model": "gpt-4o",
56
+ "commit": {
57
+ "messageLimit": 100,
58
+ "maxAgenticIterations": 5,
59
+ "selfReflection": true
60
+ },
61
+ "release": {
62
+ "messageLimit": 150,
63
+ "maxAgenticIterations": 3
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ ```
70
+
71
+ ## Configuration Schema
72
+
73
+ Kodrdriv's configuration schema is defined using Zod and includes the following sections:
74
+
75
+ ### Global Options
76
+
77
+ ```json
78
+ {
79
+ "dryRun": false,
80
+ "verbose": true,
81
+ "debug": false,
82
+ "model": "gpt-4o",
83
+ "openaiReasoning": "medium",
84
+ "openaiMaxOutputTokens": 16000,
85
+ "contextDirectories": ["./docs", "./guide"],
86
+ "outputDirectory": "./output",
87
+ "preferencesDirectory": "~/.kodrdriv"
88
+ }
89
+ ```
90
+
91
+ | Field | Type | Description |
92
+ |-------|------|-------------|
93
+ | `dryRun` | boolean | Run commands without making changes |
94
+ | `verbose` | boolean | Enable verbose output |
95
+ | `debug` | boolean | Enable debug logging |
96
+ | `model` | string | Default AI model to use |
97
+ | `openaiReasoning` | `"low"` \| `"medium"` \| `"high"` | OpenAI reasoning effort level |
98
+ | `openaiMaxOutputTokens` | number | Maximum output tokens for OpenAI |
99
+ | `contextDirectories` | string[] | Directories to include in context |
100
+ | `outputDirectory` | string | Directory for output files |
101
+ | `preferencesDirectory` | string | Directory for user preferences |
102
+
103
+ ### Commit Configuration
104
+
105
+ ```json
106
+ {
107
+ "commit": {
108
+ "add": true,
109
+ "cached": false,
110
+ "sendit": false,
111
+ "interactive": true,
112
+ "amend": false,
113
+ "push": false,
114
+ "messageLimit": 100,
115
+ "context": "Additional context for commit",
116
+ "contextFiles": ["./CHANGELOG.md"],
117
+ "maxDiffBytes": 500000,
118
+ "model": "gpt-4o",
119
+ "maxAgenticIterations": 5,
120
+ "allowCommitSplitting": true,
121
+ "autoSplit": true,
122
+ "selfReflection": true
123
+ }
124
+ }
125
+ ```
126
+
127
+ | Field | Type | Description |
128
+ |-------|------|-------------|
129
+ | `add` | boolean | Automatically stage changes |
130
+ | `cached` | boolean | Only commit staged changes |
131
+ | `sendit` | boolean | Skip confirmation prompts |
132
+ | `interactive` | boolean | Enable interactive mode |
133
+ | `amend` | boolean | Amend previous commit |
134
+ | `push` | boolean \| string | Push after commit (true or remote name) |
135
+ | `messageLimit` | number | Maximum commit message length |
136
+ | `context` | string | Additional context for AI |
137
+ | `contextFiles` | string[] | Files to include in context |
138
+ | `maxDiffBytes` | number | Maximum diff size to analyze |
139
+ | `model` | string | AI model for commit messages |
140
+ | `maxAgenticIterations` | number | Max agentic workflow iterations |
141
+ | `allowCommitSplitting` | boolean | Allow splitting large commits |
142
+ | `autoSplit` | boolean | Automatically split commits |
143
+ | `selfReflection` | boolean | Enable self-reflection mode |
144
+
145
+ ### Release Configuration
146
+
147
+ ```json
148
+ {
149
+ "release": {
150
+ "from": "v1.0.0",
151
+ "to": "HEAD",
152
+ "messageLimit": 150,
153
+ "context": "Release context",
154
+ "contextFiles": ["./RELEASE_NOTES.md"],
155
+ "interactive": true,
156
+ "focus": "bug fixes and features",
157
+ "maxDiffBytes": 1000000,
158
+ "model": "gpt-4o",
159
+ "noMilestones": false,
160
+ "fromMain": false,
161
+ "maxAgenticIterations": 3,
162
+ "selfReflection": true
163
+ }
164
+ }
165
+ ```
166
+
167
+ | Field | Type | Description |
168
+ |-------|------|-------------|
169
+ | `from` | string | Starting commit/tag for release notes |
170
+ | `to` | string | Ending commit/tag for release notes |
171
+ | `messageLimit` | number | Maximum release note length |
172
+ | `context` | string | Additional context for AI |
173
+ | `contextFiles` | string[] | Files to include in context |
174
+ | `interactive` | boolean | Enable interactive mode |
175
+ | `focus` | string | Focus area for release notes |
176
+ | `maxDiffBytes` | number | Maximum diff size to analyze |
177
+ | `model` | string | AI model for release notes |
178
+ | `noMilestones` | boolean | Skip milestone detection |
179
+ | `fromMain` | boolean | Generate from main branch |
180
+ | `maxAgenticIterations` | number | Max agentic workflow iterations |
181
+ | `selfReflection` | boolean | Enable self-reflection mode |
182
+
183
+ ### Review Configuration
184
+
185
+ ```json
186
+ {
187
+ "review": {
188
+ "includeCommitHistory": true,
189
+ "includeRecentDiffs": true,
190
+ "includeReleaseNotes": false,
191
+ "includeGithubIssues": false,
192
+ "commitHistoryLimit": 50,
193
+ "diffHistoryLimit": 10,
194
+ "releaseNotesLimit": 5,
195
+ "githubIssuesLimit": 20,
196
+ "context": "Review context",
197
+ "sendit": false,
198
+ "note": "Review note text",
199
+ "editorTimeout": 300000,
200
+ "maxContextErrors": 3,
201
+ "model": "gpt-4o",
202
+ "file": "./review-notes.md",
203
+ "directory": "./reviews"
204
+ }
205
+ }
206
+ ```
207
+
208
+ | Field | Type | Description |
209
+ |-------|------|-------------|
210
+ | `includeCommitHistory` | boolean | Include commit history in review |
211
+ | `includeRecentDiffs` | boolean | Include recent diffs |
212
+ | `includeReleaseNotes` | boolean | Include release notes |
213
+ | `includeGithubIssues` | boolean | Include GitHub issues |
214
+ | `commitHistoryLimit` | number | Max commits to include |
215
+ | `diffHistoryLimit` | number | Max diffs to include |
216
+ | `releaseNotesLimit` | number | Max release notes to include |
217
+ | `githubIssuesLimit` | number | Max GitHub issues to include |
218
+ | `context` | string | Additional context for review |
219
+ | `sendit` | boolean | Skip confirmation prompts |
220
+ | `note` | string | Review note text |
221
+ | `editorTimeout` | number | Editor timeout in milliseconds |
222
+ | `maxContextErrors` | number | Max context loading errors |
223
+ | `model` | string | AI model for reviews |
224
+ | `file` | string | File path to read review note from |
225
+ | `directory` | string | Directory to process review files |
226
+
227
+ ### Publish Configuration
228
+
229
+ ```json
230
+ {
231
+ "publish": {
232
+ "mergeMethod": "squash",
233
+ "from": "working",
234
+ "targetVersion": "1.0.0",
235
+ "interactive": true,
236
+ "skipAlreadyPublished": true,
237
+ "forceRepublish": false,
238
+ "linkWorkspacePackages": true,
239
+ "unlinkWorkspacePackages": true,
240
+ "checksTimeout": 300000,
241
+ "skipUserConfirmation": false,
242
+ "syncTarget": true,
243
+ "sendit": false,
244
+ "waitForReleaseWorkflows": true,
245
+ "releaseWorkflowsTimeout": 600000,
246
+ "releaseWorkflowNames": ["npm-publish", "release"],
247
+ "targetBranch": "main",
248
+ "noMilestones": false,
249
+ "fromMain": false,
250
+ "skipPrePublishMerge": false,
251
+ "agenticPublish": true,
252
+ "agenticPublishMaxIterations": 5,
253
+ "skipLinkCleanup": false
254
+ }
255
+ }
256
+ ```
257
+
258
+ | Field | Type | Description |
259
+ |-------|------|-------------|
260
+ | `mergeMethod` | `"merge"` \| `"squash"` \| `"rebase"` | Git merge method |
261
+ | `from` | string | Source branch for publish |
262
+ | `targetVersion` | string | Target version to publish |
263
+ | `interactive` | boolean | Enable interactive mode |
264
+ | `skipAlreadyPublished` | boolean | Skip already published packages |
265
+ | `forceRepublish` | boolean | Force republish packages |
266
+ | `linkWorkspacePackages` | boolean | Link workspace packages |
267
+ | `unlinkWorkspacePackages` | boolean | Unlink after publish |
268
+ | `checksTimeout` | number | Timeout for CI checks (ms) |
269
+ | `skipUserConfirmation` | boolean | Skip confirmation prompts |
270
+ | `syncTarget` | boolean | Sync with target branch |
271
+ | `sendit` | boolean | Skip all prompts |
272
+ | `waitForReleaseWorkflows` | boolean | Wait for release workflows |
273
+ | `releaseWorkflowsTimeout` | number | Workflow timeout (ms) |
274
+ | `releaseWorkflowNames` | string[] | Workflow names to wait for |
275
+ | `targetBranch` | string | Target branch for publish |
276
+ | `noMilestones` | boolean | Skip milestone detection |
277
+ | `fromMain` | boolean | Publish from main branch |
278
+ | `skipPrePublishMerge` | boolean | Skip pre-publish merge |
279
+ | `agenticPublish` | boolean | Use agentic publish workflow |
280
+ | `agenticPublishMaxIterations` | number | Max agentic iterations |
281
+ | `skipLinkCleanup` | boolean | Skip link cleanup |
282
+
283
+ ### Branch Configuration
284
+
285
+ ```json
286
+ {
287
+ "branches": {
288
+ "working": {
289
+ "targetBranch": "main",
290
+ "developmentBranch": true,
291
+ "version": {
292
+ "type": "prerelease",
293
+ "increment": true,
294
+ "incrementLevel": "patch",
295
+ "tag": "dev"
296
+ }
297
+ },
298
+ "main": {
299
+ "targetBranch": "main",
300
+ "developmentBranch": false,
301
+ "version": {
302
+ "type": "release",
303
+ "increment": true,
304
+ "incrementLevel": "minor"
305
+ }
306
+ }
307
+ }
308
+ }
309
+ ```
310
+
311
+ | Field | Type | Description |
312
+ |-------|------|-------------|
313
+ | `targetBranch` | string | Target branch for merges |
314
+ | `developmentBranch` | boolean | Is this a development branch? |
315
+ | `version.type` | `"release"` \| `"prerelease"` | Version type |
316
+ | `version.increment` | boolean | Auto-increment version |
317
+ | `version.incrementLevel` | `"patch"` \| `"minor"` \| `"major"` | Increment level |
318
+ | `version.tag` | string | Prerelease tag (e.g., "dev", "beta") |
319
+
320
+ ### Link Configuration
321
+
322
+ ```json
323
+ {
324
+ "link": {
325
+ "scopeRoots": {
326
+ "@grunnverk": "../../grunnverk",
327
+ "@riotprompt": "../../kjerneverk",
328
+ "@theunwalked": "../../utilarium"
329
+ },
330
+ "dryRun": false,
331
+ "packageArgument": "@grunnverk/core"
332
+ }
333
+ }
334
+ ```
335
+
336
+ | Field | Type | Description |
337
+ |-------|------|-------------|
338
+ | `scopeRoots` | Record<string, string> | Scope to directory mappings |
339
+ | `dryRun` | boolean | Run without making changes |
340
+ | `packageArgument` | string | Specific package to link |
341
+
342
+ ### Tree Configuration
343
+
344
+ ```json
345
+ {
346
+ "tree": {
347
+ "parallel": true,
348
+ "maxConcurrency": 4,
349
+ "continueOnError": false,
350
+ "skipDependencyCheck": false,
351
+ "includeRoot": false,
352
+ "topological": true,
353
+ "reverse": false,
354
+ "filter": ["@grunnverk/*"],
355
+ "exclude": ["@grunnverk/test-*"],
356
+ "scope": "@grunnverk",
357
+ "since": "v1.0.0",
358
+ "uncommitted": false,
359
+ "changed": false
360
+ }
361
+ }
362
+ ```
363
+
364
+ | Field | Type | Description |
365
+ |-------|------|-------------|
366
+ | `parallel` | boolean | Execute commands in parallel |
367
+ | `maxConcurrency` | number | Max parallel executions |
368
+ | `continueOnError` | boolean | Continue if a package fails |
369
+ | `skipDependencyCheck` | boolean | Skip dependency validation |
370
+ | `includeRoot` | boolean | Include root package |
371
+ | `topological` | boolean | Use topological order |
372
+ | `reverse` | boolean | Reverse execution order |
373
+ | `filter` | string[] | Package name patterns to include |
374
+ | `exclude` | string[] | Package name patterns to exclude |
375
+ | `scope` | string | Scope to filter packages |
376
+ | `since` | string | Only packages changed since commit |
377
+ | `uncommitted` | boolean | Only packages with uncommitted changes |
378
+ | `changed` | boolean | Only packages with changes |
379
+
380
+ ### Workspace Configuration
381
+
382
+ ```json
383
+ {
384
+ "workspace": {
385
+ "excludeSubprojects": ["doc/", "docs/", "test-*/", "examples/"]
386
+ }
387
+ }
388
+ ```
389
+
390
+ | Field | Type | Description |
391
+ |-------|------|-------------|
392
+ | `excludeSubprojects` | string[] | Patterns for subprojects to exclude from workspace scanning. Useful for excluding documentation sites, test fixtures, and example projects that aren't actual packages. Default: `["doc/", "docs/", "test-*/"]` |
393
+
394
+ **Note**: The workspace configuration affects MCP resources like `kodrdriv://workspace`, `kodrdriv://tree-graph`, and `kodrdriv://package` by filtering out directories that match the exclusion patterns when scanning for packages. This is particularly useful in monorepos where documentation sites or test fixtures contain `package.json` files but shouldn't be treated as workspace packages.
395
+
396
+ ## Complete Example
397
+
398
+ Here's a complete example of a Cursor MCP configuration for Kodrdriv:
399
+
400
+ ```json
401
+ {
402
+ "mcpServers": {
403
+ "kodrdriv": {
404
+ "command": "node",
405
+ "args": ["/Users/tobrien/gitw/grunnverk/kodrdriv/dist/mcp-server.js"],
406
+ "config": {
407
+ "verbose": true,
408
+ "model": "gpt-4o",
409
+ "openaiReasoning": "medium",
410
+ "contextDirectories": ["./docs", "./guide"],
411
+ "commit": {
412
+ "add": true,
413
+ "messageLimit": 100,
414
+ "maxAgenticIterations": 5,
415
+ "allowCommitSplitting": true,
416
+ "autoSplit": true,
417
+ "selfReflection": true,
418
+ "model": "gpt-4o"
419
+ },
420
+ "release": {
421
+ "messageLimit": 150,
422
+ "maxAgenticIterations": 3,
423
+ "selfReflection": true,
424
+ "interactive": true,
425
+ "model": "gpt-4o"
426
+ },
427
+ "review": {
428
+ "includeCommitHistory": true,
429
+ "includeRecentDiffs": true,
430
+ "commitHistoryLimit": 50,
431
+ "diffHistoryLimit": 10,
432
+ "model": "gpt-4o"
433
+ },
434
+ "publish": {
435
+ "mergeMethod": "squash",
436
+ "skipAlreadyPublished": true,
437
+ "linkWorkspacePackages": true,
438
+ "unlinkWorkspacePackages": true,
439
+ "waitForReleaseWorkflows": true,
440
+ "agenticPublish": true,
441
+ "agenticPublishMaxIterations": 5
442
+ },
443
+ "branches": {
444
+ "working": {
445
+ "targetBranch": "main",
446
+ "developmentBranch": true,
447
+ "version": {
448
+ "type": "prerelease",
449
+ "increment": true,
450
+ "incrementLevel": "patch",
451
+ "tag": "dev"
452
+ }
453
+ },
454
+ "main": {
455
+ "targetBranch": "main",
456
+ "developmentBranch": false,
457
+ "version": {
458
+ "type": "release",
459
+ "increment": true,
460
+ "incrementLevel": "minor"
461
+ }
462
+ }
463
+ },
464
+ "link": {
465
+ "scopeRoots": {
466
+ "@grunnverk": "../../grunnverk",
467
+ "@riotprompt": "../../kjerneverk",
468
+ "@theunwalked": "../../utilarium"
469
+ }
470
+ },
471
+ "tree": {
472
+ "parallel": true,
473
+ "maxConcurrency": 4,
474
+ "topological": true
475
+ },
476
+ "workspace": {
477
+ "excludeSubprojects": ["doc/", "docs/", "test-*/", "examples/"]
478
+ }
479
+ }
480
+ }
481
+ }
482
+ }
483
+ ```
484
+
485
+ ## Configuration Priority Model
486
+
487
+ ```
488
+ MCP Config Present?
489
+ ├─ YES → Use MCP config exclusively
490
+ └─ NO → Discover from files
491
+ ├─ Working directory?
492
+ │ ├─ YES → Start discovery from working directory
493
+ │ └─ NO → Use current directory
494
+ └─ Walk up directory tree looking for config files
495
+ ```
496
+
497
+ ## File-Based Fallback
498
+
499
+ When MCP config is not provided, Kodrdriv discovers configuration files in this order:
500
+
501
+ 1. `.kodrdriv.yaml` or `.kodrdriv.yml`
502
+ 2. `.kodrdriv.json`
503
+ 3. `kodrdriv.yaml` or `kodrdriv.yml`
504
+ 4. `kodrdriv.json`
505
+ 5. User config at `~/.kodrdriv/`
506
+
507
+ ## CheckConfig Tool
508
+
509
+ Every Kodrdriv MCP tool automatically includes the `check_config` tool for inspecting configuration.
510
+
511
+ ### Usage
512
+
513
+ ```json
514
+ {
515
+ "tool": "check_config",
516
+ "input": {
517
+ "verbose": true,
518
+ "includeConfig": true
519
+ }
520
+ }
521
+ ```
522
+
523
+ ### Output
524
+
525
+ ```json
526
+ {
527
+ "source": "mcp",
528
+ "hierarchical": false,
529
+ "config": {
530
+ "model": "gpt-4o",
531
+ "commit": {
532
+ "messageLimit": 100
533
+ }
534
+ },
535
+ "summary": "Configuration loaded from MCP invocation"
536
+ }
537
+ ```
538
+
539
+ ### When to Use CheckConfig
540
+
541
+ - **Debugging**: When Kodrdriv isn't behaving as expected
542
+ - **Verification**: To confirm MCP config is being used
543
+ - **Discovery**: To see which config files were found
544
+ - **Documentation**: To understand the current configuration
545
+
546
+ ## Best Practices
547
+
548
+ ### For Users
549
+
550
+ 1. **Start with MCP config** - Simpler than file-based for MCP tools
551
+ 2. **Use CheckConfig** - To verify your configuration
552
+ 3. **Keep it simple** - Only configure what you need to change
553
+ 4. **Test incrementally** - Add config options one at a time
554
+ 5. **Use defaults** - Kodrdriv has sensible defaults for most options
555
+
556
+ ### For AI Assistants
557
+
558
+ 1. **Use CheckConfig first** - When debugging configuration issues
559
+ 2. **Check verbose output** - To understand hierarchical merging
560
+ 3. **Verify MCP config** - Confirm it's being used when expected
561
+ 4. **Guide users** - Help them understand configuration sources
562
+ 5. **Respect dry-run** - Always check `dryRun` setting before making changes
563
+
564
+ ## FAQ
565
+
566
+ ### Can I use both MCP and file config?
567
+
568
+ No. If MCP config is provided, it's used exclusively. This is the "simplifying assumption" that makes configuration predictable.
569
+
570
+ ### How do I know which config is being used?
571
+
572
+ Use the `check_config` tool. It shows the source (`mcp`, `file`, or `defaults`) and the actual configuration values.
573
+
574
+ ### What happens if MCP config is invalid?
575
+
576
+ The tool throws a validation error with detailed information about what's wrong. Use CheckConfig to verify your configuration before running tools.
577
+
578
+ ### Can I override just one field via MCP?
579
+
580
+ No. MCP config must be complete. If you provide MCP config, it replaces all file-based config. This prevents confusion about which values come from where.
581
+
582
+ ### How do I migrate from file-based to MCP config?
583
+
584
+ 1. Use CheckConfig to see your current file-based config
585
+ 2. Copy the configuration values
586
+ 3. Convert to JSON format
587
+ 4. Add to your MCP server configuration in `~/.cursor/mcp.json`
588
+ 5. Optionally remove file-based config files
589
+
590
+ ### Where should I put my MCP configuration?
591
+
592
+ For Cursor, add it to `~/.cursor/mcp.json`. For other MCP clients, consult their documentation for the MCP server configuration file location.
593
+
594
+ ## Related Documentation
595
+
596
+ - [CardiganTime MCP Configuration](https://utilarium.github.io/cardigantime/#mcp-integration)
597
+ - [Kodrdriv Configuration Guide](./configuration.md)
598
+ - [Kodrdriv Commands](./commands.md)
599
+ - [Kodrdriv Quickstart](./quickstart.md)
600
+
601
+ ## Security Considerations
602
+
603
+ ### Sensitive Values
604
+
605
+ CheckConfig automatically sanitizes sensitive configuration values:
606
+
607
+ - `password`, `secret`, `token`
608
+ - `apiKey`, `api_key`
609
+ - `auth`, `credential`
610
+ - `privateKey`, `private_key`
611
+ - `accessKey`, `access_key`
612
+
613
+ These are replaced with `"***"` in CheckConfig output.
614
+
615
+ ### Validation
616
+
617
+ All MCP configuration is validated against the Zod schema before use. Invalid configuration will throw an error with detailed validation messages.
618
+
619
+ ## Troubleshooting
620
+
621
+ ### MCP Config Not Working
622
+
623
+ **Symptoms**: You added MCP config but Kodrdriv uses file config
624
+
625
+ **Solution**:
626
+ 1. Run `check_config` to verify the source
627
+ 2. Check that your `mcp.json` has the `config` field
628
+ 3. Verify the JSON syntax is valid
629
+ 4. Restart your MCP client (Cursor)
630
+
631
+ ### Configuration Validation Errors
632
+
633
+ **Symptoms**: Kodrdriv throws validation errors
634
+
635
+ **Solution**:
636
+ 1. Check the error message for specific field issues
637
+ 2. Verify field types match the schema (boolean, string, number, etc.)
638
+ 3. Check enum values (e.g., `openaiReasoning` must be "low", "medium", or "high")
639
+ 4. Use CheckConfig to see the current configuration
640
+
641
+ ### Wrong Configuration Being Used
642
+
643
+ **Symptoms**: Kodrdriv uses unexpected configuration values
644
+
645
+ **Solution**:
646
+ 1. Run `check_config` with `verbose: true`
647
+ 2. Check if MCP config is being used (`source: "mcp"`)
648
+ 3. If file-based, check which files are being loaded
649
+ 4. Remove or update conflicting configuration files
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grunnverk/kodrdriv",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "Create Intelligent Release Notes or Change Logs from Git",
5
5
  "main": "dist/main.js",
6
6
  "type": "module",
@@ -21,7 +21,7 @@
21
21
  "lint": "eslint . --ext .ts",
22
22
  "lint:fix": "eslint . --ext .ts --fix",
23
23
  "clean": "rm -rf dist",
24
- "precommit": "npm run build && npm run lint && npm run test && npm run mcp:test",
24
+ "precommit": "npm run lint && npm run build && npm run test && npm run mcp:test",
25
25
  "prepublishOnly": "npm run lint && npm run build && npm run test",
26
26
  "mcp:build": "vite build && chmod 755 ./dist/mcp-server.js 2>/dev/null || true",
27
27
  "mcp:inspect": "mcp-inspector npx -y @modelcontextprotocol/server-kodrdriv",
@@ -46,22 +46,22 @@
46
46
  "node": ">=24.0.0"
47
47
  },
48
48
  "dependencies": {
49
- "@grunnverk/ai-service": "^1.5.0",
50
- "@grunnverk/audio-tools": "^1.5.0",
51
- "@grunnverk/commands-audio": "^1.5.0",
52
- "@grunnverk/commands-git": "^1.5.0",
53
- "@grunnverk/commands-publish": "^1.5.0",
54
- "@grunnverk/commands-tree": "^1.5.0",
55
- "@grunnverk/core": "^1.5.0",
56
- "@grunnverk/git-tools": "^1.5.0",
57
- "@grunnverk/github-tools": "^1.5.0",
58
- "@grunnverk/shared": "^1.5.2",
59
- "@grunnverk/tree-core": "^1.5.0",
60
- "@grunnverk/tree-execution": "^1.5.0",
49
+ "@grunnverk/ai-service": "^1.5.1",
50
+ "@grunnverk/audio-tools": "^1.5.1",
51
+ "@grunnverk/commands-audio": "^1.5.1",
52
+ "@grunnverk/commands-git": "^1.5.1",
53
+ "@grunnverk/commands-publish": "^1.5.1",
54
+ "@grunnverk/commands-tree": "^1.5.1",
55
+ "@grunnverk/core": "^1.5.2",
56
+ "@grunnverk/git-tools": "^1.5.1",
57
+ "@grunnverk/github-tools": "^1.5.1",
58
+ "@grunnverk/shared": "^1.5.3",
59
+ "@grunnverk/tree-core": "^1.5.1",
60
+ "@grunnverk/tree-execution": "^1.5.1",
61
61
  "@modelcontextprotocol/sdk": "^1.25.3",
62
62
  "@octokit/rest": "^22.0.0",
63
63
  "@riotprompt/riotprompt": "^0.0.21",
64
- "@theunwalked/cardigantime": "^0.0.22",
64
+ "@theunwalked/cardigantime": "^0.0.23",
65
65
  "@theunwalked/unplayable": "^0.0.28",
66
66
  "@types/semver": "^7.7.0",
67
67
  "commander": "^14.0.0",