@praneeth_54/agentdoctor 1.1.1 → 2.0.1

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.
Files changed (224) hide show
  1. package/CHANGELOG.md +164 -7
  2. package/README.md +263 -513
  3. package/dist/agents/aider/adapter.d.ts +1 -0
  4. package/dist/agents/aider/adapter.js +1 -0
  5. package/dist/agents/aider/detector.d.ts +14 -0
  6. package/dist/agents/aider/detector.js +120 -0
  7. package/dist/agents/copilot/adapter.d.ts +1 -0
  8. package/dist/agents/copilot/adapter.js +1 -0
  9. package/dist/agents/copilot/detector.d.ts +13 -0
  10. package/dist/agents/copilot/detector.js +113 -0
  11. package/dist/agents/gemini/adapter.d.ts +1 -0
  12. package/dist/agents/gemini/adapter.js +1 -0
  13. package/dist/agents/gemini/detector.d.ts +13 -0
  14. package/dist/agents/gemini/detector.js +151 -0
  15. package/dist/agents/registry.js +13 -1
  16. package/dist/agents/types.d.ts +1 -1
  17. package/dist/agents/windsurf/adapter.d.ts +1 -0
  18. package/dist/agents/windsurf/adapter.js +1 -0
  19. package/dist/agents/windsurf/detector.d.ts +14 -0
  20. package/dist/agents/windsurf/detector.js +119 -0
  21. package/dist/architecture/c4.d.ts +22 -0
  22. package/dist/architecture/c4.js +62 -0
  23. package/dist/architecture/contract.d.ts +64 -0
  24. package/dist/architecture/contract.js +373 -0
  25. package/dist/assurance/change.d.ts +211 -0
  26. package/dist/assurance/change.js +624 -0
  27. package/dist/assurance/proof.d.ts +136 -0
  28. package/dist/assurance/proof.js +338 -0
  29. package/dist/auth/index.d.ts +81 -0
  30. package/dist/auth/index.js +130 -0
  31. package/dist/auth/rbac.d.ts +9 -0
  32. package/dist/auth/rbac.js +26 -0
  33. package/dist/cli/commands/architecture.d.ts +6 -0
  34. package/dist/cli/commands/architecture.js +109 -0
  35. package/dist/cli/commands/assurance.d.ts +67 -0
  36. package/dist/cli/commands/assurance.js +210 -0
  37. package/dist/cli/commands/brain.d.ts +12 -0
  38. package/dist/cli/commands/brain.js +162 -0
  39. package/dist/cli/commands/complete.d.ts +23 -0
  40. package/dist/cli/commands/complete.js +232 -0
  41. package/dist/cli/commands/explain.js +1 -1
  42. package/dist/cli/commands/fix.js +22 -2
  43. package/dist/cli/commands/mcp.d.ts +8 -0
  44. package/dist/cli/commands/mcp.js +14 -0
  45. package/dist/cli/commands/platform.d.ts +17 -0
  46. package/dist/cli/commands/platform.js +195 -0
  47. package/dist/cli/commands/policy-graph-run.d.ts +40 -0
  48. package/dist/cli/commands/policy-graph-run.js +200 -0
  49. package/dist/cli/commands/v2.d.ts +55 -0
  50. package/dist/cli/commands/v2.js +278 -0
  51. package/dist/cli/commands/workspace.d.ts +9 -0
  52. package/dist/cli/commands/workspace.js +82 -0
  53. package/dist/cli/program.js +1328 -3
  54. package/dist/constants.d.ts +3 -2
  55. package/dist/constants.js +5 -1
  56. package/dist/contracts/adapters.d.ts +7 -0
  57. package/dist/contracts/adapters.js +60 -0
  58. package/dist/contracts/index.d.ts +162 -0
  59. package/dist/contracts/index.js +18 -0
  60. package/dist/core/baseline/store.d.ts +48 -0
  61. package/dist/core/baseline/store.js +163 -0
  62. package/dist/core/brain-cli/service.d.ts +26 -0
  63. package/dist/core/brain-cli/service.js +175 -0
  64. package/dist/core/brain-product/init.d.ts +45 -0
  65. package/dist/core/brain-product/init.js +235 -0
  66. package/dist/core/changes/analyze.d.ts +41 -0
  67. package/dist/core/changes/analyze.js +223 -0
  68. package/dist/core/context-health/analyze.d.ts +15 -0
  69. package/dist/core/context-health/analyze.js +234 -0
  70. package/dist/core/fix/apply.d.ts +21 -4
  71. package/dist/core/fix/apply.js +118 -18
  72. package/dist/core/fix/backup.d.ts +30 -0
  73. package/dist/core/fix/backup.js +193 -0
  74. package/dist/core/fix/plan.d.ts +6 -3
  75. package/dist/core/fix/plan.js +113 -9
  76. package/dist/core/fix/render.d.ts +2 -0
  77. package/dist/core/fix/render.js +36 -21
  78. package/dist/core/fix/run.js +5 -1
  79. package/dist/core/fix/safe-target.d.ts +14 -0
  80. package/dist/core/fix/safe-target.js +81 -0
  81. package/dist/core/fix/types.d.ts +12 -1
  82. package/dist/core/fix/types.js +2 -0
  83. package/dist/core/fix/writers/claude-settings.js +3 -1
  84. package/dist/core/fix/writers/codex-config.d.ts +3 -0
  85. package/dist/core/fix/writers/codex-config.js +24 -3
  86. package/dist/core/fix/writers/cursorignore.js +3 -1
  87. package/dist/core/fix/writers/simple-ignore.d.ts +16 -0
  88. package/dist/core/fix/writers/simple-ignore.js +68 -0
  89. package/dist/core/monorepo/detect.d.ts +13 -0
  90. package/dist/core/monorepo/detect.js +121 -0
  91. package/dist/core/rules/build-context.js +22 -3
  92. package/dist/core/rules/context/generated-directory.js +11 -1
  93. package/dist/core/rules/context/large-instruction-file.js +6 -0
  94. package/dist/core/rules/context/large-log-file.js +16 -1
  95. package/dist/core/rules/ignore.d.ts +11 -1
  96. package/dist/core/rules/ignore.js +22 -1
  97. package/dist/core/rules/instructions/empty-instructions.js +7 -0
  98. package/dist/core/rules/security/env-file-exposure.js +23 -2
  99. package/dist/core/rules/security/private-key-file.js +1 -1
  100. package/dist/core/scanner/scan.js +1 -1
  101. package/dist/core/schemas/validate.d.ts +6 -0
  102. package/dist/core/schemas/validate.js +62 -0
  103. package/dist/core/scoring/compute-scores.d.ts +1 -1
  104. package/dist/core/scoring/compute-scores.js +5 -1
  105. package/dist/core/scoring/placeholder.d.ts +1 -1
  106. package/dist/core/scoring/placeholder.js +5 -1
  107. package/dist/core/secrets/scan.d.ts +29 -0
  108. package/dist/core/secrets/scan.js +172 -0
  109. package/dist/coverage/cobertura.d.ts +6 -0
  110. package/dist/coverage/cobertura.js +52 -0
  111. package/dist/coverage/istanbul.d.ts +7 -0
  112. package/dist/coverage/istanbul.js +134 -0
  113. package/dist/coverage/lcov.d.ts +7 -0
  114. package/dist/coverage/lcov.js +59 -0
  115. package/dist/coverage/load.d.ts +9 -0
  116. package/dist/coverage/load.js +39 -0
  117. package/dist/coverage/types.d.ts +23 -0
  118. package/dist/coverage/types.js +5 -0
  119. package/dist/dashboard/server.d.ts +24 -0
  120. package/dist/dashboard/server.js +402 -0
  121. package/dist/enforcement/runner.d.ts +67 -0
  122. package/dist/enforcement/runner.js +460 -0
  123. package/dist/index.d.ts +34 -0
  124. package/dist/index.js +25 -0
  125. package/dist/integrations/github/pr-analyze.d.ts +28 -0
  126. package/dist/integrations/github/pr-analyze.js +98 -0
  127. package/dist/integrations/local-ai/provider.d.ts +45 -0
  128. package/dist/integrations/local-ai/provider.js +104 -0
  129. package/dist/intelligence/git/analyze.d.ts +34 -0
  130. package/dist/intelligence/git/analyze.js +136 -0
  131. package/dist/intelligence/graph/build.d.ts +15 -0
  132. package/dist/intelligence/graph/build.js +259 -0
  133. package/dist/intelligence/graph/incremental.d.ts +68 -0
  134. package/dist/intelligence/graph/incremental.js +234 -0
  135. package/dist/intelligence/resolve/imports.d.ts +36 -0
  136. package/dist/intelligence/resolve/imports.js +245 -0
  137. package/dist/knowledge/store.d.ts +25 -0
  138. package/dist/knowledge/store.js +91 -0
  139. package/dist/languages/go.d.ts +9 -0
  140. package/dist/languages/go.js +45 -0
  141. package/dist/languages/index.d.ts +11 -0
  142. package/dist/languages/index.js +76 -0
  143. package/dist/languages/php.d.ts +7 -0
  144. package/dist/languages/php.js +193 -0
  145. package/dist/languages/python.d.ts +7 -0
  146. package/dist/languages/python.js +150 -0
  147. package/dist/languages/types.d.ts +42 -0
  148. package/dist/languages/types.js +26 -0
  149. package/dist/languages/typescript.d.ts +3 -0
  150. package/dist/languages/typescript.js +95 -0
  151. package/dist/mcp/agentdoctor/server.d.ts +16 -0
  152. package/dist/mcp/agentdoctor/server.js +67 -0
  153. package/dist/mcp/brain/session.js +7 -7
  154. package/dist/mcp/intelligence/handlers.d.ts +16 -0
  155. package/dist/mcp/intelligence/handlers.js +364 -0
  156. package/dist/mcp/intelligence/path-safety.d.ts +9 -0
  157. package/dist/mcp/intelligence/path-safety.js +63 -0
  158. package/dist/mcp/intelligence/registry.d.ts +8 -0
  159. package/dist/mcp/intelligence/registry.js +228 -0
  160. package/dist/ops/health.d.ts +18 -0
  161. package/dist/ops/health.js +51 -0
  162. package/dist/platform/ai-quality/analyze.d.ts +9 -0
  163. package/dist/platform/ai-quality/analyze.js +65 -0
  164. package/dist/platform/architecture/drift.d.ts +17 -0
  165. package/dist/platform/architecture/drift.js +74 -0
  166. package/dist/platform/auth/local.d.ts +15 -0
  167. package/dist/platform/auth/local.js +58 -0
  168. package/dist/platform/context-security/analyze.d.ts +6 -0
  169. package/dist/platform/context-security/analyze.js +97 -0
  170. package/dist/platform/firewall/evaluate.d.ts +57 -0
  171. package/dist/platform/firewall/evaluate.js +359 -0
  172. package/dist/platform/graph/build.d.ts +6 -0
  173. package/dist/platform/graph/build.js +189 -0
  174. package/dist/platform/health/analyze.d.ts +7 -0
  175. package/dist/platform/health/analyze.js +192 -0
  176. package/dist/platform/index.d.ts +27 -0
  177. package/dist/platform/index.js +89 -0
  178. package/dist/platform/knowledge/analyze.d.ts +20 -0
  179. package/dist/platform/knowledge/analyze.js +96 -0
  180. package/dist/platform/provenance/build.d.ts +44 -0
  181. package/dist/platform/provenance/build.js +65 -0
  182. package/dist/platform/readiness/scorecard.d.ts +5 -0
  183. package/dist/platform/readiness/scorecard.js +98 -0
  184. package/dist/platform/refactor/impact.d.ts +20 -0
  185. package/dist/platform/refactor/impact.js +60 -0
  186. package/dist/platform/reports/export.d.ts +12 -0
  187. package/dist/platform/reports/export.js +92 -0
  188. package/dist/platform/security/redact.d.ts +15 -0
  189. package/dist/platform/security/redact.js +87 -0
  190. package/dist/platform/sessions/store.d.ts +32 -0
  191. package/dist/platform/sessions/store.js +97 -0
  192. package/dist/platform/store.d.ts +6 -0
  193. package/dist/platform/store.js +57 -0
  194. package/dist/platform/test-impact/analyze.d.ts +50 -0
  195. package/dist/platform/test-impact/analyze.js +350 -0
  196. package/dist/platform/time-machine/compare.d.ts +17 -0
  197. package/dist/platform/time-machine/compare.js +62 -0
  198. package/dist/platform/tokens/plan.d.ts +28 -0
  199. package/dist/platform/tokens/plan.js +108 -0
  200. package/dist/platform/types.d.ts +120 -0
  201. package/dist/platform/types.js +5 -0
  202. package/dist/plugins/runtime.d.ts +36 -0
  203. package/dist/plugins/runtime.js +101 -0
  204. package/dist/plugins/sdk.d.ts +29 -0
  205. package/dist/plugins/sdk.js +114 -0
  206. package/dist/policy/compose.d.ts +34 -0
  207. package/dist/policy/compose.js +118 -0
  208. package/dist/policy/packs.d.ts +9 -0
  209. package/dist/policy/packs.js +91 -0
  210. package/dist/reporters/terminal/report.js +38 -5
  211. package/dist/security/paths.d.ts +21 -0
  212. package/dist/security/paths.js +105 -0
  213. package/dist/storage/postgres.d.ts +26 -0
  214. package/dist/storage/postgres.js +90 -0
  215. package/dist/storage/provider.d.ts +30 -0
  216. package/dist/storage/provider.js +109 -0
  217. package/dist/storage/sqlite.d.ts +33 -0
  218. package/dist/storage/sqlite.js +77 -0
  219. package/dist/team/auth.d.ts +35 -0
  220. package/dist/team/auth.js +70 -0
  221. package/dist/types/index.d.ts +5 -1
  222. package/dist/workspace/index.d.ts +69 -0
  223. package/dist/workspace/index.js +220 -0
  224. package/package.json +15 -5
