@cyanheads/git-mcp-server 2.4.7 → 2.4.9

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 (3) hide show
  1. package/README.md +8 -5
  2. package/dist/index.js +101 -28
  3. package/package.json +19 -23
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-2.4.7-blue.svg?style=flat-square)](./CHANGELOG.md) [![MCP Spec](https://img.shields.io/badge/MCP%20Spec-2025--06--18-8A2BE2.svg?style=flat-square)](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-06-18/changelog.mdx) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.20.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Status](https://img.shields.io/badge/Status-Stable-brightgreen.svg?style=flat-square)](https://github.com/cyanheads/git-mcp-server/issues) [![TypeScript](https://img.shields.io/badge/TypeScript-^5.9.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.2.21-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-2.4.9-blue.svg?style=flat-square)](./CHANGELOG.md) [![MCP Spec](https://img.shields.io/badge/MCP%20Spec-2025--06--18-8A2BE2.svg?style=flat-square)](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-06-18/changelog.mdx) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.20.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Status](https://img.shields.io/badge/Status-Stable-brightgreen.svg?style=flat-square)](https://github.com/cyanheads/git-mcp-server/issues) [![TypeScript](https://img.shields.io/badge/TypeScript-^5.9.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.2.21-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -73,7 +73,7 @@ Add the following to your MCP Client configuration file (e.g., `cline_mcp_settin
73
73
  "env": {
74
74
  "MCP_TRANSPORT_TYPE": "stdio",
75
75
  "MCP_LOG_LEVEL": "info",
76
- "GIT_MCP_BASE_DIR": "~/Developer/",
76
+ "GIT_BASE_DIR": "~/Developer/",
77
77
  "LOGS_DIR": "~/Developer/logs/git-mcp-server/",
78
78
  "GIT_USERNAME": "cyanheads",
79
79
  "GIT_EMAIL": "casey@caseyjhand.com",
@@ -96,7 +96,7 @@ Add the following to your MCP Client configuration file (e.g., `cline_mcp_settin
96
96
  "env": {
97
97
  "MCP_TRANSPORT_TYPE": "stdio",
98
98
  "MCP_LOG_LEVEL": "info",
99
- "GIT_MCP_BASE_DIR": "~/Developer/",
99
+ "GIT_BASE_DIR": "~/Developer/",
100
100
  "LOGS_DIR": "~/Developer/logs/git-mcp-server/",
101
101
  "GIT_USERNAME": "cyanheads",
102
102
  "GIT_EMAIL": "casey@caseyjhand.com",
@@ -133,8 +133,9 @@ Plus, specialized features for **Git integration**:
133
133
  - **Optimized Git Execution**: Direct git CLI interaction with cross-runtime support for high-performance process management, streaming I/O, and timeout handling (current CLI provider).
134
134
  - **Comprehensive Coverage**: 27 tools covering all essential Git operations from init to push.
135
135
  - **Working Directory Management**: Session-specific directory context for multi-repo workflows.
136
+ - **Configurable Git Identity**: Override author/committer information via environment variables with automatic fallback to global git config.
136
137
  - **Safety Features**: Explicit confirmations for destructive operations like `git clean` and `git reset --hard`.
137
- - **Commit Signing**: Optional GPG/SSH signing support for verified commits.
138
+ - **Commit Signing**: Optional GPG/SSH signing support for all commit-creating operations (commits, merges, rebases, cherry-picks, and tags).
138
139
 
139
140
  ### Development Environment Setup
140
141
 
@@ -190,7 +191,9 @@ All configuration is centralized and validated at startup in `src/config/index.t
190
191
  | `STORAGE_PROVIDER_TYPE` | Storage backend: `in-memory`, `filesystem`, `supabase`, `cloudflare-kv`, `r2`. | `in-memory` |
191
192
  | `OTEL_ENABLED` | Set to `true` to enable OpenTelemetry. | `false` |
192
193
  | `MCP_LOG_LEVEL` | The minimum level for logging (`debug`, `info`, `warn`, `error`). | `info` |
193
- | `GIT_SIGN_COMMITS` | Set to `"true"` to enable GPG/SSH signing for commits. Requires server-side Git configuration. | `false` |
194
+ | `GIT_SIGN_COMMITS` | Set to `"true"` to enable GPG/SSH signing for all commits, merges, rebases, cherry-picks, and tags. Requires GPG/SSH configuration. | `false` |
195
+ | `GIT_AUTHOR_NAME` | Git author name. Aliases: `GIT_USERNAME`, `GIT_USER`. Falls back to global git config if not set. | `(none)` |
196
+ | `GIT_AUTHOR_EMAIL` | Git author email. Aliases: `GIT_EMAIL`, `GIT_USER_EMAIL`. Falls back to global git config if not set. | `(none)` |
194
197
  | `GIT_BASE_DIR` | Optional absolute path to restrict all git operations to a specific directory tree. Provides security sandboxing for multi-tenant or shared environments. | `(none)` |
195
198
  | `GIT_WRAPUP_INSTRUCTIONS_PATH` | Optional path to custom markdown file with Git workflow instructions. | `(none)` |
196
199
  | `MCP_AUTH_SECRET_KEY` | **Required for `jwt` auth.** A 32+ character secret key. | `(none)` |
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ var __create = Object.create;
4
4
  var __getProtoOf = Object.getPrototypeOf;
5
5
  var __defProp = Object.defineProperty;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
9
  var __toESM = (mod2, isNodeMode, target) => {
9
10
  target = mod2 != null ? __create(__getProtoOf(mod2)) : {};
@@ -16,6 +17,20 @@ var __toESM = (mod2, isNodeMode, target) => {
16
17
  });
17
18
  return to;
18
19
  };
20
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
21
+ var __toCommonJS = (from) => {
22
+ var entry = __moduleCache.get(from), desc;
23
+ if (entry)
24
+ return entry;
25
+ entry = __defProp({}, "__esModule", { value: true });
26
+ if (from && typeof from === "object" || typeof from === "function")
27
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
28
+ get: () => from[key],
29
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
30
+ }));
31
+ __moduleCache.set(from, entry);
32
+ return entry;
33
+ };
19
34
  var __commonJS = (cb, mod2) => () => (mod2 || cb((mod2 = { exports: {} }).exports, mod2), mod2.exports);
