ssh-mcp-pro 1.2.1 → 1.4.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.
Files changed (214) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +12 -2
  3. package/dist/agent-bin.js +5 -2
  4. package/dist/agent-bin.js.map +1 -1
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +38 -47
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config-security-env.d.ts +4 -0
  10. package/dist/config-security-env.d.ts.map +1 -0
  11. package/dist/config-security-env.js +64 -0
  12. package/dist/config-security-env.js.map +1 -0
  13. package/dist/config.d.ts +2 -2
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +4 -67
  16. package/dist/config.js.map +1 -1
  17. package/dist/connector-profile.d.ts +17 -3
  18. package/dist/connector-profile.d.ts.map +1 -1
  19. package/dist/connector-profile.js.map +1 -1
  20. package/dist/detect.d.ts.map +1 -1
  21. package/dist/detect.js +226 -192
  22. package/dist/detect.js.map +1 -1
  23. package/dist/ensure-package-service.d.ts +9 -0
  24. package/dist/ensure-package-service.d.ts.map +1 -0
  25. package/dist/ensure-package-service.js +146 -0
  26. package/dist/ensure-package-service.js.map +1 -0
  27. package/dist/ensure-pkg.js +4 -4
  28. package/dist/ensure-pkg.js.map +1 -1
  29. package/dist/ensure.d.ts.map +1 -1
  30. package/dist/ensure.js +15 -144
  31. package/dist/ensure.js.map +1 -1
  32. package/dist/fs-sftp.js +1 -1
  33. package/dist/fs-sftp.js.map +1 -1
  34. package/dist/fs-stat.d.ts +10 -0
  35. package/dist/fs-stat.d.ts.map +1 -0
  36. package/dist/fs-stat.js +62 -0
  37. package/dist/fs-stat.js.map +1 -0
  38. package/dist/fs-tools.d.ts.map +1 -1
  39. package/dist/fs-tools.js +6 -58
  40. package/dist/fs-tools.js.map +1 -1
  41. package/dist/http-security.d.ts.map +1 -1
  42. package/dist/http-security.js +6 -6
  43. package/dist/http-security.js.map +1 -1
  44. package/dist/http-server-runtime.d.ts.map +1 -1
  45. package/dist/http-server-runtime.js +41 -7
  46. package/dist/http-server-runtime.js.map +1 -1
  47. package/dist/index.js +6 -23
  48. package/dist/index.js.map +1 -1
  49. package/dist/mcp-http-web.d.ts +8 -0
  50. package/dist/mcp-http-web.d.ts.map +1 -0
  51. package/dist/mcp-http-web.js +35 -0
  52. package/dist/mcp-http-web.js.map +1 -0
  53. package/dist/mcp.d.ts +6 -2
  54. package/dist/mcp.d.ts.map +1 -1
  55. package/dist/mcp.js +22 -14
  56. package/dist/mcp.js.map +1 -1
  57. package/dist/policy.d.ts +8 -0
  58. package/dist/policy.d.ts.map +1 -1
  59. package/dist/policy.js +147 -105
  60. package/dist/policy.js.map +1 -1
  61. package/dist/process.d.ts.map +1 -1
  62. package/dist/process.js +11 -7
  63. package/dist/process.js.map +1 -1
  64. package/dist/prompts.d.ts +2 -11
  65. package/dist/prompts.d.ts.map +1 -1
  66. package/dist/prompts.js.map +1 -1
  67. package/dist/remote/agent-activity-log.d.ts +26 -0
  68. package/dist/remote/agent-activity-log.d.ts.map +1 -0
  69. package/dist/remote/agent-activity-log.js +211 -0
  70. package/dist/remote/agent-activity-log.js.map +1 -0
  71. package/dist/remote/agent-cli.d.ts.map +1 -1
  72. package/dist/remote/agent-cli.js +92 -25
  73. package/dist/remote/agent-cli.js.map +1 -1
  74. package/dist/remote/agent-executor.d.ts.map +1 -1
  75. package/dist/remote/agent-executor.js +25 -16
  76. package/dist/remote/agent-executor.js.map +1 -1
  77. package/dist/remote/agent-handler.d.ts +2 -0
  78. package/dist/remote/agent-handler.d.ts.map +1 -1
  79. package/dist/remote/agent-handler.js +4 -0
  80. package/dist/remote/agent-handler.js.map +1 -1
  81. package/dist/remote/config.d.ts.map +1 -1
  82. package/dist/remote/config.js +12 -1
  83. package/dist/remote/config.js.map +1 -1
  84. package/dist/remote/control-plane.d.ts +12 -0
  85. package/dist/remote/control-plane.d.ts.map +1 -1
  86. package/dist/remote/control-plane.js +174 -53
  87. package/dist/remote/control-plane.js.map +1 -1
  88. package/dist/remote/crypto.d.ts +9 -4
  89. package/dist/remote/crypto.d.ts.map +1 -1
  90. package/dist/remote/crypto.js +41 -9
  91. package/dist/remote/crypto.js.map +1 -1
  92. package/dist/remote/http-util.d.ts.map +1 -1
  93. package/dist/remote/http-util.js +14 -7
  94. package/dist/remote/http-util.js.map +1 -1
  95. package/dist/remote/mcp-tools.d.ts +7 -0
  96. package/dist/remote/mcp-tools.d.ts.map +1 -1
  97. package/dist/remote/mcp-tools.js +28 -0
  98. package/dist/remote/mcp-tools.js.map +1 -1
  99. package/dist/remote/oauth-handler.d.ts +36 -3
  100. package/dist/remote/oauth-handler.d.ts.map +1 -1
  101. package/dist/remote/oauth-handler.js +287 -13
  102. package/dist/remote/oauth-handler.js.map +1 -1
  103. package/dist/remote/policy.js +2 -2
  104. package/dist/remote/policy.js.map +1 -1
  105. package/dist/remote/safe-file.d.ts +2 -1
  106. package/dist/remote/safe-file.d.ts.map +1 -1
  107. package/dist/remote/safe-file.js +51 -53
  108. package/dist/remote/safe-file.js.map +1 -1
  109. package/dist/remote/schemas.d.ts +9 -9
  110. package/dist/remote/schemas.js +6 -6
  111. package/dist/remote/schemas.js.map +1 -1
  112. package/dist/remote/store.d.ts +38 -1
  113. package/dist/remote/store.d.ts.map +1 -1
  114. package/dist/remote/store.js +149 -11
  115. package/dist/remote/store.js.map +1 -1
  116. package/dist/remote/types.d.ts +14 -0
  117. package/dist/remote/types.d.ts.map +1 -1
  118. package/dist/remote/types.js.map +1 -1
  119. package/dist/remote/web-dashboard-client-config.d.ts +77 -0
  120. package/dist/remote/web-dashboard-client-config.d.ts.map +1 -0
  121. package/dist/remote/web-dashboard-client-config.js +81 -0
  122. package/dist/remote/web-dashboard-client-config.js.map +1 -0
  123. package/dist/remote/web-dashboard-html.d.ts +2 -0
  124. package/dist/remote/web-dashboard-html.d.ts.map +1 -0
  125. package/dist/remote/web-dashboard-html.js +433 -0
  126. package/dist/remote/web-dashboard-html.js.map +1 -0
  127. package/dist/remote/web-dashboard-oauth-users.d.ts +4 -0
  128. package/dist/remote/web-dashboard-oauth-users.d.ts.map +1 -0
  129. package/dist/remote/web-dashboard-oauth-users.js +78 -0
  130. package/dist/remote/web-dashboard-oauth-users.js.map +1 -0
  131. package/dist/remote/web-dashboard-static.d.ts +4 -0
  132. package/dist/remote/web-dashboard-static.d.ts.map +1 -0
  133. package/dist/remote/web-dashboard-static.js +19 -0
  134. package/dist/remote/web-dashboard-static.js.map +1 -0
  135. package/dist/remote/web-dashboard-styles.d.ts +2 -0
  136. package/dist/remote/web-dashboard-styles.d.ts.map +1 -0
  137. package/dist/remote/web-dashboard-styles.js +187 -0
  138. package/dist/remote/web-dashboard-styles.js.map +1 -0
  139. package/dist/remote/web-dashboard.d.ts +62 -0
  140. package/dist/remote/web-dashboard.d.ts.map +1 -0
  141. package/dist/remote/web-dashboard.js +467 -0
  142. package/dist/remote/web-dashboard.js.map +1 -0
  143. package/dist/resources.d.ts +2 -7
  144. package/dist/resources.d.ts.map +1 -1
  145. package/dist/resources.js.map +1 -1
  146. package/dist/retry.d.ts.map +1 -1
  147. package/dist/retry.js +6 -3
  148. package/dist/retry.js.map +1 -1
  149. package/dist/safety.d.ts.map +1 -1
  150. package/dist/safety.js +56 -6
  151. package/dist/safety.js.map +1 -1
  152. package/dist/session-auth.js +7 -7
  153. package/dist/session-auth.js.map +1 -1
  154. package/dist/session.d.ts +5 -0
  155. package/dist/session.d.ts.map +1 -1
  156. package/dist/session.js +81 -54
  157. package/dist/session.js.map +1 -1
  158. package/dist/shell.d.ts.map +1 -1
  159. package/dist/shell.js +5 -4
  160. package/dist/shell.js.map +1 -1
  161. package/dist/ssh-config.d.ts +2 -2
  162. package/dist/ssh-config.d.ts.map +1 -1
  163. package/dist/ssh-config.js +24 -20
  164. package/dist/ssh-config.js.map +1 -1
  165. package/dist/telemetry.d.ts.map +1 -1
  166. package/dist/telemetry.js +9 -2
  167. package/dist/telemetry.js.map +1 -1
  168. package/dist/tools/connector.provider.d.ts +1 -1
  169. package/dist/tools/connector.provider.d.ts.map +1 -1
  170. package/dist/tools/ensure.provider.d.ts +1 -1
  171. package/dist/tools/ensure.provider.d.ts.map +1 -1
  172. package/dist/tools/fs.provider.d.ts +1 -1
  173. package/dist/tools/fs.provider.d.ts.map +1 -1
  174. package/dist/tools/metadata.d.ts +1 -1
  175. package/dist/tools/metadata.d.ts.map +1 -1
  176. package/dist/tools/output-schemas.d.ts +27 -135
  177. package/dist/tools/output-schemas.d.ts.map +1 -1
  178. package/dist/tools/process.provider.d.ts +1 -1
  179. package/dist/tools/process.provider.d.ts.map +1 -1
  180. package/dist/tools/registry.d.ts +1 -1
  181. package/dist/tools/registry.d.ts.map +1 -1
  182. package/dist/tools/registry.js +16 -13
  183. package/dist/tools/registry.js.map +1 -1
  184. package/dist/tools/session.provider.d.ts +1 -1
  185. package/dist/tools/session.provider.d.ts.map +1 -1
  186. package/dist/tools/system.provider.d.ts +1 -1
  187. package/dist/tools/system.provider.d.ts.map +1 -1
  188. package/dist/tools/transfer.provider.d.ts +1 -1
  189. package/dist/tools/transfer.provider.d.ts.map +1 -1
  190. package/dist/tools/tunnel.provider.d.ts +1 -1
  191. package/dist/tools/tunnel.provider.d.ts.map +1 -1
  192. package/dist/tools/types.d.ts +1 -1
  193. package/dist/tools/types.d.ts.map +1 -1
  194. package/dist/transfer.js +2 -2
  195. package/dist/transfer.js.map +1 -1
  196. package/dist/types.js +1 -1
  197. package/dist/types.js.map +1 -1
  198. package/docs/adding-a-device.md +39 -17
  199. package/docs/agent-activity-monitor.md +34 -0
  200. package/docs/coolify.md +29 -0
  201. package/docs/development/coding-standards.md +8 -2
  202. package/docs/development/dependency-management.md +1 -1
  203. package/docs/development/mcp-protocol-2026.md +33 -0
  204. package/docs/development/release-process.md +29 -55
  205. package/docs/doppler-guide.md +34 -0
  206. package/docs/reference/compatibility.md +1 -1
  207. package/docs/remote-mcp-hardening.md +17 -0
  208. package/docs/security/dependency-audit-exceptions.md +3 -7
  209. package/docs/security/hosted-data-inventory.md +81 -0
  210. package/docs/sonarcloud-analysis.md +9 -0
  211. package/mcp.json +1 -1
  212. package/package.json +31 -24
  213. package/registry/ssh-mcp-pro/mcp.json +1 -1
  214. package/server.json +3 -3
