@lovrabet/rabetbase-cli 2.0.2-beta.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.
Files changed (163) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +605 -0
  3. package/lib/ai-setup/config.js +1 -0
  4. package/lib/api/api-doc-ui.js +1 -0
  5. package/lib/api/api-doc.js +1 -0
  6. package/lib/api/api-pull-ui.js +1 -0
  7. package/lib/api/fetch-model-list.js +1 -0
  8. package/lib/api/generate-api-file.js +1 -0
  9. package/lib/api/main.js +1 -0
  10. package/lib/api/pull-silent.js +1 -0
  11. package/lib/app-menu/app-menu-sync-ui.js +1 -0
  12. package/lib/app-menu/create-menu.js +1 -0
  13. package/lib/app-menu/get-local-pages.js +1 -0
  14. package/lib/app-menu/get-online-menu-list.js +1 -0
  15. package/lib/app-menu/types.js +1 -0
  16. package/lib/app-menu/use-get-online-menu-list.js +1 -0
  17. package/lib/app-menu/utils.js +1 -0
  18. package/lib/app-menu/valid-url.js +1 -0
  19. package/lib/app-menu-update-cdn/current-content.js +1 -0
  20. package/lib/app-menu-update-cdn/input-cdn-asset.js +1 -0
  21. package/lib/app-menu-update-cdn/main.js +1 -0
  22. package/lib/app-menu-update-cdn/types.js +1 -0
  23. package/lib/app-menu-update-cdn/update-menu-cdn-url.js +1 -0
  24. package/lib/auth/auth-server-ui.js +1 -0
  25. package/lib/auth/auth-server.js +1 -0
  26. package/lib/auth/constant.js +1 -0
  27. package/lib/auth/get-cookie.js +1 -0
  28. package/lib/auth/is-session-valid.js +1 -0
  29. package/lib/auth/logout.js +1 -0
  30. package/lib/cli-flags.js +1 -0
  31. package/lib/cli.js +2 -0
  32. package/lib/commands/api.js +1 -0
  33. package/lib/commands/app.js +1 -0
  34. package/lib/commands/auth.js +1 -0
  35. package/lib/commands/bff/delete.js +1 -0
  36. package/lib/commands/bff/detail.js +1 -0
  37. package/lib/commands/bff/index.js +1 -0
  38. package/lib/commands/bff/list.js +1 -0
  39. package/lib/commands/bff/new.js +1 -0
  40. package/lib/commands/bff/pull.js +1 -0
  41. package/lib/commands/bff/push.js +1 -0
  42. package/lib/commands/bff/status.js +1 -0
  43. package/lib/commands/build.js +1 -0
  44. package/lib/commands/codegen/index.js +1 -0
  45. package/lib/commands/codegen/sdk.js +1 -0
  46. package/lib/commands/codegen/sql.js +1 -0
  47. package/lib/commands/config.js +1 -0
  48. package/lib/commands/create.js +1 -0
  49. package/lib/commands/dataset/detail.js +1 -0
  50. package/lib/commands/dataset/index.js +1 -0
  51. package/lib/commands/dataset/links.js +1 -0
  52. package/lib/commands/dataset/list.js +1 -0
  53. package/lib/commands/dataset/operations.js +1 -0
  54. package/lib/commands/init.js +1 -0
  55. package/lib/commands/logout.js +1 -0
  56. package/lib/commands/logs.js +1 -0
  57. package/lib/commands/mcp.js +1 -0
  58. package/lib/commands/menu.js +1 -0
  59. package/lib/commands/preview.js +1 -0
  60. package/lib/commands/registry.js +1 -0
  61. package/lib/commands/run.js +1 -0
  62. package/lib/commands/skill.js +1 -0
  63. package/lib/commands/sql/detail.js +1 -0
  64. package/lib/commands/sql/exec.js +1 -0
  65. package/lib/commands/sql/index.js +1 -0
  66. package/lib/commands/sql/list.js +1 -0
  67. package/lib/commands/sql/save.js +1 -0
  68. package/lib/commands/sql/validate.js +1 -0
  69. package/lib/commands/start.js +1 -0
  70. package/lib/config/config-help.js +1 -0
  71. package/lib/config/main.js +1 -0
  72. package/lib/constant/cli.js +1 -0
  73. package/lib/constant/domain.js +1 -0
  74. package/lib/constant/env.js +1 -0
  75. package/lib/context.js +1 -0
  76. package/lib/core/alias-resolver.js +1 -0
  77. package/lib/core/api-client.js +1 -0
  78. package/lib/core/bff/config.js +1 -0
  79. package/lib/core/bff/file-system.js +1 -0
  80. package/lib/core/bff/hash.js +1 -0
  81. package/lib/core/bff/lock.js +1 -0
  82. package/lib/core/bff/types.js +1 -0
  83. package/lib/core/bff/utils.js +1 -0
  84. package/lib/core/db-resolver.js +1 -0
  85. package/lib/core/sql-validator.js +1 -0
  86. package/lib/create-app/enhanced-guided-create.js +1 -0
  87. package/lib/create-app/format-elapsed.js +1 -0
  88. package/lib/create-app/main.js +1 -0
  89. package/lib/create-app/non-interactive.js +1 -0
  90. package/lib/create-app/task-finished.js +1 -0
  91. package/lib/create-app/task-loading.js +1 -0
  92. package/lib/create-app/task-running.js +1 -0
  93. package/lib/create-app/task-time.js +1 -0
  94. package/lib/create-app/use-copy-project-template.js +1 -0
  95. package/lib/create-app/use-format-code.js +1 -0
  96. package/lib/create-app/use-install-dependencies.js +1 -0
  97. package/lib/errors.js +1 -0
  98. package/lib/framework/flags.js +1 -0
  99. package/lib/framework/help.js +1 -0
  100. package/lib/framework/index.js +1 -0
  101. package/lib/framework/output.js +1 -0
  102. package/lib/framework/response.js +1 -0
  103. package/lib/framework/runner.js +1 -0
  104. package/lib/framework/types.js +1 -0
  105. package/lib/generated/build-info.js +1 -0
  106. package/lib/help.js +1 -0
  107. package/lib/init/main.js +1 -0
  108. package/lib/mcp/McpInstallUI.js +1 -0
  109. package/lib/mcp/claude.js +1 -0
  110. package/lib/mcp/cursor.js +1 -0
  111. package/lib/mcp/main.js +1 -0
  112. package/lib/mcp/mcp-install-non-interactive.js +1 -0
  113. package/lib/mcp/mcp-installer.js +1 -0
  114. package/lib/skills/main.js +1 -0
  115. package/lib/skills/npx-skills-add.js +1 -0
  116. package/lib/types/index.js +1 -0
  117. package/lib/ui/IDESelector.js +1 -0
  118. package/lib/ui/useIDESelection.js +1 -0
  119. package/lib/utils/ai_config.js +1 -0
  120. package/lib/utils/cdn-config.js +1 -0
  121. package/lib/utils/check-sdk-version.js +1 -0
  122. package/lib/utils/cli-version-check.js +1 -0
  123. package/lib/utils/config.js +1 -0
  124. package/lib/utils/copy-directory.js +1 -0
  125. package/lib/utils/file-utils.js +1 -0
  126. package/lib/utils/guides-cdn.js +1 -0
  127. package/lib/utils/http-client.js +1 -0
  128. package/lib/utils/logger.js +1 -0
  129. package/lib/utils/rules-cdn.js +1 -0
  130. package/lib/utils/sleep.js +1 -0
  131. package/lib/utils/template-replacer.js +1 -0
  132. package/package.json +77 -0
  133. package/sidecar/flags.json +10 -0
  134. package/templates/README.md +97 -0
  135. package/templates/generate-api/api.ts.tpl +47 -0
  136. package/templates/generate-api/client.ts.tpl +64 -0
  137. package/templates/projects/sub-app-react-demo/.prettierrc +1 -0
  138. package/templates/projects/sub-app-react-demo/CHANGELOG.md +53 -0
  139. package/templates/projects/sub-app-react-demo/README.md +318 -0
  140. package/templates/projects/sub-app-react-demo/docs/API_RULE_CHANGE.md +212 -0
  141. package/templates/projects/sub-app-react-demo/docs/quick-start.md +526 -0
  142. package/templates/projects/sub-app-react-demo/index.html +27 -0
  143. package/templates/projects/sub-app-react-demo/package.json +34 -0
  144. package/templates/projects/sub-app-react-demo/public/logo.svg +1 -0
  145. package/templates/projects/sub-app-react-demo/public/vite.svg +1 -0
  146. package/templates/projects/sub-app-react-demo/src/api/api.ts +83 -0
  147. package/templates/projects/sub-app-react-demo/src/api/client.ts +64 -0
  148. package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +311 -0
  149. package/templates/projects/sub-app-react-demo/src/main.tsx +48 -0
  150. package/templates/projects/sub-app-react-demo/src/pages/dashboard/index.tsx +572 -0
  151. package/templates/projects/sub-app-react-demo/src/pages/data-screen/index.tsx +526 -0
  152. package/templates/projects/sub-app-react-demo/src/pages/index.tsx +467 -0
  153. package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +453 -0
  154. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +293 -0
  155. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +155 -0
  156. package/templates/projects/sub-app-react-demo/src/router/index.tsx +30 -0
  157. package/templates/projects/sub-app-react-demo/src/style.css +92 -0
  158. package/templates/projects/sub-app-react-demo/src/utils/api.ts +12 -0
  159. package/templates/projects/sub-app-react-demo/src/vite-env.d.ts +2 -0
  160. package/templates/projects/sub-app-react-demo/tsconfig.json +26 -0
  161. package/templates/projects/sub-app-react-demo/vite.config.ts +111 -0
  162. package/templates/rules/lovrabet_rules.mdc.tpl +891 -0
  163. package/templates/skill/SKILL.md.tpl +120 -0
