@xrkseek/harness 0.6.0-rc.2 → 0.6.0

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 (78) hide show
  1. package/node_modules/@xrkseek/exec-fs/dist/index.d.ts.map +1 -1
  2. package/node_modules/@xrkseek/exec-fs/dist/index.js +65 -8
  3. package/node_modules/@xrkseek/exec-fs/dist/index.js.map +1 -1
  4. package/node_modules/@xrkseek/exec-fs/dist/routing-prompt.d.ts.map +1 -1
  5. package/node_modules/@xrkseek/exec-fs/dist/routing-prompt.js +5 -3
  6. package/node_modules/@xrkseek/exec-fs/dist/routing-prompt.js.map +1 -1
  7. package/node_modules/@xrkseek/exec-fs/dist/search.d.ts +2 -0
  8. package/node_modules/@xrkseek/exec-fs/dist/search.d.ts.map +1 -1
  9. package/node_modules/@xrkseek/exec-fs/dist/search.js.map +1 -1
  10. package/node_modules/@xrkseek/exec-pty/dist/backend.d.ts +5 -0
  11. package/node_modules/@xrkseek/exec-pty/dist/backend.d.ts.map +1 -1
  12. package/node_modules/@xrkseek/exec-pty/dist/backend.js +4 -1
  13. package/node_modules/@xrkseek/exec-pty/dist/backend.js.map +1 -1
  14. package/node_modules/@xrkseek/exec-pty/dist/index.d.ts +5 -0
  15. package/node_modules/@xrkseek/exec-pty/dist/index.d.ts.map +1 -1
  16. package/node_modules/@xrkseek/exec-pty/dist/index.js +3 -0
  17. package/node_modules/@xrkseek/exec-pty/dist/index.js.map +1 -1
  18. package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
  19. package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
  20. package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
  21. package/node_modules/@xrkseek/server-face/dist/approvals.d.ts.map +1 -1
  22. package/node_modules/@xrkseek/server-face/dist/approvals.js +6 -3
  23. package/node_modules/@xrkseek/server-face/dist/approvals.js.map +1 -1
  24. package/node_modules/@xrkseek/server-face/dist/index.d.ts +1 -1
  25. package/node_modules/@xrkseek/server-face/dist/index.d.ts.map +1 -1
  26. package/node_modules/@xrkseek/server-face/dist/index.js +1 -1
  27. package/node_modules/@xrkseek/server-face/dist/index.js.map +1 -1
  28. package/node_modules/@xrkseek/server-face/dist/permissions.d.ts +2 -1
  29. package/node_modules/@xrkseek/server-face/dist/permissions.d.ts.map +1 -1
  30. package/node_modules/@xrkseek/server-face/dist/permissions.js +6 -5
  31. package/node_modules/@xrkseek/server-face/dist/permissions.js.map +1 -1
  32. package/node_modules/@xrkseek/server-face/dist/session-capability.d.ts.map +1 -1
  33. package/node_modules/@xrkseek/server-face/dist/session-capability.js +4 -3
  34. package/node_modules/@xrkseek/server-face/dist/session-capability.js.map +1 -1
  35. package/node_modules/@xrkseek/server-face/dist/session-posture.d.ts +3 -3
  36. package/node_modules/@xrkseek/server-face/dist/session-posture.js +9 -9
  37. package/node_modules/@xrkseek/server-face/dist/session-posture.js.map +1 -1
  38. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/demand-translate.d.ts +4 -0
  39. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/demand-translate.d.ts.map +1 -0
  40. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/demand-translate.js +54 -0
  41. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/demand-translate.js.map +1 -0
  42. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/home-config.d.ts +4 -0
  43. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/home-config.d.ts.map +1 -0
  44. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/home-config.js +61 -0
  45. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/home-config.js.map +1 -0
  46. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/index.d.ts +9 -0
  47. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/index.d.ts.map +1 -0
  48. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/index.js +24 -0
  49. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/index.js.map +1 -0
  50. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/mainline-sideline.d.ts +4 -0
  51. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/mainline-sideline.d.ts.map +1 -0
  52. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/mainline-sideline.js +46 -0
  53. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/mainline-sideline.js.map +1 -0
  54. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/memory-polish.d.ts +4 -0
  55. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/memory-polish.d.ts.map +1 -0
  56. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/memory-polish.js +38 -0
  57. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/memory-polish.js.map +1 -0
  58. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/plugin-dev.d.ts +4 -0
  59. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/plugin-dev.d.ts.map +1 -0
  60. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/plugin-dev.js +114 -0
  61. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/plugin-dev.js.map +1 -0
  62. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/skill-merge.d.ts +4 -0
  63. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/skill-merge.d.ts.map +1 -0
  64. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/skill-merge.js +36 -0
  65. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/skill-merge.js.map +1 -0
  66. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/xrk-cleanup.d.ts +4 -0
  67. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/xrk-cleanup.d.ts.map +1 -0
  68. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/xrk-cleanup.js +61 -0
  69. package/node_modules/@xrkseek/server-face/dist/xiangyang-skill-bodies/xrk-cleanup.js.map +1 -0
  70. package/node_modules/@xrkseek/server-face/dist/xiangyang-skills.d.ts +15 -4
  71. package/node_modules/@xrkseek/server-face/dist/xiangyang-skills.d.ts.map +1 -1
  72. package/node_modules/@xrkseek/server-face/dist/xiangyang-skills.js +18 -92
  73. package/node_modules/@xrkseek/server-face/dist/xiangyang-skills.js.map +1 -1
  74. package/node_modules/@xrkseek/server-host/dist/index.d.ts +10 -0
  75. package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
  76. package/node_modules/@xrkseek/server-host/dist/index.js +14 -7
  77. package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
  78. package/package.json +1 -1
