@jonathanleelx/meddle 0.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.
- package/CONFIG_STRUCTURE.md +315 -0
- package/LICENSE +21 -0
- package/README.md +298 -0
- package/bin/commands/mock/add.js +92 -0
- package/bin/commands/mock/delete.js +58 -0
- package/bin/commands/mock/index.js +50 -0
- package/bin/commands/mock/list.js +68 -0
- package/bin/commands/mock/toggle.js +64 -0
- package/bin/commands/mock/update.js +94 -0
- package/bin/commands/route/active.js +141 -0
- package/bin/commands/route/add.js +127 -0
- package/bin/commands/route/create.js +77 -0
- package/bin/commands/route/delete.js +120 -0
- package/bin/commands/route/index.js +59 -0
- package/bin/commands/route/list.js +67 -0
- package/bin/commands/route/preview.js +159 -0
- package/bin/commands/route/show.js +111 -0
- package/bin/commands/route/update.js +126 -0
- package/bin/commands/session/create.js +166 -0
- package/bin/commands/session/delete.js +69 -0
- package/bin/commands/session/index.js +61 -0
- package/bin/commands/session/list.js +42 -0
- package/bin/commands/session/prune.js +31 -0
- package/bin/commands/start.js +43 -0
- package/bin/commands/status.js +115 -0
- package/bin/commands/supervise.js +106 -0
- package/bin/commands/url.js +30 -0
- package/bin/doctor.js +356 -0
- package/bin/index +130 -0
- package/bin/lib/api-client.js +72 -0
- package/bin/lib/file-access.js +337 -0
- package/bin/lib/meddle-home.js +20 -0
- package/bin/lib/output.js +146 -0
- package/bin/lib/parsers.js +127 -0
- package/bin/lib/proxy-detect.js +105 -0
- package/bin/lib/route-preview.js +180 -0
- package/bin/lib/session-args.js +54 -0
- package/bin/lib/sessions.js +213 -0
- package/dist/cert.d.ts +10 -0
- package/dist/cert.d.ts.map +1 -0
- package/dist/cert.js +184 -0
- package/dist/cert.js.map +1 -0
- package/dist/core/application-identity.d.ts +55 -0
- package/dist/core/application-identity.d.ts.map +1 -0
- package/dist/core/application-identity.js +321 -0
- package/dist/core/application-identity.js.map +1 -0
- package/dist/core/body-utils.d.ts +2 -0
- package/dist/core/body-utils.d.ts.map +1 -0
- package/dist/core/body-utils.js +21 -0
- package/dist/core/body-utils.js.map +1 -0
- package/dist/core/browser.d.ts +2 -0
- package/dist/core/browser.d.ts.map +1 -0
- package/dist/core/browser.js +92 -0
- package/dist/core/browser.js.map +1 -0
- package/dist/core/client-identity.d.ts +27 -0
- package/dist/core/client-identity.d.ts.map +1 -0
- package/dist/core/client-identity.js +136 -0
- package/dist/core/client-identity.js.map +1 -0
- package/dist/core/config-diagnostics.d.ts +14 -0
- package/dist/core/config-diagnostics.d.ts.map +1 -0
- package/dist/core/config-diagnostics.js +137 -0
- package/dist/core/config-diagnostics.js.map +1 -0
- package/dist/core/connect-tunnel.d.ts +5 -0
- package/dist/core/connect-tunnel.d.ts.map +1 -0
- package/dist/core/connect-tunnel.js +45 -0
- package/dist/core/connect-tunnel.js.map +1 -0
- package/dist/core/content-encoding.d.ts +2 -0
- package/dist/core/content-encoding.d.ts.map +1 -0
- package/dist/core/content-encoding.js +77 -0
- package/dist/core/content-encoding.js.map +1 -0
- package/dist/core/custom-plugin-loader.d.ts +18 -0
- package/dist/core/custom-plugin-loader.d.ts.map +1 -0
- package/dist/core/custom-plugin-loader.js +178 -0
- package/dist/core/custom-plugin-loader.js.map +1 -0
- package/dist/core/h2-pool.d.ts +4 -0
- package/dist/core/h2-pool.d.ts.map +1 -0
- package/dist/core/h2-pool.js +180 -0
- package/dist/core/h2-pool.js.map +1 -0
- package/dist/core/inspection-dispatch.d.ts +5 -0
- package/dist/core/inspection-dispatch.d.ts.map +1 -0
- package/dist/core/inspection-dispatch.js +146 -0
- package/dist/core/inspection-dispatch.js.map +1 -0
- package/dist/core/log-rate-limit.d.ts +34 -0
- package/dist/core/log-rate-limit.d.ts.map +1 -0
- package/dist/core/log-rate-limit.js +52 -0
- package/dist/core/log-rate-limit.js.map +1 -0
- package/dist/core/map-local.d.ts +4 -0
- package/dist/core/map-local.d.ts.map +1 -0
- package/dist/core/map-local.js +195 -0
- package/dist/core/map-local.js.map +1 -0
- package/dist/core/meddle-home.d.ts +13 -0
- package/dist/core/meddle-home.d.ts.map +1 -0
- package/dist/core/meddle-home.js +56 -0
- package/dist/core/meddle-home.js.map +1 -0
- package/dist/core/mock-gate.d.ts +3 -0
- package/dist/core/mock-gate.d.ts.map +1 -0
- package/dist/core/mock-gate.js +20 -0
- package/dist/core/mock-gate.js.map +1 -0
- package/dist/core/mock-handler.d.ts +5 -0
- package/dist/core/mock-handler.d.ts.map +1 -0
- package/dist/core/mock-handler.js +339 -0
- package/dist/core/mock-handler.js.map +1 -0
- package/dist/core/on-mode-gate.d.ts +4 -0
- package/dist/core/on-mode-gate.d.ts.map +1 -0
- package/dist/core/on-mode-gate.js +64 -0
- package/dist/core/on-mode-gate.js.map +1 -0
- package/dist/core/pipeline-gate.d.ts +3 -0
- package/dist/core/pipeline-gate.d.ts.map +1 -0
- package/dist/core/pipeline-gate.js +34 -0
- package/dist/core/pipeline-gate.js.map +1 -0
- package/dist/core/pipeline.d.ts +6 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +228 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/plugin-bootstrap-runner.d.ts +6 -0
- package/dist/core/plugin-bootstrap-runner.d.ts.map +1 -0
- package/dist/core/plugin-bootstrap-runner.js +148 -0
- package/dist/core/plugin-bootstrap-runner.js.map +1 -0
- package/dist/core/plugin-bootstrap.d.ts +3 -0
- package/dist/core/plugin-bootstrap.d.ts.map +1 -0
- package/dist/core/plugin-bootstrap.js +15 -0
- package/dist/core/plugin-bootstrap.js.map +1 -0
- package/dist/core/plugin-compiler.d.ts +37 -0
- package/dist/core/plugin-compiler.d.ts.map +1 -0
- package/dist/core/plugin-compiler.js +172 -0
- package/dist/core/plugin-compiler.js.map +1 -0
- package/dist/core/plugin-context-factory.d.ts +29 -0
- package/dist/core/plugin-context-factory.d.ts.map +1 -0
- package/dist/core/plugin-context-factory.js +206 -0
- package/dist/core/plugin-context-factory.js.map +1 -0
- package/dist/core/plugin-generator.d.ts +47 -0
- package/dist/core/plugin-generator.d.ts.map +1 -0
- package/dist/core/plugin-generator.js +697 -0
- package/dist/core/plugin-generator.js.map +1 -0
- package/dist/core/plugin-health.d.ts +3 -0
- package/dist/core/plugin-health.d.ts.map +1 -0
- package/dist/core/plugin-health.js +54 -0
- package/dist/core/plugin-health.js.map +1 -0
- package/dist/core/plugin-intercept.d.ts +17 -0
- package/dist/core/plugin-intercept.d.ts.map +1 -0
- package/dist/core/plugin-intercept.js +133 -0
- package/dist/core/plugin-intercept.js.map +1 -0
- package/dist/core/plugin-runtime.d.ts +33 -0
- package/dist/core/plugin-runtime.d.ts.map +1 -0
- package/dist/core/plugin-runtime.js +254 -0
- package/dist/core/plugin-runtime.js.map +1 -0
- package/dist/core/proxy-context.d.ts +3 -0
- package/dist/core/proxy-context.d.ts.map +1 -0
- package/dist/core/proxy-context.js +129 -0
- package/dist/core/proxy-context.js.map +1 -0
- package/dist/core/proxy-record.d.ts +3 -0
- package/dist/core/proxy-record.d.ts.map +1 -0
- package/dist/core/proxy-record.js +32 -0
- package/dist/core/proxy-record.js.map +1 -0
- package/dist/core/refactor-config.d.ts +6 -0
- package/dist/core/refactor-config.d.ts.map +1 -0
- package/dist/core/refactor-config.js +45 -0
- package/dist/core/refactor-config.js.map +1 -0
- package/dist/core/refactor-status.d.ts +3 -0
- package/dist/core/refactor-status.d.ts.map +1 -0
- package/dist/core/refactor-status.js +19 -0
- package/dist/core/refactor-status.js.map +1 -0
- package/dist/core/remote-access.d.ts +40 -0
- package/dist/core/remote-access.d.ts.map +1 -0
- package/dist/core/remote-access.js +281 -0
- package/dist/core/remote-access.js.map +1 -0
- package/dist/core/route-decision.d.ts +3 -0
- package/dist/core/route-decision.d.ts.map +1 -0
- package/dist/core/route-decision.js +20 -0
- package/dist/core/route-decision.js.map +1 -0
- package/dist/core/route-loader.d.ts +14 -0
- package/dist/core/route-loader.d.ts.map +1 -0
- package/dist/core/route-loader.js +94 -0
- package/dist/core/route-loader.js.map +1 -0
- package/dist/core/route-preview.d.ts +15 -0
- package/dist/core/route-preview.d.ts.map +1 -0
- package/dist/core/route-preview.js +91 -0
- package/dist/core/route-preview.js.map +1 -0
- package/dist/core/runtime-health.d.ts +92 -0
- package/dist/core/runtime-health.d.ts.map +1 -0
- package/dist/core/runtime-health.js +205 -0
- package/dist/core/runtime-health.js.map +1 -0
- package/dist/core/sessions.d.ts +19 -0
- package/dist/core/sessions.d.ts.map +1 -0
- package/dist/core/sessions.js +93 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/shadow-compare.d.ts +8 -0
- package/dist/core/shadow-compare.d.ts.map +1 -0
- package/dist/core/shadow-compare.js +83 -0
- package/dist/core/shadow-compare.js.map +1 -0
- package/dist/core/shadow-readiness.d.ts +4 -0
- package/dist/core/shadow-readiness.d.ts.map +1 -0
- package/dist/core/shadow-readiness.js +118 -0
- package/dist/core/shadow-readiness.js.map +1 -0
- package/dist/core/short-response.d.ts +5 -0
- package/dist/core/short-response.d.ts.map +1 -0
- package/dist/core/short-response.js +18 -0
- package/dist/core/short-response.js.map +1 -0
- package/dist/core/static-server.d.ts +9 -0
- package/dist/core/static-server.d.ts.map +1 -0
- package/dist/core/static-server.js +136 -0
- package/dist/core/static-server.js.map +1 -0
- package/dist/core/types.d.ts +590 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/helpers.d.ts +36 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +290 -0
- package/dist/helpers.js.map +1 -0
- package/dist/plugins/builtin/index.d.ts +3 -0
- package/dist/plugins/builtin/index.d.ts.map +1 -0
- package/dist/plugins/builtin/index.js +23 -0
- package/dist/plugins/builtin/index.js.map +1 -0
- package/dist/plugins/builtin/logger-plugin.d.ts +8 -0
- package/dist/plugins/builtin/logger-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/logger-plugin.js +121 -0
- package/dist/plugins/builtin/logger-plugin.js.map +1 -0
- package/dist/plugins/builtin/mock-plugin.d.ts +3 -0
- package/dist/plugins/builtin/mock-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/mock-plugin.js +99 -0
- package/dist/plugins/builtin/mock-plugin.js.map +1 -0
- package/dist/plugins/builtin/router-plugin.d.ts +3 -0
- package/dist/plugins/builtin/router-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/router-plugin.js +36 -0
- package/dist/plugins/builtin/router-plugin.js.map +1 -0
- package/dist/server/agent/model.d.ts +30 -0
- package/dist/server/agent/model.d.ts.map +1 -0
- package/dist/server/agent/model.js +143 -0
- package/dist/server/agent/model.js.map +1 -0
- package/dist/server/agent/routes.d.ts +4 -0
- package/dist/server/agent/routes.d.ts.map +1 -0
- package/dist/server/agent/routes.js +188 -0
- package/dist/server/agent/routes.js.map +1 -0
- package/dist/server/agent/runtime.d.ts +12 -0
- package/dist/server/agent/runtime.d.ts.map +1 -0
- package/dist/server/agent/runtime.js +208 -0
- package/dist/server/agent/runtime.js.map +1 -0
- package/dist/server/agent/tools.d.ts +13 -0
- package/dist/server/agent/tools.d.ts.map +1 -0
- package/dist/server/agent/tools.js +1201 -0
- package/dist/server/agent/tools.js.map +1 -0
- package/dist/server/agent/types.d.ts +56 -0
- package/dist/server/agent/types.d.ts.map +1 -0
- package/dist/server/agent/types.js +3 -0
- package/dist/server/agent/types.js.map +1 -0
- package/dist/server/config.d.ts +9 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +124 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/health.d.ts +4 -0
- package/dist/server/health.d.ts.map +1 -0
- package/dist/server/health.js +22 -0
- package/dist/server/health.js.map +1 -0
- package/dist/server/index.d.ts +239 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +44 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/logs.d.ts +4 -0
- package/dist/server/logs.d.ts.map +1 -0
- package/dist/server/logs.js +40 -0
- package/dist/server/logs.js.map +1 -0
- package/dist/server/mocks.d.ts +9 -0
- package/dist/server/mocks.d.ts.map +1 -0
- package/dist/server/mocks.js +103 -0
- package/dist/server/mocks.js.map +1 -0
- package/dist/server/pipeline.d.ts +16 -0
- package/dist/server/pipeline.d.ts.map +1 -0
- package/dist/server/pipeline.js +159 -0
- package/dist/server/pipeline.js.map +1 -0
- package/dist/server/plugins.d.ts +32 -0
- package/dist/server/plugins.d.ts.map +1 -0
- package/dist/server/plugins.js +795 -0
- package/dist/server/plugins.js.map +1 -0
- package/dist/server/refactor.d.ts +4 -0
- package/dist/server/refactor.d.ts.map +1 -0
- package/dist/server/refactor.js +86 -0
- package/dist/server/refactor.js.map +1 -0
- package/dist/server/rule-files.d.ts +34 -0
- package/dist/server/rule-files.d.ts.map +1 -0
- package/dist/server/rule-files.js +389 -0
- package/dist/server/rule-files.js.map +1 -0
- package/dist/server/rules.d.ts +4 -0
- package/dist/server/rules.d.ts.map +1 -0
- package/dist/server/rules.js +40 -0
- package/dist/server/rules.js.map +1 -0
- package/dist/server/sessions.d.ts +4 -0
- package/dist/server/sessions.d.ts.map +1 -0
- package/dist/server/sessions.js +20 -0
- package/dist/server/sessions.js.map +1 -0
- package/index.js +950 -0
- package/mcp-server.js +794 -0
- package/package.json +92 -0
- package/plugins/builtin/index.ts +25 -0
- package/plugins/builtin/logger-plugin.ts +126 -0
- package/plugins/builtin/mock-plugin.ts +112 -0
- package/plugins/builtin/router-plugin.ts +35 -0
- package/web/README.md +111 -0
- package/web/dist/assets/ai-config-store-DQXVJVn_.js +1 -0
- package/web/dist/assets/alert-COF-DIAE.js +1 -0
- package/web/dist/assets/arrow-right-B4Mrlj2-.js +1 -0
- package/web/dist/assets/babel-DsprIpXZ.js +15 -0
- package/web/dist/assets/body-diff-view-D7dCWajG.js +6 -0
- package/web/dist/assets/button-BTToMaBW.js +1 -0
- package/web/dist/assets/checkbox-DIBarrJx.js +1 -0
- package/web/dist/assets/chevron-down-CPngAx4M.js +1 -0
- package/web/dist/assets/chevron-right-V1DGIDbL.js +1 -0
- package/web/dist/assets/circle-alert-Q8cZk9Rv.js +1 -0
- package/web/dist/assets/circle-x-C9USji_R.js +1 -0
- package/web/dist/assets/code-5_eJ_XpJ.js +1 -0
- package/web/dist/assets/code-fixer-fQtWZ5He.js +20 -0
- package/web/dist/assets/copy-BYjq1hdN.js +1 -0
- package/web/dist/assets/detail-panel-BX_hxeI0.js +3 -0
- package/web/dist/assets/dist-B8XUKgXe.js +1 -0
- package/web/dist/assets/dist-Bb9TeEub.js +1 -0
- package/web/dist/assets/dist-C5nMErq8.js +1 -0
- package/web/dist/assets/dist-C6eaYCUo.js +1 -0
- package/web/dist/assets/dist-Cn0y0IRn.js +1 -0
- package/web/dist/assets/dist-CxdY_A67.js +5 -0
- package/web/dist/assets/dist-D5Dj17P8.js +1 -0
- package/web/dist/assets/dist-DZJ9SMlJ.js +1 -0
- package/web/dist/assets/es2015-CfXu88Y7.js +41 -0
- package/web/dist/assets/estree-BP7k0NIt.js +44 -0
- package/web/dist/assets/file-system-access-CtcvBfj4.js +1 -0
- package/web/dist/assets/global-panel-shell-ChdO0dWd.js +6 -0
- package/web/dist/assets/health-panel-CQeCQ7gr.js +1 -0
- package/web/dist/assets/html-6FIWbqxX.js +25 -0
- package/web/dist/assets/index-CjqaTnE_.css +2 -0
- package/web/dist/assets/index-L7uWxTnp.js +18 -0
- package/web/dist/assets/mobile-proxy-panel-Dj1iLami.js +8 -0
- package/web/dist/assets/mock-config-BTTCw7RK.js +1 -0
- package/web/dist/assets/mock-editor-panel-C-aVfFme.js +1 -0
- package/web/dist/assets/monaco-editor-B3brLg8j.js +11 -0
- package/web/dist/assets/pencil-line-Cqe41E4h.js +1 -0
- package/web/dist/assets/plugin-code-editor-CPjCbJ9g.js +2 -0
- package/web/dist/assets/plugin-config-BzmCkvz3.js +1 -0
- package/web/dist/assets/plugin-generator-BnEafDF9.js +2 -0
- package/web/dist/assets/plugin-test-dialog-BWoWsWV4.js +7 -0
- package/web/dist/assets/plus-tVxSydJ8.js +1 -0
- package/web/dist/assets/postcss-Dnf30fQU.js +61 -0
- package/web/dist/assets/refresh-cw-CG3HaiQT.js +1 -0
- package/web/dist/assets/rotate-ccw-CAYM6Vv0.js +1 -0
- package/web/dist/assets/route-preview-BX7sfY0O.js +1 -0
- package/web/dist/assets/rule-ai-assistant-panel-WBiOOUw5.js +47 -0
- package/web/dist/assets/rule-config-CHpVij2M.css +1 -0
- package/web/dist/assets/rule-config-fTIZVwg1.js +15 -0
- package/web/dist/assets/select-CkFOB61l.js +1 -0
- package/web/dist/assets/server-Cpj4KNwN.js +1 -0
- package/web/dist/assets/settings-panel-COCYiIUg.js +1 -0
- package/web/dist/assets/shield-check-OqUmVLQt.js +1 -0
- package/web/dist/assets/smartphone-DKeDuJTU.js +1 -0
- package/web/dist/assets/standalone-CjxtLKw-.js +29 -0
- package/web/dist/assets/switch-C-Xk56TK.js +1 -0
- package/web/dist/assets/syntax-highlight-DVhPdkuV.js +5 -0
- package/web/dist/assets/table-CT97lAYq.js +1 -0
- package/web/dist/assets/textarea-C6NooVK1.js +1 -0
- package/web/dist/assets/wand-sparkles-wkul5vje.js +1 -0
- package/web/dist/assets/wifi-D9M35Ajj.js +1 -0
- package/web/dist/assets/zap-Djo4cgux.js +1 -0
- package/web/dist/index.html +24 -0
- package/web/dist/vite.svg +1 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# Meddle 配置文件结构说明
|
|
2
|
+
|
|
3
|
+
## 目录结构
|
|
4
|
+
|
|
5
|
+
Meddle 的运行配置统一存储在 `~/.meddle/`:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
~/.meddle/
|
|
9
|
+
├── route-rules/ # 路由规则文本文件
|
|
10
|
+
│ ├── 默认规则.txt
|
|
11
|
+
│ └── beta-rules.txt
|
|
12
|
+
├── mocks.json # Mock 规则
|
|
13
|
+
├── settings.json # 系统设置和启用状态
|
|
14
|
+
├── ca/ # HTTPS 证书
|
|
15
|
+
│ ├── rootCA.crt
|
|
16
|
+
│ ├── rootCA.key
|
|
17
|
+
│ └── *.crt / *.key
|
|
18
|
+
├── plugins/ # 用户自定义插件
|
|
19
|
+
├── plugins-data/ # 插件配置和持久化数据
|
|
20
|
+
├── mcp-proxy-url.json # MCP 启动时记录的代理地址
|
|
21
|
+
└── supervisor.log # daemon supervisor 日志
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
其中 `route-rules/`、`ca/` 等目录会在需要时自动创建。路由规则不再从项目目录或单个用户配置文件加载。
|
|
25
|
+
|
|
26
|
+
## 路由规则
|
|
27
|
+
|
|
28
|
+
### 文件位置与启用状态
|
|
29
|
+
|
|
30
|
+
每组路由规则对应一个文本文件:
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
~/.meddle/route-rules/<规则文件名称>.txt
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
可以同时启用多个规则文件。启用文件名称及顺序存储在 `settings.json` 的 `activeRuleFiles` 数组中,代理会按数组顺序合并各文件,再按文件内顺序匹配规则。
|
|
37
|
+
|
|
38
|
+
推荐通过以下方式管理:
|
|
39
|
+
|
|
40
|
+
- Web 界面的“路由规则”页面
|
|
41
|
+
- `meddle route list/show/create/add/update/delete`
|
|
42
|
+
- `meddle route active` 和 `meddle route active set <file>`
|
|
43
|
+
|
|
44
|
+
### 文本格式
|
|
45
|
+
|
|
46
|
+
每行格式固定为:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
pattern [pattern2 ...] [!exclusion ...] target
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- `target` 必须位于最后。
|
|
53
|
+
- 同一行可以包含多个 pattern,它们共享 target 和 exclusion。
|
|
54
|
+
- 空行以及以 `#` 或 `//` 开头的行会被忽略。
|
|
55
|
+
|
|
56
|
+
示例:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
# 单条规则
|
|
60
|
+
app.example.com http://localhost:8000
|
|
61
|
+
|
|
62
|
+
# 多个 pattern 共用 target
|
|
63
|
+
app.example.com/console app.example.com/dev-server https://localhost:8000
|
|
64
|
+
|
|
65
|
+
# 排除部分路径
|
|
66
|
+
api.example.com !/api !/oauth !/internal http://localhost:5173
|
|
67
|
+
|
|
68
|
+
# 通配符
|
|
69
|
+
*.example.com 127.0.0.1:3000
|
|
70
|
+
|
|
71
|
+
# marker 路径重写
|
|
72
|
+
^https://app.example.com[/api/v2] https://localhost:13001
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 匹配规则
|
|
76
|
+
|
|
77
|
+
1. 请求按照合并后的规则顺序逐条匹配,第一条可用规则生效。
|
|
78
|
+
2. pattern 面向完整请求 URL,而不是只匹配 host。
|
|
79
|
+
3. pattern 支持显式正则和 `*` 通配符。
|
|
80
|
+
4. exclusion 使用 `!` 前缀;任一 exclusion 命中时跳过当前规则,继续检查下一条。
|
|
81
|
+
5. target 为 host 或 `host:port` 时,会继承原请求的协议、路径和查询参数。
|
|
82
|
+
6. target 带自定义路径时,默认使用 target 自身的路径。
|
|
83
|
+
7. pattern 中的 `[marker]` 会保留 marker 后面的原始尾路径,并拼接到 target 后。
|
|
84
|
+
8. target 可以是 `file://` URL 或本地绝对路径,用于映射本地文件。
|
|
85
|
+
9. WebSocket 请求会根据 target 协议自动转换为 `ws` 或 `wss`。
|
|
86
|
+
|
|
87
|
+
marker 示例:
|
|
88
|
+
|
|
89
|
+
```text
|
|
90
|
+
^https://app.example.com[/api/v2] https://localhost:13001
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
请求:
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
https://app.example.com/api/v2/micro/app?a=1
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
最终地址:
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
https://localhost:13001/micro/app?a=1
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Mock 规则
|
|
106
|
+
|
|
107
|
+
默认文件:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
~/.meddle/mocks.json
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
也可以通过 `settings.json` 的 `mocksFilePath` 指定其他 JSON 文件。
|
|
114
|
+
|
|
115
|
+
示例:
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
{
|
|
119
|
+
"nextId": 2,
|
|
120
|
+
"rules": [
|
|
121
|
+
{
|
|
122
|
+
"id": 1,
|
|
123
|
+
"name": "模拟 API 响应",
|
|
124
|
+
"urlPattern": "/api/user",
|
|
125
|
+
"method": "GET",
|
|
126
|
+
"statusCode": 200,
|
|
127
|
+
"headers": {
|
|
128
|
+
"Content-Type": "application/json"
|
|
129
|
+
},
|
|
130
|
+
"bodyType": "inline",
|
|
131
|
+
"body": "{\"name\":\"test\"}",
|
|
132
|
+
"delay": 0,
|
|
133
|
+
"enabled": true
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
主要字段:
|
|
140
|
+
|
|
141
|
+
| 字段 | 类型 | 说明 |
|
|
142
|
+
|------|------|------|
|
|
143
|
+
| `id` | number | 规则 ID |
|
|
144
|
+
| `name` | string | 规则名称 |
|
|
145
|
+
| `urlPattern` | string | URL 匹配模式 |
|
|
146
|
+
| `method` | string | HTTP 方法,`*` 表示全部 |
|
|
147
|
+
| `statusCode` | number | HTTP 状态码 |
|
|
148
|
+
| `headers` | object | 自定义响应头 |
|
|
149
|
+
| `bodyType` | string | `inline` 或 `file` |
|
|
150
|
+
| `body` | string | 响应内容或文件路径 |
|
|
151
|
+
| `delay` | number | 响应延迟,单位毫秒 |
|
|
152
|
+
| `enabled` | boolean | 是否启用 |
|
|
153
|
+
|
|
154
|
+
> 内置 Mock 插件只处理 `inline` 类型;其他类型由传统 Mock 处理器处理。
|
|
155
|
+
|
|
156
|
+
## 系统设置
|
|
157
|
+
|
|
158
|
+
固定位置:
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
~/.meddle/settings.json
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
示例:
|
|
165
|
+
|
|
166
|
+
```json
|
|
167
|
+
{
|
|
168
|
+
"theme": "system",
|
|
169
|
+
"accentColor": "auto",
|
|
170
|
+
"fontSize": "100",
|
|
171
|
+
"activeRuleFiles": [
|
|
172
|
+
"默认规则",
|
|
173
|
+
"beta-rules"
|
|
174
|
+
],
|
|
175
|
+
"mocksFilePath": "",
|
|
176
|
+
"pluginMode": "off",
|
|
177
|
+
"clientAliases": {
|
|
178
|
+
"10.0.0.8": "测试手机"
|
|
179
|
+
},
|
|
180
|
+
"aiConfig": {
|
|
181
|
+
"enabled": false,
|
|
182
|
+
"provider": "openai",
|
|
183
|
+
"apiKey": "",
|
|
184
|
+
"baseUrl": "",
|
|
185
|
+
"model": "",
|
|
186
|
+
"models": []
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
主要字段:
|
|
192
|
+
|
|
193
|
+
| 字段 | 说明 |
|
|
194
|
+
|------|------|
|
|
195
|
+
| `theme` | `light`、`dark` 或 `system` |
|
|
196
|
+
| `accentColor` | 界面强调色 |
|
|
197
|
+
| `fontSize` | 界面缩放百分比字符串,例如 `100` |
|
|
198
|
+
| `activeRuleFiles` | 当前启用的路由规则文件名称,顺序即合并顺序 |
|
|
199
|
+
| `mocksFilePath` | 自定义 Mock JSON 路径;空值使用默认位置 |
|
|
200
|
+
| `pluginMode` | 插件 Pipeline 模式:`off`、`shadow` 或 `on` |
|
|
201
|
+
| `clientAliases` | 客户端 IP 到设备名称的映射 |
|
|
202
|
+
| `aiConfig` | AI 服务和模型配置 |
|
|
203
|
+
|
|
204
|
+
设置文件可能包含 API Key,不应提交到代码仓库或发送给他人。
|
|
205
|
+
|
|
206
|
+
## SSL 证书
|
|
207
|
+
|
|
208
|
+
证书目录:
|
|
209
|
+
|
|
210
|
+
```text
|
|
211
|
+
~/.meddle/ca/
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
- `rootCA.crt`:根证书。
|
|
215
|
+
- `rootCA.key`:根证书私钥,必须妥善保管。
|
|
216
|
+
- 域名证书和私钥会在 HTTPS 代理过程中按需生成。
|
|
217
|
+
|
|
218
|
+
首次进行 HTTPS 解密前,需要在系统或测试设备上安装并信任根证书。
|
|
219
|
+
|
|
220
|
+
## 配置加载规则
|
|
221
|
+
|
|
222
|
+
### 路由规则
|
|
223
|
+
|
|
224
|
+
1. 读取 `~/.meddle/settings.json` 中的 `activeRuleFiles`。
|
|
225
|
+
2. 按数组顺序读取 `~/.meddle/route-rules/<名称>.txt`。
|
|
226
|
+
3. 合并规则并按顺序匹配。
|
|
227
|
+
4. 如果目录为空,首次启动会创建一个默认规则文件并将其设为启用状态。
|
|
228
|
+
5. 规则文件修改后会自动重新加载。
|
|
229
|
+
|
|
230
|
+
### Mock 规则
|
|
231
|
+
|
|
232
|
+
1. `mocksFilePath` 有值且文件存在时,读取自定义文件。
|
|
233
|
+
2. 否则读取 `~/.meddle/mocks.json`。
|
|
234
|
+
3. 可通过设置页的“重新加载配置”立即重新读取。
|
|
235
|
+
|
|
236
|
+
### 系统设置
|
|
237
|
+
|
|
238
|
+
- 始终读取 `~/.meddle/settings.json`。
|
|
239
|
+
- 文件不存在时使用应用默认值。
|
|
240
|
+
- Web 设置页保存时会写入该文件。
|
|
241
|
+
|
|
242
|
+
## 常用操作
|
|
243
|
+
|
|
244
|
+
### 查看配置
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
ls -la ~/.meddle/
|
|
248
|
+
ls -la ~/.meddle/route-rules/
|
|
249
|
+
cat ~/.meddle/route-rules/默认规则.txt
|
|
250
|
+
cat ~/.meddle/mocks.json | jq .
|
|
251
|
+
cat ~/.meddle/settings.json | jq .
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### 管理路由文件
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
meddle route list
|
|
258
|
+
meddle route create local --content "api.example.com localhost:3000"
|
|
259
|
+
meddle route show local
|
|
260
|
+
meddle route active set local
|
|
261
|
+
meddle route preview "https://api.example.com/users"
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### 配置健康检查
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
meddle doctor
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
诊断内容包括:
|
|
271
|
+
|
|
272
|
+
- `~/.meddle/` 是否存在。
|
|
273
|
+
- `settings.json` 是否为有效 JSON。
|
|
274
|
+
- `route-rules/` 中的规则文件数量和启用状态。
|
|
275
|
+
- Mock 文件格式和启用规则数量。
|
|
276
|
+
- 根证书及私钥是否存在。
|
|
277
|
+
|
|
278
|
+
Web 设置页的“配置文件”标签也提供相同的诊断入口。
|
|
279
|
+
|
|
280
|
+
### 备份与恢复
|
|
281
|
+
|
|
282
|
+
完整备份:
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
tar -czf meddle-backup.tar.gz ~/.meddle/
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
仅备份主要配置:
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
tar -czf meddle-config-backup.tar.gz \
|
|
292
|
+
~/.meddle/route-rules \
|
|
293
|
+
~/.meddle/mocks.json \
|
|
294
|
+
~/.meddle/settings.json
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
恢复完整备份:
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
tar -xzf meddle-backup.tar.gz -C ~/
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## 安全提示
|
|
304
|
+
|
|
305
|
+
1. 不要公开 `settings.json` 中的 API Key。
|
|
306
|
+
2. 不要分享 `ca/rootCA.key`。
|
|
307
|
+
3. 备份文件包含敏感数据时应加密保存。
|
|
308
|
+
4. 修改配置前建议先备份 `~/.meddle/`。
|
|
309
|
+
|
|
310
|
+
## 相关文档
|
|
311
|
+
|
|
312
|
+
- [README](./README.md)
|
|
313
|
+
- [CLI Reference](./docs/CLI_REFERENCE.md)
|
|
314
|
+
- [API Reference](./docs/API_REFERENCE.md)
|
|
315
|
+
- [Mock 优化指南](./MOCK_OPTIMIZATION_SUMMARY.md)
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 JonathanLee-LX
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# 一个非常简单的开发代理服务器
|
|
2
|
+
|
|
3
|
+
- 自定义代理规则
|
|
4
|
+
- 支持https✅
|
|
5
|
+
|
|
6
|
+
## 使用
|
|
7
|
+
|
|
8
|
+
全局安装 `npm install @jonathanleelx/meddle -g`,会创建一个 `meddle` 命令。
|
|
9
|
+
|
|
10
|
+
### 命令
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# 启动代理服务器
|
|
14
|
+
meddle
|
|
15
|
+
|
|
16
|
+
# 启动并自动打开浏览器
|
|
17
|
+
meddle --open
|
|
18
|
+
|
|
19
|
+
# 检查配置文件健康状况
|
|
20
|
+
meddle doctor
|
|
21
|
+
|
|
22
|
+
# 查看代理状态
|
|
23
|
+
meddle status
|
|
24
|
+
|
|
25
|
+
# 显示帮助信息
|
|
26
|
+
meddle --help
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
完整 CLI 命令文档见 [CLI Reference](./docs/CLI_REFERENCE.md)
|
|
30
|
+
|
|
31
|
+
### 配置文件
|
|
32
|
+
|
|
33
|
+
配置文件扁平化存储在 `~/.meddle/` 目录:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
~/.meddle/
|
|
37
|
+
├── route-rules/ # 路由规则文本文件
|
|
38
|
+
├── mocks.json # Mock 规则配置
|
|
39
|
+
├── settings.json # 系统设置(主题、字体、AI配置)
|
|
40
|
+
└── ca/ # SSL 证书目录
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**路由规则配置**:
|
|
44
|
+
- 每个规则文件存储为 `~/.meddle/route-rules/<名称>.txt`
|
|
45
|
+
- 可同时启用多个规则文件,启用顺序记录在 `settings.json` 的 `activeRuleFiles`
|
|
46
|
+
- 支持顺序匹配、通配符、正则、排除规则和 marker 路径重写
|
|
47
|
+
- 可通过 Web 界面或 `meddle route *` 命令管理
|
|
48
|
+
|
|
49
|
+
**Web 界面管理**:
|
|
50
|
+
- 启动后访问 http://localhost:8989
|
|
51
|
+
- 通过界面管理路由规则、Mock 规则和系统设置
|
|
52
|
+
|
|
53
|
+
详见 [配置文件结构说明](./CONFIG_STRUCTURE.md)
|
|
54
|
+
|
|
55
|
+
### 自动打开浏览器并设置代理
|
|
56
|
+
|
|
57
|
+
使用以下任一方式启动:
|
|
58
|
+
- `meddle --open`(全局安装后)
|
|
59
|
+
- `npm run start:open`(开发时)
|
|
60
|
+
- `MEDDLE_OPEN=1 npm run start`
|
|
61
|
+
|
|
62
|
+
启动后将使用 Chrome/Edge/Chromium 的 `--proxy-server` 参数启动浏览器,仅该浏览器实例使用代理,不修改系统代理设置。
|
|
63
|
+
|
|
64
|
+
### 手机远程代理与抓包
|
|
65
|
+
|
|
66
|
+
电脑和手机连接同一局域网后,使用远程模式启动:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
meddle --remote
|
|
70
|
+
|
|
71
|
+
# 推荐:在支持代理认证的设备上设置口令
|
|
72
|
+
meddle --remote --remote-token "change-me"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
启动日志会输出手机配置入口和代理地址,例如:
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
手机配置入口: http://192.168.1.10:8989/
|
|
79
|
+
代理服务器: 192.168.1.10:8989
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
也可以在电脑上打开 `http://127.0.0.1:8989/_meddle/setup` 查看手机配置页。
|
|
83
|
+
|
|
84
|
+
1. 用手机浏览器打开“手机配置入口”。
|
|
85
|
+
2. 在当前 Wi-Fi 的 HTTP 代理设置中选择手动,填写电脑 IP 和端口。
|
|
86
|
+
3. 下载并安装 `meddle-ca.crt`。
|
|
87
|
+
4. 在系统设置中完全信任该根证书,然后在电脑 Web 界面查看 HTTP/HTTPS 请求与响应。
|
|
88
|
+
|
|
89
|
+
iOS 安装证书后,还需前往“设置 → 通用 → 关于本机 → 证书信任设置”开启完全信任。Android 应用是否信任用户证书取决于应用配置;使用证书锁定的 App 无法解密 HTTPS 流量。
|
|
90
|
+
|
|
91
|
+
远程模式只允许局域网私有地址接入,且远程设备不能访问管理 API。默认会解密 HTTPS;如只需普通隧道代理,可使用:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
meddle --remote --no-intercept-https
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 请求来源应用识别
|
|
98
|
+
|
|
99
|
+
日志面板会识别请求来源应用:
|
|
100
|
+
|
|
101
|
+
- macOS 本机请求通过 socket 反查真实进程,可信度高。
|
|
102
|
+
- 远程设备请求根据 User-Agent 推断 Chrome、Safari、Firefox、Edge 和常见 WebView。
|
|
103
|
+
- 推断结果会显示“推断”标记,不会生成虚假的 PID 或 Bundle ID。
|
|
104
|
+
- 可使用 `app:Chrome`、`app:Safari` 等条件过滤日志。
|
|
105
|
+
|
|
106
|
+
远程 HTTPS 只有在开启解密并成功读取 HTTP 请求头时才能进行 User-Agent 推断。完整策略、字段和限制见 [请求来源应用识别](./docs/APPLICATION_IDENTITY.md)。
|
|
107
|
+
|
|
108
|
+
### MCP Server
|
|
109
|
+
|
|
110
|
+
提供 MCP 工具:启动代理服务器、管理路由规则与 Mock 规则、创建和管理多 Session。
|
|
111
|
+
|
|
112
|
+
**Cursor 配置**:在 Cursor 设置中添加 MCP 服务器:
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"mcpServers": {
|
|
117
|
+
"meddle": {
|
|
118
|
+
"command": "node",
|
|
119
|
+
"args": ["/path/to/meddle/mcp-server.js"]
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
或使用 npm 脚本(在项目目录下):
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"mcpServers": {
|
|
130
|
+
"meddle": {
|
|
131
|
+
"command": "npm",
|
|
132
|
+
"args": ["run", "mcp", "--prefix", "/path/to/meddle"]
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**MCP 工具列表:**
|
|
139
|
+
|
|
140
|
+
| 工具 | 说明 |
|
|
141
|
+
|------|------|
|
|
142
|
+
| `start_proxy` | 启动默认代理服务器 |
|
|
143
|
+
| `get_proxy_url` | 获取代理地址 |
|
|
144
|
+
| `create_session` | 创建隔离代理 session |
|
|
145
|
+
| `delete_session` | 删除指定 session |
|
|
146
|
+
| `list_sessions` | 列出所有 session |
|
|
147
|
+
| `mock_rule_*` | Mock 规则管理(支持 session 参数) |
|
|
148
|
+
| `route_rule_*` | 路由规则管理(支持 session 参数) |
|
|
149
|
+
| `route_preview` | 预览路由匹配结果(支持 session 参数) |
|
|
150
|
+
|
|
151
|
+
所有 `mock_rule_*`、`route_rule_*`、`route_preview` 工具均支持可选 `session` 参数,指定后可操作对应 session 的规则,不传则操作默认 session。
|
|
152
|
+
|
|
153
|
+
### 多 Session 隔离(预览功能)
|
|
154
|
+
|
|
155
|
+
多 Session 允许同时运行多个独立的 `meddle` 代理进程,每个进程拥有独立的配置目录(MEDDLE_HOME)、端口、路由规则和 Mock 规则,适用于多个 Agent 或项目需要隔离代理环境的场景。
|
|
156
|
+
|
|
157
|
+
**核心概念**:
|
|
158
|
+
- **Session**:一个独立的 `meddle` 代理进程,拥有自己的 MEDDLE_HOME 和端口
|
|
159
|
+
- **默认 Session**:不指定 `--session` 时的回退,使用 `~/.meddle/`,行为与之前完全一致
|
|
160
|
+
- **CA 共享**:所有 session 共用 `~/.meddle/ca/` 证书,无需重复安装
|
|
161
|
+
|
|
162
|
+
**目录结构**:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
~/.meddle/
|
|
166
|
+
├── sessions.json # session 注册表
|
|
167
|
+
├── sessions/ # 非默认 session 的数据目录
|
|
168
|
+
│ ├── my-project-1718283600/
|
|
169
|
+
│ │ ├── route-rules/
|
|
170
|
+
│ │ ├── mocks.json
|
|
171
|
+
│ │ ├── settings.json
|
|
172
|
+
│ │ ├── plugins/
|
|
173
|
+
│ │ └── plugins-data/
|
|
174
|
+
│ └── ...
|
|
175
|
+
├── ca/ # 共享 CA 证书
|
|
176
|
+
├── route-rules/ # 默认 session 路由
|
|
177
|
+
├── mocks.json # 默认 session Mock
|
|
178
|
+
└── settings.json # 默认 session 设置
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**CLI 命令**:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# 创建一个新 session,返回 session id
|
|
185
|
+
meddle session create --name my-project
|
|
186
|
+
|
|
187
|
+
# 指定端口创建
|
|
188
|
+
meddle session create --name debug --port 9100
|
|
189
|
+
|
|
190
|
+
# 列出所有 session(含存活状态)
|
|
191
|
+
meddle session list
|
|
192
|
+
|
|
193
|
+
# 操作指定 session 的路由/Mock 等
|
|
194
|
+
meddle --session <session-id> route list
|
|
195
|
+
meddle --session <session-id> mock add --name API --pattern "api.test.com"
|
|
196
|
+
|
|
197
|
+
# 删除 session(--clean 同时删除数据目录)
|
|
198
|
+
meddle session delete <session-id>
|
|
199
|
+
meddle session delete <session-id> --clean
|
|
200
|
+
|
|
201
|
+
# 清理所有孤儿 session(进程已退出的注册表记录)
|
|
202
|
+
meddle session prune
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**MCP 工具**:
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
# 通过 MCP 创建 session
|
|
209
|
+
create_session({ name: "my-project" })
|
|
210
|
+
# → { id: "my-project-1718283600", port: 9000, proxyUrl: "http://127.0.0.1:9000" }
|
|
211
|
+
|
|
212
|
+
# 操作指定 session 的路由(传入 session 参数)
|
|
213
|
+
route_rule_list({ session: "my-project-1718283600" })
|
|
214
|
+
route_rule_add({ session: "my-project-1718283600", ruleFile: "dev", pattern: "...", target: "..." })
|
|
215
|
+
|
|
216
|
+
# 不传 session 参数时操作默认 session(向后兼容)
|
|
217
|
+
route_rule_list({})
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**兼容性**:不设置 `--session` 或 `MEDDLE_HOME` 环境变量时,行为与之前完全一致,所有配置仍在 `~/.meddle/` 下。详见 [多 Session 隔离设计文档](./docs/proposals/multi-session-isolation.md)。
|
|
221
|
+
|
|
222
|
+
## 文档
|
|
223
|
+
|
|
224
|
+
- [配置文件结构说明](./CONFIG_STRUCTURE.md) - 配置文件详细说明 ⭐
|
|
225
|
+
- [CLI Reference](./docs/CLI_REFERENCE.md) - CLI 命令完整文档 ⭐
|
|
226
|
+
- [API Reference](./docs/API_REFERENCE.md) - HTTP API 完整文档
|
|
227
|
+
- [请求来源应用识别](./docs/APPLICATION_IDENTITY.md) - 本机进程识别、远程 UA 推断与限制
|
|
228
|
+
- [文档索引](./docs/DOCS_INDEX.md) - 了解所有可用文档
|
|
229
|
+
- [Mock 优化指南](./MOCK_OPTIMIZATION_SUMMARY.md) - Mock 功能优化说明
|
|
230
|
+
|
|
231
|
+
## 插件开发
|
|
232
|
+
|
|
233
|
+
Meddle 提供了强大的插件系统,允许开发者扩展代理功能。
|
|
234
|
+
|
|
235
|
+
### AI 辅助插件开发 ✨ 新功能
|
|
236
|
+
|
|
237
|
+
**通过AI自动生成自定义插件**,无需手写代码!
|
|
238
|
+
|
|
239
|
+
1. **配置AI服务**:在Web界面设置中配置OpenAI或Anthropic API
|
|
240
|
+
2. **描述需求**:用自然语言描述插件功能
|
|
241
|
+
3. **AI生成代码**:实时查看AI生成的TypeScript插件代码
|
|
242
|
+
4. **自动编译**:保存时自动编译为JavaScript
|
|
243
|
+
5. **即刻使用**:重启服务器后插件自动加载
|
|
244
|
+
|
|
245
|
+
**特性**:
|
|
246
|
+
- 🤖 支持 OpenAI 和 Anthropic
|
|
247
|
+
- ⚡ 流式输出,实时查看生成进度
|
|
248
|
+
- 🔧 自动编译 TypeScript → JavaScript
|
|
249
|
+
- 📊 编译状态可视化(已编译/未编译/需要重新编译)
|
|
250
|
+
- 💾 自动保存到 `~/.meddle/plugins/` 目录
|
|
251
|
+
|
|
252
|
+
**使用步骤**:
|
|
253
|
+
1. 启动代理服务器并访问 Web 界面
|
|
254
|
+
2. 进入"扩展插件"标签页
|
|
255
|
+
3. 点击"AI 生成插件"按钮
|
|
256
|
+
4. 填写插件需求并生成
|
|
257
|
+
5. 查看代码,确认后保存
|
|
258
|
+
|
|
259
|
+
详见:
|
|
260
|
+
- [AI插件功能完整总结](./AI_PLUGIN_FEATURE_SUMMARY.md) ⭐ - 功能概述、使用指南、演示视频
|
|
261
|
+
- [插件生成器功能说明](./PLUGIN_GENERATOR_FEATURE.md) - 技术实现细节
|
|
262
|
+
- [流式输出功能说明](./STREAMING_FEATURE.md) - 流式生成原理和优势
|
|
263
|
+
- [插件编译功能说明](./PLUGIN_COMPILATION.md) - TypeScript编译机制
|
|
264
|
+
|
|
265
|
+
### 手动插件开发
|
|
266
|
+
|
|
267
|
+
如果您希望手动编写插件,详细的插件开发指南请参考:
|
|
268
|
+
|
|
269
|
+
- [插件系统完整开发指南](./docs/plugin/PLUGIN_SYSTEM_GUIDE.md) ⭐ - 包含插件接口、Hook 协议、示例代码和最佳实践
|
|
270
|
+
- [插件架构设计文档](./docs/plugin/RFC_PLUGIN_ARCHITECTURE.md) - 插件系统的架构设计和实施方案
|
|
271
|
+
- [插件 API 决策文档](./docs/plugin/ADR-001-plugin-api.md) - 插件 API 与 Hook 协议定版
|
|
272
|
+
- [插件 Pipeline 模式指南](./docs/plugin/PIPELINE_MODE_GUIDE.md) - 三种运行模式、Shadow 比对追踪、切换策略
|
|
273
|
+
|
|
274
|
+
## 环境变量
|
|
275
|
+
|
|
276
|
+
| 变量 | 说明 | 默认值 |
|
|
277
|
+
|------|------|--------|
|
|
278
|
+
| `MEDDLE_PLUGIN_MODE` | 插件运行模式(off/shadow/on) | `off` |
|
|
279
|
+
| `MEDDLE_PLUGIN_ON_HOSTS` | On 模式 host 白名单(逗号分隔) | 空 |
|
|
280
|
+
| `MEDDLE_ENABLE_BUILTIN_ROUTER` | 启用内置路由插件 | `true` |
|
|
281
|
+
| `MEDDLE_ENABLE_BUILTIN_LOGGER` | 启用内置日志插件 | `true` |
|
|
282
|
+
| `MEDDLE_ENABLE_BUILTIN_MOCK` | 启用内置 Mock 插件 | `false` |
|
|
283
|
+
| `PORT` | Web 界面端口 | `8989` |
|
|
284
|
+
| `MEDDLE_REMOTE` | 允许局域网设备连接代理 | `false` |
|
|
285
|
+
| `MEDDLE_REMOTE_TOKEN` | 远程代理认证口令,用户名固定为 `meddle` | 空 |
|
|
286
|
+
| `MEDDLE_INTERCEPT_HTTPS` | 解密并记录全部 HTTPS 流量;远程模式默认开启 | `false` |
|
|
287
|
+
| `MEDDLE_BIND_HOST` | 监听地址;远程模式默认 `0.0.0.0` | `127.0.0.1` |
|
|
288
|
+
|
|
289
|
+
详见 [插件 Pipeline 模式指南](./docs/plugin/PIPELINE_MODE_GUIDE.md)
|
|
290
|
+
|
|
291
|
+
## 开发
|
|
292
|
+
|
|
293
|
+
克隆项目到本地
|
|
294
|
+
### 安装依赖
|
|
295
|
+
`pnpm install`
|
|
296
|
+
|
|
297
|
+
### 启动
|
|
298
|
+
`
|