@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.
@@ -11,7 +11,7 @@
11
11
  "name": "kxm",
12
12
  "source": "./plugins/kxm",
13
13
  "description": "Durable workflows, peer agents, and kxm tui",
14
- "version": "0.7.105",
14
+ "version": "0.7.107",
15
15
  "category": "development",
16
16
  "tags": ["kxm", "multi-agent", "workflows", "mcp"]
17
17
  }
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.105",
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.270",
79
- "@earendil-works/pi-tui": "0.85.1",
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.85.1",
96
+ "@earendil-works/pi-coding-agent": "0.86.1",
97
97
  "@modelcontextprotocol/sdk": "1.30.0",
98
- "@types/node": "26.5.1",
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.2",
102
+ "markdownlint-cli2": "0.23.3",
103
103
  "nx": "23.2.1",
104
104
  "tsx": "^4.23.13",
105
- "typebox": "1.3.30",
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.105",
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",