@kontextmind/kxm 0.7.128 → 0.7.131

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 (65) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.kxm/README.md +4 -1
  3. package/.kxm/agents/coordinator.yaml +1 -0
  4. package/.kxm/agents/critic-arch.yaml +1 -4
  5. package/.kxm/agents/critic-cli.yaml +1 -4
  6. package/.kxm/agents/implementer.yaml +1 -4
  7. package/.kxm/workflows/implement-only.yaml +1 -1
  8. package/.kxm/workflows/review-arch-only.yaml +1 -1
  9. package/.kxm/workflows/review-cli-only.yaml +1 -1
  10. package/CHANGELOG.md +42 -1
  11. package/docs/architecture/inventory.md +1 -1
  12. package/docs/concepts/architecture.md +1 -1
  13. package/docs/concepts/data-and-storage.md +1 -1
  14. package/docs/contracts/README.md +1 -1
  15. package/docs/contracts/migration.md +12 -8
  16. package/docs/contracts/routing.md +3 -3
  17. package/docs/contributing/assignment-runner.md +14 -15
  18. package/docs/contributing/development.md +22 -6
  19. package/docs/contributing/harness-routing-internals.md +8 -8
  20. package/docs/glossary.md +1 -1
  21. package/docs/guides/agent-skills.md +1 -1
  22. package/docs/operations/backup-and-restore.md +7 -7
  23. package/docs/operations/upgrade.md +2 -2
  24. package/docs/reference/cli-reference.md +37 -14
  25. package/docs/reference/config-reference.md +81 -155
  26. package/docs/reference/harness-routing.md +29 -21
  27. package/docs/reference/workflow-catalog.md +4 -4
  28. package/docs/start/first-workflow.md +1 -1
  29. package/examples/project/.kxm/agents/coordinator.yaml +1 -2
  30. package/examples/project/.kxm/agents/critic-1.yaml +1 -3
  31. package/examples/project/.kxm/agents/critic-2.yaml +1 -2
  32. package/examples/project/.kxm/agents/critic-3.yaml +2 -3
  33. package/examples/project/.kxm/agents/implementer.yaml +1 -2
  34. package/examples/project/.kxm/agents/planner.yaml +1 -2
  35. package/examples/project/.kxm/agents/reproducer.yaml +1 -2
  36. package/examples/project/.kxm/agents/reviewer.yaml +1 -2
  37. package/examples/project/.kxm/workflows/fix.yaml +0 -12
  38. package/package.json +8 -8
  39. package/plugins/kxm/.claude-plugin/plugin.json +1 -1
  40. package/plugins/kxm/dist/cli.js +2565 -465
  41. package/plugins/kxm/dist/mcp-server.js +1 -1
  42. package/plugins/kxm/dist/runtime-supervisor.js +683 -348
  43. package/plugins/kxm/dist/runtime.js +694 -358
  44. package/plugins/kxm/dist/server.js +17 -14
  45. package/plugins/kxm/package.json +1 -1
  46. package/plugins/kxm/skills/kxm/SKILL.md +1 -1
  47. package/plugins/kxm/skills/kxm-definitions/SKILL.md +8 -0
  48. package/plugins/kxm/src/cli/lanes.ts +109 -4
  49. package/plugins/kxm/src/cli/project.ts +6 -6
  50. package/plugins/kxm/src/database.ts +25 -19
  51. package/plugins/kxm/src/engine.ts +168 -163
  52. package/plugins/kxm/src/init-guide-setup.ts +75 -15
  53. package/plugins/kxm/src/mcp-server.ts +1 -1
  54. package/plugins/kxm/src/oneshot-producer.ts +3 -15
  55. package/plugins/kxm/src/project-config.ts +83 -70
  56. package/plugins/kxm/src/routes.ts +26 -18
  57. package/plugins/kxm/src/runtime-service.ts +1 -0
  58. package/plugins/kxm/src/runtime-store.ts +390 -77
  59. package/plugins/kxm/src/runtime-supervisor.ts +87 -21
  60. package/plugins/kxm/src/suggest.ts +2 -2
  61. package/plugins/kxm/src/template.ts +2 -14
  62. package/schemas/agent.schema.json +8 -0
  63. package/scripts/roster-policy.d.mts +2 -1
  64. package/scripts/roster-policy.mjs +119 -22
  65. package/scripts/run-bounded.mjs +53 -0
