Skip to content

Commit 6390dfe

Browse files
author
dsh-jev
committed
refactor!: rename the packages and brand to the jevkit family
Two of the three packages are not DSH-specific, and the @dsh-jev scope said otherwise. A Claude Desktop user looking for a Jev MCP server would have read @dsh-jev/mcp as "not for me", as would anyone writing a plain script against @dsh-jev/core. Only the DSH adapter is DSH-specific, so only it now carries dsh. @dsh-jev/core -> jevkit @dsh-jev/plugin -> jevkit-dsh @dsh-jev/mcp -> jevkit-mcp Both adapters depend on the root name, so the dependency direction is readable from the names alone. The rename reached every runtime identifier a user or host can see, not just the manifests: the Cordis plugin name, the MCP server name and bin command, the Config Standard Schema vendor field, the startup egress prefix, and the config and gate error messages. A stale plugin name or egress prefix is the kind of thing that only shows up when someone reads a log line, so each was replaced by an assertion that fails on an unexpected number of hits rather than a blind substitution. The CI tarball glob is fixed too: it still matched dsh-jev-*.tgz after the rename, so the clean-room install step would have failed on the next run. Verified after the rename: 360 tests pass, all three packages typecheck, the schema check passes, both MCP smoke tests pass (including the live one against real System One models), the tarballs pack as jevkit/jevkit-dsh/jevkit-mcp with LICENSE and NOTICE, and a clean-room install of the packed artifacts loads 64 core exports with the MCP default still offline. The harness profile's links were rebuilt and the local plugin loads.
1 parent 9a675b8 commit 6390dfe

46 files changed

Lines changed: 265 additions & 323 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/ci.yml‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ jobs:
4646
# handshake, discovery, calls, and the error path.
4747
env:
4848
TYPESAFE_API_KEY: ''
49-
run: pnpm --filter @dsh-jev/mcp run smoke
49+
run: pnpm --filter jevkit-mcp run smoke
5050

5151
- name: Cross-check our payloads against the vendor's own schemas
5252
# The unit tests stub the SDKs, so they prove our side of the contract
5353
# but not that a vendor would accept it. This imports the real zod
5454
# schemas and parses what this project actually builds. Offline and
5555
# credential-free by design. It is what caught `score.criteria` being
5656
# sent as a keyed map when both vendors require an ordered array.
57-
run: pnpm --filter @dsh-jev/core run check:schemas
57+
run: pnpm --filter jevkit run check:schemas
5858

5959
package:
6060
runs-on: ubuntu-latest
@@ -107,12 +107,12 @@ jobs:
107107
run: |
108108
mkdir -p /tmp/cleanroom && cd /tmp/cleanroom
109109
echo '{"name":"cleanroom","private":true,"version":"1.0.0"}' > package.json
110-
pnpm --dir "$GITHUB_WORKSPACE" --filter @dsh-jev/core pack --pack-destination .
111-
pnpm --dir "$GITHUB_WORKSPACE" --filter @dsh-jev/mcp pack --pack-destination .
112-
npm install --no-audit --no-fund ./dsh-jev-core-*.tgz ./dsh-jev-mcp-*.tgz
110+
pnpm --dir "$GITHUB_WORKSPACE" --filter jevkit pack --pack-destination .
111+
pnpm --dir "$GITHUB_WORKSPACE" --filter jevkit-mcp pack --pack-destination .
112+
npm install --no-audit --no-fund ./jevkit-*.tgz ./jevkit-mcp-*.tgz
113113
node -e "
114-
const core = await import('@dsh-jev/core');
115-
const mcp = await import('@dsh-jev/mcp');
114+
const core = await import('jevkit');
115+
const mcp = await import('jevkit-mcp');
116116
if (typeof core.JevService !== 'function') throw new Error('core did not load');
117117
if (typeof mcp.createServer !== 'function') throw new Error('mcp did not load');
118118
const runtime = await mcp.buildRuntime(() => undefined);

‎CHANGELOG.md‎

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,33 @@ Notable changes, newest first. The format follows
88

99
Initial implementation. Pre-1.0, so the API may change between minor versions.
1010

