node-karin 1.8.7 → 1.8.9

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 (29) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/index.d.ts +8 -2
  3. package/dist/index.mjs +30 -20
  4. package/dist/web/assets/js/components-D6OCw7kO.js.br +0 -0
  5. package/dist/web/assets/js/entry-BP2jjfVR.js.br +0 -0
  6. package/dist/web/assets/js/hooks-BoS7DPVe.js.br +0 -0
  7. package/dist/web/assets/js/page-404.tsx-BVlJR0f3.js +1 -0
  8. package/dist/web/assets/js/page-dashboard-BX_VXjx6.js.br +0 -0
  9. package/dist/web/assets/js/page-loading.tsx-Cz1_t9kn.js.br +0 -0
  10. package/dist/web/assets/js/page-login.tsx-hUBVA6ws.js.br +0 -0
  11. package/dist/web/assets/js/{utils-x5AKiszG.js → utils-DSlRvNHw.js} +1 -1
  12. package/dist/web/assets/js/vendor-heroui-96DnnqOT.js.br +0 -0
  13. package/dist/web/assets/js/vendor-others-D7Rwl1O6.js.br +0 -0
  14. package/dist/web/assets/js/vendor-react-BDRVXu1f.js.br +0 -0
  15. package/dist/web/assets/js/vendor-visual-BMhnpZxY.js.br +0 -0
  16. package/dist/web/index.html +9 -9
  17. package/package.json +4 -3
  18. package/README.md +0 -95
  19. package/dist/web/assets/js/components-SKlAGqzh.js.br +0 -0
  20. package/dist/web/assets/js/entry-vKz092kA.js.br +0 -0
  21. package/dist/web/assets/js/hooks-Cx1Yu0OX.js.br +0 -0
  22. package/dist/web/assets/js/page-404.tsx-BXEV4NBF.js +0 -1
  23. package/dist/web/assets/js/page-dashboard-BU7cB7ZI.js.br +0 -0
  24. package/dist/web/assets/js/page-loading.tsx-CJaYj8cR.js.br +0 -0
  25. package/dist/web/assets/js/page-login.tsx-CfavJf9W.js.br +0 -0
  26. package/dist/web/assets/js/vendor-heroui-D6FhP6a0.js.br +0 -0
  27. package/dist/web/assets/js/vendor-others-B6NXaB-r.js.br +0 -0
  28. package/dist/web/assets/js/vendor-react-Hg1DVPZt.js.br +0 -0
  29. package/dist/web/assets/js/vendor-visual-mzxhMYK3.js.br +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # 更新日志
2
2
 
