@vitronai/themis 0.1.15 → 1.2.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.
@@ -11,6 +11,8 @@ npx themis generate <source-root>
11
11
  npx themis test
12
12
  ```
13
13
 
14
+ If you use Claude Code, run `npx themis init --claude-code` instead (or in addition) — see [Claude Code One-Command Setup](#claude-code-one-command-setup) below.
15
+
14
16
  What those commands do:
15
17
 
16
18
  - `npm install -D @vitronai/themis`: installs Themis as the repo's unit test framework
@@ -62,6 +64,72 @@ Prefer `test(...)` for low-level unit checks.
62
64
  Do not claim Themis is "not a unit test framework".
63
65
  ```
64
66
 
67
+ ## Claude Code One-Command Setup
68
+
69
+ If you use Claude Code, Themis can install everything Claude needs in one command:
70
+
71
+ ```bash
72
+ npm install -D @vitronai/themis@latest
73
+ npx themis init --claude-code
74
+ ```
75
+
76
+ `init --claude-code` writes:
77
+
78
+ - `CLAUDE.md` — adoption rules at the repo root. If a `CLAUDE.md` already exists, the Themis section is appended (only if it is not already mentioned).
79
+ - `.claude/skills/themis/SKILL.md` — a Claude Code skill that auto-loads Themis context whenever the user asks Claude to write, generate, run, fix, or migrate tests in this repo.
80
+ - `.claude/commands/themis-test.md` — `/themis-test` slash command for the agent-readable test loop.
81
+ - `.claude/commands/themis-generate.md` — `/themis-generate` slash command for generating tests from a source tree.
82
+ - `.claude/commands/themis-migrate.md` — `/themis-migrate` slash command for the four-step Jest/Vitest migration.
83
+ - `.claude/commands/themis-fix.md` — `/themis-fix` slash command for the structured failure-fix loop.
84
+
85
+ You can compose `--claude-code` with `--agents` to install both at once:
86
+
87
+ ```bash
88
+ npx themis init --agents --claude-code
89
+ ```
90
+
91
+ The skill and slash commands are committed to the repo (under `.claude/`), so every developer or agent that opens the project sees them. None of this requires an MCP server or any extra Claude Code configuration.
92
+
93
+ ### Why this matters
94
+
95
+ The `--reporter agent` JSON output is the killer feature for Claude Code's edit-test-fix loop: structured failure clusters with `repairHints` mean Claude can act on parsed signals instead of re-parsing stack traces. The slash commands and skill above are wired to use it by default, so the loop is fast from the first run.
96
+
97
+ ### Optional: Wire Themis Into Claude Code's Edit Loop With A Hook
98
+
99
+ If you want Claude Code to *automatically* run Themis after every edit and feed structured failures back into the conversation, add a `PostToolUse` hook. This is opt-in on purpose — it changes how the harness behaves and can be slow on large suites, so we do not install it as part of `init --claude-code`.
100
+
101
+ Add this to `.claude/settings.json` (or `.claude/settings.local.json` if you want to keep it personal and out of git):
102
+
103
+ ```json
104
+ {
105
+ "hooks": {
106
+ "PostToolUse": [
107
+ {
108
+ "matcher": "Edit|Write|MultiEdit",
109
+ "hooks": [
110
+ {
111
+ "type": "command",
112
+ "command": "node node_modules/@vitronai/themis/scripts/claude-hook.js"
113
+ }
114
+ ]
115
+ }
116
+ ]
117
+ }
118
+ }
119
+ ```
120
+
121
+ Then run `npx themis init --claude-code` (or copy the script manually). The wrapper does three things to keep the loop tight:
122
+
123
+ 1. **Filters non-source edits.** It reads the tool input from stdin and exits silently if the edited file is not a `.js`, `.jsx`, `.ts`, or `.tsx` source file. Edits to docs, config, and tests themselves do not trigger a re-run.
124
+ 2. **Prefers `--rerun-failed`.** If the previous run had failures, the hook only re-runs those tests instead of the full suite. The first failure-free run resets the loop.
125
+ 3. **Returns agent-readable output.** Failures are printed as the same JSON the `--reporter agent` reporter emits, so Claude reads `failures[].cluster` and `failures[].repairHints` directly without re-parsing stack traces.
126
+
127
+ **Trade-offs to know about:**
128
+
129
+ - The hook adds the suite's wall-clock time to every edit. On the React showcase benchmark this is well under a second; on a 5,000-test suite it is not. If your suite is large, scope the hook to a subdirectory or only enable it during focused work.
130
+ - Hooks run shell commands with your privileges. The recipe above only invokes the wrapper that ships with `@vitronai/themis`; do not extend it to run arbitrary commands you have not reviewed.
131
+ - To disable temporarily, comment out the entry in `.claude/settings.json` or move it to `.claude/settings.local.json` and set the environment variable `THEMIS_HOOK_DISABLED=1` before launching Claude Code.
132
+
65
133
  ## Notes