@@ -99,35 +99,43 @@ pi auth check --model openrouter/qwen/qwen3-coder-plus --json --no-refresh
99
99
 
100
100
  ### How KXM builds a route
101
101
 
102
- - **Selector.** The selector is `<model.provider>/<model.model>`, taken from the agent YAML. The provider must not contain `/`. The model id may, for example `qwen/qwen3-coder-plus` under `openrouter`.
103
- - **Harness.** The harness is the agent's `harness:`, or the project's `defaultHarness` (Pi) when the agent omits it. The selector string does not choose the harness, and neither does a roster entry.
104
- - **Admission.** The selector must be admitted, and it must be in the role roster when that role file exists. Agent id `implementer` maps to role `writer`.
102
+ - **Selector.** The selector is `<vendor>/<model>` from the selected `.kxm/models/<route>.yaml`. The agent names a `role`, `.kxm/roles/<role>.yaml` lists route ids, and the chosen roster entry names that model file. The model id may contain `/`, for example `openrouter/qwen/qwen3-coder-plus`.
103
+ - **Harness.** The harness is the `harness` field on that model file. An agent file does not select it.
104
+ - **Admission.** The selector must be admitted. The engine uses the first roster entry whose model file is readable and whose route is admitted.
105
105
  - **Dispatch probe.** Before spawning anything, the producer probes the exact harness, provider and model triple. It refuses unhosted pairs and the Pi brake.
106
106
  - **Effort.** The Runtime sets the thinking effort per attempt: the first attempt of a step runs at `low`, and any later attempt of the same step at `medium`. The live producer passes it as `--effort` to `claude`, as `model_reasoning_effort` to `codex` and as `--reasoning-effort` to `grok`. `agy`, `kimi` and `pi` get no effort flag. A roster entry's `effort` is display-only.
107
107
 
108
108
  ### Agent YAML
109
109
 
110
- This is the native route, from `.kxm/agents/implementer.yaml`:
110
+ An agent names a role and nothing else about the route:
111
+
112
+ ```yaml
113
+ role: writer
114
+ ```
115
+
116
+ `harness` and `model` on an agent file are refused at load (`retired_agent_routing_fields`). A step `model` is refused at load and again at dispatch (`producer_route_unsupported`).
117
+
118
+ ### Model file
119
+
120
+ This is the native route, from `.kxm/models/grok-native.yaml`:
111
121
 
112
122
  ```yaml
113
123
  harness: grok
114
- model:
115
- provider: xai
116
- model: grok-4.6
124
+ model: grok-4.7
125
+ vendor: xai
117
126
  ```
118
127
 
119
- The selector is `xai/grok-4.6` and the harness is `grok`. The live one-shot producer spawns `grok --model grok-4.6 … --output-format json --single <prompt>`.
128
+ The selector is `xai/grok-4.7` and the harness is `grok`. The live one-shot producer spawns `grok --model grok-4.7 … --output-format json --single <prompt>`.
120
129
 
121
- This is the same model through Pi and OpenRouter:
130
+ This is the same vendor through Pi and OpenRouter, which the brake refuses:
122
131
 
123
132
  ```yaml
124
- # harness omitted: Pi
125
- model:
126
- provider: openrouter
127
- model: x-ai/grok-4.6
133
+ harness: pi
134
+ model: openrouter/x-ai/grok-4.6
135
+ vendor: xai
128
136
  ```
129
137
 
130
- The selector is `openrouter/x-ai/grok-4.6` and the harness is `pi`. The Pi brake refuses it before Pi starts, because the vendor segment `x-ai` is xAI, which has a native harness. A vendor with no native harness runs in the same shape: with `model: qwen/qwen3-coder-plus`, Pi is spawned with `--model openrouter/qwen/qwen3-coder-plus`, its read-only flags (section 3) and `-p --mode json`. Write `model.model` exactly as the provider names it. For OpenRouter that is the vendor slug, so `x-ai`, not `xai`.
138
+ The selector is `openrouter/x-ai/grok-4.6` and the harness is `pi`. The Pi brake refuses it before Pi starts, because the vendor segment `x-ai` is xAI, which has a native harness. A vendor with no native harness runs in the same shape: with `model: openrouter/qwen/qwen3-coder-plus`, Pi is spawned with `--model openrouter/qwen/qwen3-coder-plus`, its read-only flags (section 3) and `-p --mode json`. Write `model` exactly as the provider names it. For OpenRouter that is the vendor slug, so `x-ai`, not `xai`.
131
139
 
