nolo-cli 0.191.0-alpha.3 → 0.191.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 (149) hide show
  1. package/{_executeModel-WQ2D4ZRH.js → _executeModel-4HQQXPN4.js} +44 -46
  2. package/{action-BHWB4MOK.js → action-HNG2JKWK.js} +3 -3
  3. package/{addContentAction-BY375D35.js → addContentAction-FEN3H2EE.js} +6 -6
  4. package/{addDialogAgentAction-HOZYOCWC.js → addDialogAgentAction-DDA6S3WS.js} +5 -5
  5. package/{agentDeleteCommand-TTCVC74A.js → agentDeleteCommand-HZFWSKED.js} +57 -59
  6. package/{agentEmailCommands-PTG35KER.js → agentEmailCommands-HRYMVHC7.js} +59 -61
  7. package/{agentListCommands-MAG736RU.js → agentListCommands-HE2CCZEW.js} +33 -31
  8. package/{agentMachineCommands-ATOZK3R5.js → agentMachineCommands-ISSULCRR.js} +23 -23
  9. package/{agentProviderCommands-XSZUCNIR.js → agentProviderCommands-4EAYN3ZY.js} +3 -3
  10. package/{agentRecordCommands-KGRPIJN5.js → agentRecordCommands-WGAMWQLA.js} +57 -59
  11. package/{agentRunCommand-75VVJTNU.js → agentRunCommand-7EQ64FIB.js} +59 -61
  12. package/{agentRunControl-6HHESKDB.js → agentRunControl-EJPBPVLU.js} +5 -5
  13. package/{agentRuntimeLocal-NAAYNHCW.js → agentRuntimeLocal-ONSIOOQB.js} +20 -20
  14. package/{agentSlice-UJPIKKKP.js → agentSlice-CHWNVAS5.js} +6 -6
  15. package/{appDeleteCommands-VDHCDVBF.js → appDeleteCommands-RNAF4V5C.js} +25 -25
  16. package/{appDeployCommands-V6UTKVXR.js → appDeployCommands-LTIZ4QH7.js} +25 -25
  17. package/{appDeployStatusCommands-4UIFSEPC.js → appDeployStatusCommands-OJJR4LDK.js} +25 -25
  18. package/{appGetCommands-XKDXLC3C.js → appGetCommands-UJZF6U4V.js} +25 -25
  19. package/{appListCommands-BELRVX2Y.js → appListCommands-M5C5BIDY.js} +25 -25
  20. package/{authCommand-RV5MQDWN.js → authCommand-RMUBRAXF.js} +11 -11
  21. package/{builtinSkillRegistry-7MBUY5EY.js → builtinSkillRegistry-XDBPVNY6.js} +3 -5
  22. package/{chromeOpsCommands-C46BXHEE.js → chromeOpsCommands-P4PFQDT7.js} +19 -4
  23. package/{chunk-7UODCAWW.js → chunk-32GANJHJ.js} +1 -1
  24. package/{chunk-G6OOUQWJ.js → chunk-4KB6WQUL.js} +2 -0
  25. package/{chunk-LHOR5MC2.js → chunk-4KYV2TAI.js} +164 -323
  26. package/{chunk-5EFNSNAV.js → chunk-6CFXWUYE.js} +7 -7
  27. package/{chunk-6XIE5ZGI.js → chunk-6HIGYUBQ.js} +1 -1
  28. package/{chunk-LBXUNNDS.js → chunk-6K2AKJAD.js} +1 -1
  29. package/{chunk-U5ZHUOLT.js → chunk-6OBTQSJ2.js} +2 -2
  30. package/{chunk-XPL63OIC.js → chunk-7SUYSFPG.js} +140 -66
  31. package/{chunk-53RSTB7T.js → chunk-7TMVGMM3.js} +26 -31
  32. package/{chunk-ZBCBFOWC.js → chunk-A2ZMIRLN.js} +2 -2
  33. package/{chunk-MJWUBTK7.js → chunk-AOYR4XOA.js} +1 -1
  34. package/{chunk-IIX6VWLW.js → chunk-AV6IE6NM.js} +224 -38
  35. package/{chunk-WFUIXNKC.js → chunk-BMXR7CFX.js} +3 -3
  36. package/{chunk-JIFYXQRD.js → chunk-BTYQAODF.js} +26 -8
  37. package/{chunk-VHGD6FHV.js → chunk-BZKBX5BO.js} +28 -5
  38. package/{chunk-Q6RMLYSA.js → chunk-CMLBKYEI.js} +4 -2
  39. package/chunk-CMTTXP5Y.js +291 -0
  40. package/{chunk-OHRDHS4N.js → chunk-CVCRAO6Q.js} +9 -4
  41. package/{chunk-SM56M7N7.js → chunk-DBRXPVWY.js} +39 -5
  42. package/{chunk-2KBNF477.js → chunk-DSVR6ZAV.js} +30 -21
  43. package/{chunk-ADTJJVDJ.js → chunk-DXDG4XLD.js} +2838 -2255
  44. package/{chunk-R5LJWMZE.js → chunk-EMXVOJDB.js} +3 -3
  45. package/{chunk-KHCLMKZZ.js → chunk-EY7V7REW.js} +280 -6
  46. package/{chunk-KGP7UTNN.js → chunk-FNXSQ7A3.js} +15 -15
  47. package/{chunk-BTBT2566.js → chunk-FSEGCTZQ.js} +1 -1
  48. package/{chunk-CNMQATUF.js → chunk-GL7W7TTR.js} +2 -2
  49. package/{chunk-5KTQVMCX.js → chunk-GOO6G4PY.js} +85 -0
  50. package/{chunk-HTLIKE5U.js → chunk-GVMF62PR.js} +2 -2
  51. package/{chunk-UZHYRBUB.js → chunk-H4CFODT7.js} +137 -61
  52. package/{chunk-R4BMKAR5.js → chunk-HAB2UDLT.js} +1 -1
  53. package/{chunk-3NPXGNSK.js → chunk-HVXL4VOO.js} +348 -87
  54. package/{chunk-32ZKZET7.js → chunk-HWZT5DKX.js} +1 -1
  55. package/{chunk-GYVLAHA4.js → chunk-IY7DGZSY.js} +10 -4
  56. package/{chunk-FEDJHD5X.js → chunk-J5Z2SSIY.js} +6 -6
  57. package/{chunk-UVWBGWBO.js → chunk-JA6WCCDO.js} +3 -3
  58. package/{chunk-YE6A72XL.js → chunk-JI5MQU5B.js} +35 -31
  59. package/{chunk-TFSMPRAY.js → chunk-JLOCKFSI.js} +4 -4
  60. package/{chunk-UBLITLAZ.js → chunk-K2GL335R.js} +13 -3
  61. package/{chunk-DS5DAOIY.js → chunk-KYQXW7DL.js} +3 -3
  62. package/{chunk-5HAPEKNH.js → chunk-LFJRTOUV.js} +158 -43
  63. package/{chunk-N7E3LQ4A.js → chunk-LGW6A7GK.js} +1 -1
  64. package/{chunk-UNOILAZP.js → chunk-M6AGLVV4.js} +74 -2
  65. package/{chunk-BA2FHPS4.js → chunk-MOCY5LJI.js} +1 -1
  66. package/{chunk-INFHX73M.js → chunk-MR6L6U46.js} +55 -3
  67. package/{chunk-CTPFBJAF.js → chunk-N7IBYQEC.js} +182 -91
  68. package/{chunk-QU3TLYBR.js → chunk-NHI3JZP4.js} +32 -8
  69. package/{chunk-B2N5GZBU.js → chunk-OHYCQKPW.js} +6 -6
  70. package/{chunk-WAZ6BTSC.js → chunk-OOERQPG5.js} +1 -1
  71. package/{chunk-EHB4CKUI.js → chunk-OTKNEZE3.js} +9 -9
  72. package/chunk-OVBUUU7L.js +2648 -0
  73. package/{chunk-PVD7CRYV.js → chunk-P7SUBTGZ.js} +3 -3
  74. package/{chunk-RJ3EYB5G.js → chunk-PRIROPK4.js} +1 -1
  75. package/chunk-PRJ473FK.js +63 -0
  76. package/{chunk-K6TZSON4.js → chunk-PXERKNSJ.js} +1 -1
  77. package/{chunk-B6EZB6DW.js → chunk-QAYCF4CH.js} +2 -2
  78. package/{chunk-5DPVRMSY.js → chunk-RBJASUX4.js} +1 -1
  79. package/{chunk-NVOYW6H4.js → chunk-RDKNGJ5M.js} +12 -8
  80. package/{chunk-GTP6VNWH.js → chunk-RQ22OZD7.js} +3 -3
  81. package/{chunk-2E5M3JVS.js → chunk-RWGIVUH3.js} +11 -5
  82. package/{chunk-DFF6B7P7.js → chunk-RXUKDHS5.js} +1 -1
  83. package/{chunk-JLR5NWP2.js → chunk-RXX262QX.js} +17 -3
  84. package/{chunk-GC64WGMD.js → chunk-SM3NSZJV.js} +16 -5
  85. package/{chunk-A5BLRE3G.js → chunk-T3U2KQF4.js} +2 -2
  86. package/{chunk-HLAL63BZ.js → chunk-T43B7LB2.js} +1 -1
  87. package/{chunk-LCSAJ5TJ.js → chunk-UDKNC3CV.js} +3 -3
  88. package/{chunk-VE3FEZIT.js → chunk-WKGOIXFV.js} +5 -5
  89. package/{chunk-4YMD7B4Y.js → chunk-WPOKOKZA.js} +2 -2
  90. package/{chunk-YIRADHSY.js → chunk-WYKMOZTW.js} +1 -1
  91. package/{chunk-WRCZXJ4N.js → chunk-X4F26D5K.js} +2 -0
  92. package/{chunk-4MYCKDSI.js → chunk-XUOF4MA7.js} +2 -2
  93. package/{chunk-PD2YRFAI.js → chunk-Y5ZEHS3F.js} +1 -1
  94. package/{chunk-4CEAZRZ4.js → chunk-YU2DGFKG.js} +1 -1
  95. package/{chunk-TVGX5QIN.js → chunk-YUA6OAH5.js} +2 -2
  96. package/{chunk-53PBXLID.js → chunk-Z3MQYKRN.js} +17 -17
  97. package/{chunk-I3HWJODB.js → chunk-ZHOKF4MY.js} +31 -26
  98. package/{chunk-2XUOREKD.js → chunk-ZI5MFQ42.js} +5 -4
  99. package/{chunk-DYQXB46J.js → chunk-ZSCIGIJS.js} +1 -1
  100. package/{commandRegistry-4JHVRMW7.js → commandRegistry-O2657YC7.js} +86 -66
  101. package/{contentThunks-HQBAAXNW.js → contentThunks-THWDEBJU.js} +17 -17
  102. package/{cooldownCommands-4XKJFEBW.js → cooldownCommands-V4EEBD55.js} +3 -3
  103. package/{createAgentAutomationAction-KELPOVMP.js → createAgentAutomationAction-2ZZTFGWG.js} +17 -17
  104. package/{createDialogAction-Z3SASMTM.js → createDialogAction-FCRKPKIT.js} +20 -22
  105. package/{createPageAction-PNHOIG44.js → createPageAction-EC25JTKW.js} +18 -19
  106. package/{dbSlice-QAUXABCC.js → dbSlice-JK7LWBDO.js} +5 -5
  107. package/{deleteFile-R5OBP7OM.js → deleteFile-CE24BROO.js} +3 -3
  108. package/{dialogCommands-4BGV6DPD.js → dialogCommands-QH7BJ3DJ.js} +26 -26
  109. package/{dialogSlice-QHV6I3OQ.js → dialogSlice-Z5E7POEN.js} +16 -16
  110. package/{docCreateCommands-3CW75UF2.js → docCreateCommands-KP42NGIF.js} +26 -27
  111. package/{docDeleteCommands-NL4ZYMN5.js → docDeleteCommands-7YOCX5GC.js} +27 -28
  112. package/{docReadCommands-HXCNVDPQ.js → docReadCommands-EJEIAOKQ.js} +26 -27
  113. package/{docStore-LVMUSECS.js → docStore-6MHLMMWO.js} +6 -6
  114. package/{docUpdateCommands-RMVBAMDE.js → docUpdateCommands-ACJLISGA.js} +26 -27
  115. package/{getPricing-E2PLNWCR.js → getPricing-3PQY3TGI.js} +3 -3
  116. package/{handleSendMessageAction-7TONIXHY.js → handleSendMessageAction-MTOPN4D3.js} +86 -42
  117. package/index.js +7 -7
  118. package/{lib-4YTWAGY7.js → lib-5KKIBFIT.js} +439 -272
  119. package/{localRuntimeAdapter-HRAB7P5E.js → localRuntimeAdapter-4USQ3EP7.js} +55 -57
  120. package/{machineCommands-OTXFRTDA.js → machineCommands-CJMSDSOO.js} +56 -58
  121. package/{machineWsRunDispatch-KWVWOHHG.js → machineWsRunDispatch-YIPO76QH.js} +56 -58
  122. package/{memberThunks-ZAE52VIP.js → memberThunks-WT2KVRP4.js} +158 -55
  123. package/{models-UUNO6DOL.js → models-PJBE6JDV.js} +2 -2
  124. package/package.json +1 -1
  125. package/{providerPresetApply-JGNMO2KX.js → providerPresetApply-ISA35424.js} +5 -5
  126. package/{providerRegistry-33J3ZYFJ.js → providerRegistry-QIQCHVNP.js} +5 -5
  127. package/{read-D6NEWSGG.js → read-ILTT75DW.js} +3 -3
  128. package/{readDocTool-NTAXO7SX.js → readDocTool-374CFJYO.js} +1 -1
  129. package/{readlineWorkspace-CEX5TXGM.js → readlineWorkspace-RORGDWZN.js} +291 -99
  130. package/{removeDialogAgentAction-YEPO5AYI.js → removeDialogAgentAction-BDLO7UC2.js} +7 -7
  131. package/{runAgentClientLoop-DCV4BD2W.js → runAgentClientLoop-CDCBSUWW.js} +41 -43
  132. package/{runtimeDoctorCommands-NYBOTA6D.js → runtimeDoctorCommands-AM2V5YVH.js} +5 -5
  133. package/{secretCommands-N6CMCJDZ.js → secretCommands-G5XYCXZB.js} +308 -1
  134. package/{setDialogExtraReferencesAction-EH5GWDAJ.js → setDialogExtraReferencesAction-GBIT7WAG.js} +6 -6
  135. package/{setPrimaryDialogAgentAction-PNWRK6IY.js → setPrimaryDialogAgentAction-PGBTR247.js} +7 -7
  136. package/{settingThunks-7VCWB6P7.js → settingThunks-XQJZVA4D.js} +38 -7
  137. package/{skillDiscovery-F3TMVQOJ.js → skillDiscovery-DO5372J5.js} +2 -3
  138. package/{spaceCommands-ZUI4CTSO.js → spaceCommands-BTSANKDH.js} +23 -23
  139. package/{streamAgentChatTurn-NKFKMFQ2.js → streamAgentChatTurn-VUF3EUMS.js} +66 -59
  140. package/{switchDialogAgentAction-23BFWJMV.js → switchDialogAgentAction-O7WTPLKG.js} +5 -5
  141. package/{tools-626VXEY7.js → tools-GAAYAIEW.js} +35 -37
  142. package/{tuiSummaryLlmCaller-FSOADMXK.js → tuiSummaryLlmCaller-MKOLOSH3.js} +11 -11
  143. package/{updateCommands-KE6LP3QX.js → updateCommands-W7TXEV7N.js} +3 -3
  144. package/{updateDialogTitleAction-RNNQAMXG.js → updateDialogTitleAction-LE2DBQDS.js} +17 -17
  145. package/{windowsSelfUpdate-26TSFXEZ.js → windowsSelfUpdate-575VQ6QO.js} +2 -2
  146. package/chunk-7KWPNGVJ.js +0 -150
  147. package/chunk-AETZ7AD6.js +0 -274
  148. package/chunk-EUGTFFO6.js +0 -42
  149. package/chunk-VYNMQ6HW.js +0 -138