11+
### Changed
12+
13+
- **Renamed the packages and the brand from the `@dsh-jev` scope to the `jevkit`
14+
family**, before any publish, because two of the three packages are not
15+
DSH-specific and the scope said otherwise:
16+
17+
| Was | Now | Role |
18+
|---|---|---|
19+
| `@dsh-jev/core` | `jevkit` | framework-agnostic core |
20+
| `@dsh-jev/plugin` | `jevkit-dsh` | the DeepSeek Harness plugin |
21+
| `@dsh-jev/mcp` | `jevkit-mcp` | the MCP server |
22+
23+
A Claude Desktop user looking for a Jev MCP server would have read
24+
`@dsh-jev/mcp` as "not for me", and the same went for anyone writing a plain
25+
script against `@dsh-jev/core`. Only the DSH adapter is DSH-specific, and now
26+
only its name says so. Both adapters depend on the root name, so the
27+
dependency direction is readable from the names alone.
28+
29+
The rename also reached the runtime identifiers a user or host can see: the
30+
Cordis plugin name (`jevkit`), the MCP server name and `bin` command
31+
(`jevkit-mcp`), the `Config` Standard Schema `vendor` field, the startup egress
32+
prefix (`[jevkit]`), and the config/gate error messages.
33+
34+
Unscoped family names have to be claimed individually — npm registers
35+
ownership of a scope, not a name prefix — so `jevkit`, `jevkit-dsh` and
36+
`jevkit-mcp` were each confirmed free before the rename.
37+
1138
### Added
1239

1340
- **An OpenRouter route to the same models.** OpenRouter hosts the System One
@@ -23,7 +50,7 @@ Initial implementation. Pre-1.0, so the API may change between minor versions.
2350
`typesafe/` prefix is refused before the call, because any other model answers
2451
with prose this plugin cannot interpret as a decision.
2552

26-
- **`@dsh-jev/core`** — framework-agnostic decision layer.
53+
- **`jevkit`** — framework-agnostic decision layer.
2754
- The three System One primitives (`noul`, `choice`, `score`) with validation.
2855
- `MockProvider`, deterministic and offline, which labels every answer as
2956
synthetic in three places so it cannot be mistaken for a real judgment.
@@ -38,14 +65,14 @@ Initial implementation. Pre-1.0, so the API may change between minor versions.
3865
trusted.
3966
- Two gates: a safety gate on `tools/pre-execute` and a context gate on
4067
`tools/post-execute`, both framework-agnostic and both off by default.
41-
- **`@dsh-jev/plugin`** — the DeepSeek Harness plugin.
68+
- **`jevkit-dsh`** — the DeepSeek Harness plugin.
4269
- `ctx.jev`, a first-class service other plugins can call with no model turn
4370
in between.
4471
- Three model-visible tools: `jev_ask`, `jev_rank`, `jev_check`.
4572
- `Config` implemented as a Standard Schema, which Cordis requires before a
4673
plugin starts.
4774
- Startup egress report on one line per feature.
48-
- **`@dsh-jev/mcp`** — the same three tools over MCP, with a stdio binary that
75+
- **`jevkit-mcp`** — the same three tools over MCP, with a stdio binary that
4976
writes its egress report to stderr so the protocol channel stays clean.
5077

5178
### Fixed

‎CONTRIBUTING.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ Three packages over one decision layer:
99

1010
| Package | What it is |
1111
|---|---|
12-
| `@dsh-jev/core` | The decisions. No framework dependency — it imports nothing from DeepSeek Harness or Cordis. |
13-
| `@dsh-jev/plugin` | The DeepSeek Harness plugin: three tools, one service, two opt-in gates. |
14-
| `@dsh-jev/mcp` | The same three tools over MCP, for hosts that are not DSH. |
12+
| `jevkit` | The decisions. No framework dependency — it imports nothing from DeepSeek Harness or Cordis. |
13+
| `jevkit-dsh` | The DeepSeek Harness plugin: three tools, one service, two opt-in gates. |
14+
| `jevkit-mcp` | The same three tools over MCP, for hosts that are not DSH. |
1515

1616
Jev answers typed questions and returns calibrated probabilities. It does not
1717
generate text. Any change that treats it as a chat model is out of scope.
@@ -71,7 +71,7 @@ Please do not open a public issue. See [SECURITY.md](./SECURITY.md).
7171
## Scope
7272

7373
Welcome: better judgments, better prompts for the primitives, additional
74-
framework adapters over `@dsh-jev/core`, documentation fixes, and bug reports
74+
framework adapters over `jevkit`, documentation fixes, and bug reports
7575
with a reproduction.
7676

7777
Out of scope: anything that turns this into a general-purpose LLM client;

‎LICENSE‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2026 dsh-jev contributors
3+
Copyright (c) 2026 jevkit contributors
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

‎NOTICE‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# NOTICE
22

3-
dsh-jev — TypeSafe Jev for DeepSeek Harness
4-
Copyright (c) 2026 dsh-jev contributors
3+
jevkit — TypeSafe Jev for DeepSeek Harness
4+
Copyright (c) 2026 jevkit contributors
55
Licensed under the MIT License. See [LICENSE](./LICENSE).
66