132
140
  The harness and the selector have to agree. Pi refuses `provider: xai` and `openrouter/x-ai/…`. `grok` refuses `provider: openrouter`. [What the brake refuses](#what-the-brake-refuses) has the exact messages.
133
141
 
@@ -152,9 +160,9 @@ roster:
152
160
 
153
161
  `grok-native` resolves to `.kxm/models/grok-native.yaml`: harness `grok`, model `grok-4.7`, vendor `xai`, status `admitted`, permission `edit`. `qwen-openrouter-pi` is harness `pi`, model `openrouter/qwen/qwen3-coder-plus`, vendor `alibaba`. `gemini-agy` is harness `agy`, model `gemini-3.8-flash-high`, vendor `google`. `kxm role list` prints the first route id as the primary, for example `(grok-native)`.
154
162
 
155
- The model that runs a step still comes from the agent file. The harness is the agent's `harness:`, or Pi when the agent omits it. A route file records which harness can host that model; it does not replace the agent. If the implementer agent declares `harness: grok`, only the Grok selector can run under it. A Pi selector under that agent fails closed with `grok_not_authenticated: grok harness not detected (harness_unhosted_model)`. To run a Pi selector, create a separate agent with `harness:` omitted. The engine does not walk the roster to fail over on its own.
163
+ Dispatch resolves a step from the agent `role`, then `.kxm/roles/<role>.yaml`, then the selected `.kxm/models/<route>.yaml`. That model file carries `harness`, `model`, `vendor`, `status`, and `permissions`. The engine walks the roster in order and uses the first admitted route whose model file is readable. A missing or unreadable model file is a refusal (`roster_model_unreadable` at load, `producer_route_unsupported` at dispatch), not a skip to the next entry. A route file that names a harness the model cannot run on still fails closed with `harness_unhosted_model`.
156
164
 
157
- Dispatch still reads `.kxm/roster.yaml` until P2. Role files are what `kxm role` and the Runtime membership check use.
165
+ Role files are what `kxm role` and the Runtime membership check use.
158
166
 
159
167
  ### Route ids in `.kxm/routes.yaml`
160
168
 
@@ -308,7 +316,7 @@ kxm routing report --file ./run-events.jsonl --equivalent-list-cost
308
316
 
309
317
  ## 3. Examples: the same model, two routes
310
318
 
311
- Each example shows the agent YAML for the native route and for the same model through Pi, and which one the rules pick. For a native vendor, the Pi brake refuses the Pi column; it is shown so that you recognize the id. Whether a route is admitted is in your `.kxm/routes.yaml`. List prices and context sizes are in `.kxm/models/inventory.yaml` after `kxm models inventory-refresh`, and `pi --list-models` shows context, max output, thinking and image support per model. A provider missing from `pi --list-models` usually has no credentials, which is itself a readiness hint.
319
+ Each example shows the model file for the native route and for the same model through Pi, and which one the rules pick. For a native vendor, the Pi brake refuses the Pi column; it is shown so that you recognize the id. Whether a route is admitted is in your `.kxm/routes.yaml`. List prices and context sizes are in `.kxm/models/inventory.yaml` after `kxm models inventory-refresh`, and `pi --list-models` shows context, max output, thinking and image support per model. A provider missing from `pi --list-models` usually has no credentials, which is itself a readiness hint.
312
320
 
313
321
  ### How the live producer runs each harness
314
322
 
@@ -330,7 +338,7 @@ The Runtime does not run a step live when it has `write` access to a repository;
330
338
 
331
339
  | | Native `grok` | Pi + OpenRouter |
332
340
  |---|---|---|
333
- | Agent YAML | `harness: grok`, `provider: xai`, `model: grok-4.6` | `harness:` omitted, `provider: openrouter`, `model: x-ai/grok-4.6` |
341
+ | Model file | `harness: grok`, `model: grok-4.6`, `vendor: xai` | `harness: pi`, `model: openrouter/x-ai/grok-4.6`, `vendor: xai` |
334
342
  | Selector | `xai/grok-4.6` | `openrouter/x-ai/grok-4.6` |
335
343
  | Billing | grok.com subscription (OAuth) | OpenRouter credit |
336
344
  | Recorded `costBasis` | `unknown` | None: the brake refuses it before dispatch |
@@ -350,7 +358,7 @@ pi auth check --provider xai --json --no-refresh
350
358
 
351
359
  | | Native `codex` | Pi + OpenRouter |
352
360
  |---|---|---|
353
- | Agent YAML | `harness: codex`, `provider: openai`, `model: gpt-5.6-sol` | `harness:` omitted, `provider: openrouter`, `model: openai/gpt-5.6-sol` |
361
+ | Model file | `harness: codex`, `model: gpt-5.6-sol`, `vendor: openai` | `harness: pi`, `model: openrouter/openai/gpt-5.6-sol`, `vendor: openai` |
354
362
  | Selector | `openai/gpt-5.6-sol` | `openrouter/openai/gpt-5.6-sol` |
355
363
  | Readiness | Needs `codex` auth `yes` with `authMethod: ChatGPT` | Never reached: the brake refuses it first |
356
364
  | Billing | ChatGPT subscription | OpenRouter credit |
@@ -373,7 +381,7 @@ A larger context window on the OpenRouter route does not make OpenRouter an allo
373
381
 
374
382
  | | Native `claude` | Pi + OpenRouter |
375
383
  |---|---|---|
376
- | Agent YAML | `harness: claude`, `provider: anthropic`, `model: fable` | `harness:` omitted, `provider: openrouter`, `model: anthropic/claude-fable-5.1` |
384
+ | Model file | `harness: claude`, `model: fable`, `vendor: anthropic` | `harness: pi`, `model: openrouter/anthropic/claude-fable-5.1`, `vendor: anthropic` |
377
385
  | Selector | `anthropic/fable` | `openrouter/anthropic/claude-fable-5.1` |
378
386
  | Billing | claude.ai subscription | OpenRouter credit |
379
387
  | Recorded `costBasis` | `unmetered`, `priceRef: subscription:claude`, plus a list estimate when `prices.yaml` has an `anthropic` row dated today | None: refused before dispatch |
@@ -385,7 +393,7 @@ A larger context window on the OpenRouter route does not make OpenRouter an allo
385
393
 
386
394
  | | Native `agy` | `antigravity` Pi provider | Pi + OpenRouter |
387
395
  |---|---|---|---|
388
- | Agent YAML | `harness: agy`, `provider: google`, `model: gemini-3.8-flash-high` | `harness:` omitted, `provider: antigravity`, `model: gemini-3.8-flash` | `harness:` omitted, `provider: openrouter`, `model: google/gemini-3.8-flash` |
396
+ | Model file | `harness: agy`, `model: gemini-3.8-flash-high`, `vendor: google` | `harness: pi`, `model: antigravity/gemini-3.8-flash`, `vendor: google` | `harness: pi`, `model: openrouter/google/gemini-3.8-flash`, `vendor: google` |
389
397
  | Selector | `google/gemini-3.8-flash-high` | `antigravity/gemini-3.8-flash` | `openrouter/google/gemini-3.8-flash` |
390
398
  | Readiness | Needs `agy` auth `yes` (`antigravity-oauth`) | Registered only by the KXM Pi extension. `pi auth check` never loads extensions, so `pi auth check --provider antigravity` returns `provider_not_found`. | Never reached: the brake refuses it (vendor segment `google`) |
391
399
  | Billing | Google subscription | Google subscription | OpenRouter credit |
@@ -1094,11 +1094,11 @@ This cross-reference points each software and security workflow at the KXM pages
1094
1094
 
1095
1095
  These three files live in this repository's `.kxm/workflows`. `kxm init` does not write them.
1096
1096
 
1097
- | Workflow | Replaces |
1097
+ | Workflow | Runs through |
1098
1098
  |---|---|
1099
- | `implement-only` | `just impl`. The recipe is retired once this lands. |
1100
- | `review-arch-only` | `just review-arch`. The recipe is retired once this lands. |
1101
- | `review-cli-only` | `just review-cli`. The recipe is retired once this lands. |
1099
+ | `implement-only` | `kxm lane run`. Replaces a retired transport recipe. |
1100
+ | `review-arch-only` | `kxm lane run`. Replaces a retired transport recipe. |
1101
+ | `review-cli-only` | `kxm lane run`. Replaces a retired transport recipe. |
1102
1102
 
1103
1103
  ## Related
1104
1104
 
@@ -254,7 +254,7 @@ The file is a `kxm.workflow.v1` definition. `coordinator` names the agent that o
254
254
  | Cost | None | Model usage on your accounts |
255
255
 
256
256
  > [!WARNING]
257
- > Without `--simulated`, `kxm runs drive` calls live harnesses. An agent whose model is not an admitted route fails with `producer_route_not_admitted`. Read [Harness routing](../reference/harness-routing.md) before your first live drive. A live step with `write` access runs only on a harness with an audited writer profile (`pi` or `grok`), as a single assignment, in a project whose `limits.maxConcurrentRuns` is 1, and, when `.kxm/roster.yaml` exists, only on a route in its writer lineup; any other live write step is handed off. A live write step settles `passed` only when the checkout changed, and a read-only step that changes the checkout settles `failed`. Gate steps are exempt. The read-only `spec-and-plan` template needs none of this.
257
+ > Without `--simulated`, `kxm runs drive` calls live harnesses. An agent whose model is not an admitted route fails with `producer_route_not_admitted`. Read [Harness routing](../reference/harness-routing.md) before your first live drive. A live step with `write` access runs only on a harness with an audited writer profile (`pi` or `grok`), as a single assignment, in a project whose `limits.maxConcurrentRuns` is 1, and only on a route in the writer roster under `.kxm/roles/writer.yaml`; any other live write step is handed off. A live write step settles `passed` only when the checkout changed, and a read-only step that changes the checkout settles `failed`. Gate steps are exempt. The read-only `spec-and-plan` template needs none of this.
258
258
 
259
259
  ### Why start with `first` and not `default`
260
260
 
@@ -1,7 +1,6 @@
1
1
  schema: kxm.agent.v1
2
2
  purpose: Coordinate the pinned workflow and emit only schema-validated commands.
3
- model:
4
- profile: primary
3
+ role: planner
5
4
  tools:
6
5
  preset: coordinator
7
6
  defaultRepositoryAccess: read
@@ -1,8 +1,6 @@
1
1
  schema: kxm.agent.v1
2
2
  purpose: First fixed-identity critic for migrated strict producer policies.
3
- harness: claude
4
- model:
5
- profile: critic-claude
3
+ role: reviewer-arch
6
4
  tools:
7
5
  preset: read-only
8
6
  defaultRepositoryAccess: read
@@ -1,7 +1,6 @@
1
1
  schema: kxm.agent.v1
2
2
  purpose: Second fixed-identity critic for migrated strict producer policies.
3
- model:
4
- profile: critic-grok
3
+ role: reviewer-cli
5
4
  tools:
6
5
  preset: read-only
7
6
  defaultRepositoryAccess: read
@@ -1,7 +1,6 @@
1
1
  schema: kxm.agent.v1
2
- purpose: Third provider-distinct critic used by the KXM MOA target.
3
- model:
4
- profile: critic-gemini
2
+ purpose: Third architecture critic, bound to reviewer-arch like critic-1.
3
+ role: reviewer-arch
5
4
  tools:
6
5
  preset: read-only
7
6
  defaultRepositoryAccess: read
@@ -1,7 +1,6 @@
1
1
  schema: kxm.agent.v1
2
2
  purpose: Implement the approved plan in the assignment-owned repository worktree.
3
- model:
4
- tag: implementation
3
+ role: writer
5
4
  tools:
6
5
  preset: workspace-writer
7
6
  defaultRepositoryAccess: none
@@ -1,7 +1,6 @@
1
1
  schema: kxm.agent.v1
2
2
  purpose: Produce an implementation plan grounded in the pinned repositories and evidence.
3
- model:
4
- tag: planning
3
+ role: planner
5
4
  tools:
6
5
  preset: read-only
7
6
  defaultRepositoryAccess: read
@@ -1,7 +1,6 @@
1
1
  schema: kxm.agent.v1
2
2
  purpose: Create and execute a production-coupled failing reproduction without changing production code.
3
- model:
4
- tag: implementation
3
+ role: writer
5
4
  tools:
6
5
  preset: tests-writer
7
6
  defaultRepositoryAccess: none
@@ -1,7 +1,6 @@
1
1
  schema: kxm.agent.v1
2
2
  purpose: Independently review correctness, security, regression risk, and evidence.
3
- model:
4
- tag: critic
3
+ role: reviewer-cli
5
4
  tools:
6
5
  preset: read-only
7
6
  defaultRepositoryAccess: read
@@ -92,10 +92,6 @@ steps:
92
92
  agent: critic-1
93
93
  maxAttempts: 3
94
94
  description: Verify reporter-path coupling, failure causality, expected behavior, and absence of production edits.
95
- model:
96
- tag: critic
97
- capabilities:
98
- - structured-output
99
95
  repositories:
100
96
  control: read
101
97
  api: read
@@ -110,8 +106,6 @@ steps:
110
106
  maximum: 3
111
107
  maxParallel: 3
112
108
  maxAttemptsPerAssignment: 2
113
- distinctBy:
114
- - provider
115
109
  join:
116
110
  strategy: all-settled
117
111
  minimumPassed: 2
@@ -165,10 +159,6 @@ steps:
165
159
  agent: critic-1
166
160
  maxAttempts: 3
167
161
  description: Independently review the plan for correctness, scope, security, and regression risk.
168
- model:
169
- tag: critic
170
- capabilities:
171
- - structured-output
172
162
  repositories:
173
163
  control: read
174
164
  api: read
@@ -183,8 +173,6 @@ steps:
183
173
  maximum: 3
184
174
  maxParallel: 3
185
175
  maxAttemptsPerAssignment: 2
186
- distinctBy:
187
- - provider
188
176
  join:
189
177
  strategy: all-settled
190
178
  minimumPassed: 2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kontextmind/kxm",
3
- "version": "0.7.128",
3
+ "version": "0.7.131",
4
4
  "description": "KXM local-first multi-agent orchestration and operator dashboard",
5
5
  "type": "module",
6
6
  "author": "KontextMind",
@@ -34,12 +34,12 @@
34
34
  "build:runtime": "node scripts/build-runtime.mjs",
35
35
  "build": "npm run build:mcp && npm run build:runtime && npm run build:packages",
36
36
  "check:generated": "npm run build && node scripts/check-generated.mjs",
37
- "test:core": "npm run build && node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-concurrency=4 test/core/*.test.ts",
38
- "test:simulations": "npm run build && node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-concurrency=4 test/simulations/*.test.ts",
39
- "test:complete": "npm run build && node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-concurrency=4 test/core/*.test.ts test/simulations/*.test.ts",
40
- "test": "npm run build && node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-concurrency=4 test/core/*.test.ts packages/core/*/tests/unit/*.test.ts",
41
- "test:coverage:core": "npm run build && node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-concurrency=4 --experimental-test-coverage --test-coverage-lines=91 --test-coverage-branches=80 --test-coverage-functions=92 --test-coverage-include=plugins/kxm/src/**/*.ts --test-coverage-exclude=plugins/kxm/src/server.ts --test-coverage-exclude=plugins/kxm/src/mcp-server.ts --test-coverage-exclude=plugins/kxm/src/runtime-supervisor.ts --test-coverage-include=packages/core/*/src/**/*.ts test/core/*.test.ts packages/core/*/tests/unit/*.test.ts",
42
- "test:coverage:complete": "npm run build && node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-concurrency=4 --experimental-test-coverage --test-coverage-lines=93 --test-coverage-branches=80 --test-coverage-functions=93 --test-coverage-include=plugins/kxm/src/**/*.ts --test-coverage-exclude=plugins/kxm/src/server.ts --test-coverage-exclude=plugins/kxm/src/mcp-server.ts --test-coverage-exclude=plugins/kxm/src/runtime-supervisor.ts --test-coverage-include=packages/core/*/src/**/*.ts test/core/*.test.ts test/simulations/*.test.ts packages/core/*/tests/unit/*.test.ts",
37
+ "test:core": "npm run build && node scripts/run-bounded.mjs 1200000 node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-force-exit --test-concurrency=4 test/core/*.test.ts",
38
+ "test:simulations": "npm run build && node scripts/run-bounded.mjs 1200000 node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-force-exit --test-concurrency=4 test/simulations/*.test.ts",
39
+ "test:complete": "npm run build && node scripts/run-bounded.mjs 2400000 node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-force-exit --test-concurrency=4 test/core/*.test.ts test/simulations/*.test.ts",
40
+ "test": "npm run build && node scripts/run-bounded.mjs 1200000 node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-force-exit --test-concurrency=4 test/core/*.test.ts packages/core/*/tests/unit/*.test.ts",
41
+ "test:coverage:core": "npm run build && node scripts/run-bounded.mjs 2400000 node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-force-exit --test-concurrency=4 --experimental-test-coverage --test-coverage-lines=91 --test-coverage-branches=80 --test-coverage-functions=92 --test-coverage-include=plugins/kxm/src/**/*.ts --test-coverage-exclude=plugins/kxm/src/server.ts --test-coverage-exclude=plugins/kxm/src/mcp-server.ts --test-coverage-exclude=plugins/kxm/src/runtime-supervisor.ts --test-coverage-include=packages/core/*/src/**/*.ts test/core/*.test.ts packages/core/*/tests/unit/*.test.ts",
42
+ "test:coverage:complete": "npm run build && node scripts/run-bounded.mjs 2400000 node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-force-exit --test-concurrency=4 --experimental-test-coverage --test-coverage-lines=93 --test-coverage-branches=80 --test-coverage-functions=93 --test-coverage-include=plugins/kxm/src/**/*.ts --test-coverage-exclude=plugins/kxm/src/server.ts --test-coverage-exclude=plugins/kxm/src/mcp-server.ts --test-coverage-exclude=plugins/kxm/src/runtime-supervisor.ts --test-coverage-include=packages/core/*/src/**/*.ts test/core/*.test.ts test/simulations/*.test.ts packages/core/*/tests/unit/*.test.ts",
43
43
  "test:coverage": "npm run test:coverage:core",
44
44
  "typecheck": "tsc --noEmit",
45
45
  "lint:docs": "markdownlint-cli2",
@@ -48,7 +48,7 @@
48
48
  "verify": "npm test && npm run check && npm run check:generated",
49
49
  "validate:claude": "claude plugin validate . --strict && claude plugin validate plugins/kxm --strict",
50
50
  "validate:ci": "npm run test:coverage && npm run check && npm pack --dry-run",
51
- "validate:pr": "npm run build && npm run typecheck && node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-concurrency=4 test/core/artifacts-exist.test.ts test/core/ci-contract.test.ts test/core/envelope.test.ts test/core/envelope-contract.test.ts test/core/protocol.test.ts test/core/repo-root.test.ts test/core/routes-count.test.ts test/core/smoke.test.ts test/core/version-surfaces.test.ts && npm run check:versions && node scripts/check-generated.mjs",
51
+ "validate:pr": "npm run build && npm run typecheck && node scripts/run-bounded.mjs 1200000 node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-force-exit --test-concurrency=4 test/core/artifacts-exist.test.ts test/core/ci-contract.test.ts test/core/envelope.test.ts test/core/envelope-contract.test.ts test/core/protocol.test.ts test/core/repo-root.test.ts test/core/routes-count.test.ts test/core/smoke.test.ts test/core/version-surfaces.test.ts && npm run check:versions && node scripts/check-generated.mjs",
52
52
  "validate": "npm run validate:ci && npm run validate:claude",
53
53
  "test:packages": "npx nx run-many -t test --output-style=static",
54
54
  "check:packages": "npx nx run-many -t build,test:coverage,typecheck --output-style=static",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "kxm",
4
4
  "displayName": "KXM",
5
- "version": "0.7.128",
5
+ "version": "0.7.131",
6
6
  "description": "Headless multi-agent orchestration, durable workflows, and a live operator dashboard for Pi and Claude Code",
7
7
  "author": {
8
8
  "name": "KontextMind",