@@ -6,11 +6,11 @@ import {
6
6
  buildBuiltinObjectSkillDbKey,
7
7
  buildBuiltinObjectSkillPageContent,
8
8
  buildCodeWorkDiscipline
9
- } from "./chunk-SM56M7N7.js";
9
+ } from "./chunk-DBRXPVWY.js";
10
10
  import {
11
11
  buildSkillDocMarkdown,
12
12
  resolvePageSkillMetadata
13
- } from "./chunk-AETZ7AD6.js";
13
+ } from "./chunk-EY7V7REW.js";
14
14
  import {
15
15
  nolotusId
16
16
  } from "./chunk-Y6ORVLSS.js";
@@ -76,12 +76,28 @@ var buildIdentifierCandidates = (identifier, contentByKey) => {
76
76
  };
77
77
  async function resolveSkillGraphFromRoots(options) {
78
78
  const contentByKey = new Map(options.contentByKey ?? []);
79
- const requiredTools = /* @__PURE__ */ new Set();
80
- const recommendedTools = /* @__PURE__ */ new Set();
81
- const recommendedSkillHints = /* @__PURE__ */ new Set();
82
- const skillPromptPatches = /* @__PURE__ */ new Set();
83
- const visits = [];
84
- const visited = /* @__PURE__ */ new Set();
79
+ const createContribution = (ancestors) => ({
80
+ requiredTools: /* @__PURE__ */ new Set(),
81
+ recommendedTools: /* @__PURE__ */ new Set(),
82
+ recommendedSkillHints: /* @__PURE__ */ new Set(),
83
+ skillPromptPatches: /* @__PURE__ */ new Set(),
84
+ visits: [],
85
+ visited: new Set(ancestors)
86
+ });
87
+ const contribution = createContribution();
88
+ const strict = options.strictRequiredDependencies === true;
89
+ const blockedRoots = [];
90
+ const mergeContribution = (target, source) => {
91
+ source.requiredTools.forEach((value) => target.requiredTools.add(value));
92
+ source.recommendedTools.forEach((value) => target.recommendedTools.add(value));
93
+ source.recommendedSkillHints.forEach((value) => target.recommendedSkillHints.add(value));
94
+ source.skillPromptPatches.forEach((value) => target.skillPromptPatches.add(value));
95
+ for (const visit2 of source.visits) {
96
+ const key = `${visit2.mode}:${visit2.dbKey}`;
97
+ if (!target.visited.has(key)) target.visits.push(visit2);
98
+ target.visited.add(key);
99
+ }
100
+ };
85
101
  const loadPageCached = async (identifier) => {
86
102
  const resolvedIdentifier = buildIdentifierCandidates(identifier, contentByKey);
87
103
  if (!resolvedIdentifier) return null;
@@ -97,17 +113,22 @@ async function resolveSkillGraphFromRoots(options) {
97
113
  }
98
114
  return page ?? null;
99
115
  };
100
- const visit = async (identifier, mode, sourceLabel) => {
116
+ const visit = async (identifier, mode, sourceLabel, target, path = []) => {
101
117
  const page = await loadPageCached(identifier);
102
- if (!page?.dbKey) return;
103
- const visitKey = `${mode}:${page.dbKey}`;
104
- if (visited.has(visitKey)) return;
105
- visited.add(visitKey);
118
+ if (!page?.dbKey) return strict ? [{ path: [...path, identifier], reason: "missing" }] : [];
106
119
  const meta = resolvePageSkillMetadata(page);
120
+ const canonicalIdentifier = asOptionalTrimmedString(meta?.skillConfig?.id) ?? page.dbKey;
121
+ const nextPath = [...path, canonicalIdentifier];
122
+ if (options.admitSkill && !await options.admitSkill(page, canonicalIdentifier)) {
123
+ return strict ? [{ path: nextPath, reason: "denied" }] : [];
124
+ }
125
+ const visitKey = `${mode}:${page.dbKey}`;
126
+ if (target.visited.has(visitKey)) return [];
127
+ target.visited.add(visitKey);
107
128
  const directTools = canonicalizeToolNames(page.tools ?? []);
108
129
  const skillTools = canonicalizeToolNames(meta?.skillConfig?.toolNames ?? []);
109
130
  const mergedTools = joinUniqueStrings(directTools, skillTools);
110
- visits.push({
131
+ target.visits.push({
111
132
  dbKey: page.dbKey,
112
133
  title: page.title,
113
134
  mode,
@@ -115,33 +136,60 @@ async function resolveSkillGraphFromRoots(options) {
115
136
  meta
116
137
  });
117
138
  if (mode === "required") {
118
- mergedTools.forEach((toolName) => requiredTools.add(toolName));
139
+ mergedTools.forEach((toolName) => target.requiredTools.add(toolName));
119
140
  if (meta?.skillConfig?.promptPatch) {
120
- skillPromptPatches.add(meta.skillConfig.promptPatch);
141
+ target.skillPromptPatches.add(meta.skillConfig.promptPatch);
121
142
  }
122
143
  } else {
123
- mergedTools.forEach((toolName) => recommendedTools.add(toolName));
144
+ mergedTools.forEach((toolName) => target.recommendedTools.add(toolName));
124
145
  if (meta?.skillConfig?.name) {
125
- recommendedSkillHints.add(meta.skillConfig.name);
146
+ target.recommendedSkillHints.add(meta.skillConfig.name);
126
147
  }
127
148
  }
128
149
  const nextHard = meta?.requiredSkills ?? meta?.skillConfig?.requiredSkills ?? [];
129
150
  const nextSoft = meta?.recommendedSkills ?? meta?.skillConfig?.recommendedSkills ?? [];
151
+ if (strict) {
152
+ const failures = (await Promise.all(nextHard.map(
153
+ (childKey) => visit(childKey, mode, page.dbKey, target, nextPath)
154
+ ))).flat();
155
+ await Promise.all(nextSoft.map(async (childKey) => {
156
+ const branch = createContribution(target.visited);
157
+ const branchFailures = await visit(childKey, "recommended", page.dbKey, branch, nextPath);
158
+ if (branchFailures.length === 0) mergeContribution(target, branch);
159
+ }));
160
+ return failures;
161
+ }
130
162
  if (mode === "required") {
131
- await Promise.all(nextHard.map((childKey) => visit(childKey, "required", page.dbKey)));
132
- await Promise.all(nextSoft.map((childKey) => visit(childKey, "recommended", page.dbKey)));
133
- return;
163
+ await Promise.all(nextHard.map((childKey) => visit(childKey, "required", page.dbKey, target)));
164
+ await Promise.all(nextSoft.map((childKey) => visit(childKey, "recommended", page.dbKey, target)));
165
+ return [];
134
166
  }
135
- await Promise.all([...nextHard, ...nextSoft].map((childKey) => visit(childKey, "recommended", page.dbKey)));
167
+ await Promise.all([...nextHard, ...nextSoft].map((childKey) => visit(childKey, "recommended", page.dbKey, target)));
168
+ return [];
136
169
  };
137
- await Promise.all(options.roots.map((root) => visit(root.identifier, root.mode, root.sourceLabel)));
170
+ if (strict) {
171
+ const results = await Promise.all(options.roots.map(async (root) => {
172
+ const target = createContribution();
173
+ const failures = await visit(root.identifier, root.mode, root.sourceLabel, target);
174
+ return { root, target, failures };
175
+ }));
176
+ for (const { root, target, failures } of results) {
177
+ if (failures.length > 0) blockedRoots.push(...failures.map((failure) => ({ root, ...failure })));
178
+ else mergeContribution(contribution, target);
179
+ }
180
+ } else {
181
+ await Promise.all(options.roots.map(
182
+ (root) => visit(root.identifier, root.mode, root.sourceLabel, contribution)
183
+ ));
184
+ }
138
185
  return {
139
- requiredTools: Array.from(requiredTools),
140
- recommendedTools: Array.from(recommendedTools),
141
- recommendedSkillHints: Array.from(recommendedSkillHints),
142
- skillPromptPatches: Array.from(skillPromptPatches),
186
+ requiredTools: Array.from(contribution.requiredTools),
187
+ recommendedTools: Array.from(contribution.recommendedTools),
188
+ recommendedSkillHints: Array.from(contribution.recommendedSkillHints),
189
+ skillPromptPatches: Array.from(contribution.skillPromptPatches),
143
190
  contentByKey,
144
- visits
191
+ visits: contribution.visits,
192
+ ...strict ? { blockedRoots } : {}
145
193
  };
146
194
  }
147
195
 
@@ -1182,9 +1230,69 @@ function buildAutoReviewSkillContentBySlug(slug) {
1182
1230
  });
1183
1231
  }
1184
1232
 
1233
+ // packages/ai/skills/ubModeSkill.ts
1234
+ var UB_MODE_SKILL_SLUGS = ["ub-mode"];
1235
+ function deterministicId7(prefix, seed) {
1236
+ let h = 2166136261;
1237
+ for (let i = 0; i < seed.length; i++) {
1238
+ h ^= seed.charCodeAt(i);
1239
+ h = h * 16777619 >>> 0;
1240
+ }
1241
+ const suffix = h.toString(36).toUpperCase().padStart(14, "0");
1242
+ return (prefix + suffix).slice(0, 26);
1243
+ }
1244
+ function buildUbModeSkillId(slug) {
1245
+ return deterministicId7("01SK", slug);
1246
+ }
1247
+ function buildUbModeSkillPageKey(userId, slug) {
1248
+ return `page-${userId}-${buildUbModeSkillId(slug)}`;
1249
+ }
1250
+ function buildUbModeSkillConfig(slug) {
1251
+ return {
1252
+ version: "0.1",
1253
+ kind: "skill",
1254
+ id: buildUbModeSkillId(slug),
1255
+ name: "\u4EE3\u7801\u8D28\u91CF\u539F\u5219\uFF08ub-mode \xB7 Nolo \u9002\u914D\u7248\uFF09",
1256
+ triggerMode: "explicit",
1257
+ description: "Nolo \u9002\u914D\u7248\uFF0C\u53C2\u8003 unclebob/ub-mode \u7684\u4EE3\u7801\u8D28\u91CF\u539F\u5219\u3002\u7528\u6237\u663E\u5F0F\u542F\u7528\u540E\uFF0C\u4EE5 TDD\u3001\u6700\u5C0F\u6539\u52A8\u3001\u6839\u56E0\u4FEE\u590D\u3001\u590D\u6742\u5EA6\u4E0E\u91CD\u590D\u6CBB\u7406\u3001\u884C\u4E3A\u6D4B\u8BD5\u6307\u5BFC\u7F16\u7801\uFF1B\u4E0D\u9ED8\u8BA4\u542F\u7528\uFF0C\u4E0D\u6388\u4E88\u5DE5\u5177\u6216\u63D0\u4EA4\u3001\u63A8\u9001\u3001\u5220\u9664\u6743\u9650\u3002\u89E6\u53D1\u8BCD\uFF1Aub-mode\u3001/ub-mode\u3002"
1258
+ };
1259
+ }
1260
+ var BODY2 = [
1261
+ "# ub-mode \xB7 Nolo \u9002\u914D\u7248",
1262
+ "",
1263
+ "## \u6765\u6E90\u4E0E\u9002\u914D\u8FB9\u754C",
1264
+ "\u672C\u8BF4\u660E\u7531 Nolo \u72EC\u7ACB\u7F16\u5199\uFF0C\u539F\u5219\u53C2\u8003 unclebob \u7684 ub-mode \u9879\u76EE\uFF0C\u4E0D\u662F\u4E0A\u6E38\u539F\u6587\u3001\u5B98\u65B9\u7248\u672C\u6216\u5168\u6587\u7FFB\u8BD1\u3002",
1265
+ "\u6765\u6E90\uFF1Ahttps://github.com/unclebob/ub-mode\uFF1B\u53C2\u8003\u539F\u6587\uFF1Ahttps://github.com/unclebob/ub-mode/blob/master/SKILL.md \u3002",
1266
+ "\u9002\u914D\u65F6\u672A\u53D1\u73B0\u660E\u786E\u8BB8\u53EF\u8BC1\u58F0\u660E\uFF1B\u4E0D\u636E\u6B64\u63A8\u5B9A\u83B7\u5F97\u5168\u6587\u518D\u5206\u53D1\u8BB8\u53EF\u3002\u6B64\u5904\u4EC5\u63D0\u4F9B\u7B80\u6D01\u7684\u539F\u5219\u8BF4\u660E\uFF0C\u539F\u6587\u4E0E\u540E\u7EED\u53D8\u52A8\u4EE5\u4E0A\u6E38\u4E3A\u51C6\u3002",
1267
+ "",
1268
+ "## \u542F\u7528\u4E0E\u6743\u9650",
1269
+ "- \u4EC5\u5728\u7528\u6237\u663E\u5F0F\u542F\u7528\u7684\u4F5C\u7528\u57DF\u5185\u5E94\u7528\uFF0C\u4E0D\u9ED8\u8BA4\u542F\u7528\u4E8E\u7528\u6237\u3001\u5BF9\u8BDD\u6216\u9879\u76EE\uFF1B\u6682\u505C\u3001\u5173\u95ED\u6216\u5355\u6B21\u8986\u76D6\u4F18\u5148\u3002\u4E0D\u8981\u4EC5\u56E0\u4EFB\u52A1\u6D89\u53CA\u7F16\u7801\u4FBF\u81EA\u884C\u542F\u7528\u3002",
1270
+ "- \u8FD9\u662F\u4E00\u4EFD\u7F16\u7801\u6307\u5BFC\uFF0C\u4E0D\u6388\u4E88\u4EFB\u4F55\u5DE5\u5177\u6743\u9650\uFF0C\u4E5F\u4E0D\u81EA\u52A8\u52A0\u8F7D\u5176\u4ED6 Skill\u3002\u5E73\u53F0\u66F4\u9AD8\u4F18\u5148\u7EA7\u89C4\u5219\u3001\u7528\u6237\u6388\u6743\u8FB9\u754C\u548C\u9879\u76EE\u95E8\u7981\u4F18\u5148\u3002",
1271
+ "- \u542F\u7528\u4E0D\u7B49\u4E8E\u6388\u6743 commit\u3001push\u3001\u5408\u5E76\u3001\u53D1\u5E03\u6216\u5220\u9664\u6E05\u7406\uFF1B\u8FD9\u4E9B\u64CD\u4F5C\u4ECD\u987B\u6EE1\u8DB3\u5404\u81EA\u7684\u786E\u8BA4\u4E0E\u5BA1\u67E5\u8981\u6C42\u3002\u672A\u63D0\u4EA4\u5DE5\u4F5C\u548C\u4ED6\u4EBA\u8D44\u6E90\u4E0D\u5F97\u81EA\u884C\u6E05\u7406\u3002",
1272
+ "",
1273
+ "## \u7F16\u7801\u539F\u5219",
1274
+ "1. **\u5148\u660E\u786E\u884C\u4E3A\uFF0C\u518D\u505A\u6700\u5C0F\u6539\u52A8**\uFF1A\u786E\u8BA4\u8F93\u5165\u3001\u8F93\u51FA\u3001\u6570\u636E\u7ED3\u6784\u4E0E\u9A8C\u6536\u76EE\u6807\uFF1B\u53EA\u6539\u89E3\u51B3\u5F53\u524D\u95EE\u9898\u5FC5\u9700\u7684\u90E8\u5206\uFF0C\u4E0D\u5939\u5E26\u65E0\u5173\u91CD\u6784\u3002\u76F8\u540C\u51B3\u7B56\u4FDD\u6301\u5355\u4E00\u771F\u503C\u3002",
1275
+ "2. **TDD**\uFF1A\u80FD\u8BDA\u5B9E\u9A8C\u8BC1\u65F6\uFF0C\u5148\u5199\u80FD\u66B4\u9732\u76EE\u6807\u884C\u4E3A\u7F3A\u53E3\u7684\u6D4B\u8BD5\uFF0C\u89C2\u5BDF\u5B83\u56E0\u9884\u671F\u539F\u56E0\u5931\u8D25\uFF0C\u518D\u7528\u6700\u5C0F\u5B9E\u73B0\u4F7F\u5176\u901A\u8FC7\uFF0C\u6700\u540E\u5728\u884C\u4E3A\u53D7\u4FDD\u62A4\u65F6\u91CD\u6784\u3002\u82E5\u65E0\u6CD5\u6267\u884C\u6D4B\u8BD5\u6216\u96BE\u4EE5\u6784\u9020\u6709\u6548\u6D4B\u8BD5\uFF0C\u660E\u786E\u8BF4\u660E\u9650\u5236\uFF0C\u4E0D\u4F2A\u9020\u7EA2\u7EFF\u8BC1\u636E\uFF0C\u4E0D\u5199\u65E0\u4EF7\u503C\u6D4B\u8BD5\u51D1\u6570\u3002",
1276
+ "3. **\u4FEE\u590D\u6839\u56E0**\uFF1A\u5148\u590D\u73B0\u6216\u6536\u96C6\u76F4\u63A5\u8BC1\u636E\uFF0C\u533A\u5206\u75C7\u72B6\u4E0E\u539F\u56E0\u3002\u8FDE\u7EED\u4FEE\u590D\u5931\u8D25\u65F6\u91CD\u65B0\u68C0\u67E5\u5171\u540C\u524D\u63D0\uFF1B\u4E0D\u8981\u7528\u541E\u9519\u6216\u989D\u5916\u5B88\u536B\u63A9\u76D6\u7F3A\u9677\u3002",
1277
+ "4. **\u63A7\u5236\u590D\u6742\u5EA6\u4E0E\u91CD\u590D**\uFF1A\u68C0\u67E5\u5206\u652F\u3001\u5D4C\u5957\u3001\u804C\u8D23\u548C\u91CD\u590D\u7684\u4E1A\u52A1\u51B3\u7B56\uFF1B\u4F18\u5148\u7B80\u5316\u6570\u636E\u6A21\u578B\u4E0E\u8FB9\u754C\uFF0C\u518D\u6309\u8BC1\u636E\u63D0\u53D6\u5171\u4EAB\u903B\u8F91\u3002\u4E0D\u4E3A\u6307\u6807\u62C6\u788E\u6E05\u6670\u4EE3\u7801\uFF0C\u4E0D\u4E3A\u8868\u9762\u76F8\u4F3C\u5236\u9020\u62BD\u8C61\u3002",
1278
+ "5. **\u6D4B\u8BD5\u53EF\u89C2\u5BDF\u884C\u4E3A**\uFF1A\u4ECE\u8C03\u7528\u8005\u5165\u53E3\u68C0\u67E5\u8F93\u51FA\u3001\u72B6\u6001\u4E0E\u526F\u4F5C\u7528\uFF0C\u800C\u4E0D\u662F\u79C1\u6709\u5B9E\u73B0\u6216 mock \u81EA\u8BC1\u3002\u91CD\u6784\u524D\u56FA\u5B9A\u5173\u952E\u884C\u4E3A\uFF0C\u91CD\u6784\u540E\u8FD0\u884C\u76F8\u5173\u68C0\u67E5\uFF0C\u786E\u8BA4\u884C\u4E3A\u672A\u53D8\u3002",
1279
+ "6. **\u7EA6\u675F\u72B6\u6001\u4E0E\u8FB9\u754C**\uFF1A\u5916\u90E8\u6570\u636E\u5728\u5165\u53E3\u6821\u9A8C\uFF0C\u5185\u90E8\u903B\u8F91\u5C3D\u91CF\u4FDD\u6301\u7EAF\u51FD\u6570\uFF1B\u7528\u7C7B\u578B\u8868\u8FBE\u6709\u6548\u72B6\u6001\u3002\u65E0\u5171\u4EAB\u5199\u5165\u9700\u6C42\u7684\u4EFB\u52A1\u9694\u79BB\u72B6\u6001\uFF0C\u6709\u5171\u4EAB\u72B6\u6001\u65F6\u660E\u786E\u5199\u5165\u8005\u4E0E\u6062\u590D/\u5E42\u7B49\u7B56\u7565\u3002",
1280
+ "7. **\u5C0F\u6B65\u4EA4\u4ED8\u4E0E\u8BC1\u636E**\uFF1A\u628A\u6539\u52A8\u62C6\u6210\u53EF\u9A8C\u8BC1\u7684\u5C0F\u5355\u5143\uFF1B\u65E0\u6587\u4EF6\u51B2\u7A81\u6216\u771F\u5B9E\u6570\u636E\u4F9D\u8D56\u7684\u5DE5\u4F5C\u6309\u5E73\u53F0\u89C4\u5219\u5E76\u884C\uFF0C\u4E0D\u628A\u4E0A\u6E38\u7684\u987A\u5E8F\u5EFA\u8BAE\u53D8\u6210\u5168\u5C40\u4E32\u884C\u3002\u6C47\u62A5\u6539\u52A8\u3001\u5B9E\u9645\u68C0\u67E5\u7ED3\u679C\u4E0E\u5C1A\u672A\u9A8C\u8BC1\u7684\u90E8\u5206\u3002",
1281
+ "",
1282
+ "## \u8D28\u91CF\u5DE5\u5177\u4E0E\u7ED3\u679C\u771F\u5B9E\u6027",
1283
+ "- Crapper\uFF08\u590D\u6742\u5EA6\u4E0E\u6D4B\u8BD5\u98CE\u9669\uFF09\u3001Dryer\uFF08\u91CD\u590D\u68C0\u67E5\uFF09\u3001Mutator\uFF08\u53D8\u5F02\u6D4B\u8BD5\uFF09\u53EF\u4F5C\u4E3A\u8F85\u52A9\uFF0C\u4E0D\u662F\u542F\u7528\u524D\u63D0\u3002\u4EC5\u5728\u73AF\u5883\u5DF2\u5B89\u88C5\u3001\u9879\u76EE\u5141\u8BB8\u4E14\u9002\u5408\u5F53\u524D\u4EFB\u52A1\u65F6\u4F7F\u7528\uFF1B\u4E0D\u81EA\u52A8\u5B89\u88C5\u3002",
1284
+ "- \u5DE5\u5177\u672A\u5B89\u88C5\u3001\u68C0\u67E5\u672A\u6267\u884C\u6216\u6267\u884C\u5931\u8D25\u65F6\uFF0C\u5FC5\u987B\u5982\u5B9E\u8BF4\u660E\uFF1B\u4E0D\u53EF\u5BA3\u79F0\u68C0\u67E5\u901A\u8FC7\u3002\u666E\u901A\u6D4B\u8BD5\u901A\u8FC7\u4E5F\u4E0D\u80FD\u5192\u5145\u590D\u6742\u5EA6\u3001\u91CD\u590D\u6216\u53D8\u5F02\u68C0\u67E5\u901A\u8FC7\u3002"
1285
+ ].join("\n");
1286
+ function buildUbModeSkillContentBySlug(slug) {
1287
+ return buildSkillDocMarkdown({
1288
+ body: BODY2,
1289
+ skillConfig: buildUbModeSkillConfig(slug)
1290
+ });
1291
+ }
1292
+
1185
1293
  // packages/ai/skills/worktreeSkill.ts
1186
1294
  var WORKTREE_SKILL_SLUGS = ["worktree-isolation"];
1187
- function deterministicId7(prefix, seed) {
1295
+ function deterministicId8(prefix, seed) {
1188
1296
  let h = 2166136261;
1189
1297
  for (let i = 0; i < seed.length; i++) {
1190
1298
  h ^= seed.charCodeAt(i);
@@ -1197,7 +1305,7 @@ function normalizeSkillSeed6(input) {
1197
1305
  return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
1198
1306
  }
1199
1307
  function buildWorktreeSkillId(slug) {
1200
- return deterministicId7("01SK", normalizeSkillSeed6(slug) || slug);
1308
+ return deterministicId8("01SK", normalizeSkillSeed6(slug) || slug);
1201
1309
  }
1202
1310
  function buildWorktreeSkillPageKey(userId, slug) {
1203
1311
  return `page-${userId}-${buildWorktreeSkillId(slug)}`;
@@ -1264,7 +1372,7 @@ function buildWorktreeSkillContentBySlug(slug) {
1264
1372
 
1265
1373
  // packages/ai/skills/secretsManagerSkill.ts
1266
1374
  var SECRETS_MANAGER_SKILL_SLUGS = ["secrets-manager"];
1267
- function deterministicId8(prefix, seed) {
1375
+ function deterministicId9(prefix, seed) {
1268
1376
  let h = 2166136261;
1269
1377
  for (let i = 0; i < seed.length; i++) {
1270
1378
  h ^= seed.charCodeAt(i);
@@ -1277,7 +1385,7 @@ function normalizeSkillSeed7(input) {
1277
1385
  return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
1278
1386
  }
1279
1387
  function buildSecretsManagerSkillId(slug) {
1280
- return deterministicId8("01SK", normalizeSkillSeed7(slug) || slug);
1388
+ return deterministicId9("01SK", normalizeSkillSeed7(slug) || slug);
1281
1389
  }
1282
1390
  function buildSecretsManagerSkillPageKey(userId, slug) {
1283
1391
  return `page-${userId}-${buildSecretsManagerSkillId(slug)}`;
@@ -1358,7 +1466,7 @@ function buildSecretsManagerSkillContentBySlug(slug) {
1358
1466
 
1359
1467
  // packages/ai/skills/systematicInvestigationSkill.ts
1360
1468
  var SYSTEMATIC_INVESTIGATION_SKILL_SLUGS = ["systematic-investigation"];
1361
- function deterministicId9(prefix, seed) {
1469
+ function deterministicId10(prefix, seed) {
1362
1470
  let h = 2166136261;
1363
1471
  for (let i = 0; i < seed.length; i++) {
1364
1472
  h ^= seed.charCodeAt(i);
@@ -1371,7 +1479,7 @@ function normalizeSkillSeed8(input) {
1371
1479
  return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
1372
1480
  }
1373
1481
  function buildSystematicinvestigationSkillId(slug) {
1374
- return deterministicId9("01SK", normalizeSkillSeed8(slug) || slug);
1482
+ return deterministicId10("01SK", normalizeSkillSeed8(slug) || slug);
1375
1483
  }
1376
1484
  function buildSystematicinvestigationSkillPageKey(userId, slug) {
1377
1485
  return `page-${userId}-${buildSystematicinvestigationSkillId(slug)}`;
@@ -1395,7 +1503,7 @@ function buildSystematicinvestigationSkillContentBySlug(slug) {
1395
1503
 
1396
1504
  // packages/ai/skills/showMeSkill.ts
1397
1505
  var SHOW_ME_SKILL_SLUGS = ["show-me"];
1398
- function deterministicId10(prefix, seed) {
1506
+ function deterministicId11(prefix, seed) {
1399
1507
  let h = 2166136261;
1400
1508
  for (let i = 0; i < seed.length; i++) {
1401
1509
  h ^= seed.charCodeAt(i);
@@ -1408,7 +1516,7 @@ function normalizeSkillSeed9(input) {
1408
1516
  return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
1409
1517
  }
1410
1518
  function buildShowmeSkillId(slug) {
1411
- return deterministicId10("01SK", normalizeSkillSeed9(slug) || slug);
1519
+ return deterministicId11("01SK", normalizeSkillSeed9(slug) || slug);
1412
1520
  }
1413
1521
  function buildShowmeSkillPageKey(userId, slug) {
1414
1522
  return `page-${userId}-${buildShowmeSkillId(slug)}`;
@@ -1432,7 +1540,7 @@ function buildShowmeSkillContentBySlug(slug) {
1432
1540
 
1433
1541
  // packages/ai/skills/cavemanSkill.ts
1434
1542
  var CAVEMAN_SKILL_SLUGS = ["caveman"];
1435
- function deterministicId11(prefix, seed) {
1543
+ function deterministicId12(prefix, seed) {
1436
1544
  let h = 2166136261;
1437
1545
  for (let i = 0; i < seed.length; i++) {
1438
1546
  h ^= seed.charCodeAt(i);
@@ -1445,7 +1553,7 @@ function normalizeSkillSeed10(input) {
1445
1553
  return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
1446
1554
  }
1447
1555
  function buildCavemanSkillId(slug) {
1448
- return deterministicId11("01SK", normalizeSkillSeed10(slug) || slug);
1556
+ return deterministicId12("01SK", normalizeSkillSeed10(slug) || slug);
1449
1557
  }
1450
1558
  function buildCavemanSkillPageKey(userId, slug) {
1451
1559
  return `page-${userId}-${buildCavemanSkillId(slug)}`;
@@ -1469,7 +1577,7 @@ function buildCavemanSkillContentBySlug(slug) {
1469
1577
 
1470
1578
  // packages/ai/skills/skillCreatorSkill.ts
1471
1579
  var SKILL_CREATOR_SKILL_SLUGS = ["skill-creator"];
1472
- function deterministicId12(prefix, seed) {
1580
+ function deterministicId13(prefix, seed) {
1473
1581
  let h = 2166136261;
1474
1582
  for (let i = 0; i < seed.length; i++) {
1475
1583
  h ^= seed.charCodeAt(i);
@@ -1482,7 +1590,7 @@ function normalizeSkillSeed11(input) {
1482
1590
  return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
1483
1591
  }
1484
1592
  function buildSkillCreatorSkillId(slug) {
1485
- return deterministicId12("01SK", normalizeSkillSeed11(slug) || slug);
1593
+ return deterministicId13("01SK", normalizeSkillSeed11(slug) || slug);
1486
1594
  }
1487
1595
  function buildSkillCreatorSkillPageKey(userId, slug) {
1488
1596
  return `page-${userId}-${buildSkillCreatorSkillId(slug)}`;
@@ -1499,14 +1607,14 @@ function buildSkillCreatorSkillConfig(slug) {
1499
1607
  }
1500
1608
  function buildSkillCreatorSkillContentBySlug(slug) {
1501
1609
  return buildSkillDocMarkdown({
1502
- body: "# Skill Creator (Agent Skill \u7F16\u5199\u65B9\u6CD5\u8BBA)\n\n\u5199 skill \u662F\u7ED9 agent \u5199\u300C\u53EF\u88AB\u8DEF\u7531\u5230\u7684\u5DE5\u4F5C\u8BF4\u660E\u4E66\u300D\uFF0C\u4E0D\u662F\u7ED9\u4EBA\u770B\u7684\u6587\u6863\u3002\u672C skill \u53EA\u8BB2**\u600E\u4E48\u5199 skill**\uFF1B\u8BE5\u4E0D\u8BE5\u65B0\u5EFA\u4E00\u4E2A agent\u3001agent \u7684\u521B\u5EFA\u6D41\u7A0B\u5F52\u5185\u7F6E `agent-creator` \u7BA1\u3002\n\n## Core Principles\n\n### Concise is Key\n\n\u4E0A\u4E0B\u6587\u7A97\u53E3\u662F\u5171\u4EAB\u7684\uFF1Asystem prompt\u3001\u5BF9\u8BDD\u5386\u53F2\u3001\u5176\u4ED6 skill \u7684\u5143\u6570\u636E\u3001\u7528\u6237\u8BF7\u6C42\u90FD\u5728\u91CC\u9762\u3002**\u9ED8\u8BA4\u5047\u8BBE agent \u5DF2\u7ECF\u591F\u806A\u660E**\uFF0C\u53EA\u8865\u5B83\u6CA1\u6709\u7684\u4E0A\u4E0B\u6587\u3002\u6BCF\u53E5\u8BDD\u5148\u8FC7\u4E09\u95EE\uFF1A\u4E0D\u8BF4 agent \u80FD\u4E0D\u80FD\u81EA\u5DF1\u63A8\u51FA\u6765\uFF1F\u2192 \u5220\u3002\u522B\u7684 skill \u91CC\u6709\u6CA1\u6709\uFF1F\u2192 \u5F15\u7528\u5B83\u3002\u662F\u4E0D\u662F\u8BE6\u7EC6\u53C2\u8003\u8D44\u6599\uFF1F\u2192 \u653E `references/` \u6309\u9700\u52A0\u8F7D\u3002\u5B81\u8981\u77ED\u793A\u4F8B\uFF0C\u4E0D\u8981\u957F\u89E3\u91CA\u3002\n\n### Degree of Freedom\n\n\u628A\u8868\u8FF0\u7684\u4E25\u683C\u7A0B\u5EA6\u5339\u914D\u4EFB\u52A1\u7684\u8106\u5F31\u5EA6\uFF1A\n\n- **\u9AD8**\uFF08\u6587\u5B57\u8BF4\u660E\uFF09\u2014\u2014\u591A\u6761\u8DEF\u90FD\u901A\uFF0C\u51B3\u7B56\u4F9D\u8D56\u4E0A\u4E0B\u6587\n- **\u4E2D**\uFF08\u5E26\u53C2\u6570\u7684\u6A21\u677F\u811A\u672C\uFF09\u2014\u2014\u6709\u9996\u9009\u6A21\u5F0F\uFF0C\u5141\u8BB8\u5C11\u91CF\u53D8\u5316\n- **\u4F4E**\uFF08\u5199\u6B7B\u7684\u811A\u672C\u4E0E\u7ED3\u6784\uFF09\u2014\u2014\u64CD\u4F5C\u8106\u5F31\u3001\u4E00\u81F4\u6027\u5173\u952E\n\n### What to Not Include\n\nskill \u91CC\u53EA\u653E\u76F4\u63A5\u652F\u6491\u5B83\u804C\u80FD\u7684\u6587\u4EF6\u3002**\u7EDD\u4E0D\u521B\u5EFA** `README.md`\u3001`INSTALLATION_GUIDE.md`\u3001`CHANGELOG.md` \u6216\u4EFB\u4F55\u8BB2\u8FF0\u300C\u5B83\u662F\u600E\u4E48\u505A\u51FA\u6765\u7684\u300D\u7684\u9644\u5C5E\u6587\u6863\u3002skill \u662F\u7ED9 agent \u5E72\u6D3B\u7684\uFF0C\u4E0D\u662F\u7ED9\u4EBA\u8BFB\u5236\u4F5C\u8FC7\u7A0B\u7684\u3002\n\n## Skill Creation Process\n\n### Step 1: \u4E00\u53E5\u8BDD\u6D4B\u8BD5\n\n\u5148\u7528\u4E00\u53E5\u8BDD\u8BF4\u6E05\u8FD9\u4E2A skill \u5E72\u4EC0\u4E48\u3002\u8BF4\u4E0D\u6E05\u5C31\u505C\u4E0B\u91CD\u60F3\u3002\u300C\u5B83\u5E2E\u5FD9\u505A\u4EE3\u7801\u5BA1\u67E5\u300D\u592A\u6A21\u7CCA\uFF1B\u300C\u5B83\u5BA1\u67E5 TypeScript PR \u7684 bug\u3001\u98CE\u683C\u4E0E\u67B6\u6784\uFF0C\u5E76\u8FD4\u56DE\u5E26 severity \u7B49\u7EA7\u7684\u7ED3\u6784\u5316\u62A5\u544A\u300D\u5408\u683C\u3002\n\n#### 1b. \u8BCA\u65AD\u6A21\u7CCA\u9700\u6C42\n\n\u7528\u6237\u63CF\u8FF0\u7684\u662F\u75DB\u70B9\u800C\u4E0D\u662F skill \u8BF7\u6C42\uFF08\u300C\u6211\u6BCF\u6B21\u90FD\u5F97\u624B\u52A8\u68C0\u67E5 X\u300D\uFF09\u65F6\uFF0C\u5148\u8BCA\u65AD\u518D\u8981\u7ED3\u6784\uFF1A\n\n- \u8FD9\u4EF6\u4E8B\u6700\u9002\u5408\u7684\u662F skill\u3001\u811A\u672C\u3001\u6587\u6863\uFF0C\u8FD8\u662F\u505A\u4E00\u6B21\u5C31\u591F\uFF1F\n- \u82E5\u9002\u5408 skill\uFF0C\u6700\u8F7B\u7684\u5F62\u6001\u662F\u4EC0\u4E48\uFF1Aworkflow\u3001checklist\u3001reference\uFF0C\u8FD8\u662F\u5DE5\u5177\u5C01\u88C5\uFF1F\n- \u6700\u591A\u63A8\u8350\u4E24\u4E2A\u65B9\u5411\uFF0C\u8BF4\u6E05\u5404\u81EA\u9002\u914D\u70B9\u4E0E\u5C40\u9650\u3002\n\n#### 1c. \u95EE\u5BF9\u95EE\u9898\n\n\u52A8\u7B14\u524D\u628A\u6838\u5FC3\u95EE\u6E05\u695A\uFF0C**\u6BCF\u8F6E\u6700\u591A 2-3 \u4E2A\u95EE\u9898**\uFF0C\u4E0D\u8981\u5012\u51FA\u4E00\u5F20\u8868\u5355\u3002\u6838\u5FC3\u95EE\u9898\uFF1A(1) \u8FD9\u4E2A skill \u8981\u63A5\u7BA1\u54EA\u4EF6 recurring \u7684\u6D3B\uFF1F(2) \u522B\u4EBA\u4F1A\u5582\u7ED9\u5B83\u4EC0\u4E48\u771F\u5B9E\u8F93\u5165\uFF1F(3) \u5B83\u8BE5\u8FD4\u56DE\u4EC0\u4E48\u6210\u54C1\uFF1F(4) \u76F8\u90BB\u7684\u54EA\u4E9B\u8BF7\u6C42\u5B83\u8981\u660E\u786E\u62D2\u7EDD\uFF1F\n\n**\u987A\u5E8F\u6709\u8BB2\u7A76**\uFF1A\u5148\u95EE\u8FB9\u754C\uFF08\u300C\u5B83\u4E0D\u8BE5\u505A\u4EC0\u4E48\u300D\uFF09\uFF0C\u518D\u95EE\u4EA7\u51FA\uFF08\u300C\u6210\u529F\u957F\u4EC0\u4E48\u6837\u300D\uFF09\uFF0C\u6700\u540E\u624D\u95EE\u7ED3\u6784\uFF1B\u80FD\u4E00\u53E5\u8BDD\u8BF4\u6E05 skill \u65F6\u5C31\u505C\u6B62\u63D0\u95EE\u3002\n\n#### 1d. \u5BF9\u8BDD\u8BED\u6C14\n\n\u8BED\u6C14\u5339\u914D\u7528\u6237\u72B6\u6001\u800C\u4E0D\u662F\u6A21\u677F\uFF1A\u60F3\u6CD5\u6A21\u7CCA\u65F6\u5148\u5E76\u80A9\u628A\u5B83\u7406\u6E05\uFF0C\u76EE\u6807\u6E05\u6670\u65F6\u76F4\u63A5\u4E0A\u7ED3\u6784\uFF0C\u60F3\u5171\u521B\u5C31\u50CF\u5BF9\u7B49\u8BA8\u8BBA\u5E76\u4ECE\u5BF9\u8BDD\u91CC\u62A0\u8FB9\u754C\u3002\u7B2C\u4E00\u56DE\u590D\u6C38\u8FDC\u4E0D\u8981\u662F\u4E00\u5F20\u51B7\u51B0\u51B0\u7684\u8868\u5355\u95EE\u5377\uFF0C\u4E5F\u4E0D\u8981\u5728\u7406\u89E3\u771F\u5B9E\u804C\u8D23\u4E4B\u524D\u5C31\u7529\u4E00\u5957\u6A21\u677F\u3002\n\n### Step 2: \u89C4\u5212\u7ED3\u6784\n\n\u6309 skill \u6027\u8D28\u9009\u4E00\u79CD\u6A21\u5F0F\uFF1A\n\n**Workflow-based**\u2014\u2014\u6709\u6E05\u6670\u6B65\u9AA4\u7684\u987A\u5E8F\u6D41\u7A0B\uFF1A`## Overview \u2192 ## Workflow \u2192 ## Step 1 \u2192 ## Step 2 ...`\uFF0C\u9002\u5408\u90E8\u7F72\u3001\u53D1\u5E03\u3001\u6392\u9519\u6D41\u7A0B\u3002\n\n**Task-based**\u2014\u2014\u4E00\u7EC4\u76F8\u5173\u64CD\u4F5C\uFF1A`## Overview \u2192 ## Quick Start \u2192 ## Task A \u2192 ## Task B ...`\uFF0C\u9002\u5408 CLI \u53C2\u8003\u3001\u5DE5\u5177\u96C6\u3001API \u6307\u5357\u3002\n\n**Reference-based**\u2014\u2014\u6807\u51C6\u3001schema\u3001\u7B56\u7565\uFF1A`## Overview \u2192 ## Rules \u2192 ## Examples \u2192 ## Boundaries`\uFF0C\u9002\u5408\u4EE3\u7801\u5BA1\u67E5\u89C4\u8303\u3001\u54C1\u724C\u6807\u51C6\u3001\u67B6\u6784\u539F\u5219\u3002\n\n### Step 3: \u521D\u59CB\u5316\n\n\u5EFA\u76EE\u5F55 `<skill-name>/`\uFF0C\u5199 `SKILL.md`\uFF0CYAML frontmatter \u81F3\u5C11\u542B `name`\uFF08kebab-case\uFF09\u4E0E `description`\u3002\u9879\u76EE\u82E5\u81EA\u5E26\u811A\u624B\u67B6\uFF08\u5982 bun-nolo \u7684 `bun scripts/skill/init.ts <name>`\uFF09\u4F18\u5148\u7528\u5B83\uFF0C\u5426\u5219\u624B\u5199\u3002\n\n### Step 4: \u5199 SKILL.md\n\n#### Frontmatter\n\n**\u5148\u5199 `description`**\u2014\u2014\u5B83\u662F agent \u51B3\u5B9A\u52A0\u8F7D\u524D\u552F\u4E00\u80FD\u770B\u5230\u7684\u4E1C\u897F\uFF0C\u4E5F\u662F\u4E3B\u8981\u89E6\u53D1\u673A\u5236\u3002agent \u5929\u7136**\u6B20\u89E6\u53D1**\uFF0C\u8981\u7528\u300Cpushy\u300D\u63AA\u8F9E\u5BF9\u6297\u3002\n\n```yaml\ndescription: >\n [\u5B83\u505A\u4EC0\u4E48]\u3002Use when [\u5177\u4F53\u89E6\u53D1\u8BCD\u3001\u5173\u952E\u8BCD\u3001\u573A\u666F]\u3002\n```\n\n\u89C4\u5219\uFF1A\n\n- \u540C\u65F6\u5199\u300C\u505A\u4EC0\u4E48\u300D\u548C\u300C\u4F55\u65F6\u7528\u300D\uFF1B\u6240\u6709 when-to-use \u4FE1\u606F\u8FDB description\uFF0C\u4E0D\u8FDB\u6B63\u6587\n- \u89E6\u53D1\u8BCD\u8981\u5177\u4F53\uFF08\u6B63\u5F0F\u8BF4\u6CD5\u4E0E\u53E3\u8BED\u90FD\u8BF4\u4E0A\uFF09\uFF0C\u70B9\u540D\u6587\u4EF6\u7C7B\u578B\u3001\u5DE5\u5177\u6216\u573A\u666F\n- \u7528 pushy \u63AA\u8F9E\uFF08\u300CMake sure to use this skill whenever...\u300D\uFF09\n- \u8D1F\u5411\u8FB9\u754C\uFF08\u300C\u4E0D\u505A X\u300D\uFF09\u653E\u6B63\u6587 `## Boundaries`\uFF0C\u4E0D\u8981\u8FDB description\u2014\u2014description \u662F\u53D1\u73B0\u83DC\u5355\uFF0C\u6BCF\u4E2A\u5B57\u90FD\u8BE5\u5E2E agent \u5224\u65AD\u8981\u4E0D\u8981\u52A0\u8F7D\n- \u22641024 \u5B57\u7B26\uFF1B\u4E0D\u542B\u5C16\u62EC\u53F7 `<>`\n\n#### \u6B63\u6587\n\n- \u7528\u7948\u4F7F\u53E5\uFF08\u300C\u8BFB\u8FD9\u4E2A\u6587\u4EF6\u300D\u300C\u68C0\u67E5\u683C\u5F0F\u300D\uFF09\n- \u89E3\u91CA **why** \u800C\u4E0D\u53EA\u662F what\u2014\u2014agent \u591F\u806A\u660E\uFF0C\u80FD\u4ECE\u539F\u5219\u63A8\u7406\n- \u5B81\u8981\u77ED\u793A\u4F8B\uFF0C\u4E0D\u8981\u957F\u89E3\u91CA\n- \u5F15\u7528\u5176\u4ED6 skill \u7528\u53CD\u5F15\u53F7\u5305\u540D\u5B57\n- SKILL.md \u4FDD\u6301\u7CBE\u7B80\uFF0C\u771F\u6B63\u9700\u8981\u65F6\u624D\u62C6 `references/`\n- \u9009\u5B9A\u7ED3\u6784\u6A21\u5F0F\u540E\u5220\u6389\u6A21\u677F\u91CC\u7684\u7ED3\u6784\u6027 HTML \u6CE8\u91CA\n\n\u6BCF\u4E2A skill \u5FC5\u987B\u6709 `## Boundaries` \u4E00\u8282\uFF0C\u5217\u51FA\u5B83\u523B\u610F**\u4E0D**\u505A\u7684\u4E8B\u2014\u2014\u6CA1\u6709\u8FB9\u754C\u7684 skill \u4F1A\u9010\u6E10\u541E\u5E76\u76F8\u90BB\u4EFB\u52A1\u76F4\u5230\u4E0D\u53EF\u9760\uFF1B\u663E\u5F0F\u5217\u51FA\u4E0D\u5904\u7406\u4EC0\u4E48\uFF0C\u662F\u63D0\u5347\u89E6\u53D1\u51C6\u786E\u7387\u6700\u5FEB\u7684\u529E\u6CD5\u3002\n\n### Step 5: \u6821\u9A8C\n\n\u8DD1\u9879\u76EE\u81EA\u5E26\u6821\u9A8C\uFF08\u5982 bun-nolo \u7684 `bun scripts/skill/validate.ts <path>` \u6216 `--all`\uFF09\uFF1B\u6CA1\u6709\u5C31\u6309\u6B64\u6E05\u5355\u81EA\u67E5\uFF1ASKILL.md \u5B58\u5728\uFF1Bfrontmatter \u5408\u6CD5\uFF1B`name` \u662F kebab-case \u4E14 \u226464 \u5B57\u7B26\uFF1B`description` \u5B58\u5728\u3001\u65E0 `<>`\u3001\u22641024 \u5B57\u7B26\u3001\u65E0\u6B8B\u7559 TODO\uFF1B\u6709 `## Boundaries`\u3002\u5168\u8FC7\u624D\u7B97\u5B8C\u6210\u3002\n\n### Step 6: \u8FED\u4EE3\n\n\u7528\u300C\u63D0\u5347\u53EF\u9760\u6027\u5927\u4E8E\u589E\u52A0\u4E0A\u4E0B\u6587\u6210\u672C\u300D\u7684\u6700\u5C0F\u6539\u52A8\u3002\u5305\u66F4\u5927\u53EA\u5728\u8DEF\u7531\u3001\u6267\u884C\u6216\u6CBB\u7406\u660E\u663E\u66F4\u53EF\u9760\u65F6\u624D\u66F4\u4F18\u3002skill \u53CD\u590D\u4EA7\u51FA\u574F\u8F93\u51FA\u65F6\uFF0C\u6839\u56E0\u5F88\u5C11\u662F\u4E00\u6761\u574F\u6307\u4EE4\uFF0C\u901A\u5E38\u662F\u7ED3\u6784\u95EE\u9898\u3002\u52A0\u66F4\u591A\u6587\u5B57\u4E4B\u524D\u5148\u95EE\uFF1A\n\n1. \u8FD9\u4E2A skill **\u62E5\u6709**\u4EC0\u4E48\uFF1F\u8FB9\u754C\u6E05\u4E0D\u6E05\uFF1F\n2. \u4EC0\u4E48**\u53CD\u9988**\u8BF4\u660E\u5B83\u5728\u53D8\u597D\u8FD8\u662F\u5728\u6F02\u79FB\uFF1F\n3. \u54EA\u4E2A\u5931\u6548\u53EA\u6709**\u53CD\u590D\u4F7F\u7528**\u540E\u624D\u4F1A\u51FA\u73B0\uFF1F\n4. \u54EA\u5904\u662F**\u6700\u5C0F\u6539\u52A8\u3001\u6700\u5927\u8D28\u91CF\u6536\u76CA**\uFF1F\n\n## \u8DE8\u5E73\u53F0\u517C\u5BB9\n\nskill \u7CFB\u7EDF\u9075\u5FAA Agent Skills \u5F00\u653E\u6807\u51C6\uFF08Anthropic/OpenAI \u517C\u5BB9\uFF09\uFF1Afrontmatter \u7528 `name`\uFF08kebab-case\uFF0C\u226464 \u5B57\u7B26\uFF09+ `description`\uFF08\u5FC5\u586B\uFF0C\u65E0\u5C16\u62EC\u53F7\uFF09\uFF1B\u53EF\u9009\u5B57\u6BB5 `triggers`\u3001`assertions`\u3001`license`\u3001`metadata`\u3001`compatibility`\u3002\n\n```text\nskill-name/\n\u251C\u2500\u2500 SKILL.md (required)\n\u251C\u2500\u2500 agents/ (optional \u2014 platform-specific metadata)\n\u251C\u2500\u2500 references/ (optional \u2014 docs loaded on demand)\n\u251C\u2500\u2500 scripts/ (optional \u2014 executable code)\n\u2514\u2500\u2500 assets/ (optional \u2014 templates, images, fonts)\n```\n\n## Common Mistakes\n\n| Mistake | Fix |\n|---|---|\n| Description \u6CDB\u6CDB\uFF08\u300Chelps with X\u300D\uFF09 | \u8865\u5177\u4F53\u89E6\u53D1\u8BCD\u4E0E\u573A\u666F |\n| when-to-use \u5199\u5728\u6B63\u6587 | \u632A\u8FDB description |\n| Description \u542B\u5C16\u62EC\u53F7 | \u53BB\u6389 `<>`\uFF08\u7834\u574F XML \u89E3\u6790\uFF09 |\n| skill \u540D\u4E0E\u6CE8\u518C\u8868\u4E0D\u4E00\u81F4 | \u8DD1\u6821\u9A8C\u811A\u672C\u6293\u4E0D\u5339\u914D |\n| \u5EFA\u4E86\u6587\u4EF6\u5FD8\u4E86\u6CE8\u518C | \u7528\u811A\u624B\u67B6\u800C\u4E0D\u662F\u624B\u5EFA |\n| \u6CA1\u6709 Boundaries \u4E00\u8282 | \u81F3\u5C11\u5199\u4E00\u6761\u5B83\u4E0D\u505A\u4EC0\u4E48 |\n| \u6B63\u6587\u8FC7\u957F\uFF08>500 \u884C\uFF09 | \u62C6\u6210 SKILL.md + references/ |\n\n## Boundaries\n\n- \u53EA\u8BB2\u600E\u4E48\u5199 skill\uFF1B\u4E0D\u56DE\u7B54\u5177\u4F53\u4E1A\u52A1\u95EE\u9898\uFF0C\u4E5F\u4E0D\u66FF\u4EE3\u4EFB\u4F55\u5177\u4F53 skill \u672C\u8EAB\n- \u4E0D\u7BA1 agent \u7684\u521B\u5EFA\u4E0E\u751F\u547D\u5468\u671F\u2014\u2014\u90A3\u662F\u5185\u7F6E `agent-creator` \u7684\u804C\u8D23\n- \u4E0D\u4E3A\u4E86\u300C\u770B\u8D77\u6765\u4E13\u4E1A\u300D\u6269\u5199\u957F\u6587\uFF1B\u76EE\u6807\u59CB\u7EC8\u662F\u9AD8\u4FE1\u566A\u6BD4\u3001\u6613\u89E6\u53D1\u3001\u6613\u7EF4\u62A4",
1610
+ body: "# Skill Creator (Agent Skill \u7F16\u5199\u65B9\u6CD5\u8BBA)\n\n\u5199 skill \u662F\u7ED9 agent \u5199\u300C\u53EF\u88AB\u8DEF\u7531\u5230\u7684\u5DE5\u4F5C\u8BF4\u660E\u4E66\u300D\uFF0C\u4E0D\u662F\u7ED9\u4EBA\u770B\u7684\u6587\u6863\u3002\u672C skill \u53EA\u8BB2**\u600E\u4E48\u5199 skill**\uFF1B\u8BE5\u4E0D\u8BE5\u65B0\u5EFA\u4E00\u4E2A agent\u3001agent \u7684\u521B\u5EFA\u6D41\u7A0B\u5F52\u5185\u7F6E `agent-creator` \u7BA1\u3002\n\n## Core Principles\n\n### Concise is Key\n\n\u4E0A\u4E0B\u6587\u7A97\u53E3\u662F\u5171\u4EAB\u7684\uFF1Asystem prompt\u3001\u5BF9\u8BDD\u5386\u53F2\u3001\u5176\u4ED6 skill \u7684\u5143\u6570\u636E\u3001\u7528\u6237\u8BF7\u6C42\u90FD\u5728\u91CC\u9762\u3002**\u9ED8\u8BA4\u5047\u8BBE agent \u5DF2\u7ECF\u591F\u806A\u660E**\uFF0C\u53EA\u8865\u5B83\u6CA1\u6709\u7684\u4E0A\u4E0B\u6587\u3002\u6BCF\u53E5\u8BDD\u5148\u8FC7\u4E09\u95EE\uFF1A\u4E0D\u8BF4 agent \u80FD\u4E0D\u80FD\u81EA\u5DF1\u63A8\u51FA\u6765\uFF1F\u2192 \u5220\u3002\u522B\u7684 skill \u91CC\u6709\u6CA1\u6709\uFF1F\u2192 \u5F15\u7528\u5B83\u3002\u662F\u4E0D\u662F\u8BE6\u7EC6\u53C2\u8003\u8D44\u6599\uFF1F\u2192 \u653E `references/` \u6309\u9700\u52A0\u8F7D\u3002\u5B81\u8981\u77ED\u793A\u4F8B\uFF0C\u4E0D\u8981\u957F\u89E3\u91CA\u3002\n\n### Degree of Freedom\n\n\u628A\u8868\u8FF0\u7684\u4E25\u683C\u7A0B\u5EA6\u5339\u914D\u4EFB\u52A1\u7684\u8106\u5F31\u5EA6\uFF1A\n\n- **\u9AD8**\uFF08\u6587\u5B57\u8BF4\u660E\uFF09\u2014\u2014\u591A\u6761\u8DEF\u90FD\u901A\uFF0C\u51B3\u7B56\u4F9D\u8D56\u4E0A\u4E0B\u6587\n- **\u4E2D**\uFF08\u5E26\u53C2\u6570\u7684\u6A21\u677F\u811A\u672C\uFF09\u2014\u2014\u6709\u9996\u9009\u6A21\u5F0F\uFF0C\u5141\u8BB8\u5C11\u91CF\u53D8\u5316\n- **\u4F4E**\uFF08\u5199\u6B7B\u7684\u811A\u672C\u4E0E\u7ED3\u6784\uFF09\u2014\u2014\u64CD\u4F5C\u8106\u5F31\u3001\u4E00\u81F4\u6027\u5173\u952E\n\n### What to Not Include\n\nskill \u91CC\u53EA\u653E\u76F4\u63A5\u652F\u6491\u5B83\u804C\u80FD\u7684\u6587\u4EF6\u3002**\u7EDD\u4E0D\u521B\u5EFA** `README.md`\u3001`INSTALLATION_GUIDE.md`\u3001`CHANGELOG.md` \u6216\u4EFB\u4F55\u8BB2\u8FF0\u300C\u5B83\u662F\u600E\u4E48\u505A\u51FA\u6765\u7684\u300D\u7684\u9644\u5C5E\u6587\u6863\u3002skill \u662F\u7ED9 agent \u5E72\u6D3B\u7684\uFF0C\u4E0D\u662F\u7ED9\u4EBA\u8BFB\u5236\u4F5C\u8FC7\u7A0B\u7684\u3002\n\n## Skill Creation Process\n\n### Step 1: \u4E00\u53E5\u8BDD\u6D4B\u8BD5\n\n\u5148\u7528\u4E00\u53E5\u8BDD\u8BF4\u6E05\u8FD9\u4E2A skill \u5E72\u4EC0\u4E48\u3002\u8BF4\u4E0D\u6E05\u5C31\u505C\u4E0B\u91CD\u60F3\u3002\u300C\u5B83\u5E2E\u5FD9\u505A\u4EE3\u7801\u5BA1\u67E5\u300D\u592A\u6A21\u7CCA\uFF1B\u300C\u5B83\u5BA1\u67E5 TypeScript PR \u7684 bug\u3001\u98CE\u683C\u4E0E\u67B6\u6784\uFF0C\u5E76\u8FD4\u56DE\u5E26 severity \u7B49\u7EA7\u7684\u7ED3\u6784\u5316\u62A5\u544A\u300D\u5408\u683C\u3002\n\n#### 1b. \u8BCA\u65AD\u6A21\u7CCA\u9700\u6C42\n\n\u7528\u6237\u63CF\u8FF0\u7684\u662F\u75DB\u70B9\u800C\u4E0D\u662F skill \u8BF7\u6C42\uFF08\u300C\u6211\u6BCF\u6B21\u90FD\u5F97\u624B\u52A8\u68C0\u67E5 X\u300D\uFF09\u65F6\uFF0C\u5148\u8BCA\u65AD\u518D\u8981\u7ED3\u6784\uFF1A\n\n- \u8FD9\u4EF6\u4E8B\u6700\u9002\u5408\u7684\u662F skill\u3001\u811A\u672C\u3001\u6587\u6863\uFF0C\u8FD8\u662F\u505A\u4E00\u6B21\u5C31\u591F\uFF1F\n- \u82E5\u9002\u5408 skill\uFF0C\u6700\u8F7B\u7684\u5F62\u6001\u662F\u4EC0\u4E48\uFF1Aworkflow\u3001checklist\u3001reference\uFF0C\u8FD8\u662F\u5DE5\u5177\u5C01\u88C5\uFF1F\n- \u6700\u591A\u63A8\u8350\u4E24\u4E2A\u65B9\u5411\uFF0C\u8BF4\u6E05\u5404\u81EA\u9002\u914D\u70B9\u4E0E\u5C40\u9650\u3002\n\n#### 1c. \u95EE\u5BF9\u95EE\u9898\n\n\u52A8\u7B14\u524D\u628A\u6838\u5FC3\u95EE\u6E05\u695A\uFF0C**\u6BCF\u8F6E\u6700\u591A 2-3 \u4E2A\u95EE\u9898**\uFF0C\u4E0D\u8981\u5012\u51FA\u4E00\u5F20\u8868\u5355\u3002\u6838\u5FC3\u95EE\u9898\uFF1A(1) \u8FD9\u4E2A skill \u8981\u63A5\u7BA1\u54EA\u4EF6 recurring \u7684\u6D3B\uFF1F(2) \u522B\u4EBA\u4F1A\u5582\u7ED9\u5B83\u4EC0\u4E48\u771F\u5B9E\u8F93\u5165\uFF1F(3) \u5B83\u8BE5\u8FD4\u56DE\u4EC0\u4E48\u6210\u54C1\uFF1F(4) \u76F8\u90BB\u7684\u54EA\u4E9B\u8BF7\u6C42\u5B83\u8981\u660E\u786E\u62D2\u7EDD\uFF1F\n\n**\u987A\u5E8F\u6709\u8BB2\u7A76**\uFF1A\u5148\u95EE\u8FB9\u754C\uFF08\u300C\u5B83\u4E0D\u8BE5\u505A\u4EC0\u4E48\u300D\uFF09\uFF0C\u518D\u95EE\u4EA7\u51FA\uFF08\u300C\u6210\u529F\u957F\u4EC0\u4E48\u6837\u300D\uFF09\uFF0C\u6700\u540E\u624D\u95EE\u7ED3\u6784\uFF1B\u80FD\u4E00\u53E5\u8BDD\u8BF4\u6E05 skill \u65F6\u5C31\u505C\u6B62\u63D0\u95EE\u3002\n\n#### 1d. \u5BF9\u8BDD\u8BED\u6C14\n\n\u8BED\u6C14\u5339\u914D\u7528\u6237\u72B6\u6001\u800C\u4E0D\u662F\u6A21\u677F\uFF1A\u60F3\u6CD5\u6A21\u7CCA\u65F6\u5148\u5E76\u80A9\u628A\u5B83\u7406\u6E05\uFF0C\u76EE\u6807\u6E05\u6670\u65F6\u76F4\u63A5\u4E0A\u7ED3\u6784\uFF0C\u60F3\u5171\u521B\u5C31\u50CF\u5BF9\u7B49\u8BA8\u8BBA\u5E76\u4ECE\u5BF9\u8BDD\u91CC\u62A0\u8FB9\u754C\u3002\u7B2C\u4E00\u56DE\u590D\u6C38\u8FDC\u4E0D\u8981\u662F\u4E00\u5F20\u51B7\u51B0\u51B0\u7684\u8868\u5355\u95EE\u5377\uFF0C\u4E5F\u4E0D\u8981\u5728\u7406\u89E3\u771F\u5B9E\u804C\u8D23\u4E4B\u524D\u5C31\u7529\u4E00\u5957\u6A21\u677F\u3002\n\n### Step 2: \u89C4\u5212\u7ED3\u6784\n\n\u6309 skill \u6027\u8D28\u9009\u4E00\u79CD\u6A21\u5F0F\uFF1A\n\n**Workflow-based**\u2014\u2014\u6709\u6E05\u6670\u6B65\u9AA4\u7684\u987A\u5E8F\u6D41\u7A0B\uFF1A`## Overview \u2192 ## Workflow \u2192 ## Step 1 \u2192 ## Step 2 ...`\uFF0C\u9002\u5408\u90E8\u7F72\u3001\u53D1\u5E03\u3001\u6392\u9519\u6D41\u7A0B\u3002\n\n**Task-based**\u2014\u2014\u4E00\u7EC4\u76F8\u5173\u64CD\u4F5C\uFF1A`## Overview \u2192 ## Quick Start \u2192 ## Task A \u2192 ## Task B ...`\uFF0C\u9002\u5408 CLI \u53C2\u8003\u3001\u5DE5\u5177\u96C6\u3001API \u6307\u5357\u3002\n\n**Reference-based**\u2014\u2014\u6807\u51C6\u3001schema\u3001\u7B56\u7565\uFF1A`## Overview \u2192 ## Rules \u2192 ## Examples \u2192 ## Boundaries`\uFF0C\u9002\u5408\u4EE3\u7801\u5BA1\u67E5\u89C4\u8303\u3001\u54C1\u724C\u6807\u51C6\u3001\u67B6\u6784\u539F\u5219\u3002\n\n### Step 3: \u521D\u59CB\u5316\n\n\u5EFA\u76EE\u5F55 `<skill-name>/`\uFF0C\u5199 `SKILL.md`\uFF0CYAML frontmatter \u81F3\u5C11\u542B `name`\uFF08kebab-case\uFF09\u4E0E `description`\u3002\u9879\u76EE\u82E5\u81EA\u5E26\u811A\u624B\u67B6\uFF08\u5982 bun-nolo \u7684 `bun scripts/skill/init.ts <name>`\uFF09\u4F18\u5148\u7528\u5B83\uFF0C\u5426\u5219\u624B\u5199\u3002\n\n### Step 4: \u5199 SKILL.md\n\n#### Frontmatter\n\n**\u5148\u5199 `description`**\u2014\u2014\u5B83\u662F\u5E38\u9A7B\u53D1\u73B0\u83DC\u5355\u91CC agent \u51B3\u5B9A\u662F\u5426\u52A0\u8F7D\u7684\u552F\u4E00\u4F9D\u636E\uFF0C\u5199\u6E05\u300C\u6838\u5FC3\u7528\u9014 + \u5FC5\u8981\u533A\u5206\u6027\u89E6\u53D1\u8BCD\u300D\uFF0C\u907F\u514D\u7A77\u4E3E\u540C\u4E49\u8BCD\u3001\u5197\u957F\u5F3A\u5236\u89E6\u53D1\u5957\u8BDD\uFF08\u5982\u300CMake sure to use this skill whenever...\u300D\uFF09\u4EE5\u53CA\u5B9E\u73B0\u7EC6\u8282\u6216\u8E29\u5751\u7ECF\u9A8C\u3002\n\n```yaml\ndescription: >\n [\u6838\u5FC3\u7528\u9014]\u3002Use when [\u5173\u952E\u533A\u5206\u6027\u89E6\u53D1\u8BCD\u3001\u5173\u952E\u573A\u666F]\u3002\n```\n\n\u89C4\u5219\uFF1A\n\n- \u5199\u6E05\u6838\u5FC3\u7528\u9014\u4E0E\u5FC5\u8981\u533A\u5206\u6027\u89E6\u53D1\u8BCD\uFF1B\u8BE6\u7EC6\u89E6\u53D1\u573A\u666F\u3001\u6267\u884C\u6B65\u9AA4\u3001\u8E29\u5751\u4E0E\u5B9E\u73B0\u653E\u6B63\u6587\u6216 `references/`\uFF0C\u4E0D\u5806\u5165 description\n- \u89E6\u53D1\u8BCD\u8FFD\u6C42\u7CBE\u51C6\u533A\u5206\uFF08\u70B9\u540D\u5173\u952E\u6587\u4EF6\u7C7B\u578B\u3001\u4E13\u7528\u5DE5\u5177\u6216\u7279\u6709\u52A8\u4F5C\uFF09\uFF0C\u4E0D\u8981\u673A\u68B0\u7A77\u4E3E\u540C\u4E49\u8BCD\u6216\u5806\u780C\u300C\u65E0\u8BBA\u5982\u4F55\u5FC5\u987B\u89E6\u53D1\u300D\u7B49 pushy \u5957\u8BDD\n- \u957F\u5EA6\u8981\u6C42\uFF1A\u22641024 \u5B57\u7B26\u662F\u5F00\u653E\u6807\u51C6\u7684\u683C\u5F0F\u786C\u4E0A\u9650\u800C\u975E\u76EE\u6807\u957F\u5EA6\uFF1B\u5B9E\u9645\u5E94\u6309\u5BBF\u4E3B\u5C55\u793A\u9884\u7B97\u5199\uFF08\u5982 Nolo \u672C\u5730\u5E38\u9A7B\u53D1\u73B0\u76EE\u5F55\u622A\u65AD\u81F3 200 \u5B57\u7B26\uFF0C\u4E14\u591A skill \u65F6\u53EF\u80FD\u603B\u9884\u7B97\u6309\u6BD4\u4F8B\u538B\u7F29\uFF09\uFF0C\u6838\u5FC3\u7528\u9014\u4E0E\u5173\u952E\u89E6\u53D1\u8BCD\u5FC5\u987B\u524D\u7F6E\n- \u8D1F\u5411\u8FB9\u754C\uFF08\u300C\u4E0D\u505A X\u300D\uFF09\u653E\u6B63\u6587 `## Boundaries`\uFF0C\u4E0D\u8981\u8FDB description\u2014\u2014description \u662F\u53D1\u73B0\u83DC\u5355\uFF0C\u6BCF\u4E2A\u5B57\u90FD\u8BE5\u5E2E agent \u5224\u65AD\u8981\u4E0D\u8981\u52A0\u8F7D\n- \u4E0D\u542B\u5C16\u62EC\u53F7 `<>`\uFF08\u7834\u574F XML \u89E3\u6790\uFF09\n\n#### \u6B63\u6587\n\n- \u7528\u7948\u4F7F\u53E5\uFF08\u300C\u8BFB\u8FD9\u4E2A\u6587\u4EF6\u300D\u300C\u68C0\u67E5\u683C\u5F0F\u300D\uFF09\n- \u89E3\u91CA **why** \u800C\u4E0D\u53EA\u662F what\u2014\u2014agent \u591F\u806A\u660E\uFF0C\u80FD\u4ECE\u539F\u5219\u63A8\u7406\n- \u5B81\u8981\u77ED\u793A\u4F8B\uFF0C\u4E0D\u8981\u957F\u89E3\u91CA\n- \u5F15\u7528\u5176\u4ED6 skill \u7528\u53CD\u5F15\u53F7\u5305\u540D\u5B57\n- SKILL.md \u4FDD\u6301\u7CBE\u7B80\uFF0C\u771F\u6B63\u9700\u8981\u65F6\u624D\u62C6 `references/`\n- \u9009\u5B9A\u7ED3\u6784\u6A21\u5F0F\u540E\u5220\u6389\u6A21\u677F\u91CC\u7684\u7ED3\u6784\u6027 HTML \u6CE8\u91CA\n\n\u6BCF\u4E2A skill \u5FC5\u987B\u6709 `## Boundaries` \u4E00\u8282\uFF0C\u5217\u51FA\u5B83\u523B\u610F**\u4E0D**\u505A\u7684\u4E8B\u2014\u2014\u6CA1\u6709\u8FB9\u754C\u7684 skill \u4F1A\u9010\u6E10\u541E\u5E76\u76F8\u90BB\u4EFB\u52A1\u76F4\u5230\u4E0D\u53EF\u9760\uFF1B\u663E\u5F0F\u5217\u51FA\u4E0D\u5904\u7406\u4EC0\u4E48\uFF0C\u662F\u63D0\u5347\u89E6\u53D1\u51C6\u786E\u7387\u6700\u5FEB\u7684\u529E\u6CD5\u3002\n\n### Step 5: \u6821\u9A8C\n\n\u8DD1\u9879\u76EE\u81EA\u5E26\u6821\u9A8C\uFF08\u5982 bun-nolo \u7684 `bun scripts/skill/validate.ts <path>` \u6216 `--all`\uFF09\uFF1B\u6CA1\u6709\u5C31\u6309\u6B64\u6E05\u5355\u81EA\u67E5\uFF1ASKILL.md \u5B58\u5728\uFF1Bfrontmatter \u5408\u6CD5\uFF1B`name` \u662F kebab-case \u4E14 \u226464 \u5B57\u7B26\uFF1B`description` \u5B58\u5728\u3001\u65E0 `<>`\u3001\u22641024 \u5B57\u7B26\uFF08\u683C\u5F0F\u4E0A\u9650\uFF0C\u4E14\u6309\u5BBF\u4E3B\u9884\u7B97\u524D\u7F6E\u6838\u5FC3\u7528\u9014\u4E0E\u5173\u952E\u89E6\u53D1\u8BCD\uFF09\u3001\u65E0\u6B8B\u7559 TODO\uFF1B\u6709 `## Boundaries`\u3002\u6B64\u5916\uFF0C\u56DE\u8BFB\u5B9E\u9645\u53D1\u73B0\u76EE\u5F55\uFF08\u5982\u672C\u5730\u5355\u6761 200 \u5B57\u7B26\u4E0E\u603B\u9884\u7B97\u7F29\u77ED\u573A\u666F\uFF09\uFF0C\u68C0\u67E5\u622A\u65AD\u540E\u6838\u5FC3\u7528\u9014\u4E0E\u5173\u952E\u533A\u5206\u6027\u89E6\u53D1\u8BCD\u662F\u5426\u4F9D\u7136\u5B8C\u6574\u4FDD\u7559\u3002\u5168\u8FC7\u624D\u7B97\u5B8C\u6210\u3002\n\n### Step 6: \u8FED\u4EE3\n\n\u7528\u300C\u63D0\u5347\u53EF\u9760\u6027\u5927\u4E8E\u589E\u52A0\u4E0A\u4E0B\u6587\u6210\u672C\u300D\u7684\u6700\u5C0F\u6539\u52A8\u3002\u5305\u66F4\u5927\u53EA\u5728\u8DEF\u7531\u3001\u6267\u884C\u6216\u6CBB\u7406\u660E\u663E\u66F4\u53EF\u9760\u65F6\u624D\u66F4\u4F18\u3002skill \u53CD\u590D\u4EA7\u51FA\u574F\u8F93\u51FA\u65F6\uFF0C\u6839\u56E0\u5F88\u5C11\u662F\u4E00\u6761\u574F\u6307\u4EE4\uFF0C\u901A\u5E38\u662F\u7ED3\u6784\u95EE\u9898\u3002\u52A0\u66F4\u591A\u6587\u5B57\u4E4B\u524D\u5148\u95EE\uFF1A\n\n1. \u8FD9\u4E2A skill **\u62E5\u6709**\u4EC0\u4E48\uFF1F\u8FB9\u754C\u6E05\u4E0D\u6E05\uFF1F\n2. \u4EC0\u4E48**\u53CD\u9988**\u8BF4\u660E\u5B83\u5728\u53D8\u597D\u8FD8\u662F\u5728\u6F02\u79FB\uFF1F\n3. \u54EA\u4E2A\u5931\u6548\u53EA\u6709**\u53CD\u590D\u4F7F\u7528**\u540E\u624D\u4F1A\u51FA\u73B0\uFF1F\n4. \u54EA\u5904\u662F**\u6700\u5C0F\u6539\u52A8\u3001\u6700\u5927\u8D28\u91CF\u6536\u76CA**\uFF1F\n\n## \u8DE8\u5E73\u53F0\u517C\u5BB9\n\nskill \u7CFB\u7EDF\u9075\u5FAA Agent Skills \u5F00\u653E\u6807\u51C6\uFF08Anthropic/OpenAI \u517C\u5BB9\uFF09\uFF1Afrontmatter \u7528 `name`\uFF08kebab-case\uFF0C\u226464 \u5B57\u7B26\uFF09+ `description`\uFF08\u5FC5\u586B\uFF0C\u65E0\u5C16\u62EC\u53F7\uFF09\uFF1B\u53EF\u9009\u5B57\u6BB5 `triggers`\u3001`assertions`\u3001`license`\u3001`metadata`\u3001`compatibility`\u3002\n\n```text\nskill-name/\n\u251C\u2500\u2500 SKILL.md (required)\n\u251C\u2500\u2500 agents/ (optional \u2014 platform-specific metadata)\n\u251C\u2500\u2500 references/ (optional \u2014 docs loaded on demand)\n\u251C\u2500\u2500 scripts/ (optional \u2014 executable code)\n\u2514\u2500\u2500 assets/ (optional \u2014 templates, images, fonts)\n```\n\n## Common Mistakes\n\n| Mistake | Fix |\n|---|---|\n| Description \u6CDB\u6CDB\uFF08\u300Chelps with X\u300D\uFF09 | \u8865\u5177\u4F53\u89E6\u53D1\u8BCD\u4E0E\u573A\u666F |\n| when-to-use \u5168\u90E8\u5806\u8FDB\u6B63\u6587 | \u6838\u5FC3\u7528\u9014\u4E0E\u5173\u952E\u533A\u5206\u89E6\u53D1\u8BCD\u524D\u7F6E\u5165 description\uFF0C\u8BE6\u5C3D\u573A\u666F\u7559\u6B63\u6587 |\n| Description \u542B\u5C16\u62EC\u53F7 | \u53BB\u6389 `<>`\uFF08\u7834\u574F XML \u89E3\u6790\uFF09 |\n| skill \u540D\u4E0E\u6CE8\u518C\u8868\u4E0D\u4E00\u81F4 | \u8DD1\u6821\u9A8C\u811A\u672C\u6293\u4E0D\u5339\u914D |\n| \u5EFA\u4E86\u6587\u4EF6\u5FD8\u4E86\u6CE8\u518C | \u7528\u811A\u624B\u67B6\u800C\u4E0D\u662F\u624B\u5EFA |\n| \u6CA1\u6709 Boundaries \u4E00\u8282 | \u81F3\u5C11\u5199\u4E00\u6761\u5B83\u4E0D\u505A\u4EC0\u4E48 |\n| \u6B63\u6587\u8FC7\u957F\uFF08>500 \u884C\uFF09 | \u62C6\u6210 SKILL.md + references/ |\n\n## Boundaries\n\n- \u53EA\u8BB2\u600E\u4E48\u5199 skill\uFF1B\u4E0D\u56DE\u7B54\u5177\u4F53\u4E1A\u52A1\u95EE\u9898\uFF0C\u4E5F\u4E0D\u66FF\u4EE3\u4EFB\u4F55\u5177\u4F53 skill \u672C\u8EAB\n- \u4E0D\u7BA1 agent \u7684\u521B\u5EFA\u4E0E\u751F\u547D\u5468\u671F\u2014\u2014\u90A3\u662F\u5185\u7F6E `agent-creator` \u7684\u804C\u8D23\n- \u4E0D\u4E3A\u4E86\u300C\u770B\u8D77\u6765\u4E13\u4E1A\u300D\u6269\u5199\u957F\u6587\uFF1B\u76EE\u6807\u59CB\u7EC8\u662F\u9AD8\u4FE1\u566A\u6BD4\u3001\u6613\u89E6\u53D1\u3001\u6613\u7EF4\u62A4",
1503
1611
  skillConfig: buildSkillCreatorSkillConfig(slug)
1504
1612
  });
1505
1613
  }
1506
1614
 
1507
1615
  // packages/ai/skills/agentProviderSetupSkill.ts
1508
1616
  var AGENT_PROVIDER_SETUP_SKILL_SLUGS = ["agent-provider-setup"];
1509
- function deterministicId13(prefix, seed) {
1617
+ function deterministicId14(prefix, seed) {
1510
1618
  let h = 2166136261;
1511
1619
  for (let i = 0; i < seed.length; i++) {
1512
1620
  h ^= seed.charCodeAt(i);
@@ -1519,7 +1627,7 @@ function normalizeSkillSeed12(input) {
1519
1627
  return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
1520
1628
  }
1521
1629
  function buildAgentProviderSetupSkillId(slug) {
1522
- return deterministicId13("01SK", normalizeSkillSeed12(slug) || slug);
1630
+ return deterministicId14("01SK", normalizeSkillSeed12(slug) || slug);
1523
1631
  }
1524
1632
  function buildAgentProviderSetupSkillPageKey(userId, slug) {
1525
1633
  return `page-${userId}-${buildAgentProviderSetupSkillId(slug)}`;
@@ -1684,6 +1792,13 @@ var SOURCES = [
1684
1792
  buildConfig: buildAutoReviewSkillConfig,
1685
1793
  buildContent: buildAutoReviewSkillContentBySlug
1686
1794
  },
1795
+ {
1796
+ slugs: UB_MODE_SKILL_SLUGS,
1797
+ buildSkillId: buildUbModeSkillId,
1798
+ buildPageKey: buildUbModeSkillPageKey,
1799
+ buildConfig: buildUbModeSkillConfig,
1800
+ buildContent: buildUbModeSkillContentBySlug
1801
+ },
1687
1802
  {
1688
1803
  slugs: WORKTREE_SKILL_SLUGS,
1689
1804
  buildSkillId: buildWorktreeSkillId,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveAgentImageInputSupport
3
- } from "./chunk-PVD7CRYV.js";
3
+ } from "./chunk-P7SUBTGZ.js";
4
4
  import {
5
5
  TOOL_HAD_IMAGES,
6
6
  hadToolImages
@@ -976,7 +976,9 @@ var secretStrings = {
976
976
  en: `Usage:
977
977
  nolo secret list [--json] List saved secret names (without values; --json outputs machine-readable list)
978
978
  nolo secret get <name> Print the value of a secret (for debugging; agents must not read)
979
- nolo secret set <name> <value|json> Set a secret (string, or JSON starting with { / [)
979
+ nolo secret set <name> --prompt Set a secret via hidden interactive prompt (TTY only; does not echo secret)
980
+ nolo secret set <name> --stdin Set a secret securely from stdin (recommended; prevents leaking secrets in argv)
981
+ nolo secret set <name> <value|json> Set a secret via argv (legacy; discouraged: exposes secrets in shell history and process list)
980
982
  nolo secret delete <name> Delete a secret
981
983
  nolo secret run --with <names> -- <cmd> Safely inject secret environment variables and run a command
982
984
  nolo secret bind <alias> <ref> [--env <ENV_NAME>] Bind a managed credential reference to an alias
@@ -986,7 +988,9 @@ var secretStrings = {
986
988
  zh: `\u7528\u6CD5:
987
989
  nolo secret list [--json] \u5217\u51FA\u5DF2\u4FDD\u5B58\u7684 secret \u540D\u79F0\uFF08\u4E0D\u663E\u793A\u503C\uFF1B--json \u8F93\u51FA\u673A\u5668\u53EF\u8BFB\u6E05\u5355\uFF09
988
990
  nolo secret get <name> \u6253\u5370\u6307\u5B9A secret \u7684\u503C\uFF08\u4F9B\u8C03\u8BD5\uFF1BAgent \u4E0D\u5F97\u8BFB\u53D6\uFF09
989
- nolo secret set <name> <value|json> \u8BBE\u7F6E secret\uFF08\u5B57\u7B26\u4E32\uFF0C\u6216\u4EE5 { / [ \u5F00\u5934\u7684 JSON\uFF09
991
+ nolo secret set <name> --prompt \u901A\u8FC7\u9690\u85CF\u8F93\u5165\u4EA4\u4E92\u8BBE\u7F6E secret\uFF08\u4EC5\u9650 TTY\uFF0C\u4E0D\u56DE\u663E\u51ED\u636E\uFF09
992
+ nolo secret set <name> --stdin \u4ECE stdin \u5B89\u5168\u8BBE\u7F6E secret\uFF08\u63A8\u8350\uFF1B\u907F\u514D\u901A\u8FC7\u547D\u4EE4\u884C\u53C2\u6570\u6CC4\u9732\u51ED\u636E\uFF09
993
+ nolo secret set <name> <value|json> \u901A\u8FC7\u547D\u4EE4\u884C\u53C2\u6570\u8BBE\u7F6E secret\uFF08\u517C\u5BB9\u65E7\u8BED\u6CD5\uFF1B\u4E0D\u63A8\u8350\uFF1A\u51ED\u636E\u4F1A\u66B4\u9732\u5728\u8FDB\u7A0B\u5217\u8868\u4E0E shell \u5386\u53F2\u4E2D\uFF09
990
994
  nolo secret delete <name> \u5220\u9664\u6307\u5B9A\u7684 secret
991
995
  nolo secret run --with <names> -- <cmd> \u5B89\u5168\u6CE8\u5165 secret \u73AF\u5883\u53D8\u91CF\u5E76\u6267\u884C\u5B50\u547D\u4EE4
992
996
  nolo secret bind <alias> <ref> [--env <ENV_NAME>] \u5C06\u53D7\u63A7\u51ED\u636E\u5F15\u7528\u7ED1\u5B9A\u5230\u522B\u540D
@@ -1101,6 +1105,74 @@ var secretStrings = {
1101
1105
  "secret.jsonScalar": {
1102
1106
  en: "JSON values must be an object or an array, not a scalar",
1103
1107
  zh: "JSON \u503C\u5FC5\u987B\u662F\u5BF9\u8C61\u6216\u6570\u7EC4\uFF0C\u4E0D\u80FD\u662F\u6807\u91CF"
1108
+ },
1109
+ "secret.setNameRequired": {
1110
+ en: "Error: Please provide a secret name. Example: nolo secret set <name> --stdin",
1111
+ zh: "\u9519\u8BEF: \u8BF7\u63D0\u4F9B secret \u540D\u79F0\u3002\u4F8B\u5982: nolo secret set <name> --stdin"
1112
+ },
1113
+ "secret.stdinDuplicateFlag": {
1114
+ en: "Error: Duplicate --stdin flag",
1115
+ zh: "\u9519\u8BEF: --stdin \u53C2\u6570\u91CD\u590D"
1116
+ },
1117
+ "secret.stdinMixedWithValue": {
1118
+ en: "Error: Cannot mix --stdin with value arguments. Pass value via stream only",
1119
+ zh: "\u9519\u8BEF: \u4E0D\u80FD\u5C06 --stdin \u4E0E\u503C\u53C2\u6570\u6DF7\u7528\u3002\u8BF7\u4EC5\u901A\u8FC7\u6D41\u8F93\u5165\u63D0\u4F9B\u503C"
1120
+ },
1121
+ "secret.stdinTtyNotSupported": {
1122
+ en: "Error: Interactive terminal (TTY) detected. --stdin is not an interactive prompt; please pipe input via stdin (e.g. pass show secret | nolo secret set <name> --stdin)",
1123
+ zh: "\u9519\u8BEF: \u68C0\u6D4B\u5230\u4EA4\u4E92\u5F0F\u7EC8\u7AEF (TTY)\u3002--stdin \u4E0D\u662F\u4EA4\u4E92\u5F0F\u9690\u85CF\u63D0\u793A\u7B26\uFF1B\u8BF7\u901A\u8FC7\u7BA1\u9053\u63D0\u4F9B\u8F93\u5165\uFF08\u4F8B\u5982: pass show secret | nolo secret set <name> --stdin\uFF09"
1124
+ },
1125
+ "secret.stdinEmpty": {
1126
+ en: "Error: Secret input from stdin cannot be empty or pure whitespace",
1127
+ zh: "\u9519\u8BEF: \u6765\u81EA stdin \u7684 secret \u8F93\u5165\u4E0D\u80FD\u4E3A\u7A7A\u6216\u7EAF\u7A7A\u767D"
1128
+ },
1129
+ "secret.stdinTooLarge": {
1130
+ en: "Error: Secret input from stdin exceeds maximum limit (64 KiB)",
1131
+ zh: "\u9519\u8BEF: \u6765\u81EA stdin \u7684 secret \u8F93\u5165\u8D85\u8FC7\u6700\u5927\u9650\u5236 (64 KiB)"
1132
+ },
1133
+ "secret.stdinTimeout": {
1134
+ en: "Error: Timed out waiting for stdin input (10s limit)",
1135
+ zh: "\u9519\u8BEF: \u7B49\u5F85 stdin \u8F93\u5165\u8D85\u65F6\uFF08\u9650\u5236 10 \u79D2\uFF09"
1136
+ },
1137
+ "secret.stdinReadError": {
1138
+ en: "Error: Failed to read secret from stdin",
1139
+ zh: "\u9519\u8BEF: \u4ECE stdin \u8BFB\u53D6 secret \u5931\u8D25"
1140
+ },
1141
+ "secret.promptDuplicateFlag": {
1142
+ en: "Error: Duplicate --prompt flag",
1143
+ zh: "\u9519\u8BEF: --prompt \u53C2\u6570\u91CD\u590D"
1144
+ },
1145
+ "secret.cannotMixStdinAndPrompt": {
1146
+ en: "Error: Cannot mix --stdin and --prompt flags",
1147
+ zh: "\u9519\u8BEF: \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528 --stdin \u548C --prompt \u53C2\u6570"
1148
+ },
1149
+ "secret.promptMixedWithValue": {
1150
+ en: "Error: Cannot mix --prompt with value arguments. Pass value via interactive prompt only",
1151
+ zh: "\u9519\u8BEF: \u4E0D\u80FD\u5C06 --prompt \u4E0E\u503C\u53C2\u6570\u6DF7\u7528\u3002\u8BF7\u4EC5\u901A\u8FC7\u4EA4\u4E92\u63D0\u793A\u7B26\u63D0\u4F9B\u503C"
1152
+ },
1153
+ "secret.promptNameRequired": {
1154
+ en: "Error: Please provide a secret name. Example: nolo secret set <name> --prompt",
1155
+ zh: "\u9519\u8BEF: \u8BF7\u63D0\u4F9B secret \u540D\u79F0\u3002\u4F8B\u5982: nolo secret set <name> --prompt"
1156
+ },
1157
+ "secret.promptNonTtyNotSupported": {
1158
+ en: "Error: Interactive terminal (TTY) required for --prompt. For automated pipelines use --stdin",
1159
+ zh: "\u9519\u8BEF: --prompt \u9700\u8981\u4EA4\u4E92\u5F0F\u7EC8\u7AEF (TTY)\u3002\u81EA\u52A8\u5316\u6D41\u6C34\u7EBF\u8BF7\u4F7F\u7528 --stdin"
1160
+ },
1161
+ "secret.promptEmpty": {
1162
+ en: "Error: Secret input from prompt cannot be empty or pure whitespace",
1163
+ zh: "\u9519\u8BEF: \u6765\u81EA\u63D0\u793A\u7B26\u7684 secret \u8F93\u5165\u4E0D\u80FD\u4E3A\u7A7A\u6216\u7EAF\u7A7A\u767D"
1164
+ },
1165
+ "secret.promptAborted": {
1166
+ en: "Secret input cancelled",
1167
+ zh: "\u7528\u6237\u53D6\u6D88\u4E86 secret \u8F93\u5165"
1168
+ },
1169
+ "secret.promptLabel": {
1170
+ en: 'Enter secret value for "{0}": ',
1171
+ zh: '\u8BF7\u8F93\u5165 "{0}" \u7684 secret \u503C\uFF08\u8F93\u5165\u5185\u5BB9\u5DF2\u9690\u85CF\uFF09: '
1172
+ },
1173
+ "secret.promptReadError": {
1174
+ en: "Error: Failed to read secret from prompt",
1175
+ zh: "\u9519\u8BEF: \u4ECE\u4EA4\u4E92\u63D0\u793A\u7B26\u8BFB\u53D6 secret \u5931\u8D25"
1104
1176
  }
1105
1177
  };
1106
1178
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getRuntimeServerContext,
3
3
  scheduleDeleteReplication
4
- } from "./chunk-7UODCAWW.js";
4
+ } from "./chunk-32GANJHJ.js";
5
5
  import {
6
6
  fetchFromClientDb
7
7
  } from "./chunk-6Q7UTJKR.js";
@@ -1,7 +1,58 @@
1
1
  import {
2
2
  DEFAULT_AGENT_BASE_POLICY,
3
- DEFAULT_USER_PREFERENCE_PROFILE
4
- } from "./chunk-VYNMQ6HW.js";
3
+ DEFAULT_USER_PREFERENCE_PROFILE,
4
+ isAgentSkillDisabled,
5
+ resolveAgentSkillConfig,
6
+ resolveUserEnabledSkills
7
+ } from "./chunk-CMTTXP5Y.js";
8
+ import {
9
+ resolveBuiltinSkillEntry,
10
+ resolveBuiltinSkillPage,
11
+ resolveSkillGraphFromRoots
12
+ } from "./chunk-LFJRTOUV.js";
13
+ import {
14
+ parseSkillDocProtocol
15
+ } from "./chunk-EY7V7REW.js";
16
+
17
+ // packages/ai/skills/userSkillRuntime.ts
18
+ async function resolveUserSkillRuntime(agentConfig, preferences) {
19
+ const effectiveConfig = agentConfig && typeof agentConfig === "object" ? "rawRecord" in agentConfig && agentConfig.rawRecord && typeof agentConfig.rawRecord === "object" ? agentConfig.rawRecord : agentConfig : null;
20
+ const disabledSlugs = /* @__PURE__ */ new Set();
21
+ for (const identifier of Object.keys(resolveAgentSkillConfig(effectiveConfig))) {
22
+ if (!isAgentSkillDisabled(effectiveConfig, identifier)) continue;
23
+ const entry = resolveBuiltinSkillEntry(identifier);
24
+ if (entry) disabledSlugs.add(entry.slug);
25
+ }
26
+ const graph = await resolveSkillGraphFromRoots({
27
+ roots: resolveUserEnabledSkills(preferences).map((identifier) => ({
28
+ identifier,
29
+ mode: "required"
30
+ })),
31
+ loadPage: async (identifier) => {
32
+ const entry = resolveBuiltinSkillEntry(identifier);
33
+ return entry ? resolveBuiltinSkillPage(entry.skillId) : null;
34
+ },
35
+ strictRequiredDependencies: true,
36
+ admitSkill: (page, canonicalIdentifier) => {
37
+ const entry = resolveBuiltinSkillEntry(canonicalIdentifier) ?? resolveBuiltinSkillEntry(page?.dbKey);
38
+ return !!entry && !disabledSlugs.has(entry.slug) && !isAgentSkillDisabled(effectiveConfig, entry.slug);
39
+ }
40
+ });
41
+ const admittedKeys = new Set(graph.visits.map((visit) => visit.dbKey));
42
+ const contentByKey = new Map(
43
+ [...graph.contentByKey].filter(([, page]) => page?.dbKey && admittedKeys.has(page.dbKey))
44
+ );
45
+ const skillPromptPatches = /* @__PURE__ */ new Set();
46
+ const seen = /* @__PURE__ */ new Set();
47
+ for (const visit of graph.visits) {
48
+ if (seen.has(visit.dbKey)) continue;
49
+ seen.add(visit.dbKey);
50
+ const page = contentByKey.get(visit.dbKey);
51
+ const patch = (visit.meta?.skillConfig?.promptPatch || parseSkillDocProtocol(page?.content ?? "", visit.meta).content).trim();
52
+ if (patch) skillPromptPatches.add(patch);
53
+ }
54
+ return { ...graph, contentByKey, skillPromptPatches: [...skillPromptPatches] };
55
+ }
5
56
 
6
57
  // packages/ai/policy/runtimePolicy.ts
7
58
  var clampLevel = (value, fallback) => {
@@ -227,5 +278,6 @@ var resolveSpaceContextPreloadPlan = (level) => ({
227
278
  export {
228
279
  inferCaptureIntent,
229
280
  buildStaticUserPolicyContext,
230
- resolveSpaceContextPreloadPlan
281
+ resolveSpaceContextPreloadPlan,
282
+ resolveUserSkillRuntime
231
283
  };