@kontextmind/kxm 0.7.105 → 0.7.107
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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +11 -0
- package/docs/contributing/test-matrix.md +2 -0
- package/docs/reference/cli-reference.md +3 -1
- package/docs/reference/config-reference.md +1 -1
- package/package.json +7 -7
- package/plugins/kxm/.claude-plugin/plugin.json +1 -1
- package/plugins/kxm/dist/cli.js +2478 -2432
- package/plugins/kxm/dist/mcp-server.js +1 -1
- package/plugins/kxm/dist/runtime-supervisor.js +11 -9
- package/plugins/kxm/dist/runtime.js +11 -9
- package/plugins/kxm/package.json +1 -1
- package/plugins/kxm/src/cli/roles.ts +47 -40
- package/plugins/kxm/src/mcp-server.ts +1 -1
- package/plugins/kxm/src/project-config.ts +33 -5
package/CHANGELOG.md
CHANGED
|
@@ -345,6 +345,17 @@ All notable user-facing changes are documented here. The project follows [Semant
|
|
|
345
345
|
picking a global definition wrote the one-step scaffold under its id and reported
|
|
346
346
|
success. It now writes the global definition's content, with `--description` replacing
|
|
347
347
|
its description, and the loader check refuses one the project cannot load.
|
|
348
|
+
- **`kxm role add --pick <global-id>` copies the global role.** In local scope, picking a
|
|
349
|
+
global role wrote an empty `Role <id>` with no skills or roster under its ID. It now
|
|
350
|
+
writes the global role's content, with `--description`, `--skills` and `--model`
|
|
351
|
+
replacing those fields the way they do for a built-in template.
|
|
352
|
+
- **`kxm role add` no longer leaves a project that refuses to load.** A local add now needs
|
|
353
|
+
a KXM project (`project_not_found` otherwise, and no stray `.kxm/` that would make
|
|
354
|
+
`kxm init` refuse), writes under the project root from any subdirectory, and is checked
|
|
355
|
+
by the project loader first with the new role in place of any file of that ID. A
|
|
356
|
+
`writer` role whose roster leaves out the `implementer` agent's model, including the
|
|
357
|
+
built-in `writer` template for such a project, is refused with `role_invalid`, exit 2,
|
|
358
|
+
and nothing is written, also under `--dry-run`.
|
|
348
359
|
- **Live `kxm runs drive` can author on an audited writer profile.** A write-repository
|
|
349
360
|
step on pi (`-a`, with extensions, skills, and the session off) or grok
|
|
350
361
|
(`--always-approve`, with subagents and web search off) runs against the checkout.
|
|
@@ -67,6 +67,8 @@ to run one file is in [Develop KXM](development.md#run-one-file-or-one-test).
|
|
|
67
67
|
| Explicit local YAML validates with runner schema/transitions; webhook environment sources retain JSON/secret checks | `gate-validation.test.ts` |
|
|
68
68
|
| `kxm workflow add` writes a local workflow only where the loader reads it and only if the project still loads; outside a project it refuses | `role-and-workflow-manager.test.ts` ("workflow add writes only what the project loader accepts, at the project root, and loadKxmProject still loads") |
|
|
69
69
|
| `kxm workflow add --pick <global-id>` copies the global definition into the project, not the scaffold, and the loader check refuses one that does not fit | `role-and-workflow-manager.test.ts` ("workflow add --pick <global-id> copies that global definition into the project, and refuses one the project loader rejects") |
|
|
70
|
+
| `kxm role add --pick <global-id>` copies the global role into the project, not an empty role, with `--description`, `--skills` and `--model` applied over it | `role-and-workflow-manager.test.ts` ("role add --pick <global-id> copies that global role into the project, with --description, --skills and --model applied over it") |
|
|
71
|
+
| `kxm role add` writes a local role only at the project root and only if the project still loads, so a `writer` roster without the implementer's model is refused; outside a project it refuses | `role-and-workflow-manager.test.ts` ("role add writes a local role only at the project root, and only if the project loader accepts it") |
|
|
70
72
|
| `default.yaml` and the 13-step `fix.yaml` compile deterministically; back edges need budgets | `engine-compile.test.ts` |
|
|
71
73
|
| Artifact gate: non-empty regular files pass; missing, empty, non-file and escaping paths fail | `artifacts-exist.test.ts` |
|
|
72
74
|
| Vision gate: strict verdicts, admitted routes only, unreadable images fail closed | `vision-gate.test.ts` |
|
|
@@ -1197,7 +1197,7 @@ Not run with a configured role; in a fresh project it exits 1 with `kxm: role 'w
|
|
|
1197
1197
|
kxm role add [roleId] [--file <path>] [--description <text>] [--skills <skills>] [--harness <harness>] [--model <model>] [--scope global|local] [--overwrite] [--pick [selection]]
|
|
1198
1198
|
```
|
|
1199
1199
|
|
|
1200
|
-
Adds a role definition. Without a role ID, or with `--pick`, you choose from the built-in templates (`writer`, `planner`, `critic-arch`, `critic-cli`, `verifier`) and, for local scope, existing global roles. With `--file`, the YAML file is used and its `id` is replaced by the role ID.
|
|
1200
|
+
Adds a role definition. Without a role ID, or with `--pick`, you choose from the built-in templates (`writer`, `planner`, `critic-arch`, `critic-cli`, `verifier`) and, for local scope, existing global roles; a global role with a template's ID is not offered. The choice is written under its own ID with its content: the template, or a copy of the global role's file, with `--description`, `--skills`, and `--model` (with `--harness`) replacing its description, skills, and roster. With `--file`, the YAML file is used and its `id` is replaced by the role ID. Otherwise a role with only the given options is written.
|
|
1201
1201
|
|
|
1202
1202
|
| Option | Argument | Default | Description |
|
|
1203
1203
|
|---|---|---|---|
|
|
@@ -1211,6 +1211,8 @@ Adds a role definition. Without a role ID, or with `--pick`, you choose from the
|
|
|
1211
1211
|
| `--pick` | `[selection]` | none | Pick from available role templates (index or id) |
|
|
1212
1212
|
|
|
1213
1213
|
- Writes `<scope dir>/roles/<id>.yaml`. `--dry-run` plans the write and writes nothing.
|
|
1214
|
+
- Local scope belongs to a KXM project: the file lands in the project root's `.kxm/roles/` from any subdirectory, and outside a project the command refuses with `project_not_found` and creates nothing. Before writing, the project loader checks the project with the new role in place of any file of that ID. The loader reads only `writer.yaml`, whose enabled roster must include the `implementer` agent's model (see [Roles](config-reference.md#kxmrolesroleyaml-kxmrolev1)). If the project would not load, the command refuses with `role_invalid`, lists each issue and writes nothing, also under `--dry-run`, and `--overwrite` replaces a `writer.yaml` the loader refuses. Global scope is not checked, because no loader reads it.
|
|
1215
|
+
- Refusals exit 2 and honor `--json`: `project_not_found` and `role_invalid` (with `issues`, each `{phase, code, file, message}`). An existing role without `--overwrite` exits 1 with a plain `role add failed: role_already_exists: ...` line, also under `--dry-run`.
|
|
1214
1216
|
- JSON keys: `roleId`, `id`, `filePath`, `scope`.
|
|
1215
1217
|
|
|
1216
1218
|
> [!WARNING]
|
|
@@ -965,7 +965,7 @@ read different fields:
|
|
|
965
965
|
|---|---|---|---|
|
|
966
966
|
| Project loader (`validateBundle`) | `.kxm/roles/writer.yaml` only | `roster[].model`, `roster[].enabled` | Cross-checks the writer roster against the `implementer` agent's model (see below). Parsed as restricted YAML. |
|
|
967
967
|
| Runtime route check (`listRoleBindings` in `plugins/kxm/src/routes.ts`) | `.kxm/roles/<role>.yaml`, role = agent ID, `writer` for `implementer` | `roster[].model` | The agent's `provider/model` must appear exactly. `enabled` is ignored, so a disabled entry still admits. The role name comes from the filename. |
|
|
968
|
-
| `kxm role` commands (`plugins/kxm/src/role.ts`) | `.kxm/roles/*.yaml` and `~/.config/kxm/roles/*.yaml` | Everything below | Listing and editing only. A file without `schema: kxm.role.v1` is silently skipped. A local file overrides a global one with the same ID. |
|
|
968
|
+
| `kxm role` commands (`plugins/kxm/src/role.ts`) | `.kxm/roles/*.yaml` and `~/.config/kxm/roles/*.yaml` | Everything below | Listing and editing only. A file without `schema: kxm.role.v1` is silently skipped. A local file overrides a global one with the same ID. A local `kxm role add` runs the project loader check above first and refuses with `role_invalid` a role the loader would reject. |
|
|
969
969
|
|
|
970
970
|
The loader check applies when the agent `implementer` (or else `writer`)
|
|
971
971
|
declares a model and the roster has at least one enabled entry. One enabled
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kontextmind/kxm",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.107",
|
|
4
4
|
"description": "KXM local-first multi-agent orchestration and operator dashboard",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "KontextMind",
|
|
@@ -75,8 +75,8 @@
|
|
|
75
75
|
]
|
|
76
76
|
},
|
|
77
77
|
"dependencies": {
|
|
78
|
-
"@anthropic-ai/claude-agent-sdk": "0.3.
|
|
79
|
-
"@earendil-works/pi-tui": "0.
|
|
78
|
+
"@anthropic-ai/claude-agent-sdk": "0.3.278",
|
|
79
|
+
"@earendil-works/pi-tui": "0.86.1",
|
|
80
80
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
81
81
|
"yaml": "^2.9.0"
|
|
82
82
|
},
|
|
@@ -93,16 +93,16 @@
|
|
|
93
93
|
}
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
|
96
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
96
|
+
"@earendil-works/pi-coding-agent": "0.86.1",
|
|
97
97
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
98
|
-
"@types/node": "26.
|
|
98
|
+
"@types/node": "26.6.2",
|
|
99
99
|
"ajv": "8.20.0",
|
|
100
100
|
"commander": "15.0.0",
|
|
101
101
|
"esbuild": "0.28.2",
|
|
102
|
-
"markdownlint-cli2": "0.23.
|
|
102
|
+
"markdownlint-cli2": "0.23.3",
|
|
103
103
|
"nx": "23.2.1",
|
|
104
104
|
"tsx": "^4.23.13",
|
|
105
|
-
"typebox": "1.3.
|
|
105
|
+
"typebox": "1.3.34",
|
|
106
106
|
"typescript": "7.0.2"
|
|
107
107
|
},
|
|
108
108
|
"files": [
|
|
@@ -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.
|
|
5
|
+
"version": "0.7.107",
|
|
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",
|