batch-auto-knowledge-mcp.mjs 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/usr/bin/env node
  2. /**
  3. * Batch auto_knowledge via MCP HTTP — gets runtime defaults from editor
  4. * Requires: editor running with MCP on port 3000
  5. */
  6. import http from 'http';
  7. const MCP_URL = 'http://127.0.0.1:3000/mcp';
  8. const ALL = [
  9. 'cc.Label','cc.Sprite','cc.Button','cc.Widget','cc.Layout',
  10. 'cc.UITransform','cc.RichText','cc.ScrollView','cc.Toggle',
  11. 'cc.ToggleContainer','cc.ProgressBar','cc.Slider','cc.PageView',
  12. 'cc.Mask','cc.Graphics','cc.UIOpacity','cc.SafeArea',
  13. 'cc.BlockInputEvents','cc.LabelOutline','cc.LabelShadow',
  14. 'cc.PageViewIndicator','cc.EditBox',
  15. 'cc.AudioSource','cc.VideoPlayer','cc.WebView',
  16. 'cc.ParticleSystem2D',
  17. 'cc.Camera','cc.Canvas','cc.Animation','cc.SkeletalAnimation',
  18. 'cc.MeshRenderer','cc.SkinnedMeshRenderer',
  19. 'cc.DirectionalLight','cc.PointLight','cc.SpotLight','cc.SphereLight',
  20. 'cc.RigidBody2D','cc.BoxCollider2D','cc.CircleCollider2D','cc.PolygonCollider2D',
  21. 'cc.RigidBody','cc.BoxCollider','cc.SphereCollider','cc.CapsuleCollider','cc.MeshCollider',
  22. 'cc.MotionStreak','cc.Billboard','cc.Line',
  23. 'cc.TiledMap','cc.TiledLayer',
  24. 'cc.HingeJoint2D','cc.DistanceJoint2D','cc.SpringJoint2D',
  25. 'cc.FixedJoint2D','cc.WheelJoint2D','cc.SliderJoint2D',
  26. 'cc.RelativeJoint2D','cc.MouseJoint2D',
  27. 'cc.HingeConstraint','cc.FixedConstraint','cc.PointToPointConstraint',
  28. 'cc.Terrain','cc.LODGroup','cc.ReflectionProbe',
  29. 'sp.Skeleton','dragonBones.ArmatureDisplay',
  30. ];
  31. function callMcp(toolName, args) {
  32. return new Promise((resolve, reject) => {
  33. const body = JSON.stringify({
  34. jsonrpc: '2.0', id: Date.now(), method: 'tools/call',
  35. params: { name: toolName, arguments: args }
  36. });
  37. const req = http.request(MCP_URL, {
  38. method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) },
  39. timeout: 30000,
  40. }, (res) => {
  41. const chunks = [];
  42. res.on('data', c => chunks.push(c));
  43. res.on('end', () => {
  44. try {
  45. const data = JSON.parse(Buffer.concat(chunks).toString());
  46. const content = data.result?.content || [];
  47. const text = content.find(c => c.type === 'text')?.text;
  48. resolve(text ? JSON.parse(text) : {});
  49. } catch (e) { reject(e); }
  50. });
  51. });
  52. req.on('error', reject);
  53. req.on('timeout', () => { req.destroy(); reject(new Error('timeout')); });
  54. req.write(body);
  55. req.end();
  56. });
  57. }
  58. // Check connectivity
  59. try {
  60. await callMcp('cocos_editor', { action: 'project_info' });
  61. } catch {
  62. console.error('❌ Cannot connect to MCP at', MCP_URL);
  63. console.error(' Make sure editor is running and plugin is loaded.');
  64. process.exit(1);
  65. }
  66. console.log(`Connected. Running auto_knowledge(save:true) for ${ALL.length} components...\n`);
  67. let ok = 0, fail = 0, withDefaults = 0;
  68. for (const comp of ALL) {
  69. try {
  70. const r = await callMcp('cocos_devtools', { action: 'auto_knowledge', componentType: comp, save: true });
  71. if (r.success) {
  72. ok++;
  73. const hasRuntime = r.data?.hasRuntimeDefaults;
  74. if (hasRuntime) withDefaults++;
  75. const propCount = Object.keys(r.data?.recommendedKnowledge?.properties || {}).length;
  76. console.log(` ✅ ${comp.padEnd(35)} ${propCount} props ${hasRuntime ? '(+defaults)' : '(dts only)'}`);
  77. } else {
  78. fail++;
  79. console.log(` ❌ ${comp}: ${r.error}`);
  80. }
  81. } catch (e) {
  82. fail++;
  83. console.log(` ❌ ${comp}: ${e.message}`);
  84. }
  85. }
  86. console.log(`\nDone: ${ok} ok, ${fail} fail, ${withDefaults} with runtime defaults`);