77
## Not affiliated with TypeSafe AI
@@ -22,11 +22,11 @@ remain under their own licences:
2222

2323
| Package | Role | Declared as |
2424
|---|---|---|
25-
| `@typesafe-ai/sdk` | Official TypeSafe client, used by the `live` provider | optional dependency of `@dsh-jev/core` |
26-
| `@openrouter/sdk` | Official OpenRouter client, used by the `openrouter` provider | optional dependency of `@dsh-jev/core` and `@dsh-jev/mcp` |
27-
| `@modelcontextprotocol/sdk` | MCP server and stdio transport | dependency of `@dsh-jev/mcp` |
28-
| `zod` | Wire-schema validation for the MCP surface | dependency of `@dsh-jev/mcp` |
29-
| `@deepseek-ai/dsh-tools` | DeepSeek Harness tool registry | peer dependency of `@dsh-jev/plugin`, supplied by the harness at runtime |
25+
| `@typesafe-ai/sdk` | Official TypeSafe client, used by the `live` provider | optional dependency of `jevkit` |
26+
| `@openrouter/sdk` | Official OpenRouter client, used by the `openrouter` provider | optional dependency of `jevkit` and `jevkit-mcp` |
27+
| `@modelcontextprotocol/sdk` | MCP server and stdio transport | dependency of `jevkit-mcp` |
28+
| `zod` | Wire-schema validation for the MCP surface | dependency of `jevkit-mcp` |
29+
| `@deepseek-ai/dsh-tools` | DeepSeek Harness tool registry | peer dependency of `jevkit-dsh`, supplied by the harness at runtime |
3030

3131
The optional dependencies are loaded lazily. An install that omits them still
3232
runs, on the offline mock provider.

‎PUBLISHING.md‎

Lines changed: 52 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@ Run every step from the repository root.
77

88
## 0. Package names — decided
99

10-
The three packages publish under the `@dsh-jev` scope:
10+
The three packages publish as a **family of unscoped names**, rooted at `jevkit`:
1111

12-
| Directory | Package |
13-
|---|---|
14-
| `packages/core` | `@dsh-jev/core` |
15-
| `packages/dsh` | `@dsh-jev/plugin` |
16-
| `packages/mcp` | `@dsh-jev/mcp` |
12+
| Directory | Package | Role |
13+
|---|---|---|
14+
| `packages/core` | `jevkit` | The framework-agnostic decision core |
15+
| `packages/dsh` | `jevkit-dsh` | The DeepSeek Harness / Cordis plugin |
16+
| `packages/mcp` | `jevkit-mcp` | The MCP server |
17+
18+
Both adapters depend on the root name, so a reader can infer the dependency
19+
direction from the names alone. Nothing but the DSH adapter carries `dsh`.
1720

1821
### Why not the bare name `dsh-jev`
1922

@@ -23,24 +26,38 @@ free up. Two packages with the same name and different behaviour is a support
2326
burden for both authors, and the collision is worse than usual here because
2427
theirs targets the same framework and the same model.
2528

26-
Verify the scope is still yours before publishing; an npm scope belongs to
27-
whoever publishes into it first:
29+
### Why not a `@dsh-jev` scope
2830

29-
```sh
30-
npm view @dsh-jev/core version # 404 means the scope is still unclaimed
31-
```
31+
That was the earlier plan and it was wrong, for a reason worth recording: two of
32+
the three packages are **not** DSH-specific. A Claude Desktop user looking for a
33+
Jev MCP server would find `@dsh-jev/mcp` and reasonably conclude it was not for
34+
them, and someone writing a plain script would read the same into
35+
`@dsh-jev/core`. Scoping everything under the framework's name mis-sold two
36+
thirds of the project. Only the DSH adapter should say `dsh`, and now only it
37+
does.
38+
39+
### Why `jevkit`
3240

33-
### Why `plugin` rather than `dsh`
41+
`jev-kit`, `jev-mcp`, `jev-tools`, `jev-core` and `jev-plugin` are taken or
42+
risk reading as official TypeSafe packages. `jevkit` is free, avoids a `jev-`
43+
prefix that implies first-party status, and `kit` says "tools for" rather than
44+
"attachment to a framework".
3445

35-
`@dsh-jev/dsh` was the first choice and it reads badly: the same three letters
36-
appear twice with different meanings, so the scope and the package cannot be told
37-
apart at a glance. `@dsh-jev/plugin` names the thing rather than repeating the
38-
framework it targets, and it matches what the other two already do — scope for
39-
the project, leaf for the artifact.
46+
### Unscoped names must be claimed individually
47+
48+
npm registers ownership of a **scope** (`@scope/`), not a name prefix. There is
49+
no such thing as owning `jevkit-*`: `jevkit`, `jevkit-dsh` and `jevkit-mcp` are
50+
three independent names and each has to be free at publish time. Verify before
51+
publishing:
52+
53+
```sh
54+
for n in jevkit jevkit-dsh jevkit-mcp; do npm view "$n" version 2>&1 | head -1; done
55+
# 404 for each means all three are still claimable
56+
```
4057