@@ -0,0 +1,81 @@
1
+ # Hosted remote-agent data inventory
2
+
3
+ **Engineering evidence only — not a privacy notice or terms of service.**
4
+ This document describes the repository's remote control-plane source
5
+ on 2026-11-04, **not necessarily the version deployed in production**.
6
+ It does not claim legal compliance or promise any retention period.
7
+
8
+ ## Data handled in the remote control plane
9
+
10
+ | Category | Recorded data | Implementation evidence |
11
+ | --- | --- | --- |
12
+ | Account identity | GitHub ID/login/name or Google ID/email/name when configured | SQLite `users` in [remote store](../../src/remote/store.ts) |
13
+ | Dashboard sessions | Random browser session token, a stored token hash, user ID and expiry | `dashboard_sessions` in [remote store](../../src/remote/store.ts) and [dashboard](../../src/remote/web-dashboard.ts) |
14
+ | OAuth clients/codes | Client identity, redirect URIs, scopes and hashed authorization codes with expiry and use status | `oauth_clients` and `oauth_authorization_codes` in [remote store](../../src/remote/store.ts) |
15
+ | Devices | Alias, public key, policy, status, host metadata and last seen | `agents` in [remote store](../../src/remote/store.ts) |
16
+ | Enrollment | Hashed one-time tokens with expiration and use status | `agent_enrollment_tokens` in [remote store](../../src/remote/store.ts) |
17
+ | Remote actions | Tool and capability, **arguments**, status, deadline, **result**, and error details | `actions` in [remote store](../../src/remote/store.ts) |
18
+ | Security events | Event type/severity/time, optional user/device/action IDs and metadata | `audit_events` in [remote store](../../src/remote/store.ts) |
19
+ | Local agent credentials | Agent private key, server URL, device ID and execution policy | Local file described in [agent CLI](../../src/remote/agent-cli.ts) |
20
+
21
+ Remote actions can return stdout, stderr, file output and host logs.
22
+ The [executor](../../src/remote/agent-executor.ts) bounds output sizes,
23
+ but bounded size is **not** automatic secret redaction. Arguments and
24
+ results can contain sensitive host information and are persisted as JSON
25
+ in the action table.
26
+
27
+ ## Expiration and erasure: observed behavior
28
+
29
+ - Dashboard cookies and session records are valid for 24 hours. Logout
30
+ deletes the current session, while periodic maintenance also deletes
31
+ session rows whose expiration time has passed.
32
+ - OAuth authorization codes and device enrollment tokens expire logically
33
+ and can be used only once. The existing minute maintenance tick also
34
+ removes physically expired code/token rows. Non-expired rows are retained
35
+ even if already used.
36
+ - The periodic cleanup also clears in-memory OAuth and connection state.
37
+ It does **not** impose automatic retention/deletion on users, OAuth
38
+ clients, devices, action history, audit events or infrastructure logs.
39
+ - Dashboard **Remove device** revokes/disconnects that device, then deletes
40
+ the device row, associated enrollment token records and its action rows.
41
+ **Audit events remain** for security review. **Revoke** by itself
42
+ changes device status and is not the same as Remove device.
43
+ - No account-level export/erasure workflow, audit-erasure workflow, or
44
+ global retention/deletion job for users, clients, actions and audit
45
+ events was found in the inspected remote routes and store.
46
+
47
+ Source: [dashboard](../../src/remote/web-dashboard.ts),
48
+ [store](../../src/remote/store.ts),
49
+ [OAuth handler](../../src/remote/oauth-handler.ts),
50
+ [control plane](../../src/remote/control-plane.ts).
51
+
52
+ ## Deployment and third-party boundaries
53
+
54
+ The documented [Coolify deployment](../coolify.md) uses one SQLite
55
+ replica and a persistent `/app/data` volume for the database and
56
+ signing keys. Redeploying the application does not itself remove the
57
+ volume. OAuth login involves GitHub or Google depending on configuration.
58
+ Infrastructure access logs, provider-side logs, external processing,
59
+ hosting jurisdiction and infrastructure-level backups **cannot be
60
+ inferred from the repository's database schema**.
61
+
62
+ ## Verify before drafting a user-facing privacy notice and terms
63
+
64
+ 1. Confirm operator identity, responsible contact and intended account scope.
65
+ 2. Verify actual hosting region, infrastructure/OAuth processors, logs and
66
+ their configured retention; do not purchase new services to do so.
67
+ 3. Decide accurate retention and deletion behavior for identities, sessions,
68
+ authorization records, command args/results and audit events. Explain
69
+ the surviving audit trail after Remove device.
70
+ 4. Define an actionable access/correction/deletion request process before
71
+ promising rights, methods or timelines.
72
+ 5. Verify agent/SSH-host data transfer, user responsibilities and any
73
+ external storage or telemetry not visible in these source files.
74
+ 6. Publish **separate**, reviewed HTTPS privacy and terms documents.
75
+ `SECURITY.md` concerns vulnerability reports; the MIT `LICENSE`
76
+ concerns source licensing. Neither is a substitute.
77
+
78
+ ChatGPT, Claude and Gemini application metadata must remain
79
+ `publishReady: false` until these and the other launch conditions
80
+ are genuinely complete. This inventory is engineering
81
+ evidence, **not** a published privacy policy.
@@ -0,0 +1,9 @@
1
+ # SonarQube Cloud analysis
2
+
3
+ This repository uses **SonarQube Cloud Automatic Analysis** for GitHub pull requests and the default branch. SonarScanner must not run in GitHub Actions while automatic analysis is enabled; the two methods conflict.
4
+
5
+ The GitHub CI workflow runs Node 24 and 26 test/coverage gates and uploads LCOV coverage artifacts. Vitest enforces local coverage thresholds independently of SonarQube Cloud. SonarQube Cloud automatic analysis **cannot import LCOV coverage**: its quality gate must not be interpreted as measuring this repository's test coverage. The project coverage minimum remains enforced in CI.
6
+
7
+ Do not add `SONAR_TOKEN`, another Doppler credential-fetch step, or `sonarqube-scan-action` to this workflow for automatic analysis. To migrate back to CI analysis, first explicitly switch off Automatic Analysis in SonarQube Cloud, then implement a single authenticated scanner pipeline and restore LCOV import.
8
+
9
+ Security and maintainability findings, especially new-code duplication, remain enforced by SonarQube Cloud's independent GitHub PR check. Do not weaken duplication thresholds or bypass repository rules to make CI green.
package/mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "ssh-mcp-pro",
3
3
  "display_name": "ssh-mcp-pro",
