@jev-kit/cli 0.1.0 → 0.2.0
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/README.md +10 -1
- package/dist/evidence-cli.d.ts +3 -0
- package/dist/evidence-cli.d.ts.map +1 -0
- package/dist/evidence-cli.js +47 -0
- package/dist/evidence-cli.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -1
- package/dist/semantic-diff-cli.d.ts +3 -0
- package/dist/semantic-diff-cli.d.ts.map +1 -0
- package/dist/semantic-diff-cli.js +47 -0
- package/dist/semantic-diff-cli.js.map +1 -0
- package/package.json +10 -6
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @jev-kit/cli
|
|
2
2
|
|
|
3
|
-
Run Jev agent review from hooks, shell scripts, Python or any process that can exchange JSON over stdin/stdout.
|
|
3
|
+
Run Jev agent review, evidence checks and semantic diffs from hooks, shell scripts, Python or any process that can exchange JSON over stdin/stdout.
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
6
|
jev-agent-review --adapter normalized --config ./policy.json < request.json
|
|
@@ -14,3 +14,12 @@ jev-agent-review --adapter claude-permission --config ./policy.json
|
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
The API key is read by the official TypeSafe SDK from `TYPESAFE_API_KEY`. Do not place credentials in the policy file. Hook adapters print native allow JSON only after the configured policy passes; a deferred decision produces no hook output.
|
|
17
|
+
|
|
18
|
+
The evidence and semantic-diff commands accept caller-defined, versioned axes or dimensions. They return measured scores without choosing the caller's threshold or control flow.
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
jev-kit-evidence-check < evidence-request.json
|
|
22
|
+
jev-kit-semantic-diff < diff-request.json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Both commands make one Jev attempt and validate the response against the exact requested contract. Provider failures return a JSON `unavailable` result; malformed input exits with status 2.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-cli.d.ts","sourceRoot":"","sources":["../src/evidence-cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { JevClient, JevEvaluationError } from "@jev-kit/decision-contract";
|
|
3
|
+
import { defineProofContract, verifyClaim } from "@jev-kit/evidence-check";
|
|
4
|
+
import { parseEvidenceCheckInput } from "./index.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
const input = parseEvidenceCheckInput(JSON.parse(await readStdin()));
|
|
7
|
+
const client = new JevClient({ ...(input.model === undefined ? {} : { defaultModel: input.model }) });
|
|
8
|
+
const contract = input.contract === undefined ? undefined : defineProofContract(input.contract);
|
|
9
|
+
const result = await verifyClaim({
|
|
10
|
+
client,
|
|
11
|
+
evidence: input.evidence,
|
|
12
|
+
claim: input.claim,
|
|
13
|
+
...(contract === undefined ? {} : { contract }),
|
|
14
|
+
});
|
|
15
|
+
process.stdout.write(`${JSON.stringify({
|
|
16
|
+
schemaVersion: 1,
|
|
17
|
+
status: "evaluated",
|
|
18
|
+
contract: result.response.contract,
|
|
19
|
+
scores: result.scores,
|
|
20
|
+
model: result.response.model,
|
|
21
|
+
usage: result.response.usage,
|
|
22
|
+
})}\n`);
|
|
23
|
+
}
|
|
24
|
+
async function readStdin() {
|
|
25
|
+
const chunks = [];
|
|
26
|
+
for await (const chunk of process.stdin)
|
|
27
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
28
|
+
const text = Buffer.concat(chunks).toString("utf8");
|
|
29
|
+
if (text.trim() === "")
|
|
30
|
+
throw new TypeError("stdin must contain one JSON document");
|
|
31
|
+
return text;
|
|
32
|
+
}
|
|
33
|
+
main().catch((error) => {
|
|
34
|
+
if (error instanceof JevEvaluationError) {
|
|
35
|
+
process.stdout.write(`${JSON.stringify({
|
|
36
|
+
schemaVersion: 1,
|
|
37
|
+
status: "unavailable",
|
|
38
|
+
errorKind: error.kind,
|
|
39
|
+
...(error.status === undefined ? {} : { httpStatus: error.status }),
|
|
40
|
+
})}\n`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
44
|
+
process.stderr.write(`jev-kit-evidence-check: ${message}\n`);
|
|
45
|
+
process.exitCode = 2;
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=evidence-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-cli.js","sourceRoot":"","sources":["../src/evidence-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { EntryType } from "@jev-kit/decision-contract";
|
|
1
2
|
export interface AgentReviewCliConfig {
|
|
2
3
|
readonly schemaVersion: 1;
|
|
3
4
|
readonly policy: {
|
|
@@ -18,5 +19,35 @@ export interface AgentReviewCliConfig {
|
|
|
18
19
|
readonly userMessageCount?: number;
|
|
19
20
|
readonly model?: string;
|
|
20
21
|
}
|
|
22
|
+
export interface EvidenceCheckCliInput {
|
|
23
|
+
readonly schemaVersion: 1;
|
|
24
|
+
readonly evidence: EntryType;
|
|
25
|
+
readonly claim: EntryType;
|
|
26
|
+
readonly contract?: {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly version: string;
|
|
29
|
+
readonly axes: readonly {
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly instructions: string;
|
|
32
|
+
}[];
|
|
33
|
+
};
|
|
34
|
+
readonly model?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface SemanticDiffCliInput {
|
|
37
|
+
readonly schemaVersion: 1;
|
|
38
|
+
readonly before: EntryType;
|
|
39
|
+
readonly after: EntryType;
|
|
40
|
+
readonly contract?: {
|
|
41
|
+
readonly id: string;
|
|
42
|
+
readonly version: string;
|
|
43
|
+
readonly dimensions: readonly {
|
|
44
|
+
readonly id: string;
|
|
45
|
+
readonly instructions: string;
|
|
46
|
+
}[];
|
|
47
|
+
};
|
|
48
|
+
readonly model?: string;
|
|
49
|
+
}
|
|
21
50
|
export declare function parseCliConfig(value: unknown): AgentReviewCliConfig;
|
|
51
|
+
export declare function parseEvidenceCheckInput(value: unknown): EvidenceCheckCliInput;
|
|
52
|
+
export declare function parseSemanticDiffInput(value: unknown): SemanticDiffCliInput;
|
|
22
53
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,UAAU,EAAE;YACnB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;YACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;YACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC3B,CAAC;QACF,QAAQ,CAAC,SAAS,CAAC,EAAE;YACnB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;YAClC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;YACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAiBnE"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,UAAU,EAAE;YACnB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;YACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;YACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC3B,CAAC;QACF,QAAQ,CAAC,SAAS,CAAC,EAAE;YACnB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;YAClC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;YACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,EAAE,SAAS;YAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAClF,CAAC;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,UAAU,EAAE,SAAS;YAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACxF,CAAC;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAiBnE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAU7E;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAU3E"}
|
package/dist/index.js
CHANGED
|
@@ -18,11 +18,86 @@ export function parseCliConfig(value) {
|
|
|
18
18
|
nonempty(config.model, "config.model");
|
|
19
19
|
return value;
|
|
20
20
|
}
|
|
21
|
+
export function parseEvidenceCheckInput(value) {
|
|
22
|
+
const input = record(value, "input");
|
|
23
|
+
schemaVersion(input.schemaVersion);
|
|
24
|
+
if (!("evidence" in input))
|
|
25
|
+
throw new TypeError("input.evidence is required");
|
|
26
|
+
if (!("claim" in input))
|
|
27
|
+
throw new TypeError("input.claim is required");
|
|
28
|
+
entryValue(input.evidence, "input.evidence");
|
|
29
|
+
entryValue(input.claim, "input.claim");
|
|
30
|
+
if (input.contract !== undefined)
|
|
31
|
+
parseNamedItemsContract(input.contract, "axes", "input.contract");
|
|
32
|
+
if (input.model !== undefined)
|
|
33
|
+
nonempty(input.model, "input.model");
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
export function parseSemanticDiffInput(value) {
|
|
37
|
+
const input = record(value, "input");
|
|
38
|
+
schemaVersion(input.schemaVersion);
|
|
39
|
+
if (!("before" in input))
|
|
40
|
+
throw new TypeError("input.before is required");
|
|
41
|
+
if (!("after" in input))
|
|
42
|
+
throw new TypeError("input.after is required");
|
|
43
|
+
entryValue(input.before, "input.before");
|
|
44
|
+
entryValue(input.after, "input.after");
|
|
45
|
+
if (input.contract !== undefined)
|
|
46
|
+
parseNamedItemsContract(input.contract, "dimensions", "input.contract");
|
|
47
|
+
if (input.model !== undefined)
|
|
48
|
+
nonempty(input.model, "input.model");
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function parseNamedItemsContract(value, itemKey, path) {
|
|
52
|
+
const contract = record(value, path);
|
|
53
|
+
nonempty(contract.id, `${path}.id`);
|
|
54
|
+
nonempty(contract.version, `${path}.version`);
|
|
55
|
+
const items = contract[itemKey];
|
|
56
|
+
if (!Array.isArray(items) || items.length === 0)
|
|
57
|
+
throw new TypeError(`${path}.${itemKey} must be a nonempty array`);
|
|
58
|
+
for (const [index, item] of items.entries()) {
|
|
59
|
+
const entry = record(item, `${path}.${itemKey}[${index}]`);
|
|
60
|
+
nonempty(entry.id, `${path}.${itemKey}[${index}].id`);
|
|
61
|
+
nonempty(entry.instructions, `${path}.${itemKey}[${index}].instructions`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function schemaVersion(value) {
|
|
65
|
+
if (value !== 1)
|
|
66
|
+
throw new TypeError("input.schemaVersion must equal 1");
|
|
67
|
+
}
|
|
21
68
|
function record(value, path) {
|
|
22
69
|
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
23
70
|
throw new TypeError(`${path} must be an object`);
|
|
24
71
|
return value;
|
|
25
72
|
}
|
|
73
|
+
function entryValue(value, path) {
|
|
74
|
+
if (typeof value === "number" || typeof value === "boolean" || value === undefined) {
|
|
75
|
+
throw new TypeError(`${path} must be text, an object, an array, or null`);
|
|
76
|
+
}
|
|
77
|
+
jsonValue(value, path, new Set());
|
|
78
|
+
}
|
|
79
|
+
function jsonValue(value, path, seen) {
|
|
80
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
81
|
+
return;
|
|
82
|
+
if (typeof value === "number") {
|
|
83
|
+
if (!Number.isFinite(value))
|
|
84
|
+
throw new TypeError(`${path} must contain only finite numbers`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (typeof value !== "object")
|
|
88
|
+
throw new TypeError(`${path} must be JSON-compatible`);
|
|
89
|
+
if (seen.has(value))
|
|
90
|
+
throw new TypeError(`${path} must not contain cycles`);
|
|
91
|
+
seen.add(value);
|
|
92
|
+
if (Array.isArray(value)) {
|
|
93
|
+
value.forEach((item, index) => jsonValue(item, `${path}[${index}]`, seen));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
for (const [key, item] of Object.entries(value))
|
|
97
|
+
jsonValue(item, `${path}.${key}`, seen);
|
|
98
|
+
}
|
|
99
|
+
seen.delete(value);
|
|
100
|
+
}
|
|
26
101
|
function nonempty(value, path) {
|
|
27
102
|
if (typeof value !== "string" || value.trim() === "")
|
|
28
103
|
throw new TypeError(`${path} must be a nonempty string`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-diff-cli.d.ts","sourceRoot":"","sources":["../src/semantic-diff-cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { JevClient, JevEvaluationError } from "@jev-kit/decision-contract";
|
|
3
|
+
import { defineDiffContract, semanticDiff } from "@jev-kit/semantic-diff";
|
|
4
|
+
import { parseSemanticDiffInput } from "./index.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
const input = parseSemanticDiffInput(JSON.parse(await readStdin()));
|
|
7
|
+
const client = new JevClient({ ...(input.model === undefined ? {} : { defaultModel: input.model }) });
|
|
8
|
+
const contract = input.contract === undefined ? undefined : defineDiffContract(input.contract);
|
|
9
|
+
const result = await semanticDiff({
|
|
10
|
+
client,
|
|
11
|
+
before: input.before,
|
|
12
|
+
after: input.after,
|
|
13
|
+
...(contract === undefined ? {} : { contract }),
|
|
14
|
+
});
|
|
15
|
+
process.stdout.write(`${JSON.stringify({
|
|
16
|
+
schemaVersion: 1,
|
|
17
|
+
status: "evaluated",
|
|
18
|
+
contract: result.response.contract,
|
|
19
|
+
scores: result.scores,
|
|
20
|
+
model: result.response.model,
|
|
21
|
+
usage: result.response.usage,
|
|
22
|
+
})}\n`);
|
|
23
|
+
}
|
|
24
|
+
async function readStdin() {
|
|
25
|
+
const chunks = [];
|
|
26
|
+
for await (const chunk of process.stdin)
|
|
27
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
28
|
+
const text = Buffer.concat(chunks).toString("utf8");
|
|
29
|
+
if (text.trim() === "")
|
|
30
|
+
throw new TypeError("stdin must contain one JSON document");
|
|
31
|
+
return text;
|
|
32
|
+
}
|
|
33
|
+
main().catch((error) => {
|
|
34
|
+
if (error instanceof JevEvaluationError) {
|
|
35
|
+
process.stdout.write(`${JSON.stringify({
|
|
36
|
+
schemaVersion: 1,
|
|
37
|
+
status: "unavailable",
|
|
38
|
+
errorKind: error.kind,
|
|
39
|
+
...(error.status === undefined ? {} : { httpStatus: error.status }),
|
|
40
|
+
})}\n`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
44
|
+
process.stderr.write(`jev-kit-semantic-diff: ${message}\n`);
|
|
45
|
+
process.exitCode = 2;
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=semantic-diff-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-diff-cli.js","sourceRoot":"","sources":["../src/semantic-diff-cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jev-kit/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Run Jev Kit agent review
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Run Jev Kit agent review, evidence checks and semantic diffs from hooks, scripts and non-TypeScript applications.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"repository": {
|
|
@@ -26,7 +26,9 @@
|
|
|
26
26
|
"dist/**/*.map"
|
|
27
27
|
],
|
|
28
28
|
"bin": {
|
|
29
|
-
"jev-agent-review": "./dist/cli.js"
|
|
29
|
+
"jev-agent-review": "./dist/cli.js",
|
|
30
|
+
"jev-kit-evidence-check": "./dist/evidence-cli.js",
|
|
31
|
+
"jev-kit-semantic-diff": "./dist/semantic-diff-cli.js"
|
|
30
32
|
},
|
|
31
33
|
"exports": {
|
|
32
34
|
".": {
|
|
@@ -35,9 +37,11 @@
|
|
|
35
37
|
}
|
|
36
38
|
},
|
|
37
39
|
"dependencies": {
|
|
38
|
-
"@jev-kit/
|
|
39
|
-
"@jev-kit/
|
|
40
|
-
"@jev-kit/
|
|
40
|
+
"@jev-kit/decision-contract": "0.2.0",
|
|
41
|
+
"@jev-kit/evidence-check": "0.1.1",
|
|
42
|
+
"@jev-kit/hook-adapters": "0.1.1",
|
|
43
|
+
"@jev-kit/semantic-diff": "0.1.1",
|
|
44
|
+
"@jev-kit/agent-review": "0.2.0"
|
|
41
45
|
},
|
|
42
46
|
"scripts": {
|
|
43
47
|
"build": "tsc -b"
|