@@ -0,0 +1,61 @@
1
+ /** Xiangyang skill body: Settings / MCP / models / credentials. */
2
+ export const ID = "xrk-home-config";
3
+ export const BODY = `---
4
+ name: xrk-home-config
5
+ description: >-
6
+ Configure Host settings, MCP, models, theme via settings tools and Credentials.
7
+ Use when the user asks to install MCP, add models, fix API keys, or change Settings.
8
+ ---
9
+
10
+ # 家目录配置(Settings · MCP · 模型)
11
+
12
+ 配置在 **\`~/.xrk\`**,与当前编码工作区无关。向阳会话可直接改。
13
+ 优先走与 Settings UI **同一写入路径**的工具,勿手改 yaml(除非用户明确要求)。
14
+
15
+ ## 工具
16
+
17
+ | 工具 | 作用 |
18
+ |------|------|
19
+ | \`settings_get\` | 列 ns 或读当前快照——**先读再改** |
20
+ | \`settings_mutate\` | 与 UI Save 同路径;多数 ns live(含主题) |
21
+
22
+ 密钥 → **Credentials**(设置里的凭据 / Face credentials),**永不**写进聊天、skill、插件源码、MCP args 明文。
23
+
24
+ ## MCP
25
+
26
+ 1. \`settings_get\` 看现有 \`mcp\` / servers。
27
+ 2. \`settings_mutate\` 增删改 \`servers[]\`(\`command\` · \`args\` · \`cwd\` · 代理 env 键如 \`HTTP_PROXY\`)。
28
+ 3. 等 remount;用 \`/mcp\` 或工具名 \`mcp__…\` 验证。
29
+ 4. policy deny → park,别硬刷 restart。
30
+ 5. 已有 MCP 包 → **挂 MCP**,不要再包一层进程插件(插件见 \`xrk-plugin-dev-care\`)。
31
+
32
+ 也可提示用户:Settings → Plugins → MCP,可粘贴 Cursor 风格 \`{ "mcpServers": { … } }\`。
33
+
34
+ ## 模型
35
+
36
+ 1. Settings → Models:提供方 + 密钥(自定义要 Base URL)。
37
+ 2. 添加模型 ID(可「获取可用模型」);**必须保存**卡片。
38
+ 3. 对话芯片或 \`/model provider/model\` 选择。
39
+ 4. 选择器空 = 未保存或无模型行;fetch 失败仍可手填 ID。
40
+
41
+ ## 外观与其它
42
+
43
+ - 主题:\`/theme light|dark|system\` 或 \`ns=ui-theme\`。
44
+ - Web search / Voice / 图像·视频等:Plugins 对应卡;密钥走 Credentials。
45
+ - 权限默认档:Settings → Permissions(含自动审查等)——改前说明影响。
46
+
47
+ ## 步骤清单
48
+
49
+ - [ ] \`settings_get\` 确认 ns
50
+ - [ ] \`settings_mutate\` 只改需要的字段(勿整表盲覆盖)
51
+ - [ ] 密钥进 Credentials
52
+ - [ ] 验证:MCP 工具名 / 模型芯片 / 主题已变
53
+
54
+ ## 反模式
55
+
56
+ - 未 \`settings_get\` 就覆盖整份 settings。
57
+ - 让用户把 API key 贴进对话。
58
+ - MCP 连不上却只狂 \`xrkh restart\`。
59
+ - 用改工作区业务配置代替 Host Settings。
60
+ `;
61
+ //# sourceMappingURL=home-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-config.js","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/home-config.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC;AAEpC,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDnB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface XiangyangSkillSeed {
2
+ readonly id: string;
3
+ readonly body: string;
4
+ }
5
+ /** Bump when seed semantics change in a way operators should notice in logs. */
6
+ export declare const XIANGYANG_SKILLS_REVISION = 2;
7
+ export declare const XIANGYANG_SKILL_SEEDS: readonly XiangyangSkillSeed[];
8
+ export declare const XIANGYANG_SKILL_IDS: readonly string[];
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/index.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAQ9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EACT,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Product-owned Xiangyang skill catalog (bodies compile into dist).
3
+ * Order: demand hub first, then care playbooks.
4
+ */
5
+ import * as demand from "./demand-translate.js";
6
+ import * as homeConfig from "./home-config.js";
7
+ import * as mainline from "./mainline-sideline.js";
8
+ import * as memory from "./memory-polish.js";
9
+ import * as plugin from "./plugin-dev.js";
10
+ import * as skillMerge from "./skill-merge.js";
11
+ import * as cleanup from "./xrk-cleanup.js";
12
+ /** Bump when seed semantics change in a way operators should notice in logs. */
13
+ export const XIANGYANG_SKILLS_REVISION = 2;
14
+ export const XIANGYANG_SKILL_SEEDS = [
15
+ { id: demand.ID, body: demand.BODY },
16
+ { id: plugin.ID, body: plugin.BODY },
17
+ { id: homeConfig.ID, body: homeConfig.BODY },
18
+ { id: cleanup.ID, body: cleanup.BODY },
19
+ { id: memory.ID, body: memory.BODY },
20
+ { id: mainline.ID, body: mainline.BODY },
21
+ { id: skillMerge.ID, body: skillMerge.BODY },
22
+ ];
23
+ export const XIANGYANG_SKILL_IDS = XIANGYANG_SKILL_SEEDS.map((s) => s.id);
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAO5C,gFAAgF;AAChF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAAkC;IAClE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;IACpC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;IACpC,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE;IAC5C,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;IACtC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;IACpC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAC9B,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Xiangyang skill body: 主线 pin + 支线 tips for Qichuang. */
2
+ export declare const ID = "xrk-mainline-sideline";
3
+ export declare const BODY = "---\nname: xrk-mainline-sideline\ndescription: >-\n Keep \u4E3B\u7EBF (thread pin) and \u652F\u7EBF (presence tips) meaningful while\n orchestrating from Xiangyang. Use when starting multi-session work,\n pinning peers, or when catalog titles look empty / duplicated.\n---\n\n# \u4E3B\u7EBF \u00B7 \u652F\u7EBF\uFF08\u5947\u521B\uFF09\n\n| \u6982\u5FF5 | \u5DE5\u5177 | \u4F5C\u7528 |\n|------|------|------|\n| **\u4E3B\u7EBF** | `thread_upsert` / `thread_list` / `thread_delete` | \u53D1\u73B0\u9489\uFF1A\u5144\u5F1F\u4F1A\u8BDD\u5728 collab board \u4E0A\u627E\u5230\u300C\u5728\u505A\u4EC0\u4E48\u300D |\n| **\u652F\u7EBF** | `presence_set` `tips` \u6216 `sideline_set` | \u672C\u4F1A\u8BDD\u4FA7\u680F\u4E00\u884C\u8FD1\u51B5 |\n| **\u4E92\u4FE1** | `thread_message` | \u4EFB\u610F\u7236\u4F1A\u8BDD\u4E92\u53D1\uFF08\u53EF\u8DE8\u5DE5\u4F5C\u533A\uFF09\uFF1B**\u4E0D\u8981\u6C42**\u5148\u6302\u9489 |\n| **\u6D3E\u5DE5** | `workspace_session_prompt` | \u5728\u7F16\u7801\u533A\u65B0\u5EFA/\u7EED\u7528\u5E76\u6D3E\u7B2C\u4E00\u53E5\uFF1B\u8FD4\u56DE `session_id` |\n\n\u4E3B\u7EBF\u662F**\u52A0\u901F\u5668**\u4E0D\u662F\u95E8\u69DB\uFF1B\u4F46\u96F6\u57FA\u7840\u591A\u4F1A\u8BDD\u573A\u666F\u4E0B\uFF0C**\u4E0D\u9489 = \u4FA7\u680F\u4E0D\u53EF\u53D1\u73B0 = \u4F53\u9A8C\u50CF\u6CA1\u6709\u4E3B\u7EBF**\u3002\n\n## \u8BE5\u9489\u65F6\n\n1. `workspace_session_prompt` \u62FF\u5230 `session_id` \u540E\u7ACB\u523B\uFF1A \n `thread_upsert({ title, brief, session_id, workspace_id })`\u3002 \n2. `title` = \u77ED\u4EFB\u52A1\u540D\uFF1B`brief` = \u4E00\u4E24\u53E5\u8BA9\u522B\u4EBA\u770B\u61C2\u3002 \n3. **\u7981\u6B62**\u7A7A brief\u3001\u91CD\u590D `mainline-a`\u3001\u628A\u4E3B\u7EBF\u5F53\u8FDB\u5EA6\u65E5\u5FD7\u3002 \n4. \u672C\u4F1A\u8BDD\u5F00\u5DE5\uFF1A`thread_upsert({ title, brief })`\uFF1B\u7ED3\u675F\u4E14\u4E0D\u518D\u9700\u8981\u88AB\u53D1\u73B0 \u2192 `thread_delete`\u3002 \n5. \u5B9A\u671F `thread_list`\uFF1A\u7A7A brief / \u6D4B\u8BD5\u6B8B\u7559 / \u91CD\u590D\u540D \u2192 \u5220\u6216\u6539\u3002\n\n## \u652F\u7EBF\n\n- \u5F00\u59CB\u3001\u5361\u4F4F\u3001\u7B49\u56DE\u590D\u3001\u6536\u5DE5\uFF1A`presence_set({ tips: \"\u2026\" })`\uFF08\u53EF\u987A\u5E26\u8868\u60C5\uFF09\u3002 \n- \u8FDB\u5EA6\u7EC6\u8282\u7528 `todo_write`\uFF1B\u4E0D\u8981\u628A\u4E3B\u7EBF\u5F53\u770B\u677F\u3002\n\n## \u4E0E\u9700\u6C42\u8F6C\u5316\n\n\u6A21\u7CCA\u9700\u6C42\u7ECF `xrk-demand-translate` \u9009\u5B9A\u7F16\u7801\u5DE5\u4F5C\u533A\u540E\uFF0C\u6D3E\u5DE5**\u5FC5\u987B**\u5E26\u4E3B\u7EBF\u9489 + \u652F\u7EBF\u66F4\u65B0\uFF0C\u7528\u6237\u624D\u80FD\u5728\u4FA7\u680F\u611F\u5230\u300C\u4E3B\u7EBF/\u652F\u7EBF\u300D\u3002\n\n## \u53CD\u6A21\u5F0F\n\n- \u53EA `workspace_session_prompt` \u4E0D `thread_upsert`\u3002 \n- \u6BCF\u4E2A\u5B50\u4EFB\u52A1\u4E00\u6761\u4E3B\u7EBF\u3002 \n- \u4EE5\u4E3A\u6CA1\u9489\u5C31\u4E0D\u80FD `thread_message`\u3002\n";
4
+ //# sourceMappingURL=mainline-sideline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mainline-sideline.d.ts","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/mainline-sideline.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,EAAE,0BAA0B,CAAC;AAE1C,eAAO,MAAM,IAAI,u1FA0ChB,CAAC"}
@@ -0,0 +1,46 @@
1
+ /** Xiangyang skill body: 主线 pin + 支线 tips for Qichuang. */
2
+ export const ID = "xrk-mainline-sideline";
3
+ export const BODY = `---
4
+ name: xrk-mainline-sideline
5
+ description: >-
6
+ Keep 主线 (thread pin) and 支线 (presence tips) meaningful while
7
+ orchestrating from Xiangyang. Use when starting multi-session work,
8
+ pinning peers, or when catalog titles look empty / duplicated.
9
+ ---
10
+
11
+ # 主线 · 支线(奇创)
12
+
13
+ | 概念 | 工具 | 作用 |
14
+ |------|------|------|
15
+ | **主线** | \`thread_upsert\` / \`thread_list\` / \`thread_delete\` | 发现钉:兄弟会话在 collab board 上找到「在做什么」 |
16
+ | **支线** | \`presence_set\` \`tips\` 或 \`sideline_set\` | 本会话侧栏一行近况 |
17
+ | **互信** | \`thread_message\` | 任意父会话互发(可跨工作区);**不要求**先挂钉 |
18
+ | **派工** | \`workspace_session_prompt\` | 在编码区新建/续用并派第一句;返回 \`session_id\` |
19
+
20
+ 主线是**加速器**不是门槛;但零基础多会话场景下,**不钉 = 侧栏不可发现 = 体验像没有主线**。
21
+
22
+ ## 该钉时
23
+
24
+ 1. \`workspace_session_prompt\` 拿到 \`session_id\` 后立刻:
25
+ \`thread_upsert({ title, brief, session_id, workspace_id })\`。
26
+ 2. \`title\` = 短任务名;\`brief\` = 一两句让别人看懂。
27
+ 3. **禁止**空 brief、重复 \`mainline-a\`、把主线当进度日志。
28
+ 4. 本会话开工:\`thread_upsert({ title, brief })\`;结束且不再需要被发现 → \`thread_delete\`。
29
+ 5. 定期 \`thread_list\`:空 brief / 测试残留 / 重复名 → 删或改。
30
+
31
+ ## 支线
32
+
33
+ - 开始、卡住、等回复、收工:\`presence_set({ tips: "…" })\`(可顺带表情)。
34
+ - 进度细节用 \`todo_write\`;不要把主线当看板。
35
+
36
+ ## 与需求转化
37
+
38
+ 模糊需求经 \`xrk-demand-translate\` 选定编码工作区后,派工**必须**带主线钉 + 支线更新,用户才能在侧栏感到「主线/支线」。
39
+
40
+ ## 反模式
41
+
42
+ - 只 \`workspace_session_prompt\` 不 \`thread_upsert\`。
43
+ - 每个子任务一条主线。
44
+ - 以为没钉就不能 \`thread_message\`。
45
+ `;
46
+ //# sourceMappingURL=mainline-sideline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mainline-sideline.js","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/mainline-sideline.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,EAAE,GAAG,uBAAuB,CAAC;AAE1C,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Xiangyang skill body: layered curated memory care. */
2
+ export declare const ID = "xrk-memory-polish";
3
+ export declare const BODY = "---\nname: xrk-memory-polish\ndescription: >-\n Polish layered curated memory (scope=global|workspace|session|agent).\n Use when memory is noisy, still flat after upgrades, or the user asks\n to prune / move project facts into workspace memory.\n---\n\n# \u8BB0\u5FC6\u5B8C\u5584\uFF08\u5206\u5C42\uFF09\n\n\u7B56\u5C55\u8BB0\u5FC6\u5DF2\u5206\u5C42\uFF1B\u540C\u4E00 `memory` \u5DE5\u5177\u7528 **`scope`** \u9009\u533A\uFF08\u7F3A\u7701\u591A\u4E3A global\uFF09\u3002 \n\u5347\u7EA7\u524D\u5199\u5165\u7684\u6761\u76EE\u5F80\u5F80\u5168\u5728 global\u2014\u2014\u7528\u6237\u8BF4\u300C\u6E05\u6CA1\u7528\u7684 / \u505A\u6210\u5DE5\u4F5C\u533A\u8BB0\u5FC6\u300D\u65F6\u6309\u672C skill \u8FC1\u3002\n\n| scope | \u5199\u4EC0\u4E48 | \u78C1\u76D8\u5927\u81F4\u4F4D\u7F6E |\n|-------|--------|----------------|\n| `global` | \u8DE8\u9879\u76EE\u504F\u597D\u3001\u8EAB\u4EFD\u3001\u957F\u671F\u4E60\u60EF | `~/.xrk/memories/`\uFF08`USER.md` \u53E6\u89C1\uFF09 |\n| `workspace` | **\u67D0\u4E00\u5DE5\u4F5C\u533A**\u7684\u9879\u76EE\u4E8B\u5B9E\u3001\u7EA6\u5B9A\u3001\u59D4\u6D3E\u4E60\u60EF | `~/.xrk/memories/workspaces/<wsId>/` |\n| `session` | \u4EC5\u672C\u4F1A\u8BDD\u4E34\u65F6\u7EA6\u675F | `~/.xrk/memories/sessions/<sid>/` |\n| `agent` | \u5E72\u5458\u79C1\u6709\u7B14\u8BB0 | `~/.xrk/memories/agents/<id>/` |\n\n## \u8D77\u624B\n\n1. `memory({ action: \"list\", target: \"memory\", scope: \"global\" })`\uFF0C\u518D list \u76F8\u5173 `workspace`\uFF08\u5148 `workspace_list` \u786E\u8BA4 id\uFF09\u3002 \n2. **\u8F6F\u5220**\u566A\u58F0\uFF1A\u4E00\u6B21\u6027\u8C03\u8BD5\u3001\u683C\u5F0F\u6307\u4EE4\u3001background job \u788E\u7247\u3001\u8FC7\u671F\u8DEF\u5F84\u3002 \n3. **\u8FC1\u79FB**\uFF1Aglobal \u91CC\u300C\u67D0\u4ED3\u5E93/\u67D0\u9879\u76EE\u300D\u2192 `scope: \"workspace\"` \u5199\u5165\u5BF9\u5E94\u533A\uFF0C\u518D\u4ECE global `remove`\u3002 \n4. \u4ED3\u5E93\u771F\u6E90\uFF08`.agents/` \u00B7 skills\uFF09\u7528**\u4E00\u53E5\u6307\u9488**\u5373\u53EF\uFF1B\u52FF\u628A\u957F\u624B\u518C\u6284\u8FDB\u8BB0\u5FC6\u3002 \n5. \u4E0D\u5199\u5BC6\u94A5\u3001\u7EDD\u5BF9\u672C\u673A\u566A\u58F0\u8DEF\u5F84\u3001\u65E0\u5173 session \u6307\u4EE4\u3002 \n6. \u6309 scope \u77ED\u6458\u8981\u56DE\u62A5\uFF08\u6E05\u4E86\u4EC0\u4E48 / \u8FC1\u4E86\u4EC0\u4E48\uFF09\u3002\n\n## \u53CD\u6A21\u5F0F\n\n- \u7EE7\u7EED\u65E0 `scope` \u5F80 global \u5806\u9879\u76EE\u624B\u518C\u3002 \n- \u628A\u300C\u5E94\u8FDB workspace\u300D\u7684\u5185\u5BB9 add \u56DE global\u3002 \n- \u6574\u76EE\u5F55\u5220\u9664 `memories/` \u5F53\u6E05\u7406\uFF08\u90A3\u662F `xrk-xrk-cleanup` \u7684\u7981\u533A\uFF09\u3002\n";
4
+ //# sourceMappingURL=memory-polish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-polish.d.ts","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/memory-polish.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,eAAO,MAAM,EAAE,sBAAsB,CAAC;AAEtC,eAAO,MAAM,IAAI,ilFAkChB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /** Xiangyang skill body: layered curated memory care. */
2
+ export const ID = "xrk-memory-polish";
3
+ export const BODY = `---
4
+ name: xrk-memory-polish
5
+ description: >-
6
+ Polish layered curated memory (scope=global|workspace|session|agent).
7
+ Use when memory is noisy, still flat after upgrades, or the user asks
8
+ to prune / move project facts into workspace memory.
9
+ ---
10
+
11
+ # 记忆完善(分层)
12
+
13
+ 策展记忆已分层;同一 \`memory\` 工具用 **\`scope\`** 选区(缺省多为 global)。
14
+ 升级前写入的条目往往全在 global——用户说「清没用的 / 做成工作区记忆」时按本 skill 迁。
15
+
16
+ | scope | 写什么 | 磁盘大致位置 |
17
+ |-------|--------|----------------|
18
+ | \`global\` | 跨项目偏好、身份、长期习惯 | \`~/.xrk/memories/\`(\`USER.md\` 另见) |
19
+ | \`workspace\` | **某一工作区**的项目事实、约定、委派习惯 | \`~/.xrk/memories/workspaces/<wsId>/\` |
20
+ | \`session\` | 仅本会话临时约束 | \`~/.xrk/memories/sessions/<sid>/\` |
21
+ | \`agent\` | 干员私有笔记 | \`~/.xrk/memories/agents/<id>/\` |
22
+
23
+ ## 起手
24
+
25
+ 1. \`memory({ action: "list", target: "memory", scope: "global" })\`,再 list 相关 \`workspace\`(先 \`workspace_list\` 确认 id)。
26
+ 2. **软删**噪声:一次性调试、格式指令、background job 碎片、过期路径。
27
+ 3. **迁移**:global 里「某仓库/某项目」→ \`scope: "workspace"\` 写入对应区,再从 global \`remove\`。
28
+ 4. 仓库真源(\`.agents/\` · skills)用**一句指针**即可;勿把长手册抄进记忆。
29
+ 5. 不写密钥、绝对本机噪声路径、无关 session 指令。
30
+ 6. 按 scope 短摘要回报(清了什么 / 迁了什么)。
31
+
32
+ ## 反模式
33
+
34
+ - 继续无 \`scope\` 往 global 堆项目手册。
35
+ - 把「应进 workspace」的内容 add 回 global。
36
+ - 整目录删除 \`memories/\` 当清理(那是 \`xrk-xrk-cleanup\` 的禁区)。
37
+ `;
38
+ //# sourceMappingURL=memory-polish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-polish.js","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/memory-polish.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,CAAC,MAAM,EAAE,GAAG,mBAAmB,CAAC;AAEtC,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Xiangyang skill body: full process-plugin authoring without harness source. */
2
+ export declare const ID = "xrk-plugin-dev-care";
3
+ export declare const BODY = "---\nname: xrk-plugin-dev-care\ndescription: >-\n Author a complete XRK process plugin without the harness monorepo: kind\n choice, scaffold, install, restart, verify. Use when the user wants a\n plugin, slash command, extra tools, or \u300C\u6269\u5C55\u80FD\u529B\u300Dand may have no source tree.\n---\n\n# \u63D2\u4EF6\u5F00\u53D1\uFF08\u65E0\u6E90\u7801\u4ED3\u4E5F\u80FD\u5B8C\u6210\uFF09\n\n\u8FDB\u7A0B\u63D2\u4EF6 = \u672C\u673A\u76EE\u5F55\u91CC\u7684 `xrk.plugin.json` + \u5165\u53E3\u6A21\u5757\u3002Host **restart** \u540E\u8FDB\u5DE5\u5177\u9762\u3002 \n**\u4E0D\u9700\u8981** XRK-harness \u4ED3\u5E93\uFF1B\u672C skill \u542B\u6700\u5C0F\u53EF\u8FD0\u884C\u6A21\u677F\u3002\n\n## 0. \u5148\u9009\u578B\uFF08\u522B\u4E00\u4E0A\u6765\u811A\u624B\u67B6\uFF09\n\n| \u7528\u6237\u8981\u4EC0\u4E48 | \u9009 | \u8BF4\u660E |\n|------------|-----|------|\n| \u63A5\u5DF2\u6709 / \u53EF\u8D77\u7684 MCP \u670D\u52A1\u5668 | **Settings \u2192 MCP** | \u8D70 `xrk-home-config`\uFF1B\u4E0D\u8981\u518D\u5305\u4E00\u5C42 tools \u63D2\u4EF6 |\n| \u672C\u673A\u81EA\u6709\u51FD\u6570\u7ED9\u6A21\u578B\u8C03 | `kind: \"tools\"` | \u672C skill |\n| \u8FFD\u52A0\u4E00\u6BB5 system \u63D0\u793A | `kind: \"prompt\"` | \u672C skill |\n| \u659C\u6760\u547D\u4EE4 | `kind: \"commands\"` | \u672C skill |\n| \u6539\u4EA7\u54C1\u58F3 UI | \u793E\u533A / client \u5305 | \u4E0D\u662F process tools\uFF1B\u52FF\u7528\u672C\u6A21\u677F\u5192\u5145 |\n\n## 1. \u843D\u76D8\u4F4D\u7F6E\n\n1. `workspace_list` \u2192 \u9009\u7528\u6237**\u7F16\u7801\u5DE5\u4F5C\u533A**\uFF08\u4E0D\u662F\u5411\u9633 `ws_default`\uFF09\u3002\n2. \u5728\u8BE5\u5DE5\u4F5C\u533A\u5EFA `extensions/<plugin-id>/`\uFF08\u63A8\u8350\uFF09\uFF0C\u6216\u4EFB\u610F\u7528\u6237\u6307\u5B9A\u76EE\u5F55\u3002\n3. \u7528 `workspace_session_prompt` \u6D3E\u7F16\u7801\u4F1A\u8BDD\u5199\u6587\u4EF6\uFF1B\u5411\u9633\u4FA7\u4FDD\u7559 `session_id`\uFF0C\u9489\u4E3B\u7EBF\uFF08\u89C1 `xrk-mainline-sideline`\uFF09\u3002\n\n## 2. \u6700\u5C0F\u53EF\u8FD0\u884C\u6A21\u677F\uFF08tools\uFF09\n\n`extensions/my-plugin/xrk.plugin.json`\uFF1A\n\n```json\n{\n \"id\": \"my-plugin\",\n \"kind\": \"tools\",\n \"entry\": \"./plugin.mjs\"\n}\n```\n\n`extensions/my-plugin/plugin.mjs`\uFF1A\n\n```js\nexport function createPlugin() {\n return {\n id: \"my-plugin\",\n kind: \"tools\",\n tools: [\n {\n name: \"my_ping\",\n description: \"Health check \u2014 returns pong. Use to verify the plugin loaded.\",\n parameters: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n async execute() {\n return { content: \"pong\" };\n },\n },\n ],\n };\n}\n```\n\n\u89C4\u5219\uFF1A\n\n- `xrk.plugin.json` \u7684 `id` / `kind` \u4E0E `createPlugin()` \u8FD4\u56DE\u503C**\u4E00\u81F4**\u3002\n- \u5DE5\u5177 `name` \u7A33\u5B9A\u3001`description` \u5199\u6E05\u4F55\u65F6\u7528\u4E0E\u5931\u8D25\u8BED\u4E49\uFF1B\u52FF\u7A7A\u63CF\u8FF0\u3001\u52FF\u4E07\u80FD catch \u541E\u9519\u3002\n- **\u5BC6\u94A5\u8D70 Credentials**\uFF08\u8BBE\u7F6E UI / \u51ED\u636E\u5DE5\u5177\uFF09\uFF0C\u7981\u6B62\u5199\u8FDB\u63D2\u4EF6\u6E90\u7801\u6216 skill\u3002\n\n### prompt / commands \u8981\u70B9\n\n- `prompt`\uFF1A\u8FD4\u56DE `promptSections`\uFF08\u8FFD\u52A0 system \u6BB5\uFF09\uFF0C\u4E0D\u8981\u5047\u88C5\u6210 tools\u3002\n- `commands`\uFF1A\u63D0\u4F9B Face \u53EF\u5217\u51FA\u7684\u659C\u6760\uFF1B\u4E0E\u7528\u6237 recipe \u540C\u540D\u65F6 recipe \u4F18\u5148\u2014\u2014\u8D77\u540D\u907F\u5F00\u51B2\u7A81\u3002\n\n## 3. \u5B89\u88C5\u4E0E\u91CD\u8F7D\n\n```bash\nxrkh plugin add <\u63D2\u4EF6\u76EE\u5F55\u7684\u7EDD\u5BF9\u6216\u76F8\u5BF9\u8DEF\u5F84>\nxrkh restart\nxrkh plugin list\n```\n\n- \u8FDB\u7A0B\u63D2\u4EF6**\u65E0\u70ED\u91CD\u8F7D**\uFF1B\u6539\u5B8C\u5FC5\u987B `restart`\uFF08\u6216\u91CD\u542F Desktop Host\uFF09\u3002\n- \u4E5F\u53EF\u7528 `XRK_PLUGINS_DIR=<\u7236\u76EE\u5F55>` \u6307\u5411\u542B\u591A\u4E2A\u63D2\u4EF6\u7684\u7236\u6587\u4EF6\u5939\u518D\u8D77 Host\u3002\n- \u63D2\u4EF6\u6E05\u5355\u9ED8\u8BA4\u5728 `~/.xrk/plugins`\uFF08\u53EF\u7528 `XRK_HOME` / `XRK_PLUGINS_DIR` \u6539\uFF09\u3002\n\n## 4. \u9A8C\u8BC1\u6E05\u5355\n\n- [ ] `plugin list` \u51FA\u73B0\u8BE5 id \n- [ ] **\u65B0\u5F00\u4F1A\u8BDD**\uFF08\u6216\u91CD\u5EFA agent\uFF09\u540E\u5DE5\u5177\u540D\u53EF\u89C1 \n- [ ] \u8C03\u7528\u4E00\u6B21\uFF08\u5982 `my_ping` \u2192 pong\uFF09 \n- [ ] \u4ECD\u6CA1\u6709 \u2192 \u67E5\u5FBD\u7AE0/policy deny\u3001\u662F\u5426\u88C5\u9519\u76EE\u5F55\uFF1B\u52FF\u76F2 `--force` \u5FAA\u73AF \n- [ ] MCP \u95EE\u9898\u52FF\u6309\u8FDB\u7A0B\u63D2\u4EF6\u72C2 restart \u2192 `xrk-home-config`\n\n## 5. \u4EA4\u4ED8\u8BDD\u672F\uFF08\u7ED9\u96F6\u57FA\u7840\u7528\u6237\uFF09\n\n1. \u63D2\u4EF6\u76EE\u5F55\u5728\u54EA \n2. \u5DF2\u6267\u884C `plugin add` + `restart` \u4E0E\u5426 \n3. \u5982\u4F55\u5728\u65B0\u4F1A\u8BDD\u91CC\u8BD5\u7528\u5DE5\u5177\u540D \n4. \u5BC6\u94A5\u662F\u5426\u5728 Credentials\uFF08\u82E5\u6D89\u53CA\uFF09\n\n## \u53CD\u6A21\u5F0F\n\n- \u6CA1\u6709 harness \u6E90\u7801\u5C31\u62D2\u7EDD\u5199\u63D2\u4EF6\u3002 \n- \u5728\u5411\u9633 cwd \u91CC\u5806\u4E1A\u52A1\u63D2\u4EF6\uFF08\u5E94\u843D\u5230\u7528\u6237\u7F16\u7801\u5DE5\u4F5C\u533A\uFF09\u3002 \n- \u4E00\u5F8B\u811A\u624B\u67B6\u3001\u4ECE\u4E0D\u8003\u8651 MCP\u3002 \n- \u6539\u5B8C\u4E0D restart \u5C31\u8BF4\u300C\u574F\u4E86\u300D\u3002\n";
4
+ //# sourceMappingURL=plugin-dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-dev.d.ts","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/plugin-dev.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,EAAE,wBAAwB,CAAC;AAExC,eAAO,MAAM,IAAI,k2KA8GhB,CAAC"}
@@ -0,0 +1,114 @@
1
+ /** Xiangyang skill body: full process-plugin authoring without harness source. */
2
+ export const ID = "xrk-plugin-dev-care";
3
+ export const BODY = `---
4
+ name: xrk-plugin-dev-care
5
+ description: >-
6
+ Author a complete XRK process plugin without the harness monorepo: kind
7
+ choice, scaffold, install, restart, verify. Use when the user wants a
8
+ plugin, slash command, extra tools, or 「扩展能力」and may have no source tree.
9
+ ---
10
+
11
+ # 插件开发(无源码仓也能完成)
12
+
13
+ 进程插件 = 本机目录里的 \`xrk.plugin.json\` + 入口模块。Host **restart** 后进工具面。
14
+ **不需要** XRK-harness 仓库;本 skill 含最小可运行模板。
15
+
16
+ ## 0. 先选型(别一上来脚手架)
17
+
18
+ | 用户要什么 | 选 | 说明 |
19
+ |------------|-----|------|
20
+ | 接已有 / 可起的 MCP 服务器 | **Settings → MCP** | 走 \`xrk-home-config\`;不要再包一层 tools 插件 |
21
+ | 本机自有函数给模型调 | \`kind: "tools"\` | 本 skill |
22
+ | 追加一段 system 提示 | \`kind: "prompt"\` | 本 skill |
23
+ | 斜杠命令 | \`kind: "commands"\` | 本 skill |
24
+ | 改产品壳 UI | 社区 / client 包 | 不是 process tools;勿用本模板冒充 |
25
+
26
+ ## 1. 落盘位置
27
+
28
+ 1. \`workspace_list\` → 选用户**编码工作区**(不是向阳 \`ws_default\`)。
29
+ 2. 在该工作区建 \`extensions/<plugin-id>/\`(推荐),或任意用户指定目录。
30
+ 3. 用 \`workspace_session_prompt\` 派编码会话写文件;向阳侧保留 \`session_id\`,钉主线(见 \`xrk-mainline-sideline\`)。
31
+
32
+ ## 2. 最小可运行模板(tools)
33
+
34
+ \`extensions/my-plugin/xrk.plugin.json\`:
35
+
36
+ \`\`\`json
37
+ {
38
+ "id": "my-plugin",
39
+ "kind": "tools",
40
+ "entry": "./plugin.mjs"
41
+ }
42
+ \`\`\`
43
+
44
+ \`extensions/my-plugin/plugin.mjs\`:
45
+
46
+ \`\`\`js
47
+ export function createPlugin() {
48
+ return {
49
+ id: "my-plugin",
50
+ kind: "tools",
51
+ tools: [
52
+ {
53
+ name: "my_ping",
54
+ description: "Health check — returns pong. Use to verify the plugin loaded.",
55
+ parameters: {
56
+ type: "object",
57
+ properties: {},
58
+ additionalProperties: false,
59
+ },
60
+ async execute() {
61
+ return { content: "pong" };
62
+ },
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ \`\`\`
68
+
69
+ 规则:
70
+
71
+ - \`xrk.plugin.json\` 的 \`id\` / \`kind\` 与 \`createPlugin()\` 返回值**一致**。
72
+ - 工具 \`name\` 稳定、\`description\` 写清何时用与失败语义;勿空描述、勿万能 catch 吞错。
73
+ - **密钥走 Credentials**(设置 UI / 凭据工具),禁止写进插件源码或 skill。
74
+
75
+ ### prompt / commands 要点
76
+
77
+ - \`prompt\`:返回 \`promptSections\`(追加 system 段),不要假装成 tools。
78
+ - \`commands\`:提供 Face 可列出的斜杠;与用户 recipe 同名时 recipe 优先——起名避开冲突。
79
+
80
+ ## 3. 安装与重载
81
+
82
+ \`\`\`bash
83
+ xrkh plugin add <插件目录的绝对或相对路径>
84
+ xrkh restart
85
+ xrkh plugin list
86
+ \`\`\`
87
+
88
+ - 进程插件**无热重载**;改完必须 \`restart\`(或重启 Desktop Host)。
89
+ - 也可用 \`XRK_PLUGINS_DIR=<父目录>\` 指向含多个插件的父文件夹再起 Host。
90
+ - 插件清单默认在 \`~/.xrk/plugins\`(可用 \`XRK_HOME\` / \`XRK_PLUGINS_DIR\` 改)。
91
+
92
+ ## 4. 验证清单
93
+
94
+ - [ ] \`plugin list\` 出现该 id
95
+ - [ ] **新开会话**(或重建 agent)后工具名可见
96
+ - [ ] 调用一次(如 \`my_ping\` → pong)
97
+ - [ ] 仍没有 → 查徽章/policy deny、是否装错目录;勿盲 \`--force\` 循环
98
+ - [ ] MCP 问题勿按进程插件狂 restart → \`xrk-home-config\`
99
+
100
+ ## 5. 交付话术(给零基础用户)
101
+
102
+ 1. 插件目录在哪
103
+ 2. 已执行 \`plugin add\` + \`restart\` 与否
104
+ 3. 如何在新会话里试用工具名
105
+ 4. 密钥是否在 Credentials(若涉及)
106
+
107
+ ## 反模式
108
+
109
+ - 没有 harness 源码就拒绝写插件。
110
+ - 在向阳 cwd 里堆业务插件(应落到用户编码工作区)。
111
+ - 一律脚手架、从不考虑 MCP。
112
+ - 改完不 restart 就说「坏了」。
113
+ `;
114
+ //# sourceMappingURL=plugin-dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-dev.js","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/plugin-dev.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,EAAE,GAAG,qBAAqB,CAAC;AAExC,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8GnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Xiangyang skill body: merge overlapping skills across layers. */
2
+ export declare const ID = "xrk-skill-merge";
3
+ export declare const BODY = "---\nname: xrk-skill-merge\ndescription: >-\n Merge overlapping skills across ~/.xrk/skills and workspace layers.\n Use when the catalog is noisy, duplicates conflict, or triggers misfire.\n---\n\n# \u6280\u80FD\u5408\u5E76\u4F18\u5316\n\nSkill \u5206\u5C42\uFF08\u4F4E \u2192 \u9AD8\u8986\u76D6\u610F\u56FE\u4EE5\u4EA7\u54C1\u6CE8\u5165\u4E3A\u51C6\uFF09\uFF1A\n\n| \u5C42 | \u8DEF\u5F84 |\n|----|------|\n| \u5BB6\u76EE\u5F55 | `~/.xrk/skills/<id>/SKILL.md` |\n| \u5411\u9633\u4E13\u7528 | `~/.xrk/xiangyang-workspace/.xrk/skills/`\uFF08\u672C\u7A7A\u95F4\u4EA7\u54C1 seed\uFF09 |\n| \u5DE5\u4F5C\u533A | `{workspace}/.xrk/skills/` \u00B7 `{workspace}/.agents/skills/` |\n\nCatalog \u53EA\u66B4\u9732 frontmatter `name` + `description`\uFF08\u89E6\u53D1\u8BCD\uFF09\uFF1B\u6B63\u6587\u9760 `skill` / `/name` \u5C55\u5F00\u3002\n\n## \u6B65\u9AA4\n\n1. \u5217\u51FA\u91CD\u590D `name` / \u8FD1\u4F3C description\uFF08\u5BB6\u76EE\u5F55 vs \u5DE5\u4F5C\u533A vs \u5411\u9633\uFF09\u3002 \n2. **\u771F\u6E90\u4E00\u4EFD**\uFF1A\u9879\u76EE\u4E13\u5C5E \u2192 \u5DE5\u4F5C\u533A\uFF1B\u8DE8\u9879\u76EE\u4E60\u60EF \u2192 `~/.xrk/skills`\uFF1B\u5411\u9633\u7F16\u6392 playbook \u2192 \u5411\u9633 `.xrk/skills`\uFF08\u52FF\u628A\u4EA7\u54C1 seed \u6284\u8FDB harness \u6E90\u7801\u4ED3\u5F53\u552F\u4E00\u771F\u6E90\uFF09\u3002 \n3. \u66F4\u65B0\u7559\u4E0B\u7684\u90A3\u4EFD `description` \u89E6\u53D1\u8BCD\uFF1B\u5220\u6216\u7F29\u5C0F\u91CD\u590D\u4EFD\uFF08\u7528\u6237\u6539\u8FC7\u7684\uFF1A\u7F3A\u624D\u5199\uFF0C\u6216\u5F81\u5F97\u540C\u610F\u518D\u6539\uFF09\u3002 \n4. \u62BD\u67E5\uFF1A`skill` \u5DE5\u5177 / `/skills` / \u65B0\u4F1A\u8BDD catalog \u662F\u5426\u5E72\u51C0\u3002 \n5. \u5411\u9633\u4EA7\u54C1 seed \u88AB\u65E7\u6B63\u6587\u5361\u4F4F\u65F6\uFF1A\u91CD\u542F Host \u4F1A\u6309\u6B63\u6587 diff \u5237\u65B0\uFF1B\u7528\u6237\u81EA\u5EFA id \u4E0D\u4F1A\u88AB seed \u8986\u76D6\u3002\n\n## \u53CD\u6A21\u5F0F\n\n- \u540C\u540D\u704C\u4E24\u4EFD\uFF08`~/.xrk/skills` \u4E0E\u5DE5\u4F5C\u533A\u5404\u4E00\u4EFD\u5168\u6587\uFF09\u3002 \n- \u628A\u957F\u624B\u518C\u585E\u8FDB description\u3002 \n- \u672A\u7ECF\u540C\u610F\u6539\u7528\u6237\u624B\u5199 SKILL.md\u3002\n";
4
+ //# sourceMappingURL=skill-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-merge.d.ts","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/skill-merge.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,eAAO,MAAM,EAAE,oBAAoB,CAAC;AAEpC,eAAO,MAAM,IAAI,+pEAgChB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /** Xiangyang skill body: merge overlapping skills across layers. */
2
+ export const ID = "xrk-skill-merge";
3
+ export const BODY = `---
4
+ name: xrk-skill-merge
5
+ description: >-
6
+ Merge overlapping skills across ~/.xrk/skills and workspace layers.
7
+ Use when the catalog is noisy, duplicates conflict, or triggers misfire.
8
+ ---
9
+
10
+ # 技能合并优化
11
+
12
+ Skill 分层(低 → 高覆盖意图以产品注入为准):
13
+
14
+ | 层 | 路径 |
15
+ |----|------|
16
+ | 家目录 | \`~/.xrk/skills/<id>/SKILL.md\` |
17
+ | 向阳专用 | \`~/.xrk/xiangyang-workspace/.xrk/skills/\`(本空间产品 seed) |
18
+ | 工作区 | \`{workspace}/.xrk/skills/\` · \`{workspace}/.agents/skills/\` |
19
+
20
+ Catalog 只暴露 frontmatter \`name\` + \`description\`(触发词);正文靠 \`skill\` / \`/name\` 展开。
21
+
22
+ ## 步骤
23
+
24
+ 1. 列出重复 \`name\` / 近似 description(家目录 vs 工作区 vs 向阳)。
25
+ 2. **真源一份**:项目专属 → 工作区;跨项目习惯 → \`~/.xrk/skills\`;向阳编排 playbook → 向阳 \`.xrk/skills\`(勿把产品 seed 抄进 harness 源码仓当唯一真源)。
26
+ 3. 更新留下的那份 \`description\` 触发词;删或缩小重复份(用户改过的:缺才写,或征得同意再改)。
27
+ 4. 抽查:\`skill\` 工具 / \`/skills\` / 新会话 catalog 是否干净。
28
+ 5. 向阳产品 seed 被旧正文卡住时:重启 Host 会按正文 diff 刷新;用户自建 id 不会被 seed 覆盖。
29
+
30
+ ## 反模式
31
+
32
+ - 同名灌两份(\`~/.xrk/skills\` 与工作区各一份全文)。
33
+ - 把长手册塞进 description。
34
+ - 未经同意改用户手写 SKILL.md。
35
+ `;
36
+ //# sourceMappingURL=skill-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-merge.js","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/skill-merge.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC;AAEpC,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Xiangyang skill body: ~/.xrk and project .xrk reclaim. */
2
+ export declare const ID = "xrk-xrk-cleanup";
3
+ export declare const BODY = "---\nname: xrk-xrk-cleanup\ndescription: >-\n Reclaim disk under ~/.xrk and project .xrk with a keep/delete map.\n Use when the user says litter, cache, full disk, tidy .xrk, or Harness feels heavy.\n---\n\n# .xrk \u5783\u573E\u6E05\u7406\n\n\u8303\u56F4\uFF1A\u4EA7\u54C1\u5BB6\u76EE\u5F55 `~/.xrk`\uFF08\u6216 `XRK_HOME`\uFF09\u4E0E\u5404**\u7F16\u7801\u5DE5\u4F5C\u533A**\u7684 `.xrk`\u3002 \n\u5411\u9633\u6709 full access\uFF0C\u53EF\u672C\u4F1A\u8BDD\u5904\u7406\uFF1B\u8DE8\u9879\u76EE\u5927\u6E05\u7406\u4E5F\u53EF `workspace_session_prompt` \u6D3E\u5DE5\u3002\n\n## \u539F\u5219\n\n1. **\u5148\u6E05\u5355\u540E\u5220\u9664**\uFF1A\u5217\u8DEF\u5F84 + \u4F53\u79EF\uFF08\u6216\u5927\u81F4\u5927\u5C0F\uFF09\uFF0C\u5BF9\u300C\u53EF\u80FD\u6709\u7528\u300D\u7684\u5F81\u5F97\u540C\u610F\u3002 \n2. **\u4F18\u5148\u5927\u6587\u4EF6\u4E0E\u660E\u786E\u4E34\u65F6\u4EA7\u7269**\u3002 \n3. **\u7EDD\u4E0D\u9759\u9ED8\u5220**\u4F1A\u8BDD\u70ED\u5E93\u3001\u51ED\u636E\u3001\u7528\u6237\u6539\u8FC7\u7684 skills / \u8BB0\u5FC6\u6B63\u6587\uFF08\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\uFF09\u3002\n\n## `~/.xrk` \u5730\u56FE\n\n| \u8DEF\u5F84 | \u9ED8\u8BA4 | \u8BF4\u660E |\n|------|------|------|\n| `settings.yaml` \u00B7 `host-settings.json` | **\u4FDD\u7559** | Host / \u8BBE\u7F6E\u771F\u6E90 |\n| `.credentials.yaml` | **\u4FDD\u7559** | \u5BC6\u94A5\uFF1B\u52FF\u8FDB\u804A\u5929 |\n| `sessions/`\uFF08`sessions.db` \u00B7 WAL\uFF09 | **\u4FDD\u7559** | \u70ED\u4F1A\u8BDD\uFF1B\u5F52\u6863\u8D70\u4EA7\u54C1\u5F52\u6863\uFF0C\u52FF\u624B\u5220\u5E93\u56FE\u7701\u4E8B |\n| `sessions-archive.db`\uFF08\u82E5\u6709\uFF09 | **\u4FDD\u7559** | \u5F52\u6863\u51B7\u5E93 |\n| `workspaces.json` \u00B7 `session-models.json` \u00B7 `session-agent-presets.json` | **\u4FDD\u7559** | \u5DE5\u4F5C\u533A\u4E0E\u5FBD\u7AE0\u9489 |\n| `memories/` | **\u4FDD\u7559\u6B63\u6587**\uFF1B\u53EF\u6E05\u566A\u58F0\u6761\u76EE | \u7528 `xrk-memory-polish`\uFF0C\u522B\u6574\u76EE\u5F55 rm |\n| `skills/` \u00B7 `xiangyang-workspace/.xrk/skills/` | **\u4FDD\u7559\u7528\u6237\u6539\u8FC7\u7684** | \u4EA7\u54C1 seed \u53EF\u5237\u65B0\uFF1B\u52FF\u5220\u7528\u6237\u81EA\u5EFA |\n| `plugins/` | **\u614E\u5220** | \u5DF2\u88C5\u63D2\u4EF6\uFF1B\u786E\u8BA4\u65E0\u7528\u518D\u5378 |\n| `spill/` \u00B7 `tmp/` \u00B7 `cache/` \u00B7 `logs/` | **\u53EF\u6E05** | \u5DE5\u5177\u6EA2\u51FA\u3001\u4E34\u65F6\u3001\u7F13\u5B58\u3001\u65E5\u5FD7 |\n| `memory-embeddings/` \u00B7 `pubmed-cache/` \u7B49\u7F13\u5B58\u6811 | **\u53EF\u6E05** | \u53EF\u518D\u751F\u7D22\u5F15/\u7F13\u5B58 |\n| `mcp-venvs/` \u00B7 `mcp-cwd/` | **\u53EF\u6E05\u95F2\u7F6E** | \u786E\u8BA4\u5BF9\u5E94 MCP \u4E0D\u7528 |\n| `community-plugin-mirror/` | **\u53EF\u6E05** | \u955C\u50CF\u7F13\u5B58\uFF0C\u53EF\u518D\u62C9 |\n| `run/` | **\u614E** | Host pid\uFF1B\u52FF\u5728 Host \u8FD0\u884C\u4E2D\u4E71\u5220\u9501 |\n| `cron/` | **\u614E** | \u7528\u6237\u5B9A\u65F6\u4EFB\u52A1 |\n| `attachments/` \u00B7 `canvases/` \u00B7 `checkpoints/` | **\u95EE\u518D\u5220** | \u7528\u6237\u4EA7\u7269 |\n| `xiangyang-workspace/` | **\u4FDD\u7559\u76EE\u5F55** | \u5411\u9633\u5BB6\uFF1B\u53EA\u6E05\u5176\u4E0B\u660E\u786E temp |\n\n## \u9879\u76EE `.xrk`\uFF08\u7F16\u7801\u5DE5\u4F5C\u533A\uFF09\n\n| \u53EF\u6E05 | \u4FDD\u7559 |\n|------|------|\n| \u7A7A / \u8FC7\u671F recipes\u3001\u660E\u663E temp\u3001\u91CD\u590D\u8349\u7A3F | \u7528\u6237\u5199\u7684 skills\u3001\u6709\u610F\u4FDD\u7559\u7684 recipes\u3001\u5DE5\u4F5C\u533A AGENTS |\n\n## \u6B65\u9AA4\n\n1. \u5217\u5019\u9009\uFF08\u8DEF\u5F84 + \u4E3A\u4F55\u53EF\u5220\uFF09\u3002 \n2. \u7528\u6237\u786E\u8BA4\u6216\u660E\u786E\u6388\u6743\u300C\u6E05\u7F13\u5B58\u300D\u540E\u5220\u9664\u3002 \n3. \u5927\u5757\u5220\u9664\u540E\u82E5\u70ED\u5E93\u865A\u80D6\uFF0C\u53EF\u63D0\u9192\uFF1A\u5F52\u6863\u4F1A\u8BDD\u8D70\u4EA7\u54C1\u5F52\u6863\uFF1BHost \u5173\u95ED\u65F6\u53EF\u80FD VACUUM\u3002 \n4. \u77ED\u6458\u8981\u56DE\u62A5\uFF1A\u5220\u4E86\u4EC0\u4E48\u3001\u4FDD\u7559\u4E86\u4EC0\u4E48\u3001\u5927\u7EA6\u817E\u51FA\u591A\u5C11\u3002\n\n## \u53CD\u6A21\u5F0F\n\n- \u4E3A\u7701\u4E8B `rm -rf ~/.xrk`\u3002 \n- \u5220 `sessions.db` / \u51ED\u636E\u5F53\u300C\u6E05\u7406\u300D\u3002 \n- \u628A\u7B56\u5C55\u8BB0\u5FC6\u6574\u76EE\u5F55\u5F53\u7F13\u5B58\u5220\u6389\u3002\n";
4
+ //# sourceMappingURL=xrk-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xrk-cleanup.d.ts","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/xrk-cleanup.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,eAAO,MAAM,EAAE,oBAAoB,CAAC;AAEpC,eAAO,MAAM,IAAI,0uIAyDhB,CAAC"}
@@ -0,0 +1,61 @@
1
+ /** Xiangyang skill body: ~/.xrk and project .xrk reclaim. */
2
+ export const ID = "xrk-xrk-cleanup";
3
+ export const BODY = `---
4
+ name: xrk-xrk-cleanup
5
+ description: >-
6
+ Reclaim disk under ~/.xrk and project .xrk with a keep/delete map.
7
+ Use when the user says litter, cache, full disk, tidy .xrk, or Harness feels heavy.
8
+ ---
9
+
10
+ # .xrk 垃圾清理
11
+
12
+ 范围:产品家目录 \`~/.xrk\`(或 \`XRK_HOME\`)与各**编码工作区**的 \`.xrk\`。
13
+ 向阳有 full access,可本会话处理;跨项目大清理也可 \`workspace_session_prompt\` 派工。
14
+
15
+ ## 原则
16
+
17
+ 1. **先清单后删除**:列路径 + 体积(或大致大小),对「可能有用」的征得同意。
18
+ 2. **优先大文件与明确临时产物**。
19
+ 3. **绝不静默删**会话热库、凭据、用户改过的 skills / 记忆正文(除非用户明确要求)。
20
+
21
+ ## \`~/.xrk\` 地图
22
+
23
+ | 路径 | 默认 | 说明 |
24
+ |------|------|------|
25
+ | \`settings.yaml\` · \`host-settings.json\` | **保留** | Host / 设置真源 |
26
+ | \`.credentials.yaml\` | **保留** | 密钥;勿进聊天 |
27
+ | \`sessions/\`(\`sessions.db\` · WAL) | **保留** | 热会话;归档走产品归档,勿手删库图省事 |
28
+ | \`sessions-archive.db\`(若有) | **保留** | 归档冷库 |
29
+ | \`workspaces.json\` · \`session-models.json\` · \`session-agent-presets.json\` | **保留** | 工作区与徽章钉 |
30
+ | \`memories/\` | **保留正文**;可清噪声条目 | 用 \`xrk-memory-polish\`,别整目录 rm |
31
+ | \`skills/\` · \`xiangyang-workspace/.xrk/skills/\` | **保留用户改过的** | 产品 seed 可刷新;勿删用户自建 |
32
+ | \`plugins/\` | **慎删** | 已装插件;确认无用再卸 |
33
+ | \`spill/\` · \`tmp/\` · \`cache/\` · \`logs/\` | **可清** | 工具溢出、临时、缓存、日志 |
34
+ | \`memory-embeddings/\` · \`pubmed-cache/\` 等缓存树 | **可清** | 可再生索引/缓存 |
35
+ | \`mcp-venvs/\` · \`mcp-cwd/\` | **可清闲置** | 确认对应 MCP 不用 |
36
+ | \`community-plugin-mirror/\` | **可清** | 镜像缓存,可再拉 |
37
+ | \`run/\` | **慎** | Host pid;勿在 Host 运行中乱删锁 |
38
+ | \`cron/\` | **慎** | 用户定时任务 |
39
+ | \`attachments/\` · \`canvases/\` · \`checkpoints/\` | **问再删** | 用户产物 |
40
+ | \`xiangyang-workspace/\` | **保留目录** | 向阳家;只清其下明确 temp |
41
+
42
+ ## 项目 \`.xrk\`(编码工作区)
43
+
44
+ | 可清 | 保留 |
45
+ |------|------|
46
+ | 空 / 过期 recipes、明显 temp、重复草稿 | 用户写的 skills、有意保留的 recipes、工作区 AGENTS |
47
+
48
+ ## 步骤
49
+
50
+ 1. 列候选(路径 + 为何可删)。
51
+ 2. 用户确认或明确授权「清缓存」后删除。
52
+ 3. 大块删除后若热库虚胖,可提醒:归档会话走产品归档;Host 关闭时可能 VACUUM。
53
+ 4. 短摘要回报:删了什么、保留了什么、大约腾出多少。
54
+
55
+ ## 反模式
56
+
57
+ - 为省事 \`rm -rf ~/.xrk\`。
58
+ - 删 \`sessions.db\` / 凭据当「清理」。
59
+ - 把策展记忆整目录当缓存删掉。
60
+ `;
61
+ //# sourceMappingURL=xrk-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xrk-cleanup.js","sourceRoot":"","sources":["../../src/xiangyang-skill-bodies/xrk-cleanup.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC;AAEpC,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDnB,CAAC"}
@@ -1,12 +1,23 @@
1
1
  /**
2
2
  * Seed 向阳空间-only skills under the workspace `.xrk/skills` tree.
3
3
  * Other workspaces do not get these files (workspace-scoped catalog).
4
+ *
5
+ * Product bodies live in `./xiangyang-skill-bodies/` and refresh when text
6
+ * changes (compare-and-write). Add sibling skill folders for local custom
7
+ * playbooks — seed never deletes unknown ids.
4
8
  */