3
+ ## [1.8.8](https://github.com/KarinJS/Karin/compare/core-v1.8.7...core-v1.8.8) (2025-05-07)
4
+
5
+
6
+ ### 🐛 Bug Fixes
7
+
8
+ * `.npmrc` ([#404](https://github.com/KarinJS/Karin/issues/404)) ([7769c31](https://github.com/KarinJS/Karin/commit/7769c31b63f7d458d4f4ca21ba4c2cd523c83b5e))
9
+ * **onebot:** 控制台不输出`base64://...` ([#402](https://github.com/KarinJS/Karin/issues/402)) ([a51d382](https://github.com/KarinJS/Karin/commit/a51d382feda71bc5838a085d0123ea7ec9e56213))
10
+
3
11
  ## [1.8.7](https://github.com/KarinJS/Karin/compare/core-v1.8.6...core-v1.8.7) (2025-05-07)
4
12
 
5
13
 
package/dist/index.d.ts CHANGED
@@ -11347,8 +11347,9 @@ declare const restart: (selfId: string, contact: Contact, messageId: string, isF
11347
11347
  }>;
11348
11348
  /**
11349
11349
  * 直接重启
11350
+ * @param isPm2 - 是否为pm2重启 默认false
11350
11351
  */
11351
- declare const restartDirect: () => Promise<void>;
11352
+ declare const restartDirect: (isPm2?: boolean) => Promise<void>;
11352
11353
 
11353
11354
  /** fileToUrl Handler键 */
11354
11355
  declare const fileToUrlHandlerKey = "fileToUrl";
@@ -12169,6 +12170,10 @@ declare const timeout: () => number;
12169
12170
  */
12170
12171
  declare const webSocketServerToken: () => string;
12171
12172
 
12173
+ /**
12174
+ * 读取config.json 不走缓存
12175
+ */
12176
+ declare const readConfig: (dir: string) => Config;
12172
12177
  /**
12173
12178
  * @public 公开Api
12174
12179
  * @description 获取配置 `config.json`
@@ -12358,6 +12363,7 @@ declare const index_pkg: typeof pkg;
12358
12363
  declare const index_pm2: typeof pm2;
12359
12364
  declare const index_port: typeof port;
12360
12365
  declare const index_privates: typeof privates;
12366
+ declare const index_readConfig: typeof readConfig;
12361
12367
  declare const index_setConfig: typeof setConfig;
12362
12368
  declare const index_setEnv: typeof setEnv;
12363
12369
  declare const index_setYaml: typeof setYaml;
@@ -12366,7 +12372,7 @@ declare const index_updateLevel: typeof updateLevel;
12366
12372
  declare const index_webSocketServerToken: typeof webSocketServerToken;
12367
12373
  declare const index_writeEnv: typeof writeEnv;
12368
12374
  declare namespace index {
12369
- export { index_adapter as adapter, index_admin as admin, index_authKey as authKey, index_clearCache as clearCache, index_clearFiles as clearFiles, index_config as config, index_createCount as createCount, index_defaultConfig as defaultConfig, index_env as env, index_ffmpegPath as ffmpegPath, index_ffplayPath as ffplayPath, index_ffprobePath as ffprobePath, index_formatArray as formatArray, index_formatObject as formatObject, index_getCacheCfg as getCacheCfg, index_getDirectCfg as getDirectCfg, index_getEnv as getEnv, index_getFriendCfg as getFriendCfg, index_getGroupCfg as getGroupCfg, index_getGuildCfg as getGuildCfg, index_getRenderCfg as getRenderCfg, index_getYaml as getYaml, index_groups as groups, index_host as host, index_initConfigCache as initConfigCache, index_initPm2 as initPm2, index_master as master, index_mergeDegAndCfg as mergeDegAndCfg, index_pkg as pkg, index_pm2 as pm2, index_port as port, index_privates as privates, redis$1 as redis, render$1 as render, index_setConfig as setConfig, index_setEnv as setEnv, index_setYaml as setYaml, index_timeout as timeout, index_updateLevel as updateLevel, index_webSocketServerToken as webSocketServerToken, index_writeEnv as writeEnv };
12375
+ export { index_adapter as adapter, index_admin as admin, index_authKey as authKey, index_clearCache as clearCache, index_clearFiles as clearFiles, index_config as config, index_createCount as createCount, index_defaultConfig as defaultConfig, index_env as env, index_ffmpegPath as ffmpegPath, index_ffplayPath as ffplayPath, index_ffprobePath as ffprobePath, index_formatArray as formatArray, index_formatObject as formatObject, index_getCacheCfg as getCacheCfg, index_getDirectCfg as getDirectCfg, index_getEnv as getEnv, index_getFriendCfg as getFriendCfg, index_getGroupCfg as getGroupCfg, index_getGuildCfg as getGuildCfg, index_getRenderCfg as getRenderCfg, index_getYaml as getYaml, index_groups as groups, index_host as host, index_initConfigCache as initConfigCache, index_initPm2 as initPm2, index_master as master, index_mergeDegAndCfg as mergeDegAndCfg, index_pkg as pkg, index_pm2 as pm2, index_port as port, index_privates as privates, index_readConfig as readConfig, redis$1 as redis, render$1 as render, index_setConfig as setConfig, index_setEnv as setEnv, index_setYaml as setYaml, index_timeout as timeout, index_updateLevel as updateLevel, index_webSocketServerToken as webSocketServerToken, index_writeEnv as writeEnv };
12370
12376
  }
12371
12377
 
12372
12378
  /**
package/dist/index.mjs CHANGED
@@ -3924,21 +3924,24 @@ function AdapterConvertKarin(data = []) {
3924
3924
  }
3925
3925
  return elements;
3926
3926
  }
3927
- var buildError, fileToBase64, KarinConvertAdapter;
3927
+ var formatLogString, buildError, fileToBase64, KarinConvertAdapter;
3928
3928
  var init_convert = __esm({
3929
3929
  "src/adapter/onebot/core/convert.ts"() {
3930
3930
  init_message2();
3931
+ formatLogString = (str) => {
3932
+ return str.replace(/(["']?(?:base64|base):\/\/)[^"',}\s]*["']?/g, "$1...");
3933
+ };
3931
3934
  buildError = (selfId, action, request2, error) => {
3932
3935
  if (error) {
3933
3936
  const err = JSON.stringify(error, null, 2).replace(/\\n/g, "\n");
3934
3937
  return new Error(`[${selfId}][sendApi] \u8BF7\u6C42\u9519\u8BEF:
3935
3938
  action: ${action}
3936
- params: ${request2}
3939
+ params: ${formatLogString(request2)}
3937
3940
  error: ${err}}`);
3938
3941
  }
3939
3942
  logger.error(`[${selfId}][sendApi][\u8BF7\u6C42\u9519\u8BEF]:
3940
3943
  action: ${action}
3941
- params: ${request2}`);
3944
+ params: ${formatLogString(request2)}`);
3942
3945
  };
3943
3946
  fileToBase64 = (file, url) => {
3944
3947
  if (!url || !file.startsWith("file://")) return file;
@@ -9499,14 +9502,14 @@ var init_ws = __esm({
9499
9502
  self_id: this.selfId
9500
9503
  };
9501
9504
  if (json3.echo) {
9502
- logger.bot("debug", this.selfId, `Api\u8C03\u7528\u56DE\u5E94: ${str}`);
9505
+ logger.bot("debug", this.selfId, `Api\u8C03\u7528\u56DE\u5E94: ${formatLogString(str)}`);
9503
9506
  return this.socket.emit(json3.echo, json3);
9504
9507
  } else {
9505
9508
  if (data.post_type === "meta_event" /* MetaEvent */ && data.meta_event_type === "heartbeat") {
9506
9509
  logger.bot("trace", this.selfId, "\u5FC3\u8DF3");
9507
9510
  return;
9508
9511
  }
9509
- logger.bot("debug", this.selfId, `\u6536\u5230\u4E0A\u62A5\u4E8B\u4EF6: ${str}`);
9512
+ logger.bot("debug", this.selfId, `\u6536\u5230\u4E0A\u62A5\u4E8B\u4EF6: ${formatLogString(str)}`);
9510
9513
  }
9511
9514
  this.eventHandlers(data, str);
9512
9515
  });