4
4
  "description": "Secure MCP SSH automation server with policy controls, resources, prompts, stdio, and HTTP.",
5
- "version": "1.2.1",
5
+ "version": "1.4.0",
6
6
  "author": "Osman Aslan",
7
7
  "license": "MIT",
8
8
  "runtime": "node",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ssh-mcp-pro",
3
- "version": "1.2.1",
3
+ "version": "1.4.0",
4
4
  "mcpName": "io.github.oaslananka/ssh-mcp-pro",
5
5
  "description": "Model Context Protocol (MCP) SSH client server for remote automation",
6
6
  "type": "module",
@@ -58,52 +58,57 @@
58
58
  },
59
59
  "engines": {
60
60
  "node": ">=22.22.2",
61
- "pnpm": "^11.28.5"
61
+ "pnpm": "^11.28.9"
62
62
  },
63
63
  "dependencies": {
64
- "@modelcontextprotocol/sdk": "^1.32.0",
64
+ "@modelcontextprotocol/node": "^2.1.2",
65
+ "@modelcontextprotocol/server": "^2.4.0",
66
+ "@modelcontextprotocol/server-legacy": "^2.4.0",
65
67
  "@opentelemetry/api": "^1.9.1",
66
68
  "@opentelemetry/exporter-trace-otlp-http": "^0.222.0",
67
69
  "@opentelemetry/resources": "^2.11.0",
68
70
  "@opentelemetry/sdk-node": "^0.222.0",
69
71
  "@opentelemetry/semantic-conventions": "^1.43.0",
70
- "jose": "6.2.3",
72
+ "html-escaper": "3.0.3",
73
+ "jose": "6.2.13",
71
74
  "node-ssh": "^13.2.1",
72
75
  "ws": "^8.21.1",
73
- "zod": "^4.4.3"
76
+ "zod": "^4.6.7"
74
77
  },