@@ -0,0 +1,220 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { atomicWriteTextFile } from "../utils/fs.js";
5
+ import { isPathInsideRoot, resolveRepoRoot } from "../utils/path.js";
6
+ export const WORKSPACE_SCHEMA_VERSION = "1.0.0";
7
+ function workspacesDir(controlRoot) {
8
+ return path.join(resolveRepoRoot(controlRoot), ".agentdoctor", "workspaces");
9
+ }
10
+ function workspaceFile(controlRoot, id) {
11
+ if (!/^[a-zA-Z0-9_-]{1,64}$/.test(id)) {
12
+ throw new Error("invalid workspace id");
13
+ }
14
+ return path.join(workspacesDir(controlRoot), `${id}.json`);
15
+ }
16
+ function normalizeRoot(rootInput) {
17
+ return resolveRepoRoot(rootInput);
18
+ }
19
+ export async function initWorkspace(options) {
20
+ const controlRoot = resolveRepoRoot(options.controlRoot);
21
+ const id = options.id ??
22
+ `ws_${createHash("sha256").update(`${options.name}:${randomUUID()}`).digest("hex").slice(0, 12)}`;
23
+ const now = new Date().toISOString();
24
+ const roots = [];
25
+ if (options.repositoryRoot) {
26
+ roots.push(normalizeRoot(options.repositoryRoot));
27
+ }
28
+ const model = {
29
+ schemaVersion: WORKSPACE_SCHEMA_VERSION,
30
+ id,
31
+ name: options.name.trim() || id,
32
+ repositoryRoots: roots,
33
+ allowCrossRead: options.allowCrossRead === true,
34
+ createdAt: now,
35
+ updatedAt: now,
36
+ };
37
+ await fs.mkdir(workspacesDir(controlRoot), { recursive: true });
38
+ const target = workspaceFile(controlRoot, id);
39
+ try {
40
+ await fs.access(target);
41
+ throw new Error(`workspace already exists: ${id}`);
42
+ }
43
+ catch (error) {
44
+ if (error instanceof Error && error.message.startsWith("workspace already exists")) {
45
+ throw error;
46
+ }
47
+ }
48
+ await atomicWriteTextFile(target, `${JSON.stringify(model, null, 2)}\n`);
49
+ return model;
50
+ }
51
+ export async function loadWorkspace(controlRoot, id) {
52
+ try {
53
+ const raw = await fs.readFile(workspaceFile(controlRoot, id), "utf8");
54
+ const parsed = JSON.parse(raw);
55
+ if (!parsed ||
56
+ parsed.schemaVersion !== WORKSPACE_SCHEMA_VERSION ||
57
+ !Array.isArray(parsed.repositoryRoots)) {
58
+ return null;
59
+ }
60
+ return {
61
+ ...parsed,
62
+ allowCrossRead: parsed.allowCrossRead === true,
63
+ repositoryRoots: parsed.repositoryRoots.map((r) => normalizeRoot(r)),
64
+ };
65
+ }
66
+ catch {
67
+ return null;
68
+ }
69
+ }
70
+ export async function listWorkspaces(controlRoot) {
71
+ const dir = workspacesDir(controlRoot);
72
+ let entries;
73
+ try {
74
+ entries = await fs.readdir(dir);
75
+ }
76
+ catch {
77
+ return [];
78
+ }
79
+ const out = [];
80
+ for (const name of entries) {
81
+ if (!name.endsWith(".json"))
82
+ continue;
83
+ const id = name.slice(0, -".json".length);
84
+ const ws = await loadWorkspace(controlRoot, id);
85
+ if (ws)
86
+ out.push(ws);
87
+ }
88
+ return out.sort((a, b) => a.id.localeCompare(b.id));
89
+ }
90
+ export async function addRepositoryToWorkspace(options) {
91
+ const ws = await loadWorkspace(options.controlRoot, options.workspaceId);
92
+ if (!ws)
93
+ throw new Error(`workspace not found: ${options.workspaceId}`);
94
+ const root = normalizeRoot(options.repositoryRoot);
95
+ if (!ws.repositoryRoots.includes(root)) {
96
+ ws.repositoryRoots.push(root);
97
+ ws.updatedAt = new Date().toISOString();
98
+ await atomicWriteTextFile(workspaceFile(options.controlRoot, ws.id), `${JSON.stringify(ws, null, 2)}\n`);
99
+ }
100
+ return ws;
101
+ }
102
+ export async function removeWorkspace(controlRoot, id) {
103
+ try {
104
+ await fs.unlink(workspaceFile(controlRoot, id));
105
+ return true;
106
+ }
107
+ catch {
108
+ return false;
109
+ }
110
+ }
111
+ export async function workspaceStatus(controlRoot, id) {
112
+ const ws = await loadWorkspace(controlRoot, id);
113
+ if (!ws)
114
+ return { ok: false, missingRoots: [], error: "workspace not found" };
115
+ const missingRoots = [];
116
+ for (const root of ws.repositoryRoots) {
117
+ try {
118
+ const st = await fs.stat(root);
119
+ if (!st.isDirectory())
120
+ missingRoots.push(root);
121
+ }
122
+ catch {
123
+ missingRoots.push(root);
124
+ }
125
+ }
126
+ return { ok: missingRoots.length === 0, workspace: ws, missingRoots };
127
+ }
128
+ /**
129
+ * Isolation gate: a path may be read only when it is inside the operation's own
130
+ * repositoryRoot, OR (allowCrossRead && both roots are members of the same workspace).
131
+ */
132
+ export function assertWorkspacePathAccess(options) {
133
+ const operationRoot = normalizeRoot(options.operationRoot);
134
+ const target = path.resolve(options.targetPath);
135
+ if (isPathInsideRoot(operationRoot, target)) {
136
+ return {
137
+ allowed: true,
138
+ reason: "inside operation repository root",
139
+ requestedRoot: operationRoot,
140
+ targetRoot: operationRoot,
141
+ ...(options.workspace ? { workspaceId: options.workspace.id } : {}),
142
+ };
143
+ }
144
+ if (!options.workspace) {
145
+ return {
146
+ allowed: false,
147
+ reason: "path outside operation root and no workspace context",
148
+ requestedRoot: operationRoot,
149
+ };
150
+ }
151
+ const members = options.workspace.repositoryRoots.map(normalizeRoot);
152
+ if (!members.includes(operationRoot)) {
153
+ return {
154
+ allowed: false,
155
+ reason: "operation root is not a member of the workspace",
156
+ workspaceId: options.workspace.id,
157
+ requestedRoot: operationRoot,
158
+ };
159
+ }
160
+ const targetMember = members.find((root) => isPathInsideRoot(root, target));
161
+ if (!targetMember) {
162
+ return {
163
+ allowed: false,
164
+ reason: "target path is not under any workspace member root",
165
+ workspaceId: options.workspace.id,
166
+ requestedRoot: operationRoot,
167
+ };
168
+ }
169
+ if (targetMember === operationRoot) {
170
+ return {
171
+ allowed: true,
172
+ reason: "inside operation repository root",
173
+ workspaceId: options.workspace.id,
174
+ requestedRoot: operationRoot,
175
+ targetRoot: targetMember,
176
+ };
177
+ }
178
+ if (!options.workspace.allowCrossRead) {
179
+ return {
180
+ allowed: false,
181
+ reason: "cross-repo read denied: target is under another workspace member and allowCrossRead=false",
182
+ workspaceId: options.workspace.id,
183
+ requestedRoot: operationRoot,
184
+ targetRoot: targetMember,
185
+ };
186
+ }
187
+ return {
188
+ allowed: true,
189
+ reason: "allowCrossRead enabled for same-workspace member",
190
+ workspaceId: options.workspace.id,
191
+ requestedRoot: operationRoot,
192
+ targetRoot: targetMember,
193
+ };
194
+ }
195
+ /**
196
+ * Read a file only when workspace isolation allows it.
197
+ */
198
+ export async function readFileWithinWorkspace(options) {
199
+ const access = assertWorkspacePathAccess({
200
+ workspace: options.workspace,
201
+ operationRoot: options.operationRoot,
202
+ targetPath: options.targetPath,
203
+ });
204
+ if (!access.allowed) {
205
+ return { ok: false, access, error: access.reason };
206
+ }
207
+ try {
208
+ const buf = await fs.readFile(path.resolve(options.targetPath));
209
+ const max = options.maxBytes ?? 1024 * 1024;
210
+ const content = buf.subarray(0, max).toString("utf8");
211
+ return { ok: true, content, access };
212
+ }
213
+ catch (error) {
214
+ return {
215
+ ok: false,
216
+ access,
217
+ error: error instanceof Error ? error.message : String(error),
218
+ };
219
+ }
220
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@praneeth_54/agentdoctor",
3
- "version": "1.1.1",
4
- "description": "Audit AI coding agent configuration in a repository — local, deterministic, no API key.",
3
+ "version": "2.0.1",
4
+ "description": "Engineering assurance for AI coding agents — repository intelligence, change evidence, safety controls, and MCP tools.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "agentdoctor": "./dist/cli/index.js"
@@ -40,7 +40,7 @@
40
40
  "validate:project-brain": "tsx validation/project-brain/run.ts",
41
41
  "validate:project-brain:real-world": "tsx validation/project-brain/real-world-run.ts",
42
42
  "benchmark:project-brain": "tsx validation/project-brain/benchmark.ts",
43
- "verify": "npm run typecheck && npm run lint && npm run format:check && npm test && npm run build",
43
+ "verify": "npm run typecheck && npm run lint && npm run format:check && npm run build && npm test",
44
44
  "verify:understanding": "npm run typecheck && npm run test:understanding",
45
45
  "verify:project-brain": "npm run typecheck && npm run test:understanding && npm run validate:project-brain && npm run benchmark:project-brain",
46
46
  "verify:mcp": "npm run typecheck && npm run test:mcp",
@@ -54,7 +54,14 @@
54
54
  "cursor",
55
55
  "claude-code",
56
56
  "codex",
57
+ "copilot",
58
+ "windsurf",
59
+ "gemini",
60
+ "aider",
57
61
  "mcp",
62
+ "change-assurance",
63
+ "evidence",
64
+ "engineering-assurance",
58
65
  "security",
59
66
  "linter",
60
67
  "cli",
@@ -76,8 +83,12 @@
76
83
  },
77
84
  "dependencies": {
78
85
  "@modelcontextprotocol/sdk": "^1.30.0",
86
+ "@types/pg": "^8.23.1",
79
87
  "commander": "^14.0.3",
80
- "picocolors": "^1.1.1"
88
+ "jose": "^6.2.12",
89
+ "pg": "^8.23.0",
90
+ "picocolors": "^1.1.1",
91
+ "typescript": "^5.9.3"
81
92
  },
82
93
  "devDependencies": {
83
94
  "@eslint/js": "^9.39.2",
@@ -85,7 +96,6 @@
85
96
  "eslint": "^9.39.2",
86
97
  "prettier": "^3.7.4",
87
98
  "tsx": "^4.23.13",
88
- "typescript": "^5.9.3",
89
99
  "typescript-eslint": "^8.70.0",
90
100
  "vitest": "^3.2.4"
91
101
  },