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.
- package/{_executeModel-WQ2D4ZRH.js → _executeModel-4HQQXPN4.js} +44 -46
- package/{action-BHWB4MOK.js → action-HNG2JKWK.js} +3 -3
- package/{addContentAction-BY375D35.js → addContentAction-FEN3H2EE.js} +6 -6
- package/{addDialogAgentAction-HOZYOCWC.js → addDialogAgentAction-DDA6S3WS.js} +5 -5
- package/{agentDeleteCommand-TTCVC74A.js → agentDeleteCommand-HZFWSKED.js} +57 -59
- package/{agentEmailCommands-PTG35KER.js → agentEmailCommands-HRYMVHC7.js} +59 -61
- package/{agentListCommands-MAG736RU.js → agentListCommands-HE2CCZEW.js} +33 -31
- package/{agentMachineCommands-ATOZK3R5.js → agentMachineCommands-ISSULCRR.js} +23 -23
- package/{agentProviderCommands-XSZUCNIR.js → agentProviderCommands-4EAYN3ZY.js} +3 -3
- package/{agentRecordCommands-KGRPIJN5.js → agentRecordCommands-WGAMWQLA.js} +57 -59
- package/{agentRunCommand-75VVJTNU.js → agentRunCommand-7EQ64FIB.js} +59 -61
- package/{agentRunControl-6HHESKDB.js → agentRunControl-EJPBPVLU.js} +5 -5
- package/{agentRuntimeLocal-NAAYNHCW.js → agentRuntimeLocal-ONSIOOQB.js} +20 -20
- package/{agentSlice-UJPIKKKP.js → agentSlice-CHWNVAS5.js} +6 -6
- package/{appDeleteCommands-VDHCDVBF.js → appDeleteCommands-RNAF4V5C.js} +25 -25
- package/{appDeployCommands-V6UTKVXR.js → appDeployCommands-LTIZ4QH7.js} +25 -25
- package/{appDeployStatusCommands-4UIFSEPC.js → appDeployStatusCommands-OJJR4LDK.js} +25 -25
- package/{appGetCommands-XKDXLC3C.js → appGetCommands-UJZF6U4V.js} +25 -25
- package/{appListCommands-BELRVX2Y.js → appListCommands-M5C5BIDY.js} +25 -25
- package/{authCommand-RV5MQDWN.js → authCommand-RMUBRAXF.js} +11 -11
- package/{builtinSkillRegistry-7MBUY5EY.js → builtinSkillRegistry-XDBPVNY6.js} +3 -5
- package/{chromeOpsCommands-C46BXHEE.js → chromeOpsCommands-P4PFQDT7.js} +19 -4
- package/{chunk-7UODCAWW.js → chunk-32GANJHJ.js} +1 -1
- package/{chunk-G6OOUQWJ.js → chunk-4KB6WQUL.js} +2 -0
- package/{chunk-LHOR5MC2.js → chunk-4KYV2TAI.js} +164 -323
- package/{chunk-5EFNSNAV.js → chunk-6CFXWUYE.js} +7 -7
- package/{chunk-6XIE5ZGI.js → chunk-6HIGYUBQ.js} +1 -1
- package/{chunk-LBXUNNDS.js → chunk-6K2AKJAD.js} +1 -1
- package/{chunk-U5ZHUOLT.js → chunk-6OBTQSJ2.js} +2 -2
- package/{chunk-XPL63OIC.js → chunk-7SUYSFPG.js} +140 -66
- package/{chunk-53RSTB7T.js → chunk-7TMVGMM3.js} +26 -31
- package/{chunk-ZBCBFOWC.js → chunk-A2ZMIRLN.js} +2 -2
- package/{chunk-MJWUBTK7.js → chunk-AOYR4XOA.js} +1 -1
- package/{chunk-IIX6VWLW.js → chunk-AV6IE6NM.js} +224 -38
- package/{chunk-WFUIXNKC.js → chunk-BMXR7CFX.js} +3 -3
- package/{chunk-JIFYXQRD.js → chunk-BTYQAODF.js} +26 -8
- package/{chunk-VHGD6FHV.js → chunk-BZKBX5BO.js} +28 -5
- package/{chunk-Q6RMLYSA.js → chunk-CMLBKYEI.js} +4 -2
- package/chunk-CMTTXP5Y.js +291 -0
- package/{chunk-OHRDHS4N.js → chunk-CVCRAO6Q.js} +9 -4
- package/{chunk-SM56M7N7.js → chunk-DBRXPVWY.js} +39 -5
- package/{chunk-2KBNF477.js → chunk-DSVR6ZAV.js} +30 -21
- package/{chunk-ADTJJVDJ.js → chunk-DXDG4XLD.js} +2838 -2255
- package/{chunk-R5LJWMZE.js → chunk-EMXVOJDB.js} +3 -3
- package/{chunk-KHCLMKZZ.js → chunk-EY7V7REW.js} +280 -6
- package/{chunk-KGP7UTNN.js → chunk-FNXSQ7A3.js} +15 -15
- package/{chunk-BTBT2566.js → chunk-FSEGCTZQ.js} +1 -1
- package/{chunk-CNMQATUF.js → chunk-GL7W7TTR.js} +2 -2
- package/{chunk-5KTQVMCX.js → chunk-GOO6G4PY.js} +85 -0
- package/{chunk-HTLIKE5U.js → chunk-GVMF62PR.js} +2 -2
- package/{chunk-UZHYRBUB.js → chunk-H4CFODT7.js} +137 -61
- package/{chunk-R4BMKAR5.js → chunk-HAB2UDLT.js} +1 -1
- package/{chunk-3NPXGNSK.js → chunk-HVXL4VOO.js} +348 -87
- package/{chunk-32ZKZET7.js → chunk-HWZT5DKX.js} +1 -1
- package/{chunk-GYVLAHA4.js → chunk-IY7DGZSY.js} +10 -4
- package/{chunk-FEDJHD5X.js → chunk-J5Z2SSIY.js} +6 -6
- package/{chunk-UVWBGWBO.js → chunk-JA6WCCDO.js} +3 -3
- package/{chunk-YE6A72XL.js → chunk-JI5MQU5B.js} +35 -31
- package/{chunk-TFSMPRAY.js → chunk-JLOCKFSI.js} +4 -4
- package/{chunk-UBLITLAZ.js → chunk-K2GL335R.js} +13 -3
- package/{chunk-DS5DAOIY.js → chunk-KYQXW7DL.js} +3 -3
- package/{chunk-5HAPEKNH.js → chunk-LFJRTOUV.js} +158 -43
- package/{chunk-N7E3LQ4A.js → chunk-LGW6A7GK.js} +1 -1
- package/{chunk-UNOILAZP.js → chunk-M6AGLVV4.js} +74 -2
- package/{chunk-BA2FHPS4.js → chunk-MOCY5LJI.js} +1 -1
- package/{chunk-INFHX73M.js → chunk-MR6L6U46.js} +55 -3
- package/{chunk-CTPFBJAF.js → chunk-N7IBYQEC.js} +182 -91
- package/{chunk-QU3TLYBR.js → chunk-NHI3JZP4.js} +32 -8
- package/{chunk-B2N5GZBU.js → chunk-OHYCQKPW.js} +6 -6
- package/{chunk-WAZ6BTSC.js → chunk-OOERQPG5.js} +1 -1
- package/{chunk-EHB4CKUI.js → chunk-OTKNEZE3.js} +9 -9
- package/chunk-OVBUUU7L.js +2648 -0
- package/{chunk-PVD7CRYV.js → chunk-P7SUBTGZ.js} +3 -3
- package/{chunk-RJ3EYB5G.js → chunk-PRIROPK4.js} +1 -1
- package/chunk-PRJ473FK.js +63 -0
- package/{chunk-K6TZSON4.js → chunk-PXERKNSJ.js} +1 -1
- package/{chunk-B6EZB6DW.js → chunk-QAYCF4CH.js} +2 -2
- package/{chunk-5DPVRMSY.js → chunk-RBJASUX4.js} +1 -1
- package/{chunk-NVOYW6H4.js → chunk-RDKNGJ5M.js} +12 -8
- package/{chunk-GTP6VNWH.js → chunk-RQ22OZD7.js} +3 -3
- package/{chunk-2E5M3JVS.js → chunk-RWGIVUH3.js} +11 -5
- package/{chunk-DFF6B7P7.js → chunk-RXUKDHS5.js} +1 -1
- package/{chunk-JLR5NWP2.js → chunk-RXX262QX.js} +17 -3
- package/{chunk-GC64WGMD.js → chunk-SM3NSZJV.js} +16 -5
- package/{chunk-A5BLRE3G.js → chunk-T3U2KQF4.js} +2 -2
- package/{chunk-HLAL63BZ.js → chunk-T43B7LB2.js} +1 -1
- package/{chunk-LCSAJ5TJ.js → chunk-UDKNC3CV.js} +3 -3
- package/{chunk-VE3FEZIT.js → chunk-WKGOIXFV.js} +5 -5
- package/{chunk-4YMD7B4Y.js → chunk-WPOKOKZA.js} +2 -2
- package/{chunk-YIRADHSY.js → chunk-WYKMOZTW.js} +1 -1
- package/{chunk-WRCZXJ4N.js → chunk-X4F26D5K.js} +2 -0
- package/{chunk-4MYCKDSI.js → chunk-XUOF4MA7.js} +2 -2
- package/{chunk-PD2YRFAI.js → chunk-Y5ZEHS3F.js} +1 -1
- package/{chunk-4CEAZRZ4.js → chunk-YU2DGFKG.js} +1 -1
- package/{chunk-TVGX5QIN.js → chunk-YUA6OAH5.js} +2 -2
- package/{chunk-53PBXLID.js → chunk-Z3MQYKRN.js} +17 -17
- package/{chunk-I3HWJODB.js → chunk-ZHOKF4MY.js} +31 -26
- package/{chunk-2XUOREKD.js → chunk-ZI5MFQ42.js} +5 -4
- package/{chunk-DYQXB46J.js → chunk-ZSCIGIJS.js} +1 -1
- package/{commandRegistry-4JHVRMW7.js → commandRegistry-O2657YC7.js} +86 -66
- package/{contentThunks-HQBAAXNW.js → contentThunks-THWDEBJU.js} +17 -17
- package/{cooldownCommands-4XKJFEBW.js → cooldownCommands-V4EEBD55.js} +3 -3
- package/{createAgentAutomationAction-KELPOVMP.js → createAgentAutomationAction-2ZZTFGWG.js} +17 -17
- package/{createDialogAction-Z3SASMTM.js → createDialogAction-FCRKPKIT.js} +20 -22
- package/{createPageAction-PNHOIG44.js → createPageAction-EC25JTKW.js} +18 -19
- package/{dbSlice-QAUXABCC.js → dbSlice-JK7LWBDO.js} +5 -5
- package/{deleteFile-R5OBP7OM.js → deleteFile-CE24BROO.js} +3 -3
- package/{dialogCommands-4BGV6DPD.js → dialogCommands-QH7BJ3DJ.js} +26 -26
- package/{dialogSlice-QHV6I3OQ.js → dialogSlice-Z5E7POEN.js} +16 -16
- package/{docCreateCommands-3CW75UF2.js → docCreateCommands-KP42NGIF.js} +26 -27
- package/{docDeleteCommands-NL4ZYMN5.js → docDeleteCommands-7YOCX5GC.js} +27 -28
- package/{docReadCommands-HXCNVDPQ.js → docReadCommands-EJEIAOKQ.js} +26 -27
- package/{docStore-LVMUSECS.js → docStore-6MHLMMWO.js} +6 -6
- package/{docUpdateCommands-RMVBAMDE.js → docUpdateCommands-ACJLISGA.js} +26 -27
- package/{getPricing-E2PLNWCR.js → getPricing-3PQY3TGI.js} +3 -3
- package/{handleSendMessageAction-7TONIXHY.js → handleSendMessageAction-MTOPN4D3.js} +86 -42
- package/index.js +7 -7
- package/{lib-4YTWAGY7.js → lib-5KKIBFIT.js} +439 -272
- package/{localRuntimeAdapter-HRAB7P5E.js → localRuntimeAdapter-4USQ3EP7.js} +55 -57
- package/{machineCommands-OTXFRTDA.js → machineCommands-CJMSDSOO.js} +56 -58
- package/{machineWsRunDispatch-KWVWOHHG.js → machineWsRunDispatch-YIPO76QH.js} +56 -58
- package/{memberThunks-ZAE52VIP.js → memberThunks-WT2KVRP4.js} +158 -55
- package/{models-UUNO6DOL.js → models-PJBE6JDV.js} +2 -2
- package/package.json +1 -1
- package/{providerPresetApply-JGNMO2KX.js → providerPresetApply-ISA35424.js} +5 -5
- package/{providerRegistry-33J3ZYFJ.js → providerRegistry-QIQCHVNP.js} +5 -5
- package/{read-D6NEWSGG.js → read-ILTT75DW.js} +3 -3
- package/{readDocTool-NTAXO7SX.js → readDocTool-374CFJYO.js} +1 -1
- package/{readlineWorkspace-CEX5TXGM.js → readlineWorkspace-RORGDWZN.js} +291 -99
- package/{removeDialogAgentAction-YEPO5AYI.js → removeDialogAgentAction-BDLO7UC2.js} +7 -7
- package/{runAgentClientLoop-DCV4BD2W.js → runAgentClientLoop-CDCBSUWW.js} +41 -43
- package/{runtimeDoctorCommands-NYBOTA6D.js → runtimeDoctorCommands-AM2V5YVH.js} +5 -5
- package/{secretCommands-N6CMCJDZ.js → secretCommands-G5XYCXZB.js} +308 -1
- package/{setDialogExtraReferencesAction-EH5GWDAJ.js → setDialogExtraReferencesAction-GBIT7WAG.js} +6 -6
- package/{setPrimaryDialogAgentAction-PNWRK6IY.js → setPrimaryDialogAgentAction-PGBTR247.js} +7 -7
- package/{settingThunks-7VCWB6P7.js → settingThunks-XQJZVA4D.js} +38 -7
- package/{skillDiscovery-F3TMVQOJ.js → skillDiscovery-DO5372J5.js} +2 -3
- package/{spaceCommands-ZUI4CTSO.js → spaceCommands-BTSANKDH.js} +23 -23
- package/{streamAgentChatTurn-NKFKMFQ2.js → streamAgentChatTurn-VUF3EUMS.js} +66 -59
- package/{switchDialogAgentAction-23BFWJMV.js → switchDialogAgentAction-O7WTPLKG.js} +5 -5
- package/{tools-626VXEY7.js → tools-GAAYAIEW.js} +35 -37
- package/{tuiSummaryLlmCaller-FSOADMXK.js → tuiSummaryLlmCaller-MKOLOSH3.js} +11 -11
- package/{updateCommands-KE6LP3QX.js → updateCommands-W7TXEV7N.js} +3 -3
- package/{updateDialogTitleAction-RNNQAMXG.js → updateDialogTitleAction-LE2DBQDS.js} +17 -17
- package/{windowsSelfUpdate-26TSFXEZ.js → windowsSelfUpdate-575VQ6QO.js} +2 -2
- package/chunk-7KWPNGVJ.js +0 -150
- package/chunk-AETZ7AD6.js +0 -274
- package/chunk-EUGTFFO6.js +0 -42
- package/chunk-VYNMQ6HW.js +0 -138
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
buildBuiltinObjectSkillDbKey,
|
|
7
7
|
buildBuiltinObjectSkillPageContent,
|
|
8
8
|
buildCodeWorkDiscipline
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-DBRXPVWY.js";
|
|
10
10
|
import {
|
|
11
11
|
buildSkillDocMarkdown,
|
|
12
12
|
resolvePageSkillMetadata
|
|
13
|
-
} from "./chunk-
|
|
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
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
@@ -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>
|
|
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>
|
|
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,58 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DEFAULT_AGENT_BASE_POLICY,
|
|
3
|
-
DEFAULT_USER_PREFERENCE_PROFILE
|
|
4
|
-
|
|
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
|
};
|