75
78
  "devDependencies": {
79
+ "@modelcontextprotocol/client": "2.4.0",
76
80
  "@stryker-mutator/core": "9.6.1",
77
81
  "@stryker-mutator/typescript-checker": "9.6.1",
78
82
  "@stryker-mutator/vitest-runner": "9.6.1",
83
+ "@types/html-escaper": "3.0.4",
79
84
  "@types/node": "^24.13.1",
80
85
  "@types/ssh2": "^1.15.6",
81
86
  "@types/ws": "^8.18.2",
82
87
  "@typescript-eslint/eslint-plugin": "^8.71.0",
83
88
  "@typescript-eslint/parser": "^8.71.0",
84
- "@vitest/coverage-v8": "^4.1.11",
89
+ "@vitest/coverage-v8": "^4.1.12",
85
90
  "ajv": "^8.20.0",
86
91
  "autocannon": "^7.15.0",
87
92
  "dependency-cruiser": "^17.4.3",
88
93
  "eslint": "^10.12.0",
89
94
  "fast-check": "^4.10.2",
90
- "knip": "^6.39.0",
95
+ "knip": "^6.44.0",
91
96
  "prettier": "^3.9.9",
92
97
  "publint": "^0.3.25",
93
98
  "typedoc": "0.28.20",
94
99
  "typescript": "^6.0.3",
95
- "vite": "^7.3.5",
96
- "vitest": "^4.1.11"
100
+ "vite": "7.3.7",
101
+ "vitest": "^4.1.12"
97
102
  },