9
+ import { type XiangyangSkillSeed } from "./xiangyang-skill-bodies/index.js";
10
+ export type { XiangyangSkillSeed };
11
+ export { XIANGYANG_SKILL_SEEDS, XIANGYANG_SKILL_IDS, XIANGYANG_SKILLS_REVISION, } from "./xiangyang-skill-bodies/index.js";
12
+ export interface SeedXiangyangSkillsResult {
13
+ /** Skill ids whose SKILL.md was created or rewritten. */
14
+ readonly installed: string[];
15
+ /** Product catalog revision (`XIANGYANG_SKILLS_REVISION`). */
16
+ readonly revision: number;
17
+ }
5
18
  /**
6
- * Write missing skill folders under the 向阳空间 workspace (idempotent).
19
+ * Write / refresh product skill folders under the 向阳空间 workspace.
7
20
  * @param xiangyangRoot - Absolute path of the reserved workspace directory.
8
21
  */
9
- export declare function seedXiangyangSkills(xiangyangRoot: string): Promise<{
10
- installed: string[];
11
- }>;
22
+ export declare function seedXiangyangSkills(xiangyangRoot: string): Promise<SeedXiangyangSkillsResult>;
12
23
  //# sourceMappingURL=xiangyang-skills.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"xiangyang-skills.d.ts","sourceRoot":"","sources":["../src/xiangyang-skills.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkGH;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAalC"}
1
+ {"version":3,"file":"xiangyang-skills.d.ts","sourceRoot":"","sources":["../src/xiangyang-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,mCAAmC,CAAC;AAE3C,YAAY,EAAE,kBAAkB,EAAE,CAAC;AACnC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,mCAAmC,CAAC;AAE3C,MAAM,WAAW,yBAAyB;IACxC,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,yBAAyB,CAAC,CAmBpC"}