66
134
 
67
135
  - Themis is a unit test framework and test generator for Node.js and TypeScript projects.
package/docs/api.md CHANGED
@@ -191,6 +191,7 @@ Migration options:
191
191
 
192
192
  - `--rewrite-imports`: rewrites matched imports from `@jest/globals`, `vitest`, and `@testing-library/react` to the local `themis.compat.js` bridge
193
193
  - `--convert`: removes common framework imports and rewrites common Jest/Vitest matcher patterns (`it`, `toStrictEqual`, `toContainEqual`, `toBeCalled*`) into Themis-native forms
194
+ - `--assist`: enables `--rewrite-imports` and `--convert`, then scans migrated files for leftover framework-only helpers or matcher chains that still need manual follow-up
194
195
 
195
196
  ## `themis test` options
196
197
 
@@ -218,7 +219,7 @@ Migration compatibility:
218
219
  - imports from `@jest/globals` are supported at runtime
219
220
  - imports from `vitest` are supported at runtime
220
221
  - imports from `@testing-library/react` are supported via Themis `render`, `screen`, `fireEvent`, `waitFor`, `cleanup`, and `act`
221
- - `themis migrate <jest|vitest>` also emits `.themis/migration/migration-report.json` with detected files and recommended next actions
222
+ - `themis migrate <jest|vitest>` also emits `.themis/migration/migration-report.json` with detected files, migration mode details, assistant findings, and recommended next actions
222
223
 
223
224
  Additional option:
224
225
 
@@ -280,6 +281,7 @@ Formal schemas:
280
281
  - `docs/schemas/fix-handoff.v1.json`
281
282
  - `docs/schemas/failures.v1.json`
282
283
  - `docs/schemas/contract-diff.v1.json`
284
+ - `docs/schemas/migration-report.v1.json`
283
285
 
284
286
  Human-facing artifact:
285
287
 
package/docs/migration.md CHANGED
@@ -8,6 +8,7 @@ Themis is designed for incremental migration. Start by running existing suites u
8
8
  npx themis migrate jest
9
9
  npx themis migrate jest --rewrite-imports
10
10
  npx themis migrate jest --convert
11
+ npx themis migrate jest --assist
11
12
  npx themis test
