@grunnverk/kodrdriv 1.5.0 → 1.5.2
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 +2 -0
- package/WORKSPACE-EXCLUSION-FIX.md +99 -0
- package/dist/application.js +3 -3
- package/dist/application.js.map +1 -1
- package/dist/arguments.js +3 -4
- package/dist/arguments.js.map +1 -1
- package/dist/constants.js +3 -5
- package/dist/constants.js.map +1 -1
- package/dist/mcp/prompts/check_development.md +123 -147
- package/dist/mcp/prompts/dependency_update.md +53 -40
- package/dist/mcp/prompts/fix_and_commit.md +17 -6
- package/dist/mcp/prompts/publish.md +22 -6
- package/dist/mcp/prompts/tree_fix_and_commit.md +16 -7
- package/dist/mcp/prompts/tree_publish.md +23 -6
- package/dist/mcp-server.js +4883 -225
- package/dist/mcp-server.js.map +4 -4
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/guide/index.md +1 -0
- package/guide/mcp-configuration.md +649 -0
- package/package.json +18 -18
- package/BUG_TREE_PUBLISH_CONFIG_DIR.md +0 -79
|
@@ -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
|