@@ -0,0 +1 @@
1
+ const a123_0x2b90d5=a123_0x38ff;(function(_0x3021e9,_0x361227){const _0x1b2f90=a123_0x38ff,_0x4267ee=_0x3021e9();while(!![]){try{const _0x16e29e=parseInt(_0x1b2f90(0x1b0))/0x1*(-parseInt(_0x1b2f90(0x1bb))/0x2)+parseInt(_0x1b2f90(0x1aa))/0x3+parseInt(_0x1b2f90(0x1c1))/0x4*(-parseInt(_0x1b2f90(0x1c3))/0x5)+parseInt(_0x1b2f90(0x1a9))/0x6+-parseInt(_0x1b2f90(0x1b3))/0x7+-parseInt(_0x1b2f90(0x1b5))/0x8+parseInt(_0x1b2f90(0x1ab))/0x9;if(_0x16e29e===_0x361227)break;else _0x4267ee['push'](_0x4267ee['shift']());}catch(_0x2594b5){_0x4267ee['push'](_0x4267ee['shift']());}}}(a123_0x44be,0xd9531));function a123_0x38ff(_0x1cf325,_0x707da6){_0x1cf325=_0x1cf325-0x1a5;const _0x44be1f=a123_0x44be();let _0x38ff34=_0x44be1f[_0x1cf325];return _0x38ff34;}import{mkdirSync,writeFileSync}from'node:fs';import{dirname,join}from'node:path';import{getTemplateBaseUrl}from'./config.js';function getGuidesCdnUrl(){const _0x157402=getTemplateBaseUrl();return _0x157402+'/skills/guides.json';}const CACHE_DIR=join(process['env'][a123_0x2b90d5(0x1b2)]||process[a123_0x2b90d5(0x1af)][a123_0x2b90d5(0x1a8)]||'',a123_0x2b90d5(0x1bd),'cache');export async function fetchGuidesFromCDN(){const _0x34975b=a123_0x2b90d5,_0x72c2ec=getGuidesCdnUrl(),_0x1d6ad3=await fetch(_0x72c2ec,{'headers':{'Accept':_0x34975b(0x1b7)}});if(!_0x1d6ad3['ok'])throw new Error(_0x34975b(0x1bf)+_0x1d6ad3['status']+'\x20'+_0x1d6ad3[_0x34975b(0x1c4)]);const _0x3c931c=await _0x1d6ad3[_0x34975b(0x1be)]();if(!_0x3c931c[_0x34975b(0x1ba)]||typeof _0x3c931c['guides']!=='object')throw new Error('CDN\x20返回数据格式错误');return _0x3c931c;}export function writeGuidesToProject(_0x1b4f90,_0x2b751b,_0x4d5fb9='.lovrabet/skill/guides',_0x5f21b0){const _0x5e15b6=a123_0x2b90d5,_0x34597e=join(_0x2b751b,_0x4d5fb9);mkdirSync(_0x34597e,{'recursive':!![]});for(const [_0xa84ab5,_0x2b8857]of Object[_0x5e15b6(0x1b1)](_0x1b4f90[_0x5e15b6(0x1ba)])){let _0x416493=_0x2b8857[_0x5e15b6(0x1b8)];_0x2b8857['lastUpdated']&&(_0x416493=appendUpdateTime(_0x416493,_0x2b8857['lastUpdated'])),writeFileSync(join(_0x34597e,_0xa84ab5+_0x5e15b6(0x1b6)),_0x416493,_0x5e15b6(0x1a6));}}function a123_0x44be(){const _0x5d67c0=['utf-8','lastUpdated','USERPROFILE','4075158hCuPmu','1809714GPbonY','25215912yUSjtN','\x0a\x0a>更新时间:','path','skillTemplate','env','306709YFbrWB','entries','HOME','6623925dDSdNk','push','11498608dFOplU','.md','application/json','content','title','guides','4oTAOhS','trimEnd','.lovrabet','json','CDN\x20请求失败:\x20','extendContent','262692DWOuEq','replace','15CYzYPk','statusText','join','length'];a123_0x44be=function(){return _0x5d67c0;};return a123_0x44be();}export function appendUpdateTime(_0x1e54bd,_0x1bb4ab){const _0x7769a3=a123_0x2b90d5;return _0x1e54bd=_0x1e54bd['replace'](/\n*>更新时间:.*$/m,''),_0x1e54bd['trimEnd']()+(_0x7769a3(0x1ac)+_0x1bb4ab);}export function getSkillTemplate(_0x19dc80){const _0x438dca=a123_0x2b90d5;return _0x19dc80['skillTemplate']?.[_0x438dca(0x1b8)]||'';}export function appendExtendContents(_0x2a8f89,_0x5ca01d,_0x41bf93){const _0x1a7865=a123_0x2b90d5,_0x342e10=[];for(const [,_0x189fdf]of Object[_0x1a7865(0x1b1)](_0x5ca01d[_0x1a7865(0x1ba)])){_0x189fdf['extendContent']&&_0x342e10[_0x1a7865(0x1b4)](_0x189fdf[_0x1a7865(0x1c0)][_0x1a7865(0x1bc)]());}if(_0x342e10[_0x1a7865(0x1a5)]===0x0)return _0x2a8f89;return _0x2a8f89['trimEnd']()+'\x0a\x0a'+_0x342e10[_0x1a7865(0x1c5)]('\x0a\x0a')+'\x0a';}export function writeSkillFile(_0x309593,_0x105e19,_0x3c118d){const _0x4b41d1=a123_0x2b90d5,_0x162daa=getSkillTemplate(_0x309593);if(!_0x162daa)throw new Error('CDN\x20数据中缺少\x20skillTemplate');const _0x400cc3=dirname(_0x105e19);mkdirSync(_0x400cc3,{'recursive':!![]});let _0x579baf=_0x162daa[_0x4b41d1(0x1c2)](/\{\{IDE_NAME\}\}/g,_0x3c118d);_0x579baf=appendExtendContents(_0x579baf,_0x309593),_0x309593[_0x4b41d1(0x1ae)][_0x4b41d1(0x1a7)]&&(_0x579baf=appendUpdateTime(_0x579baf,_0x309593[_0x4b41d1(0x1ae)][_0x4b41d1(0x1a7)])),writeFileSync(_0x105e19,_0x579baf,_0x4b41d1(0x1a6));}export async function installGuides(_0xf591d9){const _0x4952a2=a123_0x2b90d5,_0x787aae=await fetchGuidesFromCDN();return writeGuidesToProject(_0x787aae,_0xf591d9),Object['keys'](_0x787aae['guides'])[_0x4952a2(0x1a5)];}export function getGuidesSummary(_0x21976f){const _0x581f96=a123_0x2b90d5;return Object[_0x581f96(0x1b1)](_0x21976f[_0x581f96(0x1ba)])['map'](([_0x5213d4,_0x28af12])=>({'key':_0x5213d4,'title':_0x28af12[_0x581f96(0x1b9)],'path':_0x28af12[_0x581f96(0x1ad)]}));}
@@ -0,0 +1 @@
1
+ (function(_0xf48ee6,_0x5802ec){const _0x1cd6f5=a124_0x6d9d,_0x30163e=_0xf48ee6();while(!![]){try{const _0xb49396=-parseInt(_0x1cd6f5(0x1dd))/0x1+parseInt(_0x1cd6f5(0x1e2))/0x2+parseInt(_0x1cd6f5(0x1d2))/0x3+-parseInt(_0x1cd6f5(0x1de))/0x4+parseInt(_0x1cd6f5(0x1e0))/0x5+-parseInt(_0x1cd6f5(0x1d3))/0x6*(parseInt(_0x1cd6f5(0x1ce))/0x7)+parseInt(_0x1cd6f5(0x1ca))/0x8*(-parseInt(_0x1cd6f5(0x1e1))/0x9);if(_0xb49396===_0x5802ec)break;else _0x30163e['push'](_0x30163e['shift']());}catch(_0x4a64b7){_0x30163e['push'](_0x30163e['shift']());}}}(a124_0x4574,0x4db04));function a124_0x6d9d(_0x252944,_0x47cb10){_0x252944=_0x252944-0x1c8;const _0x4574b6=a124_0x4574();let _0x6d9d0d=_0x4574b6[_0x252944];return _0x6d9d0d;}function a124_0x4574(){const _0x23d413=['get','AbortError','704070epJVbE','95682KsKeBN','TypeError','\x20次重试...','Request\x20failed','message','includes','statusText','*\x20请求失败,','content-type','application/json','343455djJoUH','168352OlkoZH','name','1039740PbMJpC','9UDzSqg','958968fAclpn','signal','url','status','text','343600MPvEMq','log','ms\x20后进行第\x20','headers','77wiGiln','fetch'];a124_0x4574=function(){return _0x23d413;};return a124_0x4574();}export async function httpRequest(_0x283635,_0x3de0b2={}){const _0xa82dc2=a124_0x6d9d,{timeout:timeout=0x7530,retries:retries=0x3,retryDelay:retryDelay=0x3e8,headers:headers={}}=_0x3de0b2;let _0x2522bf=null;for(let _0x4963d9=0x0;_0x4963d9<=retries;_0x4963d9++){try{const _0x165f7f=new AbortController(),_0xe682e1=setTimeout(()=>_0x165f7f['abort'](),timeout),_0x1ae8c6=await fetch(_0x283635,{'headers':headers,'signal':_0x165f7f[_0xa82dc2(0x1e3)]});clearTimeout(_0xe682e1);let _0x5abe3e;const _0x521fca=_0x1ae8c6[_0xa82dc2(0x1cd)][_0xa82dc2(0x1d0)](_0xa82dc2(0x1db));return _0x521fca?.[_0xa82dc2(0x1d8)](_0xa82dc2(0x1dc))?_0x5abe3e=await _0x1ae8c6['json']():_0x5abe3e=await _0x1ae8c6[_0xa82dc2(0x1c9)](),{'ok':_0x1ae8c6['ok'],'status':_0x1ae8c6[_0xa82dc2(0x1c8)],'statusText':_0x1ae8c6[_0xa82dc2(0x1d9)],'data':_0x5abe3e,'headers':_0x1ae8c6[_0xa82dc2(0x1cd)],'url':_0x1ae8c6[_0xa82dc2(0x1e4)],'text':()=>_0x1ae8c6[_0xa82dc2(0x1c9)]()};}catch(_0x4a5f13){_0x2522bf=_0x4a5f13 instanceof Error?_0x4a5f13:new Error(String(_0x4a5f13));if(_0x4963d9===retries)break;if(shouldRetry(_0x4a5f13)){console[_0xa82dc2(0x1cb)](_0xa82dc2(0x1da)+retryDelay+_0xa82dc2(0x1cc)+(_0x4963d9+0x1)+_0xa82dc2(0x1d5)),await sleep(retryDelay);continue;}else break;}}throw _0x2522bf||new Error(_0xa82dc2(0x1d6));}function shouldRetry(_0x202e5e){const _0x3d26df=a124_0x6d9d;if(_0x202e5e instanceof Error){if(_0x202e5e[_0x3d26df(0x1df)]===_0x3d26df(0x1d1))return![];if(_0x202e5e[_0x3d26df(0x1df)]===_0x3d26df(0x1d4)&&_0x202e5e[_0x3d26df(0x1d7)][_0x3d26df(0x1d8)](_0x3d26df(0x1cf)))return!![];if(_0x202e5e[_0x3d26df(0x1d7)][_0x3d26df(0x1d8)]('ECONNRESET'))return!![];if(_0x202e5e[_0x3d26df(0x1d7)][_0x3d26df(0x1d8)]('ENOTFOUND'))return![];}return![];}function sleep(_0x3d441f){return new Promise(_0xb0f531=>setTimeout(_0xb0f531,_0x3d441f));}export function validateUrl(_0x2e1101){try{return new URL(_0x2e1101),!![];}catch{return![];}}
@@ -0,0 +1 @@
1
+ const a125_0x4ebbca=a125_0xfdc7;(function(_0x5a3ab3,_0x225693){const _0x784b5d=a125_0xfdc7,_0x1afb66=_0x5a3ab3();while(!![]){try{const _0x13118e=parseInt(_0x784b5d(0x163))/0x1+-parseInt(_0x784b5d(0x14a))/0x2*(-parseInt(_0x784b5d(0x157))/0x3)+-parseInt(_0x784b5d(0x13e))/0x4*(parseInt(_0x784b5d(0x145))/0x5)+-parseInt(_0x784b5d(0x158))/0x6*(parseInt(_0x784b5d(0x176))/0x7)+-parseInt(_0x784b5d(0x14c))/0x8+parseInt(_0x784b5d(0x178))/0x9*(parseInt(_0x784b5d(0x170))/0xa)+parseInt(_0x784b5d(0x164))/0xb*(parseInt(_0x784b5d(0x15a))/0xc);if(_0x13118e===_0x225693)break;else _0x1afb66['push'](_0x1afb66['shift']());}catch(_0x232c3d){_0x1afb66['push'](_0x1afb66['shift']());}}}(a125_0x2782,0xa40ba));import a125_0x11fb54 from'winston';import a125_0xb6647c from'node:fs';function a125_0xfdc7(_0x43669b,_0x1e3cad){_0x43669b=_0x43669b-0x13c;const _0x2782cd=a125_0x2782();let _0xfdc71a=_0x2782cd[_0x43669b];return _0xfdc71a;}import a125_0x15a1a0 from'node:path';class Logger{[a125_0x4ebbca(0x150)];['logFilePath'];[a125_0x4ebbca(0x148)]='';constructor(){const _0x1bd7e7=a125_0x4ebbca;this[_0x1bd7e7(0x144)]='';}[a125_0x4ebbca(0x159)](_0x1faf33){const _0x4c17d5=a125_0x4ebbca;this[_0x4c17d5(0x148)]=_0x1faf33;}['initWinstonLogger'](){const _0x3d5dde=a125_0x4ebbca,_0x27b220=a125_0x15a1a0[_0x3d5dde(0x160)](this['logFilePath']);!a125_0xb6647c[_0x3d5dde(0x168)](_0x27b220)&&a125_0xb6647c[_0x3d5dde(0x171)](_0x27b220,{'recursive':!![]});const _0x32772d=a125_0x11fb54['format'][_0x3d5dde(0x166)](a125_0x11fb54[_0x3d5dde(0x167)][_0x3d5dde(0x147)](),a125_0x11fb54['format'][_0x3d5dde(0x13f)]({'stack':!![]}),a125_0x11fb54['format'][_0x3d5dde(0x140)](_0x2e2704=>{const _0xb94c4a=_0x3d5dde,_0x3efc9e={'timestamp':_0x2e2704[_0xb94c4a(0x147)]||new Date()[_0xb94c4a(0x141)](),'level':_0x2e2704[_0xb94c4a(0x15e)]||_0xb94c4a(0x146),'command':_0x2e2704[_0xb94c4a(0x174)]||_0xb94c4a(0x14f),'rawCommand':_0x2e2704[_0xb94c4a(0x169)]||this[_0xb94c4a(0x148)]||undefined,'message':_0x2e2704[_0xb94c4a(0x16c)]||'','duration':_0x2e2704['duration']||undefined,'details':_0x2e2704[_0xb94c4a(0x149)]||undefined};return JSON[_0xb94c4a(0x16d)](_0x3efc9e);}));this['winstonLogger']=a125_0x11fb54[_0x3d5dde(0x143)]({'level':_0x3d5dde(0x146),'format':_0x32772d,'transports':[new a125_0x11fb54[(_0x3d5dde(0x152))][(_0x3d5dde(0x156))]({'filename':this[_0x3d5dde(0x144)],'level':_0x3d5dde(0x146)})],'silent':![]}),a125_0x11fb54['addColors']({'success':_0x3d5dde(0x15f),'error':_0x3d5dde(0x172),'warn':_0x3d5dde(0x177),'info':_0x3d5dde(0x16b)});}['setLogPath'](_0x41c91f){const _0xbe04d2=a125_0x4ebbca;this[_0xbe04d2(0x144)]=a125_0x15a1a0['join'](_0x41c91f,_0xbe04d2(0x165)),this[_0xbe04d2(0x150)]&&this['winstonLogger'][_0xbe04d2(0x142)](),this[_0xbe04d2(0x14b)]();}[a125_0x4ebbca(0x146)](_0x2946e0,_0x4bd225,_0x59db0f){const _0x24a108=a125_0x4ebbca;if(!this[_0x24a108(0x144)]||!this['winstonLogger'])return;this[_0x24a108(0x150)][_0x24a108(0x146)](_0x4bd225,{'command':_0x2946e0,'details':_0x59db0f});}['success'](_0x56546d,_0x1f5464,_0x36fa8a,_0x4f5d38){const _0x5746c0=a125_0x4ebbca;if(!this[_0x5746c0(0x144)]||!this[_0x5746c0(0x150)])return;this['winstonLogger'][_0x5746c0(0x162)](_0x5746c0(0x146),_0x1f5464,{'level':_0x5746c0(0x161),'command':_0x56546d,'duration':_0x36fa8a,'details':_0x4f5d38});}[a125_0x4ebbca(0x175)](_0x39584d,_0x3b6413,_0x2d2dcf){const _0x2d5545=a125_0x4ebbca;if(!this['logFilePath']||!this[_0x2d5545(0x150)])return;this['winstonLogger'][_0x2d5545(0x175)](_0x3b6413,{'command':_0x39584d,'details':_0x2d2dcf});}[a125_0x4ebbca(0x15c)](_0x19ffac,_0x4eb235,_0x28effc){const _0x1a0dd8=a125_0x4ebbca;if(!this[_0x1a0dd8(0x144)]||!this[_0x1a0dd8(0x150)])return;this[_0x1a0dd8(0x150)][_0x1a0dd8(0x15c)](_0x4eb235,{'command':_0x19ffac,'details':_0x28effc});}async['logTask'](_0x210bb7,_0x1db430,_0x4bbc5c){const _0x10b34e=a125_0x4ebbca,_0x121676=Date[_0x10b34e(0x173)]();this[_0x10b34e(0x146)](_0x210bb7,_0x10b34e(0x15b)+_0x1db430);try{const _0x50cc25=await _0x4bbc5c(),_0xecc8c1=Date[_0x10b34e(0x173)]()-_0x121676;return this['success'](_0x210bb7,'完成:\x20'+_0x1db430,_0xecc8c1),_0x50cc25;}catch(_0x17e7aa){const _0xb2e65e=Date[_0x10b34e(0x173)]()-_0x121676;this[_0x10b34e(0x175)](_0x210bb7,_0x10b34e(0x14d)+_0x1db430,{'error':_0x17e7aa instanceof Error?_0x17e7aa[_0x10b34e(0x16c)]:String(_0x17e7aa),'duration':_0xb2e65e});throw _0x17e7aa;}}[a125_0x4ebbca(0x15d)](){const _0x1ceb54=a125_0x4ebbca;try{if(!a125_0xb6647c[_0x1ceb54(0x168)](this[_0x1ceb54(0x144)]))return[];const _0xf852da=a125_0xb6647c[_0x1ceb54(0x13c)](this[_0x1ceb54(0x144)],_0x1ceb54(0x13d));return _0xf852da[_0x1ceb54(0x16f)]('\x0a')[_0x1ceb54(0x155)](_0x3a9cfd=>_0x3a9cfd['trim']())[_0x1ceb54(0x153)](_0x1a4c75=>JSON[_0x1ceb54(0x151)](_0x1a4c75));}catch(_0x284b74){return console['warn'](_0x1ceb54(0x16e),_0x284b74),[];}}[a125_0x4ebbca(0x154)](){const _0x2e6a33=a125_0x4ebbca;try{a125_0xb6647c['existsSync'](this[_0x2e6a33(0x144)])&&a125_0xb6647c[_0x2e6a33(0x14e)](this[_0x2e6a33(0x144)],'',_0x2e6a33(0x13d));}catch(_0x3ccdcc){console[_0x2e6a33(0x15c)]('Failed\x20to\x20clear\x20logs:',_0x3ccdcc);}}[a125_0x4ebbca(0x16a)](){return this['winstonLogger'];}}function a125_0x2782(){const _0x459bdb=['clear','createLogger','logFilePath','25pEoyuu','info','timestamp','currentRawCommand','details','10kxwHFc','initWinstonLogger','7566768MYROAm','失败:\x20','writeFileSync','unknown','winstonLogger','parse','transports','map','clearLogs','filter','File','5661CmiKIZ','20652Mfxcth','setRawCommand','36060fhOgtU','开始执行:\x20','warn','readLogs','level','green','dirname','success','log','1189074iPTSuS','2827WToBfN','.lovrabet.log','combine','format','existsSync','rawCommand','getWinstonInstance','blue','message','stringify','Failed\x20to\x20read\x20logs:','split','50JIRJqm','mkdirSync','red','now','command','error','133LEwIEQ','yellow','534159EpoSSB','readFileSync','utf8','467500oYqXXc','errors','printf','toISOString'];a125_0x2782=function(){return _0x459bdb;};return a125_0x2782();}export const logger=new Logger();
@@ -0,0 +1 @@
1
+ const a126_0x135217=a126_0x5047;(function(_0x1e5c6c,_0x2740f4){const _0x2cc85d=a126_0x5047,_0x140e90=_0x1e5c6c();while(!![]){try{const _0x33f895=parseInt(_0x2cc85d(0x188))/0x1+-parseInt(_0x2cc85d(0x189))/0x2+-parseInt(_0x2cc85d(0x18a))/0x3*(parseInt(_0x2cc85d(0x181))/0x4)+-parseInt(_0x2cc85d(0x185))/0x5+parseInt(_0x2cc85d(0x18d))/0x6+parseInt(_0x2cc85d(0x184))/0x7*(-parseInt(_0x2cc85d(0x18f))/0x8)+parseInt(_0x2cc85d(0x190))/0x9;if(_0x33f895===_0x2740f4)break;else _0x140e90['push'](_0x140e90['shift']());}catch(_0x4b3040){_0x140e90['push'](_0x140e90['shift']());}}}(a126_0x36c6,0x2c469));import{existsSync,mkdirSync,readFileSync,writeFileSync}from'node:fs';import{dirname,join,resolve}from'node:path';import{fileURLToPath}from'node:url';import{getTemplateBaseUrl}from'./config.js';function a126_0x5047(_0x514811,_0x4212d5){_0x514811=_0x514811-0x181;const _0x36c602=a126_0x36c6();let _0x5047ad=_0x36c602[_0x514811];return _0x5047ad;}import{appendUpdateTime}from'./guides-cdn.js';const __filename=fileURLToPath(import.meta.url),__dirname=dirname(__filename);function getRulesCdnUrl(){const _0x165c9f=a126_0x5047,_0x42bd32=getTemplateBaseUrl();return _0x42bd32+_0x165c9f(0x186);}const LOCAL_TEMPLATE_PATH=resolve(__dirname,a126_0x135217(0x191));export async function fetchRulesFromCDN(){const _0x5d8b42=a126_0x135217,_0x831b4d=getRulesCdnUrl(),_0x5cd849=await fetch(_0x831b4d,{'headers':{'Accept':_0x5d8b42(0x194)}});if(!_0x5cd849['ok'])throw new Error(_0x5d8b42(0x192)+_0x5cd849['status']+'\x20'+_0x5cd849[_0x5d8b42(0x187)]);const _0x2faf39=await _0x5cd849['json']();if(!_0x2faf39[_0x5d8b42(0x182)]||typeof _0x2faf39['content']!=='string')throw new Error(_0x5d8b42(0x193));return _0x2faf39;}export async function getRulesContent(){const _0x485aca=a126_0x135217;try{const _0x2e28e9=await fetchRulesFromCDN();return _0x2e28e9[_0x485aca(0x182)];}catch{return readLocalTemplate();}}export function readLocalTemplate(){const _0x35d640=a126_0x135217;if(existsSync(LOCAL_TEMPLATE_PATH))return readFileSync(LOCAL_TEMPLATE_PATH,_0x35d640(0x18e));throw new Error('本地模板文件不存在:\x20'+LOCAL_TEMPLATE_PATH);}function a126_0x36c6(){const _0x2ed572=['content','catch','2019451lYFjVS','1032070IBItsx','/rules/rules.json','statusText','51904XvELqQ','18696dZITiK','639AJqkpq','lovrabet_rules.mdc','lastUpdated','909522ijQwPA','utf-8','8BgEtOd','5567850SCdEiG','../../templates/rules/lovrabet_rules.mdc.tpl','CDN\x20请求失败:\x20','CDN\x20返回数据格式错误','application/json','2564lNjIxt'];a126_0x36c6=function(){return _0x2ed572;};return a126_0x36c6();}export async function writeRulesFile(_0x10ba6d){const _0x3f1d6d=a126_0x135217,_0x3a69f9=await fetchRulesFromCDN()[_0x3f1d6d(0x183)](()=>null);let _0x2b281e;_0x3a69f9?(_0x2b281e=_0x3a69f9[_0x3f1d6d(0x182)],_0x3a69f9[_0x3f1d6d(0x18c)]&&(_0x2b281e=appendUpdateTime(_0x2b281e,_0x3a69f9['lastUpdated']))):_0x2b281e=readLocalTemplate();const _0x2ecd4d=dirname(_0x10ba6d);!existsSync(_0x2ecd4d)&&mkdirSync(_0x2ecd4d,{'recursive':!![]}),writeFileSync(_0x10ba6d,_0x2b281e,_0x3f1d6d(0x18e));}export async function copyRulesToCursor(_0x4425d1){const _0x297c12=a126_0x135217,_0x4c77b7=join(_0x4425d1,'.cursor/rules'),_0x14b9e3=join(_0x4c77b7,_0x297c12(0x18b));if(existsSync(_0x14b9e3))return![];return await writeRulesFile(_0x14b9e3),!![];}export async function copyRulesToAgentsMd(_0x4f0b88){const _0x248ce3=join(_0x4f0b88,'agents.md');if(existsSync(_0x248ce3))return![];return await writeRulesFile(_0x248ce3),!![];}
@@ -0,0 +1 @@
1
+ export function sleep(_0x450dde){return new Promise(_0x52a17b=>setTimeout(_0x52a17b,_0x450dde));}
@@ -0,0 +1 @@
1
+ const a128_0x13fb02=a128_0x1768;(function(_0x10d75c,_0x5b07b5){const _0xe68698=a128_0x1768,_0x127e93=_0x10d75c();while(!![]){try{const _0x5aa0c2=-parseInt(_0xe68698(0x1df))/0x1+parseInt(_0xe68698(0x20d))/0x2+-parseInt(_0xe68698(0x1ef))/0x3+parseInt(_0xe68698(0x20b))/0x4+-parseInt(_0xe68698(0x20a))/0x5+-parseInt(_0xe68698(0x1fb))/0x6*(parseInt(_0xe68698(0x207))/0x7)+parseInt(_0xe68698(0x1e7))/0x8;if(_0x5aa0c2===_0x5b07b5)break;else _0x127e93['push'](_0x127e93['shift']());}catch(_0x3d88d5){_0x127e93['push'](_0x127e93['shift']());}}}(a128_0x5278,0xca761));import a128_0x4f1430 from'node:fs';function a128_0x1768(_0x47dcb5,_0x4c6a68){_0x47dcb5=_0x47dcb5-0x1cf;const _0x52785a=a128_0x5278();let _0x1768fd=_0x52785a[_0x47dcb5];return _0x1768fd;}import a128_0x2f7f74 from'node:path';function a128_0x5278(){const _0x133f9c=['isFile','.scss','toUpperCase','readdir','开始处理模板内容替换','.jsx','\x20},','writeFile','info','utf8','.json','14qnlpcb','endsWith','processFile','28860cyQFVD','1797060pIMZyZ','replaceApiContent','121060lXPlVo','.tsx','toLocaleDateString','toLocaleString','alias','模板内容替换完成','toISOString','.js','split','isDirectory','readFile','replaceContent','tableName','charAt','.md','pop','toDisplayTitle','name','join','promises','message','1300226aOrdXW','map','now','2-digit','../../package.json','datasetCode','api','.css','20842080fjUdPU','processTemplate','version','includes','success','toLowerCase','template','extname','1172982JGmWls','numeric','push','toComponentName','YourModel','.tpl','replace','.ts','processDirectory','mkdir','slice','alias:\x20\x22','1766346mJpJGj'];a128_0x5278=function(){return _0x133f9c;};return a128_0x5278();}import{createRequire}from'node:module';import{logger}from'./logger.js';const require=createRequire(import.meta.url),CLI_VERSION=require(a128_0x13fb02(0x1e3))[a128_0x13fb02(0x1e9)];export class TemplateReplacer{static[a128_0x13fb02(0x1f2)](_0x4513c4){const _0x24e68d=a128_0x13fb02,_0x42be9b=_0x4513c4['split']('/')['pop']()||_0x4513c4;return _0x42be9b[_0x24e68d(0x1d2)]('-')['map'](_0x39c42d=>_0x39c42d[_0x24e68d(0x1d7)](0x0)[_0x24e68d(0x1fe)]()+_0x39c42d['slice'](0x1)[_0x24e68d(0x1ec)]())[_0x24e68d(0x1dc)]('');}static[a128_0x13fb02(0x1da)](_0x3c263e){const _0x162460=a128_0x13fb02,_0x2324fd=_0x3c263e[_0x162460(0x1d2)]('/')[_0x162460(0x1d9)]()||_0x3c263e;return _0x2324fd[_0x162460(0x1d2)]('-')[_0x162460(0x1e0)](_0x5b8e02=>_0x5b8e02[_0x162460(0x1d7)](0x0)['toUpperCase']()+_0x5b8e02[_0x162460(0x1f9)](0x1)[_0x162460(0x1ec)]())[_0x162460(0x1dc)]('\x20');}static[a128_0x13fb02(0x1d5)](_0x1d15f8,_0x4b137f,_0x3fa795){const _0x5bf5e5=a128_0x13fb02,_0x54b43a=this[_0x5bf5e5(0x1f2)](_0x4b137f),_0x565644=this[_0x5bf5e5(0x1da)](_0x4b137f),_0x29d63f=new Date(),_0xc734e7=_0x29d63f[_0x5bf5e5(0x210)](undefined,{'year':'numeric','month':_0x5bf5e5(0x1e2),'day':_0x5bf5e5(0x1e2),'hour':_0x5bf5e5(0x1e2),'minute':_0x5bf5e5(0x1e2),'second':_0x5bf5e5(0x1e2),'hour12':![]})[_0x5bf5e5(0x1f5)](/\//g,'-'),_0x14ae09=_0x29d63f[_0x5bf5e5(0x20f)](undefined,{'year':_0x5bf5e5(0x1f0),'month':_0x5bf5e5(0x1e2),'day':_0x5bf5e5(0x1e2)})['replace'](/\//g,'-'),_0x3be464=_0x29d63f['toLocaleTimeString'](undefined,{'hour12':![]});let _0x5ed2af=_0x1d15f8[_0x5bf5e5(0x1f5)](/\{CliVersion\}/g,CLI_VERSION)[_0x5bf5e5(0x1f5)](/\{ComponentName\}/g,_0x54b43a)[_0x5bf5e5(0x1f5)](/\{DisplayTitle\}/g,_0x565644)[_0x5bf5e5(0x1f5)](/\{PageName\}/g,_0x4b137f)[_0x5bf5e5(0x1f5)](/\{TemplateName\}/g,_0x3fa795)[_0x5bf5e5(0x1f5)](/\{CreatedAt\}/g,_0xc734e7)[_0x5bf5e5(0x1f5)](/\{CreatedDate\}/g,_0x14ae09)[_0x5bf5e5(0x1f5)](/\{CreatedTime\}/g,_0x3be464);return _0x5ed2af;}static[a128_0x13fb02(0x20c)](_0x10786d,_0x41e9ef,_0x20a139,_0x11180e,_0x39e26f,_0x404b43,_0x5aecb0){const _0x240902=a128_0x13fb02,_0x955c68=new Date(),_0x1a4f02=_0x955c68[_0x240902(0x1d0)](),_0x167033=_0x20a139['map'](_0x2a394f=>{const _0x465111=_0x240902,_0x3d8dc7=['datasetCode:\x20\x22'+_0x2a394f[_0x465111(0x1e4)]+'\x22','tableName:\x20\x22'+_0x2a394f[_0x465111(0x1d6)]+'\x22','name:\x20\x22'+_0x2a394f[_0x465111(0x1db)]+'\x22'];return _0x2a394f[_0x465111(0x211)]&&_0x3d8dc7[_0x465111(0x1f1)](_0x465111(0x1fa)+_0x2a394f['alias']+'\x22'),'\x0a\x20\x20\x20\x20{\x20'+_0x3d8dc7['join'](',\x20')+_0x465111(0x202);})[_0x240902(0x1dc)](''),_0x1b4f5e=_0x11180e||_0x20a139[0x0]?.[_0x240902(0x211)]||_0x240902(0x1f3);let _0x555ed2=_0x10786d[_0x240902(0x1f5)](/\{AppCode\}/g,_0x41e9ef)['replace'](/\{ModelConfigs\}/g,_0x167033)[_0x240902(0x1f5)](/\{ExampleModelName\}/g,_0x1b4f5e)['replace'](/\{ApiFileName\}/g,_0x39e26f||_0x240902(0x1e5))['replace'](/\{ConfigName\}/g,_0x404b43||'default')[_0x240902(0x1f5)](/\{ClientConfigParam\}/g,_0x5aecb0||'')['replace'](/\{CreatedAt\}/g,_0x1a4f02);return _0x555ed2;}static async[a128_0x13fb02(0x1e8)](_0x47e872,_0x3646d0,_0x42debe,_0x4068e5,_0xa48c0e=!![]){const _0x2258f2=a128_0x13fb02,_0x2c94d7=Date[_0x2258f2(0x1e1)]();try{_0xa48c0e&&logger[_0x2258f2(0x204)](_0x2258f2(0x1ed),_0x2258f2(0x200),{'templatePath':_0x47e872,'targetPath':_0x3646d0,'pageName':_0x42debe,'templateName':_0x4068e5});await a128_0x4f1430[_0x2258f2(0x1dd)][_0x2258f2(0x1f8)](_0x3646d0,{'recursive':!![]}),await this[_0x2258f2(0x1f7)](_0x47e872,_0x3646d0,_0x42debe,_0x4068e5);if(_0xa48c0e){const _0x8b71c0=Date[_0x2258f2(0x1e1)]()-_0x2c94d7;logger[_0x2258f2(0x1eb)](_0x2258f2(0x1ed),_0x2258f2(0x1cf),_0x8b71c0,{'pageName':_0x42debe,'templateName':_0x4068e5});}}catch(_0xe84481){if(_0xa48c0e){const _0x4d037a=Date[_0x2258f2(0x1e1)]()-_0x2c94d7;logger['error'](_0x2258f2(0x1ed),'模板内容替换失败',{'templatePath':_0x47e872,'targetPath':_0x3646d0,'pageName':_0x42debe,'templateName':_0x4068e5,'error':_0xe84481 instanceof Error?_0xe84481[_0x2258f2(0x1de)]:String(_0xe84481),'duration':_0x4d037a});}throw _0xe84481;}}static async[a128_0x13fb02(0x1f7)](_0x1864e3,_0x3f9326,_0x5d8685,_0x467cb6){const _0x38b410=a128_0x13fb02,_0x57044f=await a128_0x4f1430[_0x38b410(0x1dd)][_0x38b410(0x1ff)](_0x1864e3,{'withFileTypes':!![]});for(const _0x5a0128 of _0x57044f){const _0x28128e=a128_0x2f7f74['join'](_0x1864e3,_0x5a0128[_0x38b410(0x1db)]);let _0x4deb9d=a128_0x2f7f74[_0x38b410(0x1dc)](_0x3f9326,_0x5a0128[_0x38b410(0x1db)]);_0x5a0128[_0x38b410(0x1db)][_0x38b410(0x208)](_0x38b410(0x1f4))&&(_0x4deb9d=a128_0x2f7f74[_0x38b410(0x1dc)](_0x3f9326,_0x5a0128[_0x38b410(0x1db)][_0x38b410(0x1f5)](/\.tpl$/,'')));if(_0x5a0128[_0x38b410(0x1d3)]())await a128_0x4f1430[_0x38b410(0x1dd)]['mkdir'](_0x4deb9d,{'recursive':!![]}),await this[_0x38b410(0x1f7)](_0x28128e,_0x4deb9d,_0x5d8685,_0x467cb6);else _0x5a0128[_0x38b410(0x1fc)]()&&await this[_0x38b410(0x209)](_0x28128e,_0x4deb9d,_0x5d8685,_0x467cb6);}}static async[a128_0x13fb02(0x209)](_0x148296,_0x35e1c0,_0x30ea61,_0x96ba6e){const _0x267d1b=a128_0x13fb02,_0x2b52d3=a128_0x2f7f74[_0x267d1b(0x1ee)](_0x148296)[_0x267d1b(0x1ec)]();_0x148296[_0x267d1b(0x208)](_0x267d1b(0x1f4))&&(_0x35e1c0=_0x35e1c0['replace'](/\.tpl$/,''));const _0x2a4fd9=[_0x267d1b(0x20e),_0x267d1b(0x1f6),_0x267d1b(0x201),_0x267d1b(0x1d1),_0x267d1b(0x206),_0x267d1b(0x1d8),_0x267d1b(0x1e6),_0x267d1b(0x1fd),_0x267d1b(0x1f4)];if(_0x2a4fd9[_0x267d1b(0x1ea)](_0x2b52d3)||_0x148296[_0x267d1b(0x208)]('.tpl')){const _0x3e83b9=await a128_0x4f1430[_0x267d1b(0x1dd)][_0x267d1b(0x1d4)](_0x148296,_0x267d1b(0x205)),_0x12fea3=this[_0x267d1b(0x1d5)](_0x3e83b9,_0x30ea61,_0x96ba6e);await a128_0x4f1430['promises'][_0x267d1b(0x203)](_0x35e1c0,_0x12fea3,_0x267d1b(0x205));}else await a128_0x4f1430[_0x267d1b(0x1dd)]['copyFile'](_0x148296,_0x35e1c0);}}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@lovrabet/rabetbase-cli",
3
+ "version": "2.0.2-beta.1",
4
+ "license": "SEE LICENSE IN LICENSE",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git@codeup.aliyun.com:yuntoo/open/rabetbase-cli.git"
8
+ },
9
+ "bin": {
10
+ "rabetbase": "lib/cli.js",
11
+ "lovrabet": "lib/cli.js"
12
+ },
13
+ "type": "module",
14
+ "module": "lib/cli.js",
15
+ "main": "lib/cli.js",
16
+ "engines": {
17
+ "node": ">=20"
18
+ },
19
+ "scripts": {
20
+ "prebuild": "node scripts/bump-build.js",
21
+ "build": "rm -rf lib && tsc && javascript-obfuscator lib --output lib",
22
+ "prebuild:dev": "node scripts/bump-build.js",
23
+ "build:dev": "rm -rf lib && tsc",
24
+ "start": "tsc --watch",
25
+ "sync-template": "node scripts/sync-template.js",
26
+ "beta-release": "bun run build && git add .build-number src/generated/build-info.ts && git commit -m 'chore: bump build number' && sh scripts/update-beta-version.sh && git push && git push origin --tag && bun publish --tag beta",
27
+ "release": "bun run build && git add .build-number src/generated/build-info.ts && git commit -m 'chore: bump build number' && sh scripts/update-latest-version.sh && git push && git push origin --tag && bun publish",
28
+ "test": "vitest run",
29
+ "test:run": "vitest run",
30
+ "test:coverage": "vitest run --coverage",
31
+ "test:ui": "vitest --ui",
32
+ "test:watch": "vitest --watch",
33
+ "test:unit": "vitest run test/unit",
34
+ "test:integration": "vitest run test/integration",
35
+ "test:e2e": "vitest run test/e2e",
36
+ "test:e2e:daily": "RABETBASE_E2E_DAILY=1 vitest run test/e2e/daily-app-smoke.test.ts",
37
+ "test:windows": "node test/run-windows-tests.js",
38
+ "test:windows:unit": "node test/run-windows-tests.js unit",
39
+ "test:windows:integration": "node test/run-windows-tests.js integration",
40
+ "typecheck": "tsc --noEmit",
41
+ "publish:github": "node scripts/publish-github.mjs",
42
+ "lint": "echo 'No linter configured yet'",
43
+ "ci": "npm run typecheck && npm run test:run && npm run build"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "files": [
49
+ "lib",
50
+ "templates",
51
+ "sidecar"
52
+ ],
53
+ "dependencies": {
54
+ "@types/winston": "^2.4.4",
55
+ "execa": "^9.6.0",
56
+ "ink": "^6.2.3",
57
+ "ink-spinner": "^5.0.0",
58
+ "javascript-obfuscator": "^4.1.1",
59
+ "listr": "^0.14.3",
60
+ "meow": "^13.2.0",
61
+ "prettier": "^3.6.2",
62
+ "react": "^19.2.0",
63
+ "semver": "^7.7.3",
64
+ "winston": "^3.17.0"
65
+ },
66
+ "devDependencies": {
67
+ "@types/listr": "^0.14.9",
68
+ "@types/node": "^24.5.2",
69
+ "@types/react": "^19.2.0",
70
+ "@types/semver": "^7.7.1",
71
+ "@vitest/coverage-v8": "^3.2.4",
72
+ "@vitest/ui": "^3.2.4",
73
+ "c8": "^10.1.3",
74
+ "typescript": "latest",
75
+ "vitest": "^3.2.4"
76
+ }
77
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "description": "动态 flags 配置文件,用于声明所有支持的 CLI 标志",
3
+ "flags": [
4
+ {
5
+ "name": "enable-bff-save",
6
+ "description": "启用 Backend Function 同步工作流(安装含 BFF 的扩展指南)",
7
+ "type": "boolean"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,97 @@
1
+ # Lovrabet CLI 模板说明
2
+
3
+ 此目录包含 Lovrabet CLI 工具的模板文件。
4
+
5
+ ## 目录结构
6
+
7
+ ```
8
+ templates/
9
+ ├── README.md # 本说明文档
10
+ ├── generate-api/ # API 生成模板
11
+ └── projects/ # 项目模板,用于 `lovrabet create` 命令
12
+ └── sub-app-react-demo/ # Git 子模块,指向主模板仓库
13
+ ```
14
+
15
+ ## API 生成模板
16
+
17
+ `generate-api/` 目录包含用于生成 API 配置的模板。
18
+
19
+ ## 项目模板
20
+
21
+ ### Git 子模块同步
22
+
23
+ `projects/sub-app-react-demo/` 目录是一个 Git 子模块,指向:
24
+ **仓库地址**: https://github.com/lovrabet-ai/sub-app-react-demo
25
+
26
+ #### 开发者:同步模板
27
+
28
+ 更新项目模板到最新版本:
29
+
30
+ ```bash
31
+ # 方法一:使用内置同步脚本
32
+ npm run sync
33
+
34
+ # 方法二:手动 git 子模块命令
35
+ git submodule update --remote --merge
36
+ git add templates/projects/sub-app-react-demo
37
+ git commit -m "Update project template to latest version"
38
+ ```
39
+
40
+ #### 初始设置(新克隆时)
41
+
42
+ ```bash
43
+ # 初始化并更新所有子模块
44
+ git submodule update --init --recursive
45
+ ```
46
+
47
+ ### 模板结构
48
+
49
+ 项目模板应维护以下结构:
50
+ - 标准的 React + Vite 设置
51
+ - Ant Design 集成
52
+ - icestark 微前端配置
53
+ - 页面管理的路由配置
54
+
55
+ ## 贡献指南
56
+
57
+ 添加新模板时:
58
+
59
+ 1. **项目模板**:放置在 `templates/projects/` 中
60
+ 2. **文件扩展名**:需要处理的模板文件使用 `.tpl`
61
+ 3. **本地测试**:提交前使用新模板生成项目进行测试
62
+ 4. **更新此 README**:记录任何新功能
63
+
64
+ ## 注意事项
65
+
66
+ - 模板在项目生成过程中被复制和处理
67
+ - CLI 使用 `TemplateReplacer` 工具进行标签替换
68
+ - 生成的文件包含显示生成元数据的头部注释
69
+ - 所有模板支持国际化并可根据需要扩展
70
+
71
+ ## Cursor Rules 模板
72
+
73
+ ### 用途
74
+
75
+ `rules/` 目录包含 Cursor Rules 模板,用于指导 AI 助手(Claude、GPT 等)正确使用 Lovrabet SDK 和 MCP。
76
+
77
+ ### 功能特性
78
+
79
+ - ✅ **SDK 使用规范** - 完整的 API 调用指南
80
+ - ✅ **MCP Tools 指南** - 7 个 MCP 工具的详细说明
81
+ - ✅ **性能优化** - 避免不必要的 API 调用
82
+ - ✅ **错误处理** - 完善的错误处理模式
83
+ - ✅ **类型安全** - TypeScript 最佳实践
84
+ - ✅ **用户体验** - 加载状态、乐观更新等
85
+ - ✅ **常见错误避免** - 清单式检查
86
+
87
+ ### 使用方法
88
+
89
+ ```bash
90
+ # 项目级别配置(推荐)
91
+ cp templates/rules/.cursorrules ./
92
+
93
+ # 全局配置
94
+ cp templates/rules/.cursorrules ~/.cursorrules
95
+ ```
96
+
97
+ 详细说明请参考 `rules/README.md`。
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Generated by Lovrabet CLI
3
+ * Created: {CreatedAt}
4
+ *
5
+ * 这个文件包含了项目的模型配置,并自动注册到 SDK 中
6
+ * CLI 工具会自动维护这个文件,通常不需要手动修改
7
+ */
8
+
9
+ import { registerModels, CONFIG_NAMES, type ModelsConfig } from "@lovrabet/sdk";
10
+
11
+ export const RABETBASE_APP_CODE = "{AppCode}";
12
+
13
+ /**
14
+ * 项目的模型配置
15
+ * 使用数组格式,每个模型包含 datasetCode、tableName、name 和可选的 alias
16
+ *
17
+ * 访问方式:
18
+ * - 标准访问:client.models.dataset_[datasetCode]
19
+ * - 别名访问:client.models.[alias](如果配置了 alias)
20
+ */
21
+ export const RABETBASE_MODELS_CONFIG: ModelsConfig = {
22
+ appCode: RABETBASE_APP_CODE,
23
+ models: [{ModelConfigs}
24
+ ]
25
+ } as const;
26
+
27
+ /**
28
+ * 自动注册配置
29
+ * 配置名称: {ConfigName}
30
+ */
31
+ registerModels(RABETBASE_MODELS_CONFIG, {ConfigName});
32
+
33
+ /**
34
+ * 如果需要支持多项目或多环境,可以注册额外的配置:
35
+ *
36
+ * // 开发环境配置
37
+ * registerModels({
38
+ * appCode: 'app-dev-123',
39
+ * models: [...]
40
+ * }, 'dev');
41
+ *
42
+ * // 其他项目配置
43
+ * registerModels({
44
+ * appCode: 'other-project',
45
+ * models: [...]
46
+ * }, 'project-b');
47
+ */
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Lovrabet SDK 客户端实例
3
+ * Generated by Lovrabet CLI
4
+ * Created: {CreatedAt}
5
+ *
6
+ * 这个文件负责创建和导出统一的客户端实例,供整个应用使用
7
+ * 通过导入 './api' 文件来自动执行配置注册
8
+ */
9
+
10
+ import { createClient,CONFIG_NAMES } from "@lovrabet/sdk";
11
+ import "./{ApiFileName}"; // 导入配置文件,执行 registerModels() 注册
12
+
13
+ /**
14
+ * 主要的客户端实例
15
+ * 使用配置名称 '{ConfigName}' 创建客户端
16
+ */
17
+ export const lovrabetClient = createClient({ClientConfigParam});
18
+
19
+ /**
20
+ * 使用示例:
21
+ *
22
+ * // 在组件中使用
23
+ * import { lovrabetClient } from '@/api/client';
24
+ *
25
+ * // 获取数据列表
26
+ * const data = await lovrabetClient.models.{ExampleModelName}.getList({
27
+ * currentPage: 1,
28
+ * pageSize: 20
29
+ * });
30
+ *
31
+ * // 获取单条记录
32
+ * const record = await lovrabetClient.models.{ExampleModelName}.getOne('123');
33
+ *
34
+ * // 创建新记录
35
+ * const newRecord = await lovrabetClient.models.{ExampleModelName}.create({
36
+ * // 记录数据
37
+ * });
38
+ */
39
+
40
+ /**
41
+ * 其他创建客户端的方式(根据需要选择):
42
+ *
43
+ * 1. 使用默认配置(无参数调用):
44
+ * export const lovrabetClient = createClient();
45
+ *
46
+ * 2. 使用其他已注册的配置:
47
+ * export const devClient = createClient('dev');
48
+ * export const prodClient = createClient('prod');
49
+ *
50
+ * 3. 直接传入配置对象:
51
+ * import { RABETBASE_MODELS_CONFIG } from './api';
52
+ * export const lovrabetClient = createClient(RABETBASE_MODELS_CONFIG);
53
+ *
54
+ * 4. 通过 ClientConfig 指定配置名和其他选项:
55
+ * export const lovrabetClient = createClient({
56
+ * apiConfigName: 'default',
57
+ * token: 'custom-token',
58
+ * env: 'daily'
59
+ * });
60
+ *
61
+ * 5. 多项目支持示例:
62
+ * export const projectAClient = createClient('project-a');
63
+ * export const projectBClient = createClient('project-b');
64
+ */
@@ -0,0 +1,53 @@
1
+ # 更新记录
2
+
3
+ ## 2025-11-30
4
+
5
+ ### 📝 完善项目文档
6
+
7
+ 全面更新 README.md,使其准确反映当前项目状态。
8
+
9
+ **变更**:
10
+
11
+ - **项目结构更新**:更新为实际目录结构,包含所有现有页面(intro、workbench、dashboard、data-screen 等)
12
+ - **功能特性完善**:分为核心功能和技术特性两部分,详细描述各页面功能
13
+ - **SDK 使用指南**:更新为实际的 SDK 调用方式(filter、getOne、create、update、delete),添加动态获取模型列表说明
14
+ - **路由说明更新**:更新为当前实际的路由映射,补充布局系统说明
15
+ - **部署指南完善**:添加 CDN 部署的两种方式(标准部署和版本化部署),补充主应用集成步骤
16
+ - **新增开发注意事项**:添加环境要求、常见问题、代码规范等章节
17
+ - **添加相关资源链接**:补充 Lovrabet 开放平台和相关文档链接
18
+
19
+ ## 2025-09-14
20
+
21
+ ### 🔧 实现自动路由生成
22
+
23
+ 引入 `vite-plugin-pages` 插件,基于文件系统自动生成路由配置。
24
+
25
+ **变更**:
26
+
27
+ - 新增 `vite-plugin-pages` 依赖
28
+ - 路由配置改用虚拟模块 `~react-pages`
29
+ - `HelloWorld.tsx` → `index.tsx` 作为默认首页
30
+
31
+ **使用**:
32
+
33
+ - `src/pages/index.tsx` → `/`
34
+ - `src/pages/table-display.tsx` → `/table-display`
35
+ - `src/pages/chart-fetch/index.tsx` → `/chart-fetch` (目录结构)
36
+
37
+ 支持文件和目录两种结构,新增页面只需在 `src/pages/` 下创建文件,无需手动配置路由。
38
+
39
+ ## 2025-09-12
40
+
41
+ ### 全面切换www.lovrabet.com域名
42
+
43
+ Lovrabet启用新品牌域名 Lovrabet.com,并为了简化API架构,我们将原有的 `smartapi/dbapi` 双调用方式统一为单一 api 接口,同时迁移域名并简化URL路径结构。
44
+
45
+ 快速替换指南:
46
+
47
+ 将所有的
48
+ `https://api.yuntooai.com/smartapi/runtime/[tenantCode]/`
49
+ `https://api.yuntooai.com/dbapi/runtime/[tenantCode]/`
50
+ 批量替换为
51
+ `https://runtime.lovrabet.com/api/`
52
+
53
+ 详情可查看 [Lovrabet API 地址规则变更通知](./docs/API_RULE_CHANGE.md)