98
103
  "overrides": {
99
104
  "brace-expansion": "^5.0.12",
100
- "fast-uri": "^3.1.8",
101
- "ip-address": "^10.7.1",
102
- "nanoid": "^3.3.18",
103
- "browserslist": "^4.28.7",
104
- "@hono/node-server": "^2.0.5",
105
- "markdown-it": "^14.3.2",
106
- "vitest": "^4.1.11"
105
+ "fast-uri": "^3.1.9",
106
+ "ip-address": "^10.7.5",
107
+ "nanoid": "^3.3.20",
108
+ "browserslist": "^4.29.5",
109
+ "@hono/node-server": "^2.1.3",
110
+ "markdown-it": "^14.3.3",
111
+ "vitest": "^4.1.12"
107
112
  },
108
113
  "scripts": {
109
114
  "build": "tsc -p tsconfig.json",
@@ -118,11 +123,11 @@
118
123
  "test:perf:baseline": "WRITE_BASELINE=true pnpm run test:perf",
119
124
  "test:mutation": "stryker run",
120
125
  "test:mutation:ci": "stryker run",
121
- "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"vitest.config.ts\" \"vitest.mutation.config.ts\"",
122
- "lint:fix": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"vitest.config.ts\" \"vitest.mutation.config.ts\" --fix",
126
+ "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"vitest.config.ts\" \"vitest.mutation.config.ts\" \"vitest.bench.config.ts\"",
127
+ "lint:fix": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"vitest.config.ts\" \"vitest.mutation.config.ts\" \"vitest.bench.config.ts\" --fix",
123
128
  "lint:staged": "node scripts/run-staged-checks.mjs --lint-only",
124
- "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"scripts/**/*.{mjs,cjs}\" \"docs/**/*.md\" \".github/workflows/*.{yml,yaml}\" \"stryker.conf.mjs\" \"vitest.config.ts\" \"vitest.mutation.config.ts\"",
125
- "format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\" \"scripts/**/*.{mjs,cjs}\" \"docs/**/*.md\" \".github/workflows/*.{yml,yaml}\" \"stryker.conf.mjs\" \"vitest.config.ts\" \"vitest.mutation.config.ts\"",
129
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"scripts/**/*.{mjs,cjs}\" \"docs/**/*.md\" \".github/workflows/*.{yml,yaml}\" \"stryker.conf.mjs\" \"vitest.config.ts\" \"vitest.mutation.config.ts\" \"vitest.bench.config.ts\"",
130
+ "format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\" \"scripts/**/*.{mjs,cjs}\" \"docs/**/*.md\" \".github/workflows/*.{yml,yaml}\" \"stryker.conf.mjs\" \"vitest.config.ts\" \"vitest.mutation.config.ts\" \"vitest.bench.config.ts\"",
126
131
  "format:staged": "node scripts/run-staged-checks.mjs",
127
132
  "docker:ssh-fixture:up": "node scripts/docker-ssh-fixture.mjs up",
128
133
  "docker:ssh-fixture:verify": "node scripts/docker-ssh-fixture.mjs verify",
@@ -140,6 +145,7 @@
140
145
  "validate:mcp-registry": "node scripts/check-mcp-registry-record.mjs",
141
146
  "validate:chatgpt-app": "node scripts/validate-chatgpt-app.mjs",
142
147
  "validate:claude-connector": "node scripts/validate-claude-connector.mjs",
148
+ "validate:google-app": "node scripts/validate-google-app.mjs",
143
149
  "check:doc-language": "node scripts/check-doc-language.mjs",
144
150
  "check:package-scripts": "node scripts/check-package-scripts.mjs",
145
151
  "check:freshness": "node scripts/check-dependency-freshness.mjs --json artifacts/dependency-freshness.json --markdown artifacts/dependency-freshness.md",
@@ -159,17 +165,18 @@
159
165
  "pack:check": "node scripts/check-package-contents.mjs",
160
166
  "pack:install-smoke": "node scripts/check-package-install-smoke.mjs",
161
167
  "pack:lint": "publint --strict=false",
162
- "check:knip": "knip -c knip.jsonc --reporter compact || true",
163
- "check:circular": "depcruise src --config .dependency-cruiser.mjs || true",
168
+ "check:knip": "knip -c knip.jsonc --include files,dependencies,unlisted,unresolved,cycles --reporter compact",
169
+ "check:circular": "depcruise src --config .dependency-cruiser.mjs",
164
170
  "check:module-size": "node scripts/check-module-size.mjs",
165
171
  "check:maintainability": "pnpm run check:module-size && pnpm run check:circular && pnpm run check:knip",
166
172
  "check:quality": "pnpm run format:check && pnpm run check:doc-language && pnpm run check:package-scripts && pnpm run check:rulesets && pnpm run verify:actions-runtime && pnpm run lint && pnpm run typecheck && pnpm run audit && pnpm run licenses:check",
167
- "check:package": "pnpm run build && pnpm run sync-version -- --check && pnpm run validate:mcp-metadata && pnpm run validate:chatgpt-app && pnpm run validate:claude-connector && pnpm run docs:check && pnpm run pack:check && pnpm run pack:install-smoke && pnpm run audit:packed",
173
+ "check:package": "pnpm run build && pnpm run sync-version -- --check && pnpm run validate:mcp-metadata && pnpm run validate:chatgpt-app && pnpm run validate:claude-connector && pnpm run validate:google-app && pnpm run docs:check && pnpm run pack:check && pnpm run pack:install-smoke && pnpm run audit:packed",
168
174
  "check:push": "pnpm run format:check && pnpm run lint && pnpm run typecheck && pnpm test",
169
175
  "check": "pnpm run check:quality && pnpm run test:coverage && pnpm run check:package",
170
176
  "hook:pre-commit": "pnpm run format:staged",
171
177
  "hook:pre-push": "pnpm run check:push",
172
178
  "release:dry-run": "node scripts/validate-release-please.mjs && node scripts/release-state.mjs --offline --json && pnpm run check:package",
173
- "sbom": "node scripts/generate-sbom.mjs"
179
+ "sbom": "node scripts/generate-sbom.mjs",
180
+ "bench": "vitest bench --run --config vitest.bench.config.ts"
174
181
  }