20
35
  var __export = (target, all) => {
21
36
  for (var name in all)
@@ -4246,7 +4261,7 @@ var package_default;
4246
4261
  var init_package = __esm(() => {
4247
4262
  package_default = {
4248
4263
  name: "@cyanheads/git-mcp-server",
4249
- version: "2.4.7",
4264
+ version: "2.4.9",
4250
4265
  mcpName: "io.github.cyanheads/git-mcp-server",
4251
4266
  description: "A secure and scalable Git MCP server enabling AI agents to perform comprehensive Git version control operations via STDIO and Streamable HTTP.",
4252
4267
  main: "dist/index.js",
@@ -4275,38 +4290,34 @@ var init_package = __esm(() => {
4275
4290
  },
4276
4291
  homepage: "https://github.com/cyanheads/git-mcp-server#readme",
4277
4292
  scripts: {
4278
- "//--- Development": "",
4279
- dev: "bun --watch src/index.ts",
4280
- "dev:http": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=http bun --watch src/index.ts",
4281
- "dev:stdio": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=stdio bun --watch src/index.ts",
4282
- devcheck: "bun run scripts/devcheck.ts",
4283
- devdocs: "bun run scripts/devdocs.ts",
4284
- "//--- Build & Deploy": "",
4285
- build: "rm -rf dist && bun build ./src/index.ts --outdir ./dist --target node",
4286
- "build:worker": "rm -rf dist && bun build ./src/worker.ts --outdir ./dist --target bun --no-external",
4293
+ build: "bun build ./src/index.ts --outdir ./dist --target node",
4294
+ "build:worker": "bun build ./src/worker.ts --outdir ./dist --target bun --no-external",
4287
4295
  "deploy:dev": "MCP_TRANSPORT_TYPE=http bunx wrangler dev",
4288
4296
  "deploy:prod": "MCP_TRANSPORT_TYPE=http bunx wrangler deploy",
4289
- "//--- Start": "",
4290
4297
  start: "bun ./dist/index.js",
4291
- "start:http": "MCP_TRANSPORT_TYPE=http bun ./dist/index.js",
4292
4298
  "start:stdio": "MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js",
4293
- "//--- Quality & Maintenance": "",
4294
- audit: "bun audit",
4295
- "audit:fix": "bun audit --fix",
4299
+ "start:http": "MCP_TRANSPORT_TYPE=http bun ./dist/index.js",
4300
+ dev: "bun --watch src/index.ts",
4301
+ "dev:stdio": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=stdio bun --watch src/index.ts",
4302
+ "dev:http": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=http bun --watch src/index.ts",
4303
+ devdocs: "bun run scripts/devdocs.ts",
4304
+ devcheck: "bun run scripts/devcheck.ts",
4305
+ rebuild: "bun run scripts/clean.ts && bun run build",
4306
+ "docs:generate": "bunx typedoc",
4296
4307
  depcheck: "bunx depcheck",
4297
- format: 'bunx prettier --write "**/*.{ts,js,json,md,html,css}"',
4298
4308
  lint: "bunx eslint .",
4299
4309
  "lint:fix": "bunx eslint . --fix",
4300
- prepare: "bunx husky",
4301
- test: "bun test --config vitest.config.ts",
4302
- "test:coverage": "bun test --coverage",
4303
4310
  typecheck: "bunx tsc --noEmit",
4304
- "//--- Utilities": "",
4305
- "docs:generate": "bunx typedoc",
4311
+ tree: "bun run scripts/tree.ts",
4306
4312
  "fetch-spec": "bun run scripts/fetch-openapi-spec.ts",
4313
+ format: 'bunx prettier --write "**/*.{ts,js,json,md,html,css}"',
4314
+ prepare: "bunx husky",
4307
4315
  inspector: "bunx mcp-inspector --config mcp.json --server git-mcp-server",
4308
- "publish-mcp": "bun scripts/validate-mcp-publish-schema.ts",
4309
- tree: "bun run scripts/tree.ts"
4316
+ test: "bun test --config vitest.config.ts",
4317
+ "test:coverage": "bun test --coverage",
4318
+ audit: "bun audit",
4319
+ "audit:fix": "bun audit --fix",
4320
+ "publish-mcp": "bun scripts/validate-mcp-publish-schema.ts"
4310
4321
  },
4311
4322
  resolutions: {
4312
4323
  "@hono/node-server": "1.19.5",
@@ -4578,6 +4589,10 @@ var import_dotenv, packageManifest, hasFileSystemAccess, emptyStringAsUndefined
4578
4589
  git: {
4579
4590
  provider: env.GIT_PROVIDER,
4580
4591
  signCommits: env.GIT_SIGN_COMMITS,
4592
+ authorName: env.GIT_AUTHOR_NAME || env.GIT_USERNAME || env.GIT_USER || undefined,
4593
+ authorEmail: env.GIT_AUTHOR_EMAIL || env.GIT_EMAIL || env.GIT_USER_EMAIL || undefined,
4594
+ committerName: env.GIT_COMMITTER_NAME || env.GIT_USERNAME || env.GIT_USER || undefined,
4595
+ committerEmail: env.GIT_COMMITTER_EMAIL || env.GIT_EMAIL || env.GIT_USER_EMAIL || undefined,
4581
4596
  wrapupInstructionsPath: env.GIT_WRAPUP_INSTRUCTIONS_PATH,
4582
4597
  baseDir: env.GIT_BASE_DIR,
4583
4598
  maxCommandTimeoutMs: env.GIT_MAX_COMMAND_TIMEOUT_MS,
@@ -4757,6 +4772,10 @@ var init_config = __esm(() => {
4757
4772
  git: z.object({
4758
4773
  provider: z.preprocess(emptyStringAsUndefined, z.enum(["auto", "cli", "isomorphic"]).default("auto")),
4759
4774
  signCommits: z.coerce.boolean().default(false),
4775
+ authorName: z.string().optional(),
4776
+ authorEmail: z.string().email().optional(),
4777
+ committerName: z.string().optional(),
4778
+ committerEmail: z.string().email().optional(),
4760
4779
  wrapupInstructionsPath: z.preprocess(expandTildePath, z.string().optional()),
4761
4780
  baseDir: z.preprocess((val) => expandTildePath(emptyStringAsUndefined(val)), z.string().refine((path) => !path || path.startsWith("/"), {
4762
4781
  message: 'GIT_BASE_DIR must be an absolute path starting with "/" (tilde expansion is supported)'
@@ -13788,7 +13807,7 @@ var require_propwrap = __commonJS((exports) => {
13788
13807
  Object.defineProperty(exports, "__esModule", { value: true });
13789
13808
  exports.propwrap = undefined;
13790
13809
  var __defProp2 = Object.defineProperty;
13791
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13810
+ var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
13792
13811
  var __hasOwnProp2 = Object.prototype.hasOwnProperty;
13793
13812
  var __getOwnPropNames2 = Object.getOwnPropertyNames;
13794
13813
  var __copyProps = (to, from, except, desc) => {
@@ -13797,7 +13816,7 @@ var require_propwrap = __commonJS((exports) => {
13797
13816
  if (!__hasOwnProp2.call(to, key) && key !== except) {
13798
13817
  __defProp2(to, key, {
13799
13818
  get: () => from[key],
13800
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
13819
+ enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable
13801
13820
  });
13802
13821
  }
13803
13822
  }
@@ -13832,7 +13851,7 @@ var require_propwrap = __commonJS((exports) => {
13832
13851
  } else {
13833
13852
  val = namespaces[i + 1];
13834
13853
  }
13835
- const desc = __getOwnPropDesc(namespace, key);
13854
+ const desc = __getOwnPropDesc2(namespace, key);
13836
13855
  const wrappedNamespace = __defProp2({}, key, {
13837
13856
  value: val,
13838
13857
  enumerable: !desc || desc.enumerable
@@ -151667,6 +151686,14 @@ function buildGitCommand(config2) {
151667
151686
  }
151668
151687
  return parts;
151669
151688
  }
151689
+ function loadConfig() {
151690
+ try {
151691
+ const configModule = (init_config(), __toCommonJS(exports_config));
151692
+ return configModule.config;
151693
+ } catch {
151694
+ return null;
151695
+ }
151696
+ }
151670
151697
  function buildGitEnv(additionalEnv) {
151671
151698
  const env = { ...process.env };
151672
151699
  Object.assign(env, {
@@ -151674,6 +151701,21 @@ function buildGitEnv(additionalEnv) {
151674
151701
  LANG: "en_US.UTF-8",
151675
151702
  LC_ALL: "en_US.UTF-8"
151676
151703
  });
151704
+ const config2 = loadConfig();
151705
+ if (config2?.git) {
151706
+ if (config2.git.authorName) {
151707
+ env.GIT_AUTHOR_NAME = config2.git.authorName;
151708
+ }
151709
+ if (config2.git.authorEmail) {
151710
+ env.GIT_AUTHOR_EMAIL = config2.git.authorEmail;
151711
+ }
151712
+ if (config2.git.committerName) {
151713
+ env.GIT_COMMITTER_NAME = config2.git.committerName;
151714
+ }
151715
+ if (config2.git.committerEmail) {
151716
+ env.GIT_COMMITTER_EMAIL = config2.git.committerEmail;
151717
+ }
151718
+ }
151677
151719
  if (additionalEnv) {
151678
151720
  Object.assign(env, additionalEnv);
151679
151721
  }
@@ -151736,6 +151778,20 @@ function validateGitArgs(args) {
151736
151778
  }
151737
151779
  }
151738
151780
 
151781
+ // src/services/git/providers/cli/utils/config-helper.ts
151782
+ function loadConfig2() {
151783
+ try {
151784
+ const configModule = (init_config(), __toCommonJS(exports_config));
151785
+ return configModule.config;
151786
+ } catch {
151787
+ return null;
151788
+ }
151789
+ }
151790
+ function shouldSignCommits() {
151791
+ const config2 = loadConfig2();
151792
+ return config2?.git?.signCommits ?? false;
151793
+ }
151794
+
151739
151795
  // src/services/git/providers/cli/utils/error-mapper.ts
151740
151796
  init_errors();
151741
151797
  var ERROR_PATTERNS = [
@@ -152331,7 +152387,8 @@ async function executeCommit(options, context, execGit) {
152331
152387
  if (options.noVerify) {
152332
152388
  args.push("--no-verify");
152333
152389
  }
152334
- if (options.sign) {
152390
+ const shouldSign = options.sign ?? shouldSignCommits();
152391
+ if (shouldSign) {
152335
152392
  args.push("--gpg-sign");
152336
152393
  }
152337
152394
  if (options.author) {
@@ -152631,6 +152688,10 @@ async function executeMerge(options, context, execGit) {
152631
152688
  if (options.message) {
152632
152689
  args.push("-m", options.message);
152633
152690
  }
152691
+ const shouldSign = options.sign ?? shouldSignCommits();
152692
+ if (shouldSign) {
152693
+ args.push("-S");
152694
+ }
152634
152695
  const cmd = buildGitCommand({ command: "merge", args });
152635
152696
  const result = await execGit(cmd, context.workingDirectory, context.requestContext);
152636
152697
  const hasConflicts = result.stdout.includes("CONFLICT") || result.stderr.includes("CONFLICT");
@@ -152710,6 +152771,10 @@ async function executeRebase(options, context, execGit) {
152710
152771
  if (options.preserve) {
152711
152772
  args.push("--preserve-merges");
152712
152773
  }
152774
+ const shouldSign = options.sign ?? shouldSignCommits();
152775
+ if (shouldSign) {
152776
+ args.push("--gpg-sign");
152777
+ }
152713
152778
  }
152714
152779
  const cmd = buildGitCommand({ command: "rebase", args });
152715
152780
  const result = await execGit(cmd, context.workingDirectory, context.requestContext);
@@ -152745,6 +152810,10 @@ async function executeCherryPick(options, context, execGit) {
152745
152810
  if (options.noCommit) {
152746
152811
  args.push("--no-commit");
152747
152812
  }
152813
+ const shouldSign = options.sign ?? shouldSignCommits();
152814
+ if (shouldSign) {
152815
+ args.push("--gpg-sign");
152816
+ }
152748
152817
  }
152749
152818
  const cmd = buildGitCommand({ command: "cherry-pick", args });
152750
152819
  const result = await execGit(cmd, context.workingDirectory, context.requestContext);
@@ -153045,7 +153114,11 @@ async function executeTag(options, context, execGit) {
153045
153114
  throw new Error("Tag name is required for create operation");
153046
153115
  }
153047
153116
  args.push(options.tagName);
153048
- if (options.message && options.annotated) {
153117
+ const shouldSign = options.sign ?? shouldSignCommits();
153118
+ if (shouldSign) {
153119
+ const message = options.message || `Tag ${options.tagName}`;
153120
+ args.push("-s", "-m", message);
153121
+ } else if (options.message && options.annotated) {
153049
153122
  args.push("-a", "-m", options.message);
153050
153123
  }
153051
153124
  if (options.commit) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/git-mcp-server",
3
- "version": "2.4.7",
3
+ "version": "2.4.9",
4
4
  "mcpName": "io.github.cyanheads/git-mcp-server",
5
5
  "description": "A secure and scalable Git MCP server enabling AI agents to perform comprehensive Git version control operations via STDIO and Streamable HTTP.",
6
6
  "main": "dist/index.js",
@@ -29,38 +29,34 @@
29
29
  },
30
30
  "homepage": "https://github.com/cyanheads/git-mcp-server#readme",
31
31
  "scripts": {
32
- "//--- Development": "",
33
- "dev": "bun --watch src/index.ts",
34
- "dev:http": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=http bun --watch src/index.ts",
35
- "dev:stdio": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=stdio bun --watch src/index.ts",
36
- "devcheck": "bun run scripts/devcheck.ts",
37
- "devdocs": "bun run scripts/devdocs.ts",
38
- "//--- Build & Deploy": "",
39
- "build": "rm -rf dist && bun build ./src/index.ts --outdir ./dist --target node",
40
- "build:worker": "rm -rf dist && bun build ./src/worker.ts --outdir ./dist --target bun --no-external",
32
+ "build": "bun build ./src/index.ts --outdir ./dist --target node",
33
+ "build:worker": "bun build ./src/worker.ts --outdir ./dist --target bun --no-external",
41
34
  "deploy:dev": "MCP_TRANSPORT_TYPE=http bunx wrangler dev",
42
35
  "deploy:prod": "MCP_TRANSPORT_TYPE=http bunx wrangler deploy",
43
- "//--- Start": "",
44
36
  "start": "bun ./dist/index.js",
45
- "start:http": "MCP_TRANSPORT_TYPE=http bun ./dist/index.js",
46
37
  "start:stdio": "MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js",
47
- "//--- Quality & Maintenance": "",
48
- "audit": "bun audit",
49
- "audit:fix": "bun audit --fix",
38
+ "start:http": "MCP_TRANSPORT_TYPE=http bun ./dist/index.js",
39
+ "dev": "bun --watch src/index.ts",
40
+ "dev:stdio": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=stdio bun --watch src/index.ts",
41
+ "dev:http": "MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=http bun --watch src/index.ts",
42
+ "devdocs": "bun run scripts/devdocs.ts",
43
+ "devcheck": "bun run scripts/devcheck.ts",
44
+ "rebuild": "bun run scripts/clean.ts && bun run build",
45
+ "docs:generate": "bunx typedoc",
50
46
  "depcheck": "bunx depcheck",
51
- "format": "bunx prettier --write \"**/*.{ts,js,json,md,html,css}\"",
52
47
  "lint": "bunx eslint .",
53
48
  "lint:fix": "bunx eslint . --fix",
54
- "prepare": "bunx husky",
55
- "test": "bun test --config vitest.config.ts",
56
- "test:coverage": "bun test --coverage",
57
49
  "typecheck": "bunx tsc --noEmit",
58
- "//--- Utilities": "",
59
- "docs:generate": "bunx typedoc",
50
+ "tree": "bun run scripts/tree.ts",
60
51
  "fetch-spec": "bun run scripts/fetch-openapi-spec.ts",
52
+ "format": "bunx prettier --write \"**/*.{ts,js,json,md,html,css}\"",
53
+ "prepare": "bunx husky",
61
54
  "inspector": "bunx mcp-inspector --config mcp.json --server git-mcp-server",
62
- "publish-mcp": "bun scripts/validate-mcp-publish-schema.ts",
63
- "tree": "bun run scripts/tree.ts"
55
+ "test": "bun test --config vitest.config.ts",
56
+ "test:coverage": "bun test --coverage",
57
+ "audit": "bun audit",
58
+ "audit:fix": "bun audit --fix",
59
+ "publish-mcp": "bun scripts/validate-mcp-publish-schema.ts"
64
60
  },
65
61
  "resolutions": {
66
62
  "@hono/node-server": "1.19.5",