ms-vite-plugin 1.5.1 → 1.5.3
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/dist/luaObfuscator/addVararg.js +1 -1
- package/dist/luaObfuscator/flatten.js +1 -1
- package/dist/luaObfuscator/rename.js +1 -1
- package/dist/luaObfuscator/scope.js +1 -1
- package/dist/mcp/runtime-tools.js +11 -8
- package/dist/mcp-server.js +1 -1
- package/dist/usb-forward.d.ts +4 -0
- package/dist/usb-forward.js +1 -0
- package/docs/api/hid.md +2 -2
- package/docs/apicn/global.md +0 -2
- package/docs/apicn/hid.md +2 -2
- package/docs/apilua/hid.md +2 -2
- package/docs/apilua/ui.md +0 -12
- package/docs/apipython/hid.md +2 -2
- package/package.json +5 -1
- package/docs/quick/vscode/createProject.md +0 -77
- package/docs/quick/vscode/packProject.md +0 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.addVararg=
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.addVararg=o;function c(t){t.vararg=!0,s(t.body.body)}function a(t){switch(t.type){case"FuncExpr":c(t);break;case"UnaryExpr":a(t.arg);break;case"BinaryExpr":a(t.left),a(t.right);break;case"TableExpr":for(const e of t.fields)e.kind==="index"&&a(e.key),a(e.value);break;case"IndexExpr":a(t.object),a(t.index);break;case"MemberExpr":a(t.object);break;case"CallExpr":a(t.callee);for(const e of t.args)a(e);break;case"MethodCallExpr":a(t.object);for(const e of t.args)a(e);break;case"ParenExpr":a(t.exp);break;default:break}}function s(t){for(const e of t)switch(e.type){case"DoStat":case"WhileStat":case"RepeatStat":case"ForNumStat":case"ForInStat":if(e.type==="WhileStat"&&a(e.cond),e.type==="RepeatStat"&&a(e.cond),e.type==="ForNumStat"&&(a(e.start),a(e.end),e.step&&a(e.step)),e.type==="ForInStat")for(const r of e.exps)a(r);s(e.body.body);break;case"IfStat":for(const r of e.clauses)a(r.cond),s(r.body.body);e.elseBody&&s(e.elseBody.body);break;case"FuncStat":case"LocalFuncStat":c(e.func);break;case"LocalStat":if(e.exps)for(const r of e.exps)a(r);break;case"AssignStat":for(const r of e.vars)a(r);for(const r of e.exps)a(r);break;case"CallStat":a(e.exp);break;case"ReturnStat":for(const r of e.exps)a(r);break;default:break}}function o(t){s(t.body)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.flattenControlFlow=C;function m(e){return{type:"NumberLiteral",raw:String(e),value:e}}function y(e){return{type:"NameExpr",name:e}}function b(e,t){return{type:"AssignStat",vars:e.map(a=>y(a)),exps:t}}function u(e,t){return b([e.stateName],[typeof t=="number"?m(t):t])}function k(e,t,a){return{type:"BinaryExpr",op:"or",left:{type:"BinaryExpr",op:"and",left:y(e),right:m(t)},right:m(a)}}function E(e,t,a){return{type:"BinaryExpr",op:e,left:t,right:a}}function S(e){const t=`__t${e.nextTemp}`;return e.nextTemp+=1,e.temps.push(t),t}function x(e){const t=e.nextState;return e.nextState+=1,e.states.set(t,[]),t}function r(e,t,a){e.states.get(t).push(a)}function L(e,t){for(const a of e)if(a.type==="LocalStat")for(const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.flattenControlFlow=C;function m(e){return{type:"NumberLiteral",raw:String(e),value:e}}function y(e){return{type:"NameExpr",name:e}}function b(e,t){return{type:"AssignStat",vars:e.map(a=>y(a)),exps:t}}function u(e,t){return b([e.stateName],[typeof t=="number"?m(t):t])}function k(e,t,a){return{type:"BinaryExpr",op:"or",left:{type:"BinaryExpr",op:"and",left:y(e),right:m(t)},right:m(a)}}function E(e,t,a){return{type:"BinaryExpr",op:e,left:t,right:a}}function S(e){const t=`__t${e.nextTemp}`;return e.nextTemp+=1,e.temps.push(t),t}function x(e){const t=e.nextState;return e.nextState+=1,e.states.set(t,[]),t}function r(e,t,a){e.states.get(t).push(a)}function L(e,t){for(const a of e)if(a.type==="LocalStat")for(const o of a.names)t.push(o.name);else if(a.type==="LocalFuncStat")t.push(a.name);else if(a.type==="ForNumStat")t.push(a.name),L(a.body.body,t);else if(a.type==="ForInStat")t.push(...a.names),L(a.body.body,t);else if(a.type==="DoStat"||a.type==="WhileStat"||a.type==="RepeatStat")L(a.body.body,t);else if(a.type==="IfStat"){for(const o of a.clauses)L(o.body.body,t);a.elseBody&&L(a.elseBody.body,t)}}function h(e,t,a,o){if(e.length===0)return t;const p=e.map(()=>x(a));for(let n=0;n<e.length;n+=1){const c=e[n];c.type==="LabelStat"&&a.userLabels.set(c.name,p[n])}for(let n=0;n<e.length;n+=1){const c=n+1<e.length?p[n+1]:t;I(a,p[n],e[n],c,o)}return p[0]}function I(e,t,a,o,p){switch(a.type){case"EmptyStat":case"LabelStat":r(e,t,u(e,o));return;case"AssignStat":case"CallStat":case"FuncStat":r(e,t,a),r(e,t,u(e,o));return;case"LocalStat":a.exps&&a.exps.length>0&&r(e,t,b(a.names.map(n=>n.name),a.exps)),r(e,t,u(e,o));return;case"LocalFuncStat":r(e,t,b([a.name],[a.func])),r(e,t,u(e,o));return;case"ReturnStat":r(e,t,a);return;case"BreakStat":r(e,t,u(e,p));return;case"GotoStat":{const n=e.userLabels.get(a.name);if(n===void 0)throw new Error(`goto \u672A\u5B9A\u4E49\u6807\u7B7E ::${a.name}::`);r(e,t,u(e,n));return}case"DoStat":r(e,t,u(e,h(a.body.body,o,e,p)));return;case"IfStat":{const n=S(e);let c=t;for(let l=0;l<a.clauses.length;l+=1){const f=l===a.clauses.length-1,d=h(a.clauses[l].body.body,o,e,p);let i=o;f?a.elseBody&&(i=h(a.elseBody.body,o,e,p)):i=x(e),r(e,c,b([n],[a.clauses[l].cond])),r(e,c,u(e,k(n,d,i))),f||(c=i)}a.clauses.length===0&&r(e,t,u(e,o));return}case"WhileStat":{const n=S(e),c=h(a.body.body,t,e,o);r(e,t,b([n],[a.cond])),r(e,t,u(e,k(n,c,o)));return}case"RepeatStat":{const n=S(e),c=x(e),l=h(a.body.body,c,e,o);r(e,t,u(e,l)),r(e,c,b([n],[a.cond])),r(e,c,u(e,k(n,o,l)));return}case"ForNumStat":{const n=a.name,c=S(e),l=S(e),f=S(e),d=x(e),i=x(e),F=x(e),g=x(e),N=h(a.body.body,g,e,o);r(e,t,b([n],[a.start])),r(e,t,b([c],[a.end])),r(e,t,b([l],[a.step??m(1)])),r(e,t,u(e,d)),r(e,d,b([f],[E(">=",y(l),m(0))])),r(e,d,u(e,k(f,i,F))),r(e,i,b([f],[E("<=",y(n),y(c))])),r(e,i,u(e,k(f,N,o))),r(e,F,b([f],[E(">=",y(n),y(c))])),r(e,F,u(e,k(f,N,o))),r(e,g,b([n],[E("+",y(n),y(l))])),r(e,g,u(e,d));return}case"ForInStat":{const n=S(e),c=S(e),l=S(e),f=S(e),d=x(e),i=[b([l],[y(a.names[0])]),...a.body.body],F=h(i,d,e,o),g=a.exps.slice();for(;g.length<3;)g.push({type:"NilLiteral"});r(e,t,b([n,c,l],g.slice(0,3))),r(e,t,u(e,d)),r(e,d,{type:"AssignStat",vars:a.names.map(N=>y(N)),exps:[{type:"CallExpr",callee:y(n),args:[y(c),y(l)]}]}),r(e,d,b([f],[E("~=",y(a.names[0]),{type:"NilLiteral"})])),r(e,d,u(e,k(f,F,o)));return}default:r(e,t,u(e,o))}}function v(e,t){const a=e.slice();let o=t>>>0||1;for(let p=a.length-1;p>0;p-=1){o=Math.imul(o,1664525)+1013904223>>>0;const n=o%(p+1),c=a[p];a[p]=a[n],a[n]=c}return a}function w(e,t){if(e.length===0)return e;const a={states:new Map,temps:[],nextState:1,nextTemp:1,stateName:"__s",userLabels:new Map},o=[];L(e,o);const p=h(e,0,a,0),n=[...new Set([...o,...a.temps,a.stateName])],c=v([...a.states.keys()],t).map(l=>({cond:E("==",y(a.stateName),m(l)),body:{type:"Block",body:a.states.get(l)}}));return[{type:"LocalStat",names:n.map(l=>({name:l}))},b([a.stateName],[m(p)]),{type:"WhileStat",cond:E("~=",y(a.stateName),m(0)),body:{type:"Block",body:[{type:"IfStat",clauses:c}]}}]}function s(e,t){switch(e.type){case"FuncExpr":B(e.body.body,t),e.body.body=w(e.body.body,t);break;case"UnaryExpr":s(e.arg,t);break;case"BinaryExpr":s(e.left,t),s(e.right,t);break;case"TableExpr":for(const a of e.fields)a.kind==="index"&&s(a.key,t),s(a.value,t);break;case"IndexExpr":s(e.object,t),s(e.index,t);break;case"MemberExpr":s(e.object,t);break;case"CallExpr":s(e.callee,t);for(const a of e.args)s(a,t);break;case"MethodCallExpr":s(e.object,t);for(const a of e.args)s(a,t);break;case"ParenExpr":s(e.exp,t);break;default:break}}function B(e,t){for(const a of e)switch(a.type){case"DoStat":case"WhileStat":case"RepeatStat":case"ForNumStat":case"ForInStat":if((a.type==="WhileStat"||a.type==="RepeatStat")&&s(a.cond,t),a.type==="ForNumStat"&&(s(a.start,t),s(a.end,t),a.step&&s(a.step,t)),a.type==="ForInStat")for(const o of a.exps)s(o,t);B(a.body.body,t);break;case"IfStat":for(const o of a.clauses)s(o.cond,t),B(o.body.body,t);a.elseBody&&B(a.elseBody.body,t);break;case"FuncStat":case"LocalFuncStat":B(a.func.body.body,t),a.func.body.body=w(a.func.body.body,t);break;case"LocalStat":if(a.exps)for(const o of a.exps)s(o,t);break;case"AssignStat":for(const o of a.vars)s(o,t);for(const o of a.exps)s(o,t);break;case"CallStat":s(a.exp,t);break;case"ReturnStat":for(const o of a.exps)s(o,t);break;default:break}}function C(e,t){B(e.body,t),e.body=w(e.body,t)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shortName=o,exports.renameLocals=c;const u=require("./reserved"),d=require("./scope"),l="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function o(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shortName=o,exports.renameLocals=c;const u=require("./reserved"),d=require("./scope"),l="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function o(r){let e=r,t="";do t=l[e%l.length]+t,e=Math.floor(e/l.length)-1;while(e>=0);return u.luaKeywords.has(t)?`_${t}`:t}function c(r){let e=0;const t=new Set;(0,d.collectAndRename)(r,(a,s)=>{if(a.newName!==a.original)return;let n=o(e);for(e+=1;s.has(n)||t.has(n)||u.luaKeywords.has(n);)n=o(e),e+=1;a.newName=n,t.add(n),s.add(n)})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveLocal=i,exports.collectAndRename=x;function i(e,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveLocal=i,exports.collectAndRename=x;function i(e,o){let n=e;for(;n;){const a=n.locals.get(o);if(a)return a;n=n.parent}}function s(e){return{parent:e,locals:new Map}}function f(e,o){const n=e.locals.get(o);if(n)return n;const a={original:o,newName:o};return e.locals.set(o,a),a}function x(e,o){const n=new Set,a={locals:new Map};d(e.body,a,n,o)}function u(e,o,n,a){d(e.body,o,n,a)}function d(e,o,n,a){for(const c of e)b(c,o,n,a)}function m(e,o,n,a){const c=s(o),r=e.params.slice();for(let l=0;l<r.length;l+=1){const p=f(c,r[l]);a(p,n),e.params[l]=p.newName}u(e.body,c,n,a)}function b(e,o,n,a){switch(e.type){case"EmptyStat":case"BreakStat":case"GotoStat":case"LabelStat":return;case"DoStat":u(e.body,s(o),n,a);return;case"WhileStat":t(e.cond,o,n,a),u(e.body,s(o),n,a);return;case"RepeatStat":{const c=s(o);u(e.body,c,n,a),t(e.cond,c,n,a);return}case"IfStat":for(const c of e.clauses)t(c.cond,o,n,a),u(c.body,s(o),n,a);e.elseBody&&u(e.elseBody,s(o),n,a);return;case"ForNumStat":{t(e.start,o,n,a),t(e.end,o,n,a),e.step&&t(e.step,o,n,a);const c=s(o),r=f(c,e.name);a(r,n),e.name=r.newName,u(e.body,c,n,a);return}case"ForInStat":{for(const r of e.exps)t(r,o,n,a);const c=s(o);for(let r=0;r<e.names.length;r+=1){const l=f(c,e.names[r]);a(l,n),e.names[r]=l.newName}u(e.body,c,n,a);return}case"FuncStat":{const c=i(o,e.name.base);c&&(e.name.base=c.newName),m(e.func,o,n,a);return}case"LocalFuncStat":{const c=f(o,e.name);a(c,n),e.name=c.newName,m(e.func,o,n,a);return}case"LocalStat":if(e.exps)for(const c of e.exps)t(c,o,n,a);for(let c=0;c<e.names.length;c+=1){const r=f(o,e.names[c].name);a(r,n),e.names[c].name=r.newName}return;case"AssignStat":for(const c of e.vars)t(c,o,n,a);for(const c of e.exps)t(c,o,n,a);return;case"CallStat":t(e.exp,o,n,a);return;case"ReturnStat":for(const c of e.exps)t(c,o,n,a);return}}function t(e,o,n,a){switch(e.type){case"NilLiteral":case"BoolLiteral":case"NumberLiteral":case"StringLiteral":case"VarargExpr":return;case"NameExpr":{const c=i(o,e.name);c&&(e.name=c.newName);return}case"UnaryExpr":t(e.arg,o,n,a);return;case"BinaryExpr":t(e.left,o,n,a),t(e.right,o,n,a);return;case"FuncExpr":m(e,o,n,a);return;case"TableExpr":for(const c of e.fields)c.kind==="index"&&t(c.key,o,n,a),t(c.value,o,n,a);return;case"IndexExpr":t(e.object,o,n,a),t(e.index,o,n,a);return;case"MemberExpr":t(e.object,o,n,a);return;case"CallExpr":t(e.callee,o,n,a);for(const c of e.args)t(c,o,n,a);return;case"MethodCallExpr":t(e.object,o,n,a);for(const c of e.args)t(c,o,n,a);return;case"ParenExpr":t(e.exp,o,n,a);return}}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var $=exports&&exports.__createBinding||(Object.create?(function(t,r,s,o){o===void 0&&(o=s);var c=Object.getOwnPropertyDescriptor(r,s);(!c||("get"in c?!r.__esModule:c.writable||c.configurable))&&(c={enumerable:!0,get:function(){return r[s]}}),Object.defineProperty(t,o,c)}):(function(t,r,s,o){o===void 0&&(o=s),t[o]=r[s]})),R=exports&&exports.__setModuleDefault||(Object.create?(function(t,r){Object.defineProperty(t,"default",{enumerable:!0,value:r})}):function(t,r){t.default=r}),w=exports&&exports.__importStar||(function(){var t=function(r){return t=Object.getOwnPropertyNames||function(s){var o=[];for(var c in s)Object.prototype.hasOwnProperty.call(s,c)&&(o[o.length]=c);return o},t(r)};return function(r){if(r&&r.__esModule)return r;var s={};if(r!=null)for(var o=t(r),c=0;c<o.length;c++)o[c]!=="default"&&$(s,r,o[c]);return R(s,r),s}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.registerRuntimeTools=O;const b=w(require("fs-extra")),v=w(require("os")),T=w(require("path")),u=w(require("zod/v4")),P=require("../packager"),m=require("../project"),h=require("./device-config"),D=require("./device-log"),y=require("./project"),i=require("./tool-utils"),_=require("../usb-forward");function S(t,r,s){return t&&t.trim()?T.resolve(t.trim()):T.join(v.tmpdir(),`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.${s}`)}function O(t){let r;function s(e){if(e&&e.trim())return r=T.resolve(e.trim()),r;if(r)return r;throw new Error("\u672A\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u8BF7\u5148\u8C03\u7528 set_workspace\uFF0C\u6216\u5728\u672C\u6B21\u5DE5\u5177\u8C03\u7528\u65F6\u4F20 workspacePath\u3002")}async function o(e){const n=s(e);return await(0,y.ensureValidKuaiJSProject)(n),n}t.registerTool("set_workspace",{title:"Set Workspace",description:"\u8BBE\u7F6E\u5F53\u524D MCP \u8FDB\u7A0B\u5185\u7684\u9ED8\u8BA4\u5DE5\u4F5C\u76EE\u5F55\u3002\u540E\u7EED build/run/package \u4F18\u5148\u4F7F\u7528\u8BE5\u76EE\u5F55\u3002",inputSchema:{workspacePath:u.string().min(1).describe("\u5FEB\u70B9JS \u9879\u76EE\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u9700\u5305\u542B package.json \u4E0E scripts\uFF09")}},async({workspacePath:e})=>{const n=await o(e);return(0,i.createTextToolResult)(`\u9ED8\u8BA4\u5DE5\u4F5C\u76EE\u5F55\u5DF2\u8BBE\u7F6E\u4E3A: ${n}`)}),t.registerTool("get_workspace",{title:"Get Workspace",description:"\u67E5\u770B\u5F53\u524D MCP \u8FDB\u7A0B\u5185\u8BB0\u5FC6\u7684\u5DE5\u4F5C\u76EE\u5F55\u3002",inputSchema:{}},async()=>r?(0,i.createTextToolResult)(`\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55: ${r}`):(0,i.createTextToolResult)("\u5F53\u524D\u672A\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u8BF7\u5148\u8C03\u7528 set_workspace\u3002"));function c(e){return e.length===0?"\u5F53\u524D\u65E0 USB \u8BBE\u5907":e.map((n,a)=>`[${a+1}] ${n.name} udid=${n.udid} ${n.ip}:${n.port}`).join(`
|
|
2
|
+
`)}t.registerTool("list_usb_devices",{title:"List USB Devices",description:"\u5217\u51FA\u5F53\u524D USB \u8F6C\u53D1\u8BBE\u5907\u3002",inputSchema:{}},async()=>{const e=(0,_.getSharedUsbDevices)();return(0,i.createTextToolResult)(`USB \u8BBE\u5907 (${e.length}):
|
|
3
|
+
${c(e)}`)}),t.registerTool("set_device",{title:"Set Device",description:"\u8BBE\u7F6E\u9ED8\u8BA4\u8BBE\u5907\u3002\u7F51\u7EDC\u8BBE\u5907\u4F20 ip/port\uFF0CUSB \u8BBE\u5907\u4F20 udid\u3002",inputSchema:{ip:u.string().min(1).optional().describe("\u8BBE\u5907 IP\uFF0C\u4F8B\u5982 192.168.1.100"),port:u.number().int().min(1).max(65535).optional().describe("\u8BBE\u5907\u7AEF\u53E3\uFF0C\u9ED8\u8BA4 9800"),udid:u.string().min(1).optional().describe("USB \u8BBE\u5907 UDID")}},async({ip:e,port:n,udid:a})=>{if(a?.trim()){const p=a.trim(),l=(0,_.getSharedUsbDevices)().find(f=>f.udid===p);if(!l)throw new Error(`\u672A\u627E\u5230 USB \u8BBE\u5907 udid=${p}
|
|
4
|
+
${c((0,_.getSharedUsbDevices)())}`);const d=await(0,h.setDeviceConfig)(l.ip,l.port);return(0,i.createTextToolResult)(`\u9ED8\u8BA4\u8BBE\u5907\u5DF2\u8BBE\u7F6E\u4E3A USB ${l.name} (${d.ip}:${d.port})`)}if(!e?.trim())throw new Error("\u8BF7\u63D0\u4F9B ip\uFF0C\u6216\u63D0\u4F9B USB udid\u3002");const g=await(0,h.setDeviceConfig)(e,n);return(0,i.createTextToolResult)(`\u9ED8\u8BA4\u8BBE\u5907\u5DF2\u8BBE\u7F6E\u4E3A ${g.ip}:${g.port}`)}),t.registerTool("get_device",{title:"Get Device",description:"\u67E5\u770B\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u914D\u7F6E\u3002",inputSchema:{}},async()=>{const e=await(0,h.readDeviceConfig)();return e?(0,i.createTextToolResult)(`\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907: ${e.ip}:${e.port}`):(0,i.createTextToolResult)("\u5F53\u524D\u672A\u8BBE\u7F6E\u9ED8\u8BA4\u8BBE\u5907\uFF0C\u8BF7\u5148\u8C03\u7528 set_device\u3002")}),t.registerTool("take_screenshot",{title:"Take Screenshot",description:"\u83B7\u53D6\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u622A\u56FE\u3002\u53EF\u8FD4\u56DE base64\uFF0C\u6216\u843D\u5730\u5230\u6587\u4EF6\u540E\u8FD4\u56DE\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\uFF09\u3002",inputSchema:{format:u.enum(["file","base64"]).optional().default("file").describe("\u622A\u56FE\u8FD4\u56DE\u683C\u5F0F\uFF1Afile=\u6587\u4EF6\u8DEF\u5F84\uFF0Cbase64=\u56FE\u7247 base64"),outputPath:u.string().min(1).optional().describe("\u5F53 format=file \u65F6\u53EF\u6307\u5B9A\u8F93\u51FA\u8DEF\u5F84\uFF0C\u4E0D\u4F20\u5219\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55")}},async({format:e,outputPath:n})=>{const a=await(0,i.resolveRuntimeHttpTarget)(),g=(0,i.createRuntimeHttpRequestOptions)(a);if(e==="base64"){const d=await(0,m.getScreenshotBase64OnDevice)(g);return(0,i.createTextToolResult)(`\u622A\u56FE\u6210\u529F: ${a.label}
|
|
2
5
|
format: base64
|
|
3
|
-
${
|
|
6
|
+
${d}`)}const p=await(0,m.getScreenshotOnDevice)(g),l=S(n,"ms-mcp-screenshot","jpg");return await b.ensureDir(T.dirname(l)),await b.writeFile(l,p),(0,i.createTextToolResult)(`\u622A\u56FE\u6210\u529F: ${a.label}
|
|
4
7
|
format: file
|
|
5
|
-
path: ${
|
|
6
|
-
size: ${
|
|
8
|
+
path: ${l}
|
|
9
|
+
size: ${p.length} bytes`)}),t.registerTool("get_node_source",{title:"Get Node Source",description:"\u83B7\u53D6\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u9875\u9762\u8282\u70B9 XML\uFF0C\u5199\u5165\u6587\u4EF6\u540E\u8FD4\u56DE\u8DEF\u5F84\uFF0C\u907F\u514D\u957F\u6587\u672C\u54CD\u5E94\u88AB\u622A\u65AD\u3002",inputSchema:{maxDepth:u.number().int().min(1).max(200).optional().default(50).describe("\u8282\u70B9\u6811\u6700\u5927\u6DF1\u5EA6\uFF0C\u9ED8\u8BA4 50"),timeout:u.number().int().min(1).max(600).optional().default(120).describe("\u8BBE\u5907\u7AEF\u8282\u70B9\u6293\u53D6\u8D85\u65F6\u79D2\u6570\uFF0C\u9ED8\u8BA4 120"),mode:u.number().int().min(1).max(3).optional().default(1).describe("\u8282\u70B9\u6293\u53D6\u6A21\u5F0F\uFF1A1\u30012\u30013\uFF0C\u9ED8\u8BA4 1"),outputPath:u.string().min(1).optional().describe("\u53EF\u9009\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF0C\u4E0D\u4F20\u5219\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55")}},async({maxDepth:e,timeout:n,mode:a,outputPath:g})=>{const p=await(0,i.resolveRuntimeHttpTarget)(),l=(0,i.createRuntimeHttpRequestOptions)(p),d=await(0,m.getSourceOnDevice)(l,e,n,a),f=S(g,"ms-mcp-node-source","xml");return await b.ensureDir(T.dirname(f)),await b.writeFile(f,d,"utf8"),(0,i.createTextToolResult)(`\u8282\u70B9\u83B7\u53D6\u6210\u529F: ${p.label}
|
|
7
10
|
maxDepth: ${e}
|
|
8
|
-
timeout: ${
|
|
9
|
-
mode: ${
|
|
10
|
-
path: ${
|
|
11
|
-
size: ${Buffer.byteLength(
|
|
11
|
+
timeout: ${n}
|
|
12
|
+
mode: ${a}
|
|
13
|
+
path: ${f}
|
|
14
|
+
size: ${Buffer.byteLength(d,"utf8")} bytes`)}),t.registerTool("get_logs",{title:"Get Device Logs",description:"\u83B7\u53D6\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u7684\u6700\u65B0\u65E5\u5FD7\u884C\u3002",inputSchema:{limit:u.number().int().min(1).max(5e3).optional().default(200).describe("\u8FD4\u56DE\u6700\u8FD1\u65E5\u5FD7\u6761\u6570\uFF0C\u9ED8\u8BA4 200\uFF0C\u6700\u5927 5000")}},async({limit:e})=>{const n=await(0,i.resolveRuntimeHttpTarget)();return(0,i.createTextToolResult)(await(0,D.buildDeviceLogSnapshotText)(n,e))}),t.registerTool("package_project",{title:"Package Project",description:"\u6267\u884C\u751F\u4EA7\u6784\u5EFA\u5E76\u52A0\u5BC6\uFF0C\u8FD4\u56DE enc.msbundle \u8DEF\u5F84\u3002",inputSchema:{workspacePath:u.string().min(1).optional().describe("\u53EF\u9009\u5DE5\u4F5C\u76EE\u5F55\uFF1B\u4E0D\u4F20\u65F6\u4F7F\u7528 set_workspace \u8BB0\u5FC6\u503C")}},async({workspacePath:e})=>{const n=await o(e),a=await(0,P.packageProject)(n);return(0,i.createTextToolResult)(`\u6253\u5305\u5B8C\u6210: ${a}`)}),t.registerTool("run_project",{title:"Run Project",description:"\u6784\u5EFA\u5E76\u540C\u6B65\u5230\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u540E\u8FD0\u884C\u9879\u76EE\uFF0C\u4EC5\u4F7F\u7528 HTTP \u8BBE\u5907\u8FDE\u63A5\u3002",inputSchema:{workspacePath:u.string().min(1).optional().describe("\u53EF\u9009\u5DE5\u4F5C\u76EE\u5F55\uFF1B\u4E0D\u4F20\u65F6\u4F7F\u7528 set_workspace \u8BB0\u5FC6\u503C")}},async({workspacePath:e})=>{const n=await o(e),a=await(0,i.resolveRuntimeHttpTarget)();return await(0,m.runOnDevice)({...(0,i.createRuntimeHttpRequestOptions)(a),workspacePath:n}),(0,i.createTextToolResult)(`\u8FD0\u884C\u8BF7\u6C42\u5DF2\u53D1\u9001\u5230 ${a.label}`)}),t.registerTool("run_ui_project",{title:"Run UI Project",description:"\u6784\u5EFA\u5E76\u540C\u6B65\u5230\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u540E\u9884\u89C8 UI\uFF0C\u4EC5\u4F7F\u7528 HTTP \u8BBE\u5907\u8FDE\u63A5\u3002",inputSchema:{workspacePath:u.string().min(1).optional().describe("\u53EF\u9009\u5DE5\u4F5C\u76EE\u5F55\uFF1B\u4E0D\u4F20\u65F6\u4F7F\u7528 set_workspace \u8BB0\u5FC6\u503C")}},async({workspacePath:e})=>{const n=await o(e),a=await(0,i.resolveRuntimeHttpTarget)();return await(0,m.runUIOnDevice)({...(0,i.createRuntimeHttpRequestOptions)(a),workspacePath:n}),(0,i.createTextToolResult)(`UI \u9884\u89C8\u8BF7\u6C42\u5DF2\u53D1\u9001\u5230 ${a.label}`)}),t.registerTool("stop_project",{title:"Stop Project",description:"\u505C\u6B62\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u4E0A\u7684\u9879\u76EE\uFF0C\u4EC5\u4F7F\u7528 HTTP \u8BBE\u5907\u8FDE\u63A5\u3002",inputSchema:{}},async()=>{const e=await(0,i.resolveRuntimeHttpTarget)();return await(0,m.stopOnDevice)((0,i.createRuntimeHttpRequestOptions)(e)),(0,i.createTextToolResult)(`\u505C\u6B62\u8BF7\u6C42\u5DF2\u53D1\u9001\u5230 ${e.label}`)})}
|
package/dist/mcp-server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var o=exports&&exports.__createBinding||(Object.create?(function(
|
|
2
|
+
"use strict";var o=exports&&exports.__createBinding||(Object.create?(function(r,e,n,t){t===void 0&&(t=n);var c=Object.getOwnPropertyDescriptor(e,n);(!c||("get"in c?!e.__esModule:c.writable||c.configurable))&&(c={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,c)}):(function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]})),s=exports&&exports.__setModuleDefault||(Object.create?(function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}):function(r,e){r.default=e}),u=exports&&exports.__importStar||(function(){var r=function(e){return r=Object.getOwnPropertyNames||function(n){var t=[];for(var c in n)Object.prototype.hasOwnProperty.call(n,c)&&(t[t.length]=c);return t},r(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t=r(e),c=0;c<t.length;c++)t[c]!=="default"&&o(n,e,t[c]);return s(n,e),n}})();Object.defineProperty(exports,"__esModule",{value:!0});const i=u(require("fs-extra")),f=require("@modelcontextprotocol/sdk/server/stdio.js"),l=require("./mcp/tools"),a=require("./mcp/device-config"),_=require("./usb-forward");async function d(){const r=(0,l.createMcpServer)(),e=new f.StdioServerTransport,n=async()=>{try{await i.remove(a.DEVICE_CONFIG_FILE)}catch{}};process.once("SIGINT",()=>{n().catch(()=>{}).finally(()=>process.exit(0))}),process.once("SIGTERM",()=>{n().catch(()=>{}).finally(()=>process.exit(0))}),process.once("exit",()=>{try{i.removeSync(a.DEVICE_CONFIG_FILE)}catch{}});try{await(0,_.attachUsbForward)()}catch(t){const c=t instanceof Error?t.message:String(t);console.error(`USB \u8F6C\u53D1\u63A5\u5165\u5931\u8D25: ${c}`)}await r.connect(e)}d().catch(r=>{const e=r instanceof Error?r.message:String(r);console.error(`MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25: ${e}`),process.exit(1)});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type UsbForwardDevice } from "kuaijs-forward-service/daemon.js";
|
|
2
|
+
export type UsbDevice = UsbForwardDevice;
|
|
3
|
+
export declare function attachUsbForward(onChange?: (devices: UsbDevice[]) => void): Promise<void>;
|
|
4
|
+
export declare function getSharedUsbDevices(): UsbDevice[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.attachUsbForward=a,exports.getSharedUsbDevices=n;const s=require("kuaijs-forward-service/daemon.js");let r=[];function a(t){return(0,s.openClient)(e=>{r=e,t?.(e)},{name:"ms"}).ready}function n(){return r}
|
package/docs/api/hid.md
CHANGED
|
@@ -189,7 +189,7 @@ logi(version);
|
|
|
189
189
|
|
|
190
190
|
### resetPosition - 复位坐标
|
|
191
191
|
|
|
192
|
-
|
|
192
|
+
将鼠标坐标复位到左下角(仅相对鼠标模式需要)。
|
|
193
193
|
|
|
194
194
|
```typescript
|
|
195
195
|
function resetPosition(): boolean;
|
|
@@ -203,7 +203,7 @@ function resetPosition(): boolean;
|
|
|
203
203
|
**示例:**
|
|
204
204
|
|
|
205
205
|
```javascript
|
|
206
|
-
//
|
|
206
|
+
// 复位坐标到左下角
|
|
207
207
|
const ok = hid.resetPosition();
|
|
208
208
|
logi(ok); // 输出: true 或 false
|
|
209
209
|
```
|
package/docs/apicn/global.md
CHANGED
package/docs/apicn/hid.md
CHANGED
|
@@ -189,7 +189,7 @@ $打印信息日志(version);
|
|
|
189
189
|
|
|
190
190
|
### 复位坐标
|
|
191
191
|
|
|
192
|
-
|
|
192
|
+
将鼠标坐标复位到左下角(仅相对鼠标模式需要)。
|
|
193
193
|
|
|
194
194
|
```typescript
|
|
195
195
|
function 复位坐标(): 布尔值;
|
|
@@ -203,7 +203,7 @@ function 复位坐标(): 布尔值;
|
|
|
203
203
|
**示例:**
|
|
204
204
|
|
|
205
205
|
```javascript
|
|
206
|
-
//
|
|
206
|
+
// 复位坐标到左下角
|
|
207
207
|
const 是否成功 = $HID.复位坐标();
|
|
208
208
|
$打印信息日志(是否成功); // 输出: true 或 false
|
|
209
209
|
```
|
package/docs/apilua/hid.md
CHANGED
|
@@ -160,7 +160,7 @@ print(hid.getDeviceVersion())
|
|
|
160
160
|
|
|
161
161
|
### resetPosition - 复位坐标
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
将鼠标坐标复位到左下角(仅相对鼠标模式需要)。
|
|
164
164
|
|
|
165
165
|
```lua
|
|
166
166
|
---@return boolean
|
|
@@ -175,7 +175,7 @@ function resetPosition() end
|
|
|
175
175
|
**示例:**
|
|
176
176
|
|
|
177
177
|
```lua
|
|
178
|
-
--
|
|
178
|
+
-- 复位坐标到左下角
|
|
179
179
|
local ok = hid.resetPosition()
|
|
180
180
|
print(ok) -- 输出: true 或 false
|
|
181
181
|
```
|
package/docs/apilua/ui.md
CHANGED
package/docs/apipython/hid.md
CHANGED
|
@@ -193,7 +193,7 @@ print(version)
|
|
|
193
193
|
|
|
194
194
|
### resetPosition - 复位坐标
|
|
195
195
|
|
|
196
|
-
|
|
196
|
+
将鼠标坐标复位到左下角(仅相对鼠标模式需要)。
|
|
197
197
|
|
|
198
198
|
```python
|
|
199
199
|
def resetPosition() -> bool:
|
|
@@ -208,7 +208,7 @@ def resetPosition() -> bool:
|
|
|
208
208
|
|
|
209
209
|
```python
|
|
210
210
|
from kuaijs import hid
|
|
211
|
-
#
|
|
211
|
+
# 复位坐标到左下角
|
|
212
212
|
ok = hid.resetPosition()
|
|
213
213
|
print(ok) # 输出: True 或 False
|
|
214
214
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ms-vite-plugin",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.3",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -17,7 +17,10 @@
|
|
|
17
17
|
"ms-mcp": "dist/mcp-server.js"
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
|
+
"sync-docs": "node scripts/sync-docs.js",
|
|
20
21
|
"build": "tsc && node scripts/minify-dist.js",
|
|
22
|
+
"prepack": "npm run sync-docs",
|
|
23
|
+
"postpack": "node scripts/sync-docs.js --clean",
|
|
21
24
|
"prepublishOnly": "npm run build"
|
|
22
25
|
},
|
|
23
26
|
"dependencies": {
|
|
@@ -29,6 +32,7 @@
|
|
|
29
32
|
"crc": "^4.3.2",
|
|
30
33
|
"fs-extra": "^11.3.5",
|
|
31
34
|
"jpeg-js": "^0.4.4",
|
|
35
|
+
"kuaijs-forward-service": "^0.1.1",
|
|
32
36
|
"magic-string": "^0.30.21",
|
|
33
37
|
"pngjs": "^7.0.0",
|
|
34
38
|
"uuid": "^14.0.0",
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# 创建项目
|
|
2
|
-
|
|
3
|
-
**前置条件**
|
|
4
|
-
|
|
5
|
-
- 已安装 Visual Studio Code 和 快点 JS 开发工具插件
|
|
6
|
-
- 快点 JS 开发工具插件需要登录`快点JS 开发者账号`,才能创建项目,请点击顶部菜单`开发者后台`注册账号
|
|
7
|
-
- 快点 JS APP 需要从`快点JS APP` 上<span style="color: red;">注册账号</span>,注册完成后,需要登录`快点JS APP`,才能使用
|
|
8
|
-
|
|
9
|
-
## 创建项目
|
|
10
|
-
|
|
11
|
-
- 快点 JS 使用 `javascript`/`python`/`lua` 编写脚本,入口文件为 `main.js` 或 `main.py` 或 `main.lua`
|
|
12
|
-
|
|
13
|
-
- 在创建`快点JS`项目之前,请确保你拥有 js 基础,了解 js 的语法,才能正常使用`快点JS`
|
|
14
|
-
- 可以查找`快点JS`的文档,了解`快点JS`的语法,如[点此进入 JS 基础教程](../js-tutorial/introduction.md)
|
|
15
|
-
- 点击`创建快点JS项目`,如没有安装`快点JS开发工具插件`,是不会有这个按钮的
|
|
16
|
-
- 选择一个文件目录,输入项目名称,回车创建项目
|
|
17
|
-
- 快点 JS-JS 引擎使用 `ES6` 语法,支持 import 别的 js 文件
|
|
18
|
-
- 快点 JS-Python 引擎使用 `Python3.14`, 打包需要安装 `Python3.14`
|
|
19
|
-
- 快点 JS-Lua 引擎入口为 `scripts/main.lua`,宿主模块是内置全局表(如 `device`),不要 `require`;全局函数如 `Sleep` 可直接调用
|
|
20
|
-
- 项目创建完成后,会自动打开项目,项目结构如下:
|
|
21
|
-
|
|
22
|
-
### 项目结构
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
项目名称/
|
|
26
|
-
├─ scripts/ ← 脚本存放目录
|
|
27
|
-
│ └─ main.js ← JS引擎程序入口(文件名不可改变,仅js项目)
|
|
28
|
-
| └─ main.py ← Python程序入口(文件名不可改变,仅python项目)
|
|
29
|
-
| └─ main.lua ← Lua程序入口(文件名不可改变,仅lua项目)
|
|
30
|
-
├─ res/ ← 资源存放目录
|
|
31
|
-
├─ ui/ ← UI 界面存放目录
|
|
32
|
-
│ ├─ fonts/
|
|
33
|
-
│ ├─ htmljs/
|
|
34
|
-
│ └─ index.html
|
|
35
|
-
├─ .gitignore ← Git 忽略文件
|
|
36
|
-
├─ .npmrc ← npm 配置文件
|
|
37
|
-
├─ .prettierignore ← 代码格式化忽略文件(仅js项目)
|
|
38
|
-
├─ .prettierrc.yaml ← 代码格式化配置(需安装 Prettier 插件,仅js项目)
|
|
39
|
-
├─ obfuscator.json ← 代码混淆配置(JS:javascript-obfuscator;Lua:Prometheus + 单文件合并,可开关和选档位)
|
|
40
|
-
├─ package.json ← 项目依赖配置文件
|
|
41
|
-
└─ tsconfig.json ← TypeScript 配置文件(用于js提示和网页提示)
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### 创建项目
|
|
45
|
-
|
|
46
|
-
<img src="/img/Project/createProject.jpg" width="800" alt="创建项目">
|
|
47
|
-
|
|
48
|
-
### 项目类型
|
|
49
|
-
|
|
50
|
-
<img src="/img/Project/项目类型.jpg" width="800" alt="创建项目">
|
|
51
|
-
|
|
52
|
-
## 运行项目
|
|
53
|
-
|
|
54
|
-
**使用说明**
|
|
55
|
-
|
|
56
|
-
- 点击运行项目,会执行编译同步到设备上运行,同时运行会变成停止按钮
|
|
57
|
-
- 点击停止项目,会停止设备上运行的项目,如果项目没有写死循环,会自动退出
|
|
58
|
-
- 点击运行 UI,设备会打开项目的 UI 界面,打开配置的 html
|
|
59
|
-
- 点击图色按钮,会打开图色工具
|
|
60
|
-
- 点击节点查找按钮,会打开节点查找工具
|
|
61
|
-
- 点击实时画面,会打开手机实时画面
|
|
62
|
-
- 点击打包,会打包项目为msbundle脚本包,打包完成后,会在项目目录下生成msbundle文件
|
|
63
|
-
|
|
64
|
-
**注意事项**
|
|
65
|
-
|
|
66
|
-
- 当你的 VisualStudioCode 安装其他的插件时,编辑器右侧顶部工具栏,可能图标不显示,因为被其他插件占用了
|
|
67
|
-
- 你可以通过编辑器右键菜单->`快点JS`->的下级菜单,来使用所有功能
|
|
68
|
-
|
|
69
|
-
<img src="/img/Project/devloper.png" width="800" alt="运行项目">
|
|
70
|
-
|
|
71
|
-
## 常见问题
|
|
72
|
-
|
|
73
|
-
### 无法显示`debug`或`warn`级别的日志
|
|
74
|
-
|
|
75
|
-
- VisualStudioCode 日志控制台默认是信息也就是 INFO 请设置为跟踪,并点击设置为默认值,否则可能看不到 `debug` 或 `warn` 级别的日志
|
|
76
|
-
|
|
77
|
-
<img src="/img/Project/log.png" width="800" alt="日志控制台">
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# 打包脚本包
|
|
2
|
-
|
|
3
|
-
**前置条件**
|
|
4
|
-
|
|
5
|
-
- 需要在项目配置 `AppId` 字段
|
|
6
|
-
- `AppId` 从开发者后台->网络验证管理->软件列表 中获取
|
|
7
|
-
|
|
8
|
-
**操作步骤**
|
|
9
|
-
|
|
10
|
-
- 打开主脚本 `main.js | main.py | main.lua`,右键编辑器,选择 `快点JS` -> `打包应用`
|
|
11
|
-
- 输入在开发者后台->网络验证管理->软件列表 中获取的 `AppId` 字段
|
|
12
|
-
- JS / Lua 项目可编辑根目录 `obfuscator.json` 决定打包行为;Python 打包编译为 `.pyc`,没有该配置
|
|
13
|
-
- JS:Vite 把入口打成单文件后再按 `enabled` 混淆
|
|
14
|
-
- Lua:Release 默认把 `scripts` 下用户模块合并为单个 `scripts/main.lua`(`bundle`,缺省 `true`),再按 `enabled` / `preset` 用 Prometheus 混淆该文件。`enabled: false` 时仍可合并。宿主全局模块(如 `device`)不受影响。不要用 `dofile` / `loadfile` 去读会被删掉的其它 `.lua`
|
|
15
|
-
- 注意:上传到快点JS热更新服务后,可通过开发者后台->网络验证管理->软件列表的软件编号进行分发
|
|
16
|
-
- 注意:快点JS上可通过软件面板,输入软件编号进行搜索加载应用
|
|
17
|
-
|
|
18
|
-
<img src="/img/PackProject/打包菜单.png" width="800" alt="打包菜单">
|
|
19
|
-
|
|
20
|
-
<img src="/img/PackProject/packageIPA.png" width="800" alt="打包IPA">
|