41-
If the scope is ever lost, the fallback is your own npm scope
42-
(`@<username>/dsh-jev` for the plugin, and matching leaves for core and mcp),
43-
which is what most of the DSH plugin ecosystem does.
58+
If a name is lost, the fallback is an npm scope you own
59+
(`@<username>/jevkit` and matching leaves), which is what most of the DSH plugin
60+
ecosystem does.
4461

4562
## 1. Pre-flight
4663

@@ -53,10 +70,10 @@ Expected: 360 tests pass (266 core, 65 dsh, 29 mcp), with no credential set.
5370

5471
```sh
5572
# Parse what this project builds against the vendors' real schemas. Offline.
56-
pnpm --filter @dsh-jev/core run check:schemas
73+
pnpm --filter jevkit run check:schemas
5774

5875
# Drive the MCP server over a real stdio transport, on the mock. Offline.
59-
pnpm --filter @dsh-jev/mcp run smoke
76+
pnpm --filter jevkit-mcp run smoke
6077
```
6178

6279
Both are credential-free by design and run in CI. The schema check is the one
@@ -75,8 +92,8 @@ changes that. Enable it under **Allowed providers** at
7592

7693
```sh
7794
export OPENROUTER_API_KEY=... # never commit this
78-
pnpm --filter @dsh-jev/core run probe:live # provider level
79-
pnpm --filter @dsh-jev/mcp run smoke:live # whole MCP surface
95+
pnpm --filter jevkit run probe:live # provider level
96+
pnpm --filter jevkit-mcp run smoke:live # whole MCP surface
8097
```
8198

8299
A passing run prints the real model (`typesafe/jev-1.13-<date>`), token usage and
@@ -138,9 +155,9 @@ Change the URL in each file, then `pnpm install` so the lockfile records it.
138155
## 4. Inspect the tarballs before publishing
139156

140157
```sh
141-
pnpm --filter @dsh-jev/core pack --dry-run
142-
pnpm --filter @dsh-jev/plugin pack --dry-run
143-
pnpm --filter @dsh-jev/mcp pack --dry-run
158+
pnpm --filter jevkit pack --dry-run
159+
pnpm --filter jevkit-dsh pack --dry-run
160+
pnpm --filter jevkit-mcp pack --dry-run
144161
```
145162

146163
Check for each: `lib/` is present, `README.md` and `LICENSE` are included, and
@@ -150,12 +167,12 @@ nothing.
150167

151168
## 5. Publish
152169

153-
Order matters: the two adapters depend on `@dsh-jev/core`.
170+
Order matters: the two adapters depend on `jevkit`.
154171

155172
```sh
156-
pnpm --filter @dsh-jev/core publish --access public
157-
pnpm --filter @dsh-jev/plugin publish --access public
158-
pnpm --filter @dsh-jev/mcp publish --access public
173+
pnpm --filter jevkit publish --access public
174+
pnpm --filter jevkit-dsh publish --access public
175+
pnpm --filter jevkit-mcp publish --access public
159176
```
160177

161178
Prefer publishing from CI with provenance over a laptop:
@@ -177,21 +194,21 @@ Do not trust the publish output; install what you actually shipped.
177194

178195
```sh
179196
mkdir /tmp/verify && cd /tmp/verify && npm init -y
180-
npm install @dsh-jev/core @dsh-jev/plugin @dsh-jev/mcp
181-
node -e "const c = require('@dsh-jev/core'); console.log(Object.keys(c).length, 'core exports')"
197+
npm install jevkit jevkit-dsh jevkit-mcp
198+
node -e "const c = require('jevkit'); console.log(Object.keys(c).length, 'core exports')"
182199
```
183200

184201
Then, for the DSH plugin, install it into a **throwaway profile** and confirm the
185202
row reaches `active` and the egress report appears:
186203

187204
```sh
188-
dsh plugin --profile verify-jev add @dsh-jev/plugin
205+
dsh plugin --profile verify-jev add jevkit-dsh
189206
```
190207

191208
For the MCP server:
192209

193210
```sh
194-
npx -y @dsh-jev/mcp # should print the egress report to stderr and wait
211+
npx -y jevkit-mcp # should print the egress report to stderr and wait
195212
```
196213

197214
## Known-before-you-publish

0 commit comments

Comments
 (0)