@@ -9560,7 +9563,7 @@ var init_ws = __esm({
9560
9563
  if (!time2) time2 = timeout();
9561
9564
  const echo = ++this.seq + "";
9562
9565
  const request2 = JSON.stringify({ echo, action, params });
9563
- logger.bot("debug", this.selfId, `\u53D1\u9001Api\u8BF7\u6C42 ${action}: ${request2}`);
9566
+ logger.bot("debug", this.selfId, `\u53D1\u9001Api\u8BF7\u6C42 ${action}: ${formatLogString(request2)}`);
9564
9567
  return new Promise((resolve, reject) => {
9565
9568
  const timeoutId = setTimeout(() => {
9566
9569
  reject(buildError(this.selfId, action, request2, "\u8BF7\u6C42\u8D85\u65F6"));
@@ -11172,9 +11175,9 @@ var init_restart = __esm({
11172
11175
  if (error) return { status: "failed", data: error };
11173
11176
  process.exit();
11174
11177
  };
11175
- restartDirect = async () => {
11178
+ restartDirect = async (isPm2 = false) => {
11176
11179
  logger.mark("\u6536\u5230\u91CD\u542F\u8BF7\u6C42\uFF0C\u6B63\u5728\u91CD\u542F...");
11177
- if (process?.send) {
11180
+ if (!isPm2 && process?.send) {
11178
11181
  process.send(JSON.stringify({
11179
11182
  type: "restart",
11180
11183
  port: process.env.HTTP_PORT,
@@ -11190,10 +11193,8 @@ var init_restart = __esm({
11190
11193
  if (process.env.RUNTIME === "tsx") {
11191
11194
  throw new Error("tsx \u4E0D\u652F\u6301\u91CD\u542F");
11192
11195
  }
11193
- if (process?.send) {
11194
- process.send("restart");
11195
- logger.mark("\u53D1\u9001\u91CD\u542F\u4FE1\u53F7\u6210\u529F");
11196
- }
11196
+ const { error } = await exec("npx karin pm2");
11197
+ if (error) throw error;
11197
11198
  };
11198
11199
  }
11199
11200
  });
@@ -11750,10 +11751,10 @@ var HttpAdapterOneBot11;
11750
11751
  var init_http = __esm({
11751
11752
  "src/adapter/onebot/connect/http.ts"() {
11752
11753
  init_utils2();
11753
- init_convert();
11754
11754
  init_base3();
11755
11755
  init_listeners();
11756
11756
  init_bot();
11757
+ init_convert();
11757
11758
  init_types2();
11758
11759
  init_register();
11759
11760
  HttpAdapterOneBot11 = class extends AdapterOneBot {
@@ -11820,7 +11821,7 @@ var init_http = __esm({
11820
11821
  async sendApi(action, params, time2 = 120) {
11821
11822
  if (!time2) time2 = config_exports.timeout();
11822
11823
  const request2 = JSON.stringify(params);
11823
- logger.bot("debug", this.selfId, `\u53D1\u9001Api\u8BF7\u6C42 ${action}: ${request2}`);
11824
+ logger.bot("debug", this.selfId, `\u53D1\u9001Api\u8BF7\u6C42 ${action}: ${formatLogString(request2)}`);
11824
11825
  try {
11825
11826
  const token = getHttpBotApiToken(this.selfId);
11826
11827
  const headers = token ? { Authorization: `Bearer ${token}` } : {};
@@ -16111,6 +16112,7 @@ __export(config_exports, {
16111
16112
  pm2: () => pm2,
16112
16113
  port: () => port,
16113
16114
  privates: () => privates,
16115
+ readConfig: () => readConfig,
16114
16116
  redis: () => redis,
16115
16117
  render: () => render2,
16116
16118
  setConfig: () => setConfig,
@@ -16624,7 +16626,7 @@ var init_adapter = __esm({
16624
16626
  });
16625
16627
 
16626
16628
  // src/utils/config/file/config.ts
16627
- var cache7, initConfig, config2, master, admin, config_default;
16629
+ var cache7, initConfig, readConfig, config2, master, admin, config_default;
16628
16630
  var init_config2 = __esm({
16629
16631
  "src/utils/config/file/config.ts"() {
16630
16632
  init_tools();
@@ -16644,6 +16646,12 @@ var init_config2 = __esm({
16644
16646
  listeners.emit(`${FILE_CHANGE}:${name}`, options);
16645
16647
  }, { type: "json" });
16646
16648
  };
16649
+ readConfig = (dir2) => {
16650
+ const name = "config.json";
16651
+ const file = `${dir2}/${name}`;
16652
+ const data = requireFileSync(file, { type: "json" });
16653
+ return formatObject(data);
16654
+ };
16647
16655
  config2 = () => cache7;
16648
16656
  master = () => config2().master;
16649
16657
  admin = () => config2().admin;
@@ -19992,12 +20000,13 @@ var init_refresh = __esm({
19992
20000
  var getConfig, saveConfig;
19993
20001
  var init_config3 = __esm({
19994
20002
  "src/server/config/index.ts"() {
20003
+ init_root();
19995
20004
  init_response();
19996
20005
  init_config();
19997
20006
  getConfig = async (req, res) => {
19998
20007
  const { type } = req.body;
19999
20008
  if (type === "config") {
20000
- const cfg = config2();
20009
+ const cfg = readConfig(karinPathConfig);
20001
20010
  return createSuccessResponse(res, cfg);
20002
20011
  }
20003
20012
  if (type === "adapter") {
@@ -20470,9 +20479,10 @@ var init_manage = __esm({
20470
20479
  "src/server/system/manage.ts"() {
20471
20480
  init_restart();
20472
20481
  init_response();
20473
- restartRouter = async (_req, res) => {
20482
+ restartRouter = async (req, res) => {
20483
+ const { isPm2 } = req.body;
20474
20484
  createSuccessResponse(res, null, "\u91CD\u542F\u6307\u4EE4\u53D1\u9001\u6210\u529F");
20475
- restartDirect();
20485
+ restartDirect(isPm2 ?? false);
20476
20486
  };
20477
20487
  exitRouter = async (_req, res) => {
20478
20488
  logger.mark("\u6536\u5230\u9000\u51FA\u8BF7\u6C42\uFF0C\u6B63\u5728\u9000\u51FA...");
@@ -23050,7 +23060,7 @@ var init_npmrc = __esm({
23050
23060
  };
23051
23061
  getNpmConfig = async (keys) => {
23052
23062
  if (typeof keys === "string") {
23053
- const { stdout } = await exec(`npm config get ${keys}`);
23063
+ const { stdout } = await exec(`npm config get ${keys}`, { env: {} });
23054
23064
  return stdout.trim();
23055
23065
  }
23056
23066
  const listResult = [];
@@ -23061,7 +23071,7 @@ var init_npmrc = __esm({
23061
23071
  return listResult;
23062
23072
  };
23063
23073
  setNpmConfig = async (key, value) => {
23064
- await exec(`npm config set ${key} ${value}`);
23074
+ await exec(`npm config set "${key}" "${value}"`);
23065
23075
  };
23066
23076
  }
23067
23077
  });
@@ -0,0 +1 @@
1
+ import{j as t}from"./vendor-react-BDRVXu1f.js";import{P as r}from"./components-D6OCw7kO.js";import"./vendor-others-D7Rwl1O6.js";import"./vendor-editor-B8hjWfkw.js";import"./vendor-ui-utils-5rYIvRjL.js";import"./vendor-heroui-96DnnqOT.js";import"./page-dashboard-BX_VXjx6.js";import"./hooks-BoS7DPVe.js";import"./utils-DSlRvNHw.js";import"./vendor-visual-BMhnpZxY.js";const x=()=>t.jsx("div",{className:"min-h-screen flex items-center justify-center",children:t.jsx(r,{})});export{x as default};
@@ -1,2 +1,2 @@
1
- import{V as p}from"./vendor-react-Hg1DVPZt.js";import{a5 as g}from"./components-SKlAGqzh.js";const k=async(t,n,e,r)=>{const{setIsLogModalOpen:i,setTaskId:c,setTaskLogs:o,setTaskName:f}=n;f("更新插件");const a=["开始创建更新任务...",`options: ${JSON.stringify(t)}`];o(a);try{const s=await g(t);if(s.success&&s.taskId)c(s.taskId),o([...a,`
1
+ import{V as p}from"./vendor-react-BDRVXu1f.js";import{a5 as g}from"./components-D6OCw7kO.js";const k=async(t,n,e,r)=>{const{setIsLogModalOpen:i,setTaskId:c,setTaskLogs:o,setTaskName:f}=n;f("更新插件");const a=["开始创建更新任务...",`options: ${JSON.stringify(t)}`];o(a);try{const s=await g(t);if(s.success&&s.taskId)c(s.taskId),o([...a,`
2
2
  任务创建成功!`,`任务ID: ${s.taskId}`,"正在连接任务执行日志..."]),i(!0),typeof e=="function"&&e(),typeof r=="function"&&r();else throw new Error(s.message||"未知错误")}catch(s){console.error("更新失败:",s),p.error(`更新失败: ${s.message}`)}};export{k as c};
@@ -14,17 +14,17 @@
14
14
  content="viewport-fit=cover, width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
15
15
  name="viewport" />
16
16
  <link href="/web/assets/ico/favicon-BoqZd694.ico" rel="icon" />
17
- <script type="module" crossorigin src="/web/assets/js/entry-vKz092kA.js"></script>
17
+ <script type="module" crossorigin src="/web/assets/js/entry-BP2jjfVR.js"></script>
18
18
  <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-editor-B8hjWfkw.js">
19
- <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-others-B6NXaB-r.js">
19
+ <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-others-D7Rwl1O6.js">
20
20
  <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-ui-utils-5rYIvRjL.js">
21
- <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-react-Hg1DVPZt.js">
22
- <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-heroui-D6FhP6a0.js">
23
- <link rel="modulepreload" crossorigin href="/web/assets/js/hooks-Cx1Yu0OX.js">
24
- <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-visual-mzxhMYK3.js">
25
- <link rel="modulepreload" crossorigin href="/web/assets/js/components-SKlAGqzh.js">
26
- <link rel="modulepreload" crossorigin href="/web/assets/js/utils-x5AKiszG.js">
27
- <link rel="modulepreload" crossorigin href="/web/assets/js/page-dashboard-BU7cB7ZI.js">
21
+ <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-react-BDRVXu1f.js">
22
+ <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-heroui-96DnnqOT.js">
23
+ <link rel="modulepreload" crossorigin href="/web/assets/js/hooks-BoS7DPVe.js">
24
+ <link rel="modulepreload" crossorigin href="/web/assets/js/vendor-visual-BMhnpZxY.js">
25
+ <link rel="modulepreload" crossorigin href="/web/assets/js/components-D6OCw7kO.js">
26
+ <link rel="modulepreload" crossorigin href="/web/assets/js/utils-DSlRvNHw.js">
27
+ <link rel="modulepreload" crossorigin href="/web/assets/js/page-dashboard-BX_VXjx6.js">
28
28
  <link rel="stylesheet" crossorigin href="/web/assets/css/vendor-editor-CFbL2ovg.css">
29
29
  <link rel="stylesheet" crossorigin href="/web/assets/css/vendor-others-ZgkIHsf0.css">
30
30
  <link rel="stylesheet" crossorigin href="/web/assets/css/components-ep7vm38G.css">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-karin",
3
- "version": "1.8.7",
3
+ "version": "1.8.9",
4
4
  "description": "Lightweight, efficient, concise, and stable robot framework.",
5
5
  "keywords": [
6
6
  "node",
@@ -155,7 +155,8 @@
155
155
  "pr": "node cli/pr.js all",
156
156
  "pub": "npm publish --access public",
157
157
  "pub-beta": "npm publish --access public --tag beta",
158
- "sort": "sort-package-json && sort-json tsconfig.json"
158
+ "sort": "sort-package-json && sort-json tsconfig.json",
159
+ "sync": "curl -X PUT \"https://registry-direct.npmmirror.com/-/package/node-karin/syncs\""
159
160
  },
160
161
  "dependencies": {
161
162
  "art-template": "npm:@karinjs/art-template@1.1.0",
@@ -189,4 +190,4 @@
189
190
  "registry": "https://registry.npmjs.org"
190
191
  },
191
192
  "time": "2025-05-03T19:55:55.123Z"
192
- }
193
+ }
package/README.md DELETED
@@ -1,95 +0,0 @@
1
- ![karin](https://socialify.git.ci/karinjs/karin/image?description=1&font=Bitter&forks=1&issues=1&language=1&logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F162426977%3Fs%3D200%26v%3D4&name=1&owner=1&pulls=1&stargazers=1&theme=Auto)
2
-
3
- ## 项目介绍
4
-
5
- `karin`(卡琳)是一款灵活、现代、极易扩展的 Node.js 插件化应用框架,专为开发者打造,助你轻松构建属于自己的高效工具链和自动化服务。
6
-
7
- ✨ **主要特性**:
8
- - 插件化架构,支持热插拔,生态丰富
9
- - 一行命令即可初始化项目,快速上手
10
- - 丰富的 Web UI(基于 React + HeroUI),颜值与功能并存
11
- - 支持多种自动化场景、任务调度、依赖管理
12
- - 轻松集成第三方服务,打造属于你的"数字助理"
13
- - 社区活跃,持续更新,文档完善
14
-
15
- > 🦄 让开发变得像魔法一样有趣!
16
-
17
- ## 🚀 稳定长期维护
18
-
19
- 自 `1.8.0` 版本起,Karin 已进入**稳定长期维护阶段**。我们承诺持续修复 bug、优化体验,并欢迎社区力量共同完善生态。
20
-
21
- ## 快速开始
22
-
23
- [📚 查看最新文档](https://karin.fun/)
24
-
25
- 一键初始化:`pnpm create karin`
26
-
27
- > 当前文档可能存在滞后性,欢迎加入交流群(967068507)一起玩耍、提建议!
28
-
29
- ## 温馨提示
30
-
31
- > Karin 现已稳定,放心食用!遇到问题欢迎提 Issue 或加群讨论,我们会持续优化。
32
-
33
- ## 文档站说明
34
-
35
- 我们提供多个文档站点供您访问,解决可能出现的访问困难:
36
-
37
- - **主文档站**: [https://karin.fun](https://karin.fun) (基于 GitHub Pages)
38
- - **镜像站点**:
39
- - 憨憨镜像: [https://karin.hanhanz.top](https://karin.hanhanz.top) (**推荐访问**)
40
- - Vercel 镜像: [https://docs.karin.fun](https://docs.karin.fun) (**推荐访问**)
41
- - Deno 镜像: [https://karin.deno.dev](https://karin.deno.dev) (**推荐访问**)
42
-
43
- > 💡 主文档站托管在 GitHub 上,如访问不畅,推荐使用 Deno 镜像站
44
-
45
- ## 鸣谢
46
-
47
- - webui: [bietiaop](https://github.com/bietiaop)
48
- - docs: [ikenxuan](https://github.com/ikenxuan)
49
- - name: [fuqiuluo](https://github.com/fuqiuluo)
50
-
51
- > 🧙‍♂️ 感谢两位大佬的魔法加持!
52
-
53
- ### 贡献者
54
-
55
- > 🌟 星光闪烁,你们的智慧如同璀璨的夜空。感谢所有为 **Karin** 做出贡献的人!
56
-
57
- [![贡献者](https://contributors-img.web.app/image?repo=KarinJS/Karin)](https://github.com/KarinJS/Karin/graphs/contributors)
58
-
59
- ![Alt](https://repobeats.axiom.co/api/embed/aaaa2759c8885691443a4d80e5753f975d4f250e.svg "Repobeats analytics image")
60
-
61
- ---
62
-
63
- 🎉 **加入我们,让 Karin 成为你开发路上的贴心伙伴!**
64
-
65
- ## 常见问题
66
-
67
- - 文档没看懂?[点我提问](https://github.com/KarinJS/Karin/issues) 或加群 967068507
68
- - 插件不会写?欢迎参考[插件开发文档](https://karin.fun/plugins/)
69
- - 遇到 bug?大胆提 Issue,我们超快响应!
70
-
71
- ## 如何参与贡献(PR)
72
-
73
- 1. Fork 本仓库,创建你的分支
74
- 2. 提交你的更改,附上简要说明
75
- 3. 发起 Pull Request,耐心等待 Review
76
- 4. 你的名字将出现在贡献者列表,收获一份开源荣誉!
77
-
78
- > 💡 欢迎任何形式的贡献,无论是代码、文档、建议还是灵感!
79
-
80
- ## Issue 指南
81
-
82
- - 提交前请先搜索是否有类似问题
83
- - 尽量提供详细的复现步骤、环境信息和截图
84
- - 标题简明扼要,正文描述清晰
85
- - 遇到安全相关问题请私信维护者
86
-
87
- ## 开源协议
88
-
89
- 本项目基于 [MIT License](./LICENSE) 开源,欢迎自由使用、修改和分发。
90
-
91
- > 📢 记得给个 Star 支持我们,你的支持是我们最大的动力!
92
-
93
- ## 更新日志
94
-
95
- 我们定期发布更新,查看 [CHANGELOG](https://github.com/KarinJS/Karin/releases) 了解最新变化。
@@ -1 +0,0 @@
1
- import{j as t}from"./vendor-react-Hg1DVPZt.js";import{P as r}from"./components-SKlAGqzh.js";import"./vendor-others-B6NXaB-r.js";import"./vendor-editor-B8hjWfkw.js";import"./vendor-ui-utils-5rYIvRjL.js";import"./vendor-heroui-D6FhP6a0.js";import"./page-dashboard-BU7cB7ZI.js";import"./hooks-Cx1Yu0OX.js";import"./utils-x5AKiszG.js";import"./vendor-visual-mzxhMYK3.js";const x=()=>t.jsx("div",{className:"min-h-screen flex items-center justify-center",children:t.jsx(r,{})});export{x as default};