git-impact 0.3.0 → 0.6.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.
- package/README.md +124 -78
- package/dist/cli/index.js +32 -211
- package/dist/cli/index.js.map +1 -1
- package/dist/init/installer.d.ts +6 -0
- package/dist/init/installer.d.ts.map +1 -1
- package/dist/init/installer.js +58 -5
- package/dist/init/installer.js.map +1 -1
- package/dist/init/installer.test.d.ts +2 -0
- package/dist/init/installer.test.d.ts.map +1 -0
- package/dist/init/installer.test.js +127 -0
- package/dist/init/installer.test.js.map +1 -0
- package/dist/init/templates.d.ts +8 -7
- package/dist/init/templates.d.ts.map +1 -1
- package/dist/init/templates.js +73 -371
- package/dist/init/templates.js.map +1 -1
- package/dist/mcp/resources.js +0 -1
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +64 -12
- package/dist/mcp/tools.js.map +1 -1
- package/dist/readers/git.d.ts +2 -1
- package/dist/readers/git.d.ts.map +1 -1
- package/dist/readers/git.js +12 -6
- package/dist/readers/git.js.map +1 -1
- package/dist/readers/redact.d.ts +29 -0
- package/dist/readers/redact.d.ts.map +1 -0
- package/dist/readers/redact.js +82 -0
- package/dist/readers/redact.js.map +1 -0
- package/dist/readers/redact.test.d.ts +2 -0
- package/dist/readers/redact.test.d.ts.map +1 -0
- package/dist/readers/redact.test.js +72 -0
- package/dist/readers/redact.test.js.map +1 -0
- package/dist/report/html.d.ts +2 -0
- package/dist/report/html.d.ts.map +1 -1
- package/dist/report/html.js +35 -1
- package/dist/report/html.js.map +1 -1
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +2 -0
- package/dist/report/render.js.map +1 -1
- package/dist/storage/db.d.ts +23 -2
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +12 -0
- package/dist/storage/db.js.map +1 -1
- package/dist/storage/db.test.d.ts +2 -0
- package/dist/storage/db.test.d.ts.map +1 -0
- package/dist/storage/db.test.js +152 -0
- package/dist/storage/db.test.js.map +1 -0
- package/package.json +7 -6
- package/skill/SKILL.md +131 -206
- package/skill/references/html-template.md +131 -0
- package/skill/references/translation-rules.md +87 -0
- package/dist/translator/prompt.d.ts +0 -21
- package/dist/translator/prompt.d.ts.map +0 -1
- package/dist/translator/prompt.js +0 -117
- package/dist/translator/prompt.js.map +0 -1
- package/dist/translator/translate.d.ts +0 -36
- package/dist/translator/translate.d.ts.map +0 -1
- package/dist/translator/translate.js +0 -73
- package/dist/translator/translate.js.map +0 -1
package/dist/storage/db.d.ts
CHANGED
|
@@ -3,13 +3,29 @@ export interface UserContext {
|
|
|
3
3
|
managerPriorities: string;
|
|
4
4
|
glossary: Record<string, string>;
|
|
5
5
|
githubToken?: string;
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Optional privacy filter config. Default: enabled. Filenames matching env /
|
|
8
|
+
* credentials patterns are redacted; obvious-looking secrets in commit
|
|
9
|
+
* bodies are too. Override via `{ "privacy": { "redact": false } }` to disable
|
|
10
|
+
* or `{ "privacy": { "filePatterns": [...], "valuePatterns": [...] } }` to extend.
|
|
11
|
+
*/
|
|
12
|
+
privacy?: {
|
|
13
|
+
redact?: boolean;
|
|
14
|
+
filePatterns?: string[];
|
|
15
|
+
valuePatterns?: string[];
|
|
16
|
+
};
|
|
7
17
|
}
|
|
18
|
+
export type ImpactStatus = "done" | "in_progress" | "blocked";
|
|
19
|
+
export type ImpactProvenance = "pr" | "commit_body" | "commit_message" | "ticket" | "inferred";
|
|
8
20
|
export interface ImpactItem {
|
|
9
|
-
status:
|
|
21
|
+
status: ImpactStatus;
|
|
10
22
|
summary: string;
|
|
11
23
|
impact: string;
|
|
12
24
|
technical_note?: string;
|
|
25
|
+
/** Where the "why it matters" came from. "inferred" means the model guessed — surface this in UI. */
|
|
26
|
+
provenance?: ImpactProvenance;
|
|
27
|
+
/** Optional supporting refs (PR numbers, commit hashes, ticket IDs) for the bullet. */
|
|
28
|
+
refs?: string[];
|
|
13
29
|
}
|
|
14
30
|
export interface ImpactEntry {
|
|
15
31
|
id?: number;
|
|
@@ -27,5 +43,10 @@ export declare function loadContext(repoRoot: string): UserContext | null;
|
|
|
27
43
|
export declare function saveContext(ctx: UserContext, repoRoot: string): void;
|
|
28
44
|
export declare function saveEntry(entry: ImpactEntry, repoRoot: string): number;
|
|
29
45
|
export declare function getEntriesForRange(fromDate: string, toDate: string, repoRoot: string): ImpactEntry[];
|
|
46
|
+
/**
|
|
47
|
+
* Returns the most recent saved entry's date (YYYY-MM-DD), or null if none exists.
|
|
48
|
+
* Used to power "since last standup" — the default mode after Phase 1.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getLastEntryDate(repoRoot: string): string | null;
|
|
30
51
|
export declare function getEntriesForDaysAgo(days: number, repoRoot: string): ImpactEntry[];
|
|
31
52
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/storage/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,aAAa,GAAG,gBAAgB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/F,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qGAAqG;IACrG,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAuCD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQhE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CASpE;AAID,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBtE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,WAAW,EAAE,CAMf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMhE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAMlF"}
|
package/dist/storage/db.js
CHANGED
|
@@ -40,6 +40,7 @@ exports.loadContext = loadContext;
|
|
|
40
40
|
exports.saveContext = saveContext;
|
|
41
41
|
exports.saveEntry = saveEntry;
|
|
42
42
|
exports.getEntriesForRange = getEntriesForRange;
|
|
43
|
+
exports.getLastEntryDate = getLastEntryDate;
|
|
43
44
|
exports.getEntriesForDaysAgo = getEntriesForDaysAgo;
|
|
44
45
|
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
45
46
|
const path = __importStar(require("path"));
|
|
@@ -131,6 +132,17 @@ function getEntriesForRange(fromDate, toDate, repoRoot) {
|
|
|
131
132
|
.all(fromDate, toDate);
|
|
132
133
|
return rows.map(rowToEntry);
|
|
133
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Returns the most recent saved entry's date (YYYY-MM-DD), or null if none exists.
|
|
137
|
+
* Used to power "since last standup" — the default mode after Phase 1.
|
|
138
|
+
*/
|
|
139
|
+
function getLastEntryDate(repoRoot) {
|
|
140
|
+
const db = getDb(repoRoot);
|
|
141
|
+
const row = db
|
|
142
|
+
.prepare(`SELECT date FROM impact_entries ORDER BY date DESC, id DESC LIMIT 1`)
|
|
143
|
+
.get();
|
|
144
|
+
return row?.date ?? null;
|
|
145
|
+
}
|
|
134
146
|
function getEntriesForDaysAgo(days, repoRoot) {
|
|
135
147
|
const cutoff = new Date();
|
|
136
148
|
cutoff.setDate(cutoff.getDate() - days);
|
package/dist/storage/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.test.d.ts","sourceRoot":"","sources":["../../src/storage/db.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const vitest_1 = require("vitest");
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const db_1 = require("./db");
|
|
41
|
+
let tmp;
|
|
42
|
+
(0, vitest_1.beforeEach)(() => {
|
|
43
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "git-impact-test-"));
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.afterEach)(() => {
|
|
46
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.describe)("context.json round-trip", () => {
|
|
49
|
+
(0, vitest_1.it)("saves and loads context", () => {
|
|
50
|
+
(0, db_1.saveContext)({
|
|
51
|
+
companyDescription: "Test Co",
|
|
52
|
+
managerPriorities: "Ship fast",
|
|
53
|
+
glossary: { RLS: "data security" },
|
|
54
|
+
}, tmp);
|
|
55
|
+
const loaded = (0, db_1.loadContext)(tmp);
|
|
56
|
+
(0, vitest_1.expect)(loaded?.companyDescription).toBe("Test Co");
|
|
57
|
+
(0, vitest_1.expect)(loaded?.glossary.RLS).toBe("data security");
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)("returns null when no context file exists", () => {
|
|
60
|
+
(0, vitest_1.expect)((0, db_1.loadContext)(tmp)).toBeNull();
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)("preserves privacy config", () => {
|
|
63
|
+
(0, db_1.saveContext)({
|
|
64
|
+
companyDescription: "X",
|
|
65
|
+
managerPriorities: "Y",
|
|
66
|
+
glossary: {},
|
|
67
|
+
privacy: { redact: false, filePatterns: ["*.internal"] },
|
|
68
|
+
}, tmp);
|
|
69
|
+
const loaded = (0, db_1.loadContext)(tmp);
|
|
70
|
+
(0, vitest_1.expect)(loaded?.privacy?.redact).toBe(false);
|
|
71
|
+
(0, vitest_1.expect)(loaded?.privacy?.filePatterns).toEqual(["*.internal"]);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.describe)("impact entries", () => {
|
|
75
|
+
const item = (over = {}) => ({
|
|
76
|
+
status: "done",
|
|
77
|
+
summary: "Shipped X",
|
|
78
|
+
impact: "Unblocked Y",
|
|
79
|
+
provenance: "pr",
|
|
80
|
+
...over,
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)("getLastEntryDate returns null when empty", () => {
|
|
83
|
+
(0, vitest_1.expect)((0, db_1.getLastEntryDate)(tmp)).toBeNull();
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.it)("saves an entry and getLastEntryDate finds it", () => {
|
|
86
|
+
(0, db_1.saveEntry)({
|
|
87
|
+
date: "2026-05-09",
|
|
88
|
+
repoPath: tmp,
|
|
89
|
+
repoName: "test",
|
|
90
|
+
totalCommits: 1,
|
|
91
|
+
totalFiles: 1,
|
|
92
|
+
filesSummary: "src",
|
|
93
|
+
items: [item()],
|
|
94
|
+
rawJson: "[]",
|
|
95
|
+
createdAt: new Date().toISOString(),
|
|
96
|
+
}, tmp);
|
|
97
|
+
(0, vitest_1.expect)((0, db_1.getLastEntryDate)(tmp)).toBe("2026-05-09");
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.it)("getLastEntryDate returns the most recent across many entries", () => {
|
|
100
|
+
const dates = ["2026-05-01", "2026-05-09", "2026-05-05"];
|
|
101
|
+
for (const date of dates) {
|
|
102
|
+
(0, db_1.saveEntry)({
|
|
103
|
+
date,
|
|
104
|
+
repoPath: tmp,
|
|
105
|
+
repoName: "r",
|
|
106
|
+
totalCommits: 1,
|
|
107
|
+
totalFiles: 1,
|
|
108
|
+
filesSummary: "",
|
|
109
|
+
items: [item()],
|
|
110
|
+
rawJson: "[]",
|
|
111
|
+
createdAt: new Date().toISOString(),
|
|
112
|
+
}, tmp);
|
|
113
|
+
}
|
|
114
|
+
(0, vitest_1.expect)((0, db_1.getLastEntryDate)(tmp)).toBe("2026-05-09");
|
|
115
|
+
});
|
|
116
|
+
(0, vitest_1.it)("preserves provenance and refs through save → get", () => {
|
|
117
|
+
(0, db_1.saveEntry)({
|
|
118
|
+
date: "2026-05-09",
|
|
119
|
+
repoPath: tmp,
|
|
120
|
+
repoName: "r",
|
|
121
|
+
totalCommits: 1,
|
|
122
|
+
totalFiles: 1,
|
|
123
|
+
filesSummary: "",
|
|
124
|
+
items: [
|
|
125
|
+
item({ provenance: "inferred", refs: ["PR #42", "ENG-1234"] }),
|
|
126
|
+
],
|
|
127
|
+
rawJson: "[]",
|
|
128
|
+
createdAt: new Date().toISOString(),
|
|
129
|
+
}, tmp);
|
|
130
|
+
const entries = (0, db_1.getEntriesForRange)("2026-05-09", "2026-05-09", tmp);
|
|
131
|
+
(0, vitest_1.expect)(entries[0].items[0].provenance).toBe("inferred");
|
|
132
|
+
(0, vitest_1.expect)(entries[0].items[0].refs).toEqual(["PR #42", "ENG-1234"]);
|
|
133
|
+
});
|
|
134
|
+
(0, vitest_1.it)("getEntriesForDaysAgo returns recent entries", () => {
|
|
135
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
136
|
+
(0, db_1.saveEntry)({
|
|
137
|
+
date: today,
|
|
138
|
+
repoPath: tmp,
|
|
139
|
+
repoName: "r",
|
|
140
|
+
totalCommits: 1,
|
|
141
|
+
totalFiles: 1,
|
|
142
|
+
filesSummary: "",
|
|
143
|
+
items: [item()],
|
|
144
|
+
rawJson: "[]",
|
|
145
|
+
createdAt: new Date().toISOString(),
|
|
146
|
+
}, tmp);
|
|
147
|
+
const entries = (0, db_1.getEntriesForDaysAgo)(7, tmp);
|
|
148
|
+
(0, vitest_1.expect)(entries).toHaveLength(1);
|
|
149
|
+
(0, vitest_1.expect)(entries[0].date).toBe(today);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=db.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../src/storage/db.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "git-impact",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Translate your git commits into plain-English business impact",
|
|
3
|
+
"version": "0.6.2",
|
|
4
|
+
"description": "Translate your git commits into plain-English business impact — runs inside your AI editor, no API key.",
|
|
5
5
|
"author": "Efraim Nafady",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -25,7 +25,9 @@
|
|
|
25
25
|
"prepublishOnly": "npm run build",
|
|
26
26
|
"dev": "ts-node src/cli/index.ts",
|
|
27
27
|
"start": "node dist/cli/index.js",
|
|
28
|
-
"mcp": "node dist/mcp/server.js"
|
|
28
|
+
"mcp": "node dist/mcp/server.js",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest"
|
|
29
31
|
},
|
|
30
32
|
"keywords": [
|
|
31
33
|
"git",
|
|
@@ -38,18 +40,17 @@
|
|
|
38
40
|
],
|
|
39
41
|
"type": "commonjs",
|
|
40
42
|
"dependencies": {
|
|
41
|
-
"@anthropic-ai/sdk": "^0.95.0",
|
|
42
43
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
43
44
|
"@octokit/rest": "^22.0.1",
|
|
44
45
|
"better-sqlite3": "^12.9.0",
|
|
45
46
|
"commander": "^14.0.3",
|
|
46
|
-
"conf": "^15.1.0",
|
|
47
47
|
"simple-git": "^3.36.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/better-sqlite3": "^7.6.13",
|
|
51
51
|
"@types/node": "^25.6.0",
|
|
52
52
|
"ts-node": "^10.9.2",
|
|
53
|
-
"typescript": "^6.0.3"
|
|
53
|
+
"typescript": "^6.0.3",
|
|
54
|
+
"vitest": "^2.1.9"
|
|
54
55
|
}
|
|
55
56
|
}
|