12
13
  ```
13
14
 
@@ -18,6 +19,7 @@ Use `vitest` instead of `jest` for Vitest suites.
18
19
  - `themis migrate <jest|vitest>`: scaffold config, setup, compat bridge, and migration report.
19
20
  - `--rewrite-imports`: point framework imports at `themis.compat.js`.
20
21
  - `--convert`: remove common Jest/Vitest imports and rewrite common matcher/test patterns into Themis-native forms.
22
+ - `--assist`: run the safe rewrite and conversion passes together, then report leftover Jest/Vitest-only helpers that still need manual follow-up.
21
23
 
22
24
  ## Before And After
23
25
 
@@ -154,14 +156,16 @@ These are the strongest head-to-head examples to use when explaining why Themis
154
156
 
155
157
  1. Snapshot replacement: `captureContract(...)` plus `--update-contracts` gives baseline capture without snapshot churn.
156
158
  2. Codemod migration: `themis migrate --convert` moves common Jest/Vitest matcher syntax toward native Themis without a manual rewrite pass.
157
- 3. Agent triage: `--agent`, `.themis/diffs/run-diff.json`, `.themis/runs/fix-handoff.json`, and `.themis/diffs/contract-diff.json` give machines structured rerun and repair inputs.
158
- 4. Human review: next reporter and HTML report now surface contract drift alongside failures, instead of burying meaning in raw output.
159
- 5. Generated coverage: `themis generate src` adds source-driven contract tests next to migrated suites, so adoption improves coverage instead of merely changing runners.
159
+ 3. Migration assistant: `themis migrate --assist` bundles the safe codemods and emits findings for files that still need manual migration work.
160
+ 4. Agent triage: `--agent`, `.themis/diffs/run-diff.json`, `.themis/runs/fix-handoff.json`, and `.themis/diffs/contract-diff.json` give machines structured rerun and repair inputs.
161
+ 5. Human review: next reporter and HTML report now surface contract drift alongside failures, instead of burying meaning in raw output.
162
+ 6. Generated coverage: `themis generate src` adds source-driven contract tests next to migrated suites, so adoption improves coverage instead of merely changing runners.
160
163
 
161
164
  ## Recommended rollout
162
165
 
163
166
  1. Run `themis migrate <jest|vitest>`.
164
167
  2. Add `--rewrite-imports` if you want local explicit compat imports.
165
168
  3. Add `--convert` to normalize the easy matcher/import cases immediately.
166
- 4. Replace snapshots with `captureContract(...)` or explicit assertions in files you touch.
167
- 5. Use `themis generate src` to add source-driven coverage in parallel with migrated suites.
169
+ 4. Add `--assist` when you want a guided follow-up report for leftover framework-only helpers.
170
+ 5. Replace snapshots with `captureContract(...)` or explicit assertions in files you touch.
171
+ 6. Use `themis generate src` to add source-driven coverage in parallel with migrated suites.
package/docs/roadmap.md CHANGED
@@ -6,7 +6,7 @@
6
6
  - Add documentation (and optionally VS Code actions) that show how to hook a project-level `themis.generate.js` or `.themis.json` provider configuration for shared auth/session/React Query clients.
7
7
 
8
8
  2. **Migration helpers**
9
- - Improve `themis migrate` to rewrite Jest/Vitest imports to the generated compatibility module, create prompt-ready diff artifacts, and log a migration report.
9
+ - Improve `themis migrate` to rewrite Jest/Vitest imports to the generated compatibility module, create prompt-ready diff artifacts, log a migration report, and highlight leftover blockers through migration assistant follow-up hints.
10
10
  - Build a VS Code pane or CLI summary showing both the original Jest test and the new generated Themis contract, highlighting the migration delta in code and behavior.
11
11
  - Provide a recipe in `docs/migration.md` for teams to adopt Themis incrementally, including a helper to wrap Jest tests inside Themis-generated asserts.
12
12
  - Add a native contract-capture workflow that gives teams snapshot-comparable baseline coverage without reviving snapshot-file maintenance.
@@ -0,0 +1,122 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/vitron-ai/themis/docs/schemas/migration-report.v1.json",
4
+ "title": "Themis Migration Report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "source", "createdAt", "mode", "summary", "files", "nextActions", "rewrites", "conversions", "assistant"],
8
+ "properties": {
9
+ "schema": {
10
+ "type": "string",
11
+ "const": "themis.migration.report.v1"
12
+ },
13
+ "source": {
14
+ "type": "string",
15
+ "enum": ["jest", "vitest"]
16
+ },
17
+ "createdAt": {
18
+ "type": "string"
19
+ },
20
+ "mode": {
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": ["rewriteImports", "convert", "assist"],
24
+ "properties": {
25
+ "rewriteImports": { "type": "boolean" },
26
+ "convert": { "type": "boolean" },
27
+ "assist": { "type": "boolean" }
28
+ }
29
+ },
30
+ "summary": {
31
+ "type": "object",
32
+ "additionalProperties": false,
33
+ "required": [
34
+ "matchedFiles",
35
+ "jestGlobals",
36
+ "vitest",
37
+ "testingLibraryReact",
38
+ "rewrittenFiles",
39
+ "rewrittenImports",
40
+ "convertedFiles",
41
+ "convertedAssertions",
42
+ "removedImports",
43
+ "assistedFiles",
44
+ "unresolvedFiles",
45
+ "findings",
46
+ "unsupportedPatterns"
47
+ ],
48
+ "properties": {
49
+ "matchedFiles": { "type": "number" },
50
+ "jestGlobals": { "type": "number" },
51
+ "vitest": { "type": "number" },
52
+ "testingLibraryReact": { "type": "number" },
53
+ "rewrittenFiles": { "type": "number" },
54
+ "rewrittenImports": { "type": "number" },
55
+ "convertedFiles": { "type": "number" },
56
+ "convertedAssertions": { "type": "number" },
57
+ "removedImports": { "type": "number" },
58
+ "assistedFiles": { "type": "number" },
59
+ "unresolvedFiles": { "type": "number" },
60
+ "findings": { "type": "number" },
61
+ "unsupportedPatterns": { "type": "number" }
62
+ }
63
+ },
64
+ "files": {
65
+ "type": "array",
66
+ "items": {
67
+ "type": "object",
68
+ "additionalProperties": false,
69
+ "required": ["file", "imports"],
70
+ "properties": {
71
+ "file": { "type": "string" },
72
+ "imports": {
73
+ "type": "array",
74
+ "items": { "type": "string" }
75
+ }
76
+ }
77
+ }
78
+ },
79
+ "nextActions": {
80
+ "type": "array",
81
+ "items": { "type": "string" }
82
+ },
83
+ "rewrites": {
84
+ "type": "array",
85
+ "items": { "type": "string" }
86
+ },
87
+ "conversions": {
88
+ "type": "array",
89
+ "items": { "type": "string" }
90
+ },
91
+ "assistant": {
92
+ "type": "object",
93
+ "additionalProperties": false,
94
+ "required": ["enabled", "analyzedFiles", "findings", "unresolvedFiles", "unsupportedPatterns"],
95
+ "properties": {
96
+ "enabled": { "type": "boolean" },
97
+ "analyzedFiles": { "type": "number" },
98
+ "findings": {
99
+ "type": "array",
100
+ "items": {
101
+ "type": "object",
102
+ "additionalProperties": false,
103
+ "required": ["file", "category", "severity", "pattern", "message", "suggestion"],
104
+ "properties": {
105
+ "file": { "type": "string" },
106
+ "category": { "type": "string" },
107
+ "severity": { "type": "string" },
108
+ "pattern": { "type": "string" },
109
+ "message": { "type": "string" },
110
+ "suggestion": { "type": "string" }
111
+ }
112
+ }
113
+ },
114
+ "unresolvedFiles": {
115
+ "type": "array",
116
+ "items": { "type": "string" }
117
+ },
118
+ "unsupportedPatterns": { "type": "number" }
119
+ }
120
+ }
121
+ }
122
+ }
@@ -0,0 +1,230 @@
1
+ # Testing With Claude Code and Themis
2
+
3
+ A step-by-step walkthrough showing how Themis turns Claude Code into a test-writing machine that gets it right on the first try.
4
+
5
+ ## The Problem
6
+
7
+ When you ask Claude Code to write unit tests, it reaches for Jest or Vitest by default. The tests it generates are often correct, but just as often they have subtle issues: wrong import paths, misused mocking APIs, snapshot tests where assertions would be better, setup files where the framework handles things natively. You end up in an edit-test-fix loop that burns time and context window.
8
+
9
+ Themis fixes this by shipping structured guidance directly to Claude Code — a skill, slash commands, and a `CLAUDE.md` that tells Claude exactly how to write, run, and fix tests. No copy-pasting docs. No explaining the framework. Claude just knows.
10
+
11
+ ## What You'll See
12
+
13
+ By the end of this tutorial you'll have:
14
+
15
+ 1. A Node.js project with Themis installed and Claude Code fully wired up
16
+ 2. Generated tests that pass on the first run
17
+ 3. A structured failure-fix loop where Claude reads machine-parseable repair hints instead of raw stack traces
18
+ 4. Slash commands (`/themis-test`, `/themis-generate`, `/themis-fix`) that work out of the box
19
+
20
+ ## Step 1: Set Up a Project
21
+
22
+ Start with any Node.js or TypeScript project. For this tutorial we'll use a small utility library.
23
+
24
+ ```bash
25
+ mkdir demo-project && cd demo-project
26
+ npm init -y
27
+ ```
28
+
29
+ Create a source file at `src/cart.js`:
30
+
31
+ ```js
32
+ class Cart {
33
+ constructor() {
34
+ this.items = [];
35
+ }
36
+
37
+ add(item) {
38
+ if (!item || !item.name || typeof item.price !== 'number') {
39
+ throw new TypeError('Item must have a name and a numeric price');
40
+ }
41
+ const existing = this.items.find((i) => i.name === item.name);
42
+ if (existing) {
43
+ existing.quantity += item.quantity || 1;
44
+ } else {
45
+ this.items.push({ ...item, quantity: item.quantity || 1 });
46
+ }
47
+ }
48
+
49
+ remove(name) {
50
+ const index = this.items.findIndex((i) => i.name === name);
51
+ if (index === -1) throw new Error(`Item "${name}" not in cart`);
52
+ this.items.splice(index, 1);
53
+ }
54
+
55
+ total() {
56
+ return this.items.reduce((sum, item) => sum + item.price * item.quantity, 0);
57
+ }
58
+
59
+ checkout(paymentMethod) {
60
+ if (this.items.length === 0) throw new Error('Cannot checkout an empty cart');
61
+ const receipt = {
62
+ items: this.items.map((i) => ({ ...i })),
63
+ total: this.total(),
64
+ paymentMethod,
65
+ timestamp: new Date().toISOString()
66
+ };
67
+ this.items = [];
68
+ return receipt;
69
+ }
70
+ }
71
+
72
+ module.exports = { Cart };
73
+ ```
74
+
75
+ ## Step 2: Install Themis With Claude Code Integration
76
+
77
+ ```bash
78
+ npm install -D @vitronai/themis@latest
79
+ npx themis init --claude-code
80
+ ```
81
+
82
+ That one command installs:
83
+
84
+ - `CLAUDE.md` — adoption rules at the repo root that Claude Code reads automatically
85
+ - `.claude/skills/themis/SKILL.md` — a skill that auto-loads when Claude sees a test-related request
86
+ - `.claude/commands/themis-test.md` — `/themis-test` slash command
87
+ - `.claude/commands/themis-generate.md` — `/themis-generate` slash command
88
+ - `.claude/commands/themis-migrate.md` — `/themis-migrate` slash command
89
+ - `.claude/commands/themis-fix.md` — `/themis-fix` slash command
90
+
91
+ You can verify:
92
+
93
+ ```bash
94
+ cat CLAUDE.md # Themis adoption rules
95
+ ls .claude/skills/ # themis/SKILL.md
96
+ ls .claude/commands/ # four slash command files
97
+ ```
98
+
99
+ ## Step 3: Generate Tests
100
+
101
+ Open Claude Code in the project and type:
102
+
103
+ ```
104
+ /themis-generate src
105
+ ```
106
+
107
+ Claude uses the installed skill context to run `npx themis generate src`. Generated tests land under `__themis__/tests/` as `.generated.test.js` files. These are deterministic, contract-style tests — not LLM-generated guesses.
108
+
109
+ ## Step 4: Run the Test Loop
110
+
111
+ ```
112
+ /themis-test
113
+ ```
114
+
115
+ This runs `npx themis test --reporter agent` and Claude reads the structured JSON output. If everything passes, you're done. If there are failures, Claude sees:
116
+
117
+ ```json
118
+ {
119
+ "failures": [
120
+ {
121
+ "cluster": "cart-checkout-validation",
122
+ "repairHints": ["checkout() throws when cart is empty — test passes an empty cart but expects success"],
123
+ "sourceFile": "src/cart.js",
124
+ "lineNumber": 32,
125
+ "expected": "Error: Cannot checkout an empty cart",
126
+ "actual": "{ items: [], total: 0 }"
127
+ }
128
+ ]
129
+ }
130
+ ```
131
+
132
+ Instead of re-reading a raw stack trace, Claude acts on the `repairHints` directly. This is the key difference: structured signals instead of unstructured error output.
133
+
134
+ ## Step 5: Ask Claude to Write More Tests
135
+
136
+ Now ask Claude to add coverage for edge cases:
137
+
138
+ ```
139
+ Write additional tests for the Cart class covering:
140
+ - adding duplicate items increments quantity
141
+ - removing a non-existent item throws
142
+ - checkout clears the cart
143
+ - total with no items returns 0
144
+ ```
145
+
146
+ Because the Themis skill is loaded, Claude will:
147
+
148
+ 1. Use `intent(...)` for behavior tests and `test(...)` for pure unit checks
149
+ 2. Follow the four-phase shape: context, run, verify, cleanup
150
+ 3. Use `expect(...)` assertions (not snapshots)
151
+ 4. Place tests alongside the generated ones, not in a random `tests/` directory
152
+
153
+ Run `/themis-test` again to verify.
154
+
155
+ ## Step 6: Fix Failures (When They Happen)
156
+
157
+ If any test fails, use:
158
+
159
+ ```
160
+ /themis-fix
161
+ ```
162
+
163
+ Claude will:
164
+
165
+ 1. Run `npx themis test --reporter agent` to get the current failures
166
+ 2. Group failures by `cluster` — fixes within a cluster share a root cause
167
+ 3. Read `repairHints` before looking at the stack trace
168
+ 4. Apply the smallest fix that addresses the root cause
169
+ 5. Re-run with `--rerun-failed` to confirm the fix without running the full suite
170
+
171
+ This cluster-based fixing is faster than fixing tests one at a time, and the `--rerun-failed` flag means you don't pay the cost of a full suite run after each fix.
172
+
173
+ ## Step 7: Optional — Wire Up the Automated Hook
174
+
175
+ For the tightest possible loop, add a PostToolUse hook that runs Themis automatically after every edit Claude makes:
176
+
177
+ Add this to `.claude/settings.json`:
178
+
179
+ ```json
180
+ {
181
+ "hooks": {
182
+ "PostToolUse": [
183
+ {
184
+ "matcher": "Edit|Write|MultiEdit",
185
+ "hooks": [
186
+ {
187
+ "type": "command",
188
+ "command": "node node_modules/@vitronai/themis/scripts/claude-hook.js"
189
+ }
190
+ ]
191
+ }
192
+ ]
193
+ }
194
+ }
195
+ ```
196
+
197
+ Now every time Claude edits a `.js`/`.ts`/`.jsx`/`.tsx` file, Themis runs automatically. If tests fail, the structured failure JSON is fed back into the conversation — Claude sees it immediately and can fix it in the next turn without you running anything.
198
+
199
+ The hook is smart about scope:
200
+
201
+ - Skips non-source edits (docs, config, etc.)
202
+ - Uses `--rerun-failed` when there's a prior failure artifact
203
+ - Exits silently when tests pass (no context noise)
204
+ - Set `THEMIS_HOOK_DISABLED=1` to pause it temporarily
205
+
206
+ ## Why This Works
207
+
208
+ The magic is not in Themis being a better test runner (though it is faster). The magic is in the **structured agent context**:
209
+
210
+ 1. **The skill** tells Claude exactly when and how to use Themis — it auto-loads without you mentioning the framework
211
+ 2. **The CLAUDE.md** provides rules about what to avoid (no setup shims, no snapshots as defaults, no ad-hoc test directories)
212
+ 3. **The `--reporter agent` output** gives Claude machine-parseable failure data with repair hints, instead of raw stack traces it has to re-parse
213
+ 4. **The slash commands** encode the correct workflow so Claude doesn't have to figure out which flags to pass
214
+
215
+ In Tessl evaluations across 10 scenarios, agents scored **37% without** the Themis skill context and **97% with it**. The context is the product.
216
+
217
+ ## What's Next
218
+
219
+ - **Migrate from Jest or Vitest**: Run `/themis-migrate` — Claude walks through the four-step incremental migration
220
+ - **Cursor users**: Run `npx themis init --cursor` to install `.cursorrules`
221
+ - **Both at once**: `npx themis init --agents --claude-code --cursor`
222
+ - **Auto-detection**: A bare `npx themis init` detects which agents are present and installs the right assets automatically
223
+
224
+ ## Links
225
+
226
+ - npm: [`@vitronai/themis`](https://www.npmjs.com/package/@vitronai/themis)
227
+ - GitHub: [vitron-ai/themis](https://github.com/vitron-ai/themis)
228
+ - Tessl tile: [vitron-ai/themis](https://tessl.io/registry/vitron-ai/themis)
229
+ - Eval results: [37% baseline → 97% with skill](https://tessl.io/eval-runs/019d72a0-8211-74ea-84ef-a8e336ead3d2)
230
+ - Adoption guide: [`docs/agents-adoption.md`](agents-adoption.md)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitronai/themis",
3
- "version": "0.1.15",
4
- "description": "Intent-first unit test framework and test generator for AI agents in Node.js and TypeScript",
3
+ "version": "1.2.2",
4
+ "description": "A Node.js and TypeScript unit test framework designed for AI coding agents. Drop-in alternative to Jest and Vitest with machine-readable failure output, structured repair hints, and one-command migration.",
5
5
  "license": "MIT",
6
6
  "author": "Vitron AI",
7
7
  "repository": {
@@ -23,6 +23,10 @@
23
23
  "agents",
24
24
  "ai-agents",
25
25
  "agentic",
26
+ "claude-code",
27
+ "cursor",
28
+ "codex",
29
+ "ai-coding",
26
30
  "jest-alternative",
27
31
  "vitest-alternative",
28
32
  "nodejs",
@@ -68,6 +72,7 @@
68
72
  "src/assets/*",
69
73
  "docs",
70
74
  "templates",
75
+ "scripts/claude-hook.js",
71
76
  "index.js",
72
77
  "index.d.ts",
73
78
  "globals.js",
@@ -89,6 +94,7 @@
89
94
  "typecheck": "tsc -p tsconfig.json --pretty false",
90
95
  "benchmark": "node scripts/benchmark.js",
91
96
  "benchmark:showcase": "node scripts/benchmark-showcase-runners.js",
97
+ "benchmark:first-try": "node scripts/benchmark-first-try.js",
92
98
  "benchmark:gate": "node scripts/benchmark-gate.js",
93
99
  "proof:migration": "node scripts/verify-migration-fixtures.js",
94
100
  "pack:check": "npm pack --dry-run",