175
182
  }
@@ -2,7 +2,7 @@
2
2
  "name": "ssh-mcp-pro",
3
3
  "display_name": "ssh-mcp-pro",
4
4
  "description": "Secure MCP SSH automation server with policy controls, resources, prompts, stdio, and HTTP.",
5
- "version": "1.2.1",
5
+ "version": "1.4.0",
6
6
  "author": "Osman Aslan",
7
7
  "license": "MIT",
8
8
  "runtime": "node",
package/server.json CHANGED
@@ -7,13 +7,13 @@
7
7
  "url": "https://github.com/oaslananka/ssh-mcp-pro",
8
8
  "source": "github"
9
9
  },
10
- "version": "1.2.1",
10
+ "version": "1.4.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "registryBaseUrl": "https://registry.npmjs.org",
15
15
  "identifier": "ssh-mcp-pro",
16
- "version": "1.2.1",
16
+ "version": "1.4.0",
17
17
  "transport": {
18
18
  "type": "stdio"
19
19
  }
@@ -22,7 +22,7 @@
22
22
  "registryType": "npm",
23
23
  "registryBaseUrl": "https://registry.npmjs.org",
24
24
  "identifier": "ssh-mcp-pro",
25
- "version": "1.2.1",
25
+ "version": "1.4.0",
26
26
  "runtimeHint": "npx",
27
27
  "transport": {
28
28
  "type": "streamable-http",