nolo-cli 0.75.0-alpha.7 → 0.75.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-MONX3AUM.js → _executeModel-I3XRMAJ2.js} +42 -42
- package/{action-D22U6CTH.js → action-7GHFPDSQ.js} +10 -10
- package/{addContentAction-XAPUTGL4.js → addContentAction-ZNVB2NOV.js} +8 -8
- package/{addDialogAgentAction-M7VLLBZM.js → addDialogAgentAction-CIDFWATM.js} +7 -7
- package/{agentDeleteCommand-UAMLWTPS.js → agentDeleteCommand-DCTG26JW.js} +27 -26
- package/{agentEmailCommands-QRVMJZ4C.js → agentEmailCommands-MRRHBLDQ.js} +54 -53
- package/{agentListCommands-63DOSBY7.js → agentListCommands-CUE46CSP.js} +29 -28
- package/{agentMachineCommands-BLILYHBN.js → agentMachineCommands-FYDEKBIO.js} +27 -26
- package/{agentProviderCommands-65ZC2WB4.js → agentProviderCommands-X3FA6BUM.js} +87 -0
- package/{agentPullCommand-N7L2CT7L.js → agentPullCommand-U73W5IBM.js} +1 -1
- package/{agentRecordCommands-4RQKVPNP.js → agentRecordCommands-P2MSNP7R.js} +52 -51
- package/{agentRunCommand-CDRQIDLW.js → agentRunCommand-QJGP7JEN.js} +52 -51
- package/{agentRuntimeLocal-XG3IDNOC.js → agentRuntimeLocal-T43UNWAY.js} +26 -25
- package/{agentSlice-BLCUNM5V.js → agentSlice-7GDS5Q2S.js} +9 -9
- package/{appDeleteCommands-TJXDMOYT.js → appDeleteCommands-YBKY3VEI.js} +27 -26
- package/{appDeployCommands-ECZJQAAL.js → appDeployCommands-EBC76HO4.js} +27 -26
- package/{appDeployStatusCommands-DZKVFG3Y.js → appDeployStatusCommands-WXRC5KEK.js} +27 -26
- package/{appGetCommands-JIT4OPUD.js → appGetCommands-VZZQEDOV.js} +27 -26
- package/{appListCommands-NR2HRMDY.js → appListCommands-HYSPVQ77.js} +27 -26
- package/{authCommand-EVGFLAHO.js → authCommand-E4GDVKMW.js} +91 -17
- package/{authCommands-ILTBI6JV.js → authCommands-VOTT6XWX.js} +3 -4
- package/builtinSkillRegistry-5SYVTS6Z.js +33 -0
- package/{chatQueueReduxAdapter-ROFM5SW7.js → chatQueueReduxAdapter-CXEWIDFZ.js} +22 -22
- package/{chunk-NG4UT4K4.js → chunk-23RQKXP6.js} +1 -1
- package/{chunk-C3FZR5EC.js → chunk-2F7RJC6L.js} +1 -1
- package/{chunk-3QPYFHAH.js → chunk-2XEVK4BT.js} +1 -1
- package/{chunk-HQUORJTM.js → chunk-3BMYXEUW.js} +1 -1
- package/{chunk-AFIWC5NH.js → chunk-3T4PRBHV.js} +1 -1
- package/{chunk-ZDONXM5U.js → chunk-4FRNB4ZG.js} +7 -7
- package/{chunk-YFADVSZE.js → chunk-5EJZGJS2.js} +6 -6
- package/{chunk-UJ63UXGE.js → chunk-6H7GN3JL.js} +1064 -752
- package/{chunk-BGIWMGSP.js → chunk-6RCZYDDC.js} +10 -172
- package/{chunk-RL5PTRUQ.js → chunk-6ZC5KPXV.js} +319 -29
- package/{chunk-BYEJ7K2Z.js → chunk-7S4YWN7P.js} +1 -1
- package/{chunk-SREASRV5.js → chunk-ABQYVJBJ.js} +1 -1
- package/{chunk-MQ25G6VQ.js → chunk-AYT2OKNM.js} +3 -3
- package/{chunk-ERD7UXVL.js → chunk-BNMZ7QUV.js} +1 -1
- package/{chunk-PGSKWZCB.js → chunk-DS3SQTDT.js} +1 -1
- package/{chunk-QC5LGHYP.js → chunk-EXWOCYCR.js} +3 -3
- package/chunk-FMODTASJ.js +109 -0
- package/{chunk-SZLVDREM.js → chunk-GIG262ZG.js} +3 -3
- package/{chunk-FPTQQSS6.js → chunk-GRJTR4PU.js} +25 -4
- package/{chunk-PZM3EENV.js → chunk-GXWEF4IZ.js} +1 -1
- package/chunk-HJKGQPYF.js +266 -0
- package/{chunk-3JQ2NRYU.js → chunk-HVURBGF3.js} +4 -4
- package/{chunk-CIHSMPAW.js → chunk-IMDA4FW4.js} +102 -34
- package/{chunk-L2Y24GRM.js → chunk-IO7DYRPW.js} +3 -3
- package/{chunk-UZ6XXCVR.js → chunk-IZAWJCG7.js} +15 -2
- package/{chunk-2SFNAHL6.js → chunk-JC2WQS66.js} +34 -22
- package/{chunk-XWNRAIUL.js → chunk-JITSBA52.js} +6 -16
- package/{chunk-6XIE5ZGI.js → chunk-JPGCXHNM.js} +1 -1
- package/{chunk-E36HZARC.js → chunk-KT6LENVP.js} +3 -3
- package/{chunk-N7DNNV6J.js → chunk-L2VNQQ7M.js} +78 -74
- package/{chunk-Q2DNZQEZ.js → chunk-LEYH5NOH.js} +5 -5
- package/{chunk-RXX4GDIH.js → chunk-LS2ZANRJ.js} +1 -1
- package/{chunk-4EJ5QYB5.js → chunk-LSV2BOJL.js} +1 -1
- package/{chunk-AFIKMMGC.js → chunk-MFW4BGJS.js} +1 -1
- package/{chunk-QH6NK22I.js → chunk-NVHJWYUO.js} +60 -788
- package/{chunk-Q6FF2MCK.js → chunk-OAJRZ35U.js} +1 -1
- package/{chunk-DSRXPQWA.js → chunk-OCL2YCAU.js} +7 -7
- package/{chunk-5J7W2VWW.js → chunk-OHUU52T3.js} +6 -265
- package/{chunk-V3ZKNK5D.js → chunk-OKCTLCKS.js} +9 -9
- package/chunk-P3AS5IPM.js +1624 -0
- package/{chunk-ZZCJUXUI.js → chunk-PHDKTASK.js} +2 -2
- package/{chunk-JFXQDXYJ.js → chunk-Q246OUG5.js} +9 -9
- package/{chunk-ZLPA7K55.js → chunk-Q4KVAB6L.js} +4 -4
- package/{chunk-AETZ7AD6.js → chunk-Q554LLSI.js} +1 -1
- package/{chunk-CGRJWXTE.js → chunk-S6STPUMG.js} +19 -15
- package/{chunk-K7AG465Q.js → chunk-T4F2EQGN.js} +4 -2
- package/{chunk-PYXL2CJL.js → chunk-TGRQUFLU.js} +1 -1
- package/{chunk-E6RGHPDR.js → chunk-UINEAQ2R.js} +3 -5
- package/{chunk-EXMHJN7C.js → chunk-UO66QKGI.js} +2 -2
- package/{chunk-BJCWNHVU.js → chunk-US463UAD.js} +2 -2
- package/{chunk-AJHEFRGJ.js → chunk-UWMQ6FPM.js} +4 -0
- package/{chunk-FSFQ3A7S.js → chunk-VARZWSKW.js} +9 -9
- package/{chunk-NHRQCXIQ.js → chunk-VMFTFOWF.js} +13 -3
- package/{chunk-3SPWIDHH.js → chunk-VQD6BTML.js} +3 -3
- package/{chunk-CUQ6PG2C.js → chunk-VW3YGKWR.js} +656 -98
- package/{chunk-G3O3PD6Q.js → chunk-W7PGACND.js} +14 -14
- package/{chunk-KIS76A2P.js → chunk-WSOMSDQB.js} +4 -4
- package/{chunk-CMH2SYHX.js → chunk-X77EN2BJ.js} +2 -2
- package/{chunk-MYU3MJCF.js → chunk-XCSSFPTB.js} +175 -7
- package/{chunk-QA6YKM3H.js → chunk-Y2IFJ7VM.js} +31 -3
- package/{chunk-UDQWGU7F.js → chunk-YZHP76TR.js} +1 -1
- package/{chunk-GBPZKFYK.js → chunk-ZIHJVHFH.js} +4 -4
- package/{chunk-DWPNOYMB.js → chunk-ZKGIAM7I.js} +1 -1
- package/chunk-ZSG2AQU4.js +626 -0
- package/{contentThunks-3BFZJFHI.js → contentThunks-Y2ACIFDB.js} +23 -23
- package/{createAgentAutomationAction-YCWUKLMK.js → createAgentAutomationAction-TNE3QMJR.js} +23 -23
- package/{createDialogAction-VULS2PKA.js → createDialogAction-BMGHBTQB.js} +26 -26
- package/{createPageAction-MZZLQPFE.js → createPageAction-FFNIZPIS.js} +24 -24
- package/{dbSlice-GKGGFNOB.js → dbSlice-4CUQE35F.js} +7 -7
- package/{deleteFile-LWSR674W.js → deleteFile-YG6QMJLU.js} +3 -3
- package/{dialogCommands-CJCAMML3.js → dialogCommands-3JC3BIXC.js} +28 -27
- package/{dialogSlice-NQO5ZETL.js → dialogSlice-3E7Z7HZV.js} +22 -22
- package/{docCreateCommands-H65RSKT4.js → docCreateCommands-6LNQLCTA.js} +28 -27
- package/{docDeleteCommands-PBYGJ6CZ.js → docDeleteCommands-ZJOAPWZS.js} +29 -28
- package/{docReadCommands-4VRYN5R5.js → docReadCommands-LJTRSBG6.js} +28 -27
- package/{docStore-AEJONTM4.js → docStore-R47ABXBB.js} +8 -8
- package/{docUpdateCommands-COZG3ZDB.js → docUpdateCommands-7P3QF3N2.js} +28 -27
- package/{fetchMessages-DRABNDPZ.js → fetchMessages-EIU7UFFK.js} +3 -4
- package/{getPricing-HRMSOF3E.js → getPricing-TV6ZB7ES.js} +4 -4
- package/{handleSendMessageAction-WIUO466V.js → handleSendMessageAction-FFYOGXAO.js} +22 -22
- package/index.js +61 -53
- package/{localDialogRead-PUQKFI73.js → localDialogRead-BTFJ4V2I.js} +2 -2
- package/{localRuntimeDb-P37ZTX55.js → localRuntimeDb-SYQGUF4U.js} +1 -1
- package/{machineCommands-BR3OIZHN.js → machineCommands-FN5GGQV3.js} +52 -51
- package/{machineWsRunDispatch-43YGAXOP.js → machineWsRunDispatch-H47IA7ZT.js} +50 -49
- package/{memberThunks-KATHH3F4.js → memberThunks-N35XAOC6.js} +8 -8
- package/{models-GS72DVJS.js → models-CMXFDBQH.js} +2 -2
- package/package.json +1 -1
- package/providerPresetApply-D2GGHPI7.js +214 -0
- package/providerRegistry-MU6C4ABD.js +31 -0
- package/{read-LC6HVYBN.js → read-2PV4PN2E.js} +4 -3
- package/{readDocTool-N3ERJHHF.js → readDocTool-FGK5XGAW.js} +1 -1
- package/{readlineWorkspace-RFSDCOKK.js → readlineWorkspace-NXKHYZEU.js} +263 -90
- package/{removeDialogAgentAction-F5GPTALR.js → removeDialogAgentAction-O2POGBOE.js} +10 -10
- package/{runAgentClientLoop-QHL2HNAI.js → runAgentClientLoop-CEBV5UPD.js} +41 -41
- package/{runtimeDoctorCommands-CROTMULY.js → runtimeDoctorCommands-X6WDBEQX.js} +2 -2
- package/{setDialogExtraReferencesAction-AY4ZCF3A.js → setDialogExtraReferencesAction-KPSVVY3C.js} +8 -8
- package/{setPrimaryDialogAgentAction-HPMG7V3R.js → setPrimaryDialogAgentAction-RMJETONI.js} +10 -10
- package/{settingSlice-OEJA4NQO.js → settingSlice-I6MTTNDX.js} +9 -9
- package/{spaceCommands-WGXHETMT.js → spaceCommands-JHT4ALCQ.js} +26 -25
- package/{streamAgentChatTurn-CE2H23VD.js → streamAgentChatTurn-SFCZP4GY.js} +49 -50
- package/{switchDialogAgentAction-HMDZTZ4I.js → switchDialogAgentAction-OQSGWVQQ.js} +7 -7
- package/{tools-F25QG6XS.js → tools-K3YOTESV.js} +37 -35
- package/{tuiSummaryLlmCaller-3Z24VUWM.js → tuiSummaryLlmCaller-T2OA5ZVB.js} +14 -14
- package/{updateDialogTitleAction-Z333XUN4.js → updateDialogTitleAction-CSPKYQRO.js} +23 -23
- package/chunk-3IT2PFHL.js +0 -611
- package/chunk-I42VC5KR.js +0 -15
- package/codingSkills-E6KSDNSJ.js +0 -48
- package/{chunk-3RAG2NAD.js → chunk-UKWGR5SS.js} +3 -3
- package/{db-VQSAOWAO.js → db-WK5MDZVN.js} +1 -1
- package/{localRuntimeAuthority-R5UBODT3.js → localRuntimeAuthority-6IR6BBXE.js} +3 -3
|
@@ -0,0 +1,1624 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BUILTIN_OBJECT_SKILL_IDS,
|
|
3
|
+
CAPABILITY_PACKS,
|
|
4
|
+
TOOL_PACKS,
|
|
5
|
+
buildBuiltinObjectSkillConfig,
|
|
6
|
+
buildBuiltinObjectSkillDbKey,
|
|
7
|
+
buildBuiltinObjectSkillPageContent,
|
|
8
|
+
buildCodeWorkDiscipline
|
|
9
|
+
} from "./chunk-XCSSFPTB.js";
|
|
10
|
+
import {
|
|
11
|
+
buildSkillDocMarkdown,
|
|
12
|
+
resolvePageSkillMetadata
|
|
13
|
+
} from "./chunk-Q554LLSI.js";
|
|
14
|
+
import {
|
|
15
|
+
canonicalizeToolNames
|
|
16
|
+
} from "./chunk-O6OSWFZQ.js";
|
|
17
|
+
import {
|
|
18
|
+
nolotusId
|
|
19
|
+
} from "./chunk-IZAWJCG7.js";
|
|
20
|
+
import {
|
|
21
|
+
asNonEmptyStringArray
|
|
22
|
+
} from "./chunk-VMFTFOWF.js";
|
|
23
|
+
import {
|
|
24
|
+
asOptionalTrimmedString
|
|
25
|
+
} from "./chunk-G3SUCT4W.js";
|
|
26
|
+
|
|
27
|
+
// packages/ai/skills/referenceRuntime.ts
|
|
28
|
+
var joinUniqueStrings = (...groups) => Array.from(new Set(groups.flatMap((items) => asNonEmptyStringArray(items))));
|
|
29
|
+
var extractRuntimePageCapabilities = (content) => {
|
|
30
|
+
const meta = resolvePageSkillMetadata(content);
|
|
31
|
+
const directTools = asNonEmptyStringArray(content?.tools);
|
|
32
|
+
const skillConfig = meta?.skillConfig;
|
|
33
|
+
const skillTools = skillConfig?.toolNames ?? [];
|
|
34
|
+
const softSkillHints = asNonEmptyStringArray([
|
|
35
|
+
skillConfig?.name,
|
|
36
|
+
...meta?.recommendedSkills ?? []
|
|
37
|
+
]);
|
|
38
|
+
return {
|
|
39
|
+
directTools,
|
|
40
|
+
hardSkillKeys: meta?.requiredSkills ?? [],
|
|
41
|
+
softSkillKeys: meta?.recommendedSkills ?? [],
|
|
42
|
+
hardSkillTools: meta?.kind === "skill" ? skillTools : [],
|
|
43
|
+
softSkillHints,
|
|
44
|
+
promptPatches: skillConfig?.promptPatch ? [skillConfig.promptPatch] : [],
|
|
45
|
+
shouldUpgradeReference: directTools.length > 0 || meta?.kind === "skill" || !!skillConfig?.promptPatch
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
var buildSkillGuidancePromptBlock = (options) => {
|
|
49
|
+
const title = asOptionalTrimmedString(options.title) ?? "--- \u6280\u80FD\u63D0\u793A ---";
|
|
50
|
+
const recommendedSkillHints = joinUniqueStrings(options.recommendedSkillHints);
|
|
51
|
+
const skillPromptPatches = joinUniqueStrings(options.skillPromptPatches);
|
|
52
|
+
if (recommendedSkillHints.length === 0 && skillPromptPatches.length === 0) {
|
|
53
|
+
return "";
|
|
54
|
+
}
|
|
55
|
+
return [
|
|
56
|
+
title,
|
|
57
|
+
recommendedSkillHints.length > 0 ? `\u4EE5\u4E0B\u6280\u80FD\u4E0E\u5F53\u524D\u4EFB\u52A1\u66F4\u76F8\u5173\uFF0C\u53EF\u4F18\u5148\u8003\u8651\uFF1A${recommendedSkillHints.join("\u3001")}` : "",
|
|
58
|
+
...skillPromptPatches
|
|
59
|
+
].filter(Boolean).join("\n");
|
|
60
|
+
};
|
|
61
|
+
var buildIdentifierCandidates = (identifier, contentByKey) => {
|
|
62
|
+
const trimmed = identifier.trim();
|
|
63
|
+
if (!trimmed || contentByKey.has(trimmed)) return trimmed;
|
|
64
|
+
const candidateToKey = /* @__PURE__ */ new Map();
|
|
65
|
+
for (const [key, page] of Array.from(contentByKey.entries())) {
|
|
66
|
+
const meta = resolvePageSkillMetadata(page);
|
|
67
|
+
for (const value of [key, page?.dbKey, page?.title, meta?.skillConfig?.id, meta?.skillConfig?.name]) {
|
|
68
|
+
const trimmedValue = asOptionalTrimmedString(value);
|
|
69
|
+
if (trimmedValue) {
|
|
70
|
+
candidateToKey.set(trimmedValue, key);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return candidateToKey.get(trimmed) ?? trimmed;
|
|
75
|
+
};
|
|
76
|
+
async function resolveSkillGraphFromRoots(options) {
|
|
77
|
+
const contentByKey = new Map(options.contentByKey ?? []);
|
|
78
|
+
const requiredTools = /* @__PURE__ */ new Set();
|
|
79
|
+
const recommendedTools = /* @__PURE__ */ new Set();
|
|
80
|
+
const recommendedSkillHints = /* @__PURE__ */ new Set();
|
|
81
|
+
const skillPromptPatches = /* @__PURE__ */ new Set();
|
|
82
|
+
const visits = [];
|
|
83
|
+
const visited = /* @__PURE__ */ new Set();
|
|
84
|
+
const loadPageCached = async (identifier) => {
|
|
85
|
+
const resolvedIdentifier = buildIdentifierCandidates(identifier, contentByKey);
|
|
86
|
+
if (!resolvedIdentifier) return null;
|
|
87
|
+
if (contentByKey.has(resolvedIdentifier)) {
|
|
88
|
+
return contentByKey.get(resolvedIdentifier) ?? null;
|
|
89
|
+
}
|
|
90
|
+
const page = await options.loadPage(resolvedIdentifier);
|
|
91
|
+
if (page) {
|
|
92
|
+
contentByKey.set(resolvedIdentifier, page);
|
|
93
|
+
if (page.dbKey) {
|
|
94
|
+
contentByKey.set(page.dbKey, page);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return page ?? null;
|
|
98
|
+
};
|
|
99
|
+
const visit = async (identifier, mode, sourceLabel) => {
|
|
100
|
+
const page = await loadPageCached(identifier);
|
|
101
|
+
if (!page?.dbKey) return;
|
|
102
|
+
const visitKey = `${mode}:${page.dbKey}`;
|
|
103
|
+
if (visited.has(visitKey)) return;
|
|
104
|
+
visited.add(visitKey);
|
|
105
|
+
const meta = resolvePageSkillMetadata(page);
|
|
106
|
+
const directTools = canonicalizeToolNames(page.tools ?? []);
|
|
107
|
+
const skillTools = canonicalizeToolNames(meta?.skillConfig?.toolNames ?? []);
|
|
108
|
+
const mergedTools = joinUniqueStrings(directTools, skillTools);
|
|
109
|
+
visits.push({
|
|
110
|
+
dbKey: page.dbKey,
|
|
111
|
+
title: page.title,
|
|
112
|
+
mode,
|
|
113
|
+
sourceLabel,
|
|
114
|
+
meta
|
|
115
|
+
});
|
|
116
|
+
if (mode === "required") {
|
|
117
|
+
mergedTools.forEach((toolName) => requiredTools.add(toolName));
|
|
118
|
+
if (meta?.skillConfig?.promptPatch) {
|
|
119
|
+
skillPromptPatches.add(meta.skillConfig.promptPatch);
|
|
120
|
+
}
|
|
121
|
+
} else {
|
|
122
|
+
mergedTools.forEach((toolName) => recommendedTools.add(toolName));
|
|
123
|
+
if (meta?.skillConfig?.name) {
|
|
124
|
+
recommendedSkillHints.add(meta.skillConfig.name);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const nextHard = meta?.requiredSkills ?? meta?.skillConfig?.requiredSkills ?? [];
|
|
128
|
+
const nextSoft = meta?.recommendedSkills ?? meta?.skillConfig?.recommendedSkills ?? [];
|
|
129
|
+
if (mode === "required") {
|
|
130
|
+
await Promise.all(nextHard.map((childKey) => visit(childKey, "required", page.dbKey)));
|
|
131
|
+
await Promise.all(nextSoft.map((childKey) => visit(childKey, "recommended", page.dbKey)));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
await Promise.all([...nextHard, ...nextSoft].map((childKey) => visit(childKey, "recommended", page.dbKey)));
|
|
135
|
+
};
|
|
136
|
+
await Promise.all(options.roots.map((root) => visit(root.identifier, root.mode, root.sourceLabel)));
|
|
137
|
+
return {
|
|
138
|
+
requiredTools: Array.from(requiredTools),
|
|
139
|
+
recommendedTools: Array.from(recommendedTools),
|
|
140
|
+
recommendedSkillHints: Array.from(recommendedSkillHints),
|
|
141
|
+
skillPromptPatches: Array.from(skillPromptPatches),
|
|
142
|
+
contentByKey,
|
|
143
|
+
visits
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// packages/ai/skills/codingSkills.ts
|
|
148
|
+
var CODING_SKILL_SLUGS = [
|
|
149
|
+
"coding",
|
|
150
|
+
"coding-review",
|
|
151
|
+
"coding-review-code-quality",
|
|
152
|
+
"coding-review-architecture",
|
|
153
|
+
"coding-review-security",
|
|
154
|
+
"coding-review-frontend-ux",
|
|
155
|
+
"coding-review-backend-data"
|
|
156
|
+
];
|
|
157
|
+
var CODING_ROOT_SKILL_SLUG = "coding";
|
|
158
|
+
function deterministicId(prefix, seed) {
|
|
159
|
+
let h = 2166136261;
|
|
160
|
+
for (let i = 0; i < seed.length; i++) {
|
|
161
|
+
h ^= seed.charCodeAt(i);
|
|
162
|
+
h = h * 16777619 >>> 0;
|
|
163
|
+
}
|
|
164
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
165
|
+
return (prefix + suffix).slice(0, 26);
|
|
166
|
+
}
|
|
167
|
+
function normalizeSkillSeed(input) {
|
|
168
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
169
|
+
}
|
|
170
|
+
function buildCodingSkillId(slug) {
|
|
171
|
+
return deterministicId("01SK", normalizeSkillSeed(slug) || slug);
|
|
172
|
+
}
|
|
173
|
+
function buildCodingSkillPageKey(userId, slug) {
|
|
174
|
+
return `page-${userId}-${buildCodingSkillId(slug)}`;
|
|
175
|
+
}
|
|
176
|
+
var CODING_ROOT_SKILL_ID = buildCodingSkillId(CODING_ROOT_SKILL_SLUG);
|
|
177
|
+
var CODING_SKILL_SEEDS = [
|
|
178
|
+
{
|
|
179
|
+
slug: "coding",
|
|
180
|
+
title: "coding",
|
|
181
|
+
description: "Root coding skill: methodology, code-modification discipline, and review discipline. Load this when the conversation turns to writing code.",
|
|
182
|
+
body: [
|
|
183
|
+
"# coding",
|
|
184
|
+
"",
|
|
185
|
+
"Root coding skill. Loaded by the agent when it decides to write code.",
|
|
186
|
+
"Children load via requiredSkills (review roles).",
|
|
187
|
+
"Until runtimes expand skill pages, Agent seed also carries a compiled snapshot."
|
|
188
|
+
].join("\n"),
|
|
189
|
+
triggerMode: "required",
|
|
190
|
+
requiredSkillSlugs: ["coding-review"],
|
|
191
|
+
// 与「代码执行」能力包共用同一份本地代码工具清单,外加编排三件套
|
|
192
|
+
// (派 review 用)。以前这里是手抄的 15 个名字,和能力包各存一份。
|
|
193
|
+
toolNames: [
|
|
194
|
+
...TOOL_PACKS.CODE,
|
|
195
|
+
"startAgentRun",
|
|
196
|
+
"controlAgentRun",
|
|
197
|
+
"listAgents"
|
|
198
|
+
],
|
|
199
|
+
// 与「代码执行」能力包共用同一份纪律正文(唯一真相源)。
|
|
200
|
+
// 两份曾逐字抄写并已漂移——能力包那版多了两句理由,这里以合并后的为准。
|
|
201
|
+
promptPatch: buildCodeWorkDiscipline("\u5199\u4EE3\u7801\u7EAA\u5F8B")
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
slug: "coding-review",
|
|
205
|
+
title: "coding-review",
|
|
206
|
+
description: "Reviewer-side rule payload: review flow, finding quality gate, false-positive list, AI-generated-code concerns, output format, Verdict. Load this first, then load the matching role skill.",
|
|
207
|
+
body: [
|
|
208
|
+
"# coding-review",
|
|
209
|
+
"",
|
|
210
|
+
"Reviewer-side rule payload. Load this first, then load the matching role skill."
|
|
211
|
+
].join("\n"),
|
|
212
|
+
triggerMode: "required",
|
|
213
|
+
requiredSkillSlugs: [
|
|
214
|
+
"coding-review-code-quality",
|
|
215
|
+
"coding-review-architecture",
|
|
216
|
+
"coding-review-security",
|
|
217
|
+
"coding-review-frontend-ux",
|
|
218
|
+
"coding-review-backend-data"
|
|
219
|
+
],
|
|
220
|
+
promptPatch: [
|
|
221
|
+
"# Review \u901A\u7528\u6D41\u7A0B\uFF08\u5B8C\u6574\u7248\uFF09",
|
|
222
|
+
"",
|
|
223
|
+
"**\u4F60\u662F reviewer\u3002** \u672C\u6587\u4EF6\u662F\u4F60\u8FD9\u4E00\u8F6E\u7684\u5168\u90E8\u89C4\u5219\uFF1Bspec \u53EA\u8865\u4EFB\u52A1\u7279\u5B9A\u5185\u5BB9\u3002",
|
|
224
|
+
"**\u4F60\u4E0D\u6D3E\u53D1\u3001\u4E0D\u505A\u5019\u9009\u9009\u62E9\u3001\u4E0D\u6539\u6587\u4EF6\u3002** \u53EA\u5BA1 spec \u7ED9\u4F60\u7684 diff\uFF0C\u4EA7\u51FA finding \u6216 `Clean review`\u3002",
|
|
225
|
+
"",
|
|
226
|
+
"## Review Dispatch Contract\uFF08\u89C4\u5212\u8005\u6D3E\u53D1\u524D\u8BFB\u53D6\uFF09",
|
|
227
|
+
"- reviewer \u4E0D\u5F97\u662F\u4EA7\u51FA\u8BE5 diff \u7684\u540C\u4E00 agent\uFF1B\u89C4\u5212\u8005\u4EB2\u81EA\u5B9E\u73B0\u7684 diff \u4E5F\u5FC5\u987B\u4EA4\u7ED9\u53E6\u4E00\u4E2A reviewer\u3002",
|
|
228
|
+
"- \u4ECE `listAgents` \u9009\u62E9 reviewer\uFF1A\u5148\u8FC7\u6EE4\u4E0D\u53EF\u7528\u5019\u9009\uFF0C\u80DC\u4EFB\u8005\u4E2D\u4F18\u5148\u81EA\u5EFA agent\uFF08\u8D70\u7528\u6237\u81EA\u5DF1\u7684 API/OAuth\uFF0C\u4E0D\u8017\u5E73\u53F0 credits\uFF09\uFF0C\u5176\u6B21\u7528\u6237\u6536\u85CF\uFF1B\u6709\u5408\u9002\u5019\u9009\u65F6\u5C3D\u91CF\u6362\u6A21\u578B\u5BB6\u65CF\u3002",
|
|
229
|
+
"- \u6210\u672C\u7EAA\u5F8B\uFF1A\u5E38\u89C4 review \u4F18\u5148\u4F4E\u4EF7\u80DC\u4EFB\u5019\u9009\uFF1B\u9876\u6863\u6A21\u578B\u53EA\u7528\u4E8E\u5927\u578B\u6DF1 review \u6216\u67B6\u6784/\u8BA1\u8D39/\u5B89\u5168/\u6570\u636E\u9AD8\u98CE\u9669\u5BA1\u67E5\uFF0C\u9009\u62E9\u524D\u8BF4\u660E\u7406\u7531\u3002\u7528\u6237\u70B9\u540D reviewer \u4E0D\u53D7\u9650\u5236\u3002",
|
|
230
|
+
"- \u5C0F\u4EFB\u52A1\u22651 \u975E\u4F5C\u8005 reviewer\uFF1B\u4E2D\u4EFB\u52A1\u22651 \u4E14\u5C3D\u91CF\u6362\u5BB6\u65CF\uFF1B\u5927\u4EFB\u52A1\uFF08\u67B6\u6784/\u8BA1\u8D39/\u5B89\u5168/\u6570\u636E/\u53D1\u5E03/\u9AD8\u5E76\u53D1\uFF09\u22652 \u4E0D\u540C\u5BB6\u65CF\u5E76\u884C + owner \u6700\u7EC8\u786E\u8BA4\u3002",
|
|
231
|
+
"- \u81EA\u5EFA/\u6536\u85CF\u4F18\u5148\u662F\u504F\u597D\uFF0C\u4E0D\u5F97\u8986\u76D6\u4EFB\u52A1\u517C\u5BB9\u6027\u3001\u6743\u9650\u3001\u8FD0\u884C\u65F6\u53EF\u7528\u6027\u6216\u4F5C\u8005\u56DE\u907F\u89C4\u5219\u3002",
|
|
232
|
+
"",
|
|
233
|
+
"## read-only \u884C\u4E3A\u7EA6\u675F",
|
|
234
|
+
"reviewer \u4E0D\u5F97\u4FEE\u6539\u88AB\u5BA1\u6587\u4EF6\u3001\u5207\u5206\u652F\u3001\u56DE\u6EDA\u4ED6\u4EBA\u6539\u52A8\u3001\u8FD0\u884C\u4F1A\u5199\u5165\u5DE5\u4F5C\u533A/\u8FDC\u7AEF\u7684\u547D\u4EE4\u3002\u4E0D\u8981\u6574\u4F53\u7981\u7528 shell/\u6587\u4EF6\u5DE5\u5177\u2014\u2014review \u9700\u901A\u8FC7 `git diff`/`git status`/\u641C\u7D22/\u8BFB\u53D6\u53D6\u8BC1\u3002\u5141\u8BB8\u53EA\u8BFB Git/shell \u547D\u4EE4\u3002\u82E5 reviewer \u8FDD\u53CD\u4EA7\u751F\u6587\u4EF6\u6539\u52A8\uFF0C\u89C4\u5212\u8005\u89C6\u8BE5 review \u65E0\u6548\u5E76\u505C\u6B62 run\uFF0C\u4E0D\u5F97\u81EA\u52A8\u56DE\u6EDA\uFF08\u5DE5\u4F5C\u6811\u53EF\u80FD\u542B\u4ED6\u4EBA\u6539\u52A8\uFF09\u3002",
|
|
235
|
+
"",
|
|
236
|
+
"## \u6D3E\u53D1\u4E0E\u5B8C\u6210\u6761\u4EF6",
|
|
237
|
+
"- \u6D3E\u53D1\uFF1A`startAgentRun(agentKey, task)`\uFF1B\u5BBF\u4E3B\u5DE5\u5177\u4E0D\u53EF\u7528\u65F6\u7528 CLI\u3002",
|
|
238
|
+
"- \u89C4\u5212\u8005\u53EA\u628A diff/\u80CC\u666F/\u68C0\u67E5\u8303\u56F4/\u9A8C\u6536\u8BC1\u636E/\u89D2\u8272\u5199\u8FDB spec\uFF1B\u89C4\u5219\u7531\u672C\u6587\u4EF6\u63D0\u4F9B\uFF0C\u4E0D\u8981\u590D\u5236\u8FDB prompt\u3002",
|
|
239
|
+
"- \u53EA\u6709\u5E26\u5B9E\u9645\u68C0\u67E5\u8BC1\u636E\u7684 finding \u6216 `Clean review` \u624D\u7B97\u5B8C\u6210\u3002\u7A7A\u54CD\u5E94\u3001\u53EA\u8BF4\u300C\u6211\u5148\u68C0\u67E5\u300D\u3001timeout \u90FD\u4E0D\u662F\u8BC1\u636E\uFF1B\u6700\u591A\u91CD\u8BD5\u4E00\u6B21\uFF0C\u4ECD\u65E0\u7ED3\u8BBA\u5C31\u6807\u8BB0 `review incomplete` \u4EA4 owner\uFF0C\u7981\u6B62\u65E0\u9650\u6362 agent\u3002",
|
|
240
|
+
"",
|
|
241
|
+
"## \u6D41\u7A0B",
|
|
242
|
+
"1. Gather\uFF1A\u8BFB spec \u7ED9\u7684\u5BA1\u67E5\u547D\u4EE4\uFF08`git diff` \u6216 `git diff alpha...HEAD`\uFF09\uFF0C\u62FF\u5230 diff\uFF1B\u65E0\u6539\u52A8\u76F4\u63A5 Clean review\u3002",
|
|
243
|
+
"2. Scope\uFF1A\u786E\u8BA4\u6539\u52A8\u8303\u56F4\uFF0C\u53EA\u5BA1 diff \u89E6\u53CA\u7684\u6587\u4EF6\uFF0C\u5F04\u6E05\u5BF9\u5E94\u4EC0\u4E48\u529F\u80FD/\u4FEE\u590D\u3002",
|
|
244
|
+
"3. Context\uFF1A\u4E0D\u8981\u53EA\u770B hunk\uFF1B\u8BFB\u5468\u56F4\u5B9E\u73B0\u3001imports\u3001\u8C03\u7528\u65B9\u3002",
|
|
245
|
+
"4. Checklist\uFF1A\u6309\u89D2\u8272\u4ECE CRITICAL \u2192 LOW\uFF1B\u53EA\u62A5 >80% \u6709\u628A\u63E1\u7684\u771F\u5B9E\u95EE\u9898\u3002",
|
|
246
|
+
"5. Report\uFF1A\u4EA7\u51FA finding \u8868 + Verdict\uFF1B\u540C\u7C7B\u95EE\u9898\u5408\u5E76\u3002",
|
|
247
|
+
"",
|
|
248
|
+
"\u989D\u5916\u8FC7\u6EE4\uFF1A\u8DF3\u8FC7\u7EAF\u98CE\u683C\u504F\u597D\uFF08\u9664\u975E\u8FDD\u53CD\u9879\u76EE\u7EA6\u5B9A\uFF09\uFF1B\u672A\u6539\u52A8\u7684\u65E7\u4EE3\u7801\u9664\u975E CRITICAL \u5B89\u5168\u5426\u5219\u4E0D\u62A5\uFF1B\u4F18\u5148\u62A5\u4F1A\u5BFC\u81F4 bug/\u5B89\u5168\u6F0F\u6D1E/\u6570\u636E\u4E22\u5931\u7684\u95EE\u9898\u3002",
|
|
249
|
+
"",
|
|
250
|
+
"## Finding \u8D28\u91CF\u95E8\uFF08\u786C\u89C4\u5219\uFF0C\u6BCF\u6761 finding \u62A5\u51FA\u524D\u8FC7\u56DB\u95EE\uFF09",
|
|
251
|
+
"\u4EFB\u4E00\u7B54\u300C\u5426\u300D\u6216\u300C\u4E0D\u786E\u5B9A\u300D\u5219\u964D\u7EA7\u6216\u4E22\u5F03\uFF1A",
|
|
252
|
+
"1. \u80FD\u5F15\u7528\u786E\u5207\u884C\u53F7\uFF1F\uFF08\u6A21\u7CCA\u53D1\u73B0\u4E0D actionable\uFF09",
|
|
253
|
+
"2. \u80FD\u63CF\u8FF0\u5177\u4F53\u5931\u8D25\u6A21\u5F0F\uFF1F\uFF08\u547D\u540D\u8F93\u5165\u3001\u72B6\u6001\u3001\u574F\u7ED3\u679C\uFF1B\u8BF4\u4E0D\u51FA\u89E6\u53D1\u6761\u4EF6 = \u6A21\u5F0F\u5339\u914D\uFF09",
|
|
254
|
+
"3. \u80FD\u7ED9\u51FA\u5177\u4F53\u4FEE\u590D\u5EFA\u8BAE\uFF1F\uFF08\u4EE3\u7801\u7EA7\uFF0C\u4E0D\u662F\u9AD8\u5C42\u5EFA\u8BAE\uFF09",
|
|
255
|
+
"4. \u5224\u65AD\u6807\u5C3A\u2014\u2014**\u8FD9\u4E2A\u56E2\u961F\u7684\u9AD8\u7EA7\u5DE5\u7A0B\u5E08\u771F\u4F1A\u5728 review \u91CC\u6539\u8FD9\u4E2A\u5417?** \u4E0D\u4F1A\u5C31\u8DF3\u8FC7\u3002",
|
|
256
|
+
"",
|
|
257
|
+
"## \u5047\u9633\u6027\u6E05\u5355\uFF08\u8FD9\u4E9B\u4E0D\u62A5\uFF09",
|
|
258
|
+
"- \u300C\u8003\u8651\u52A0\u9519\u8BEF\u5904\u7406\u300D\uFF1A\u5148\u67E5\u8C03\u7528\u65B9/\u6846\u67B6\u662F\u5426\u5DF2\u5904\u7406\u3002",
|
|
259
|
+
"- \u300C\u7F3A\u5C11\u8F93\u5165\u9A8C\u8BC1\u300D\uFF1A\u51FD\u6570\u662F\u5185\u90E8\u8C03\u7528\u4E14\u8C03\u7528\u65B9\u5DF2\u6821\u9A8C\u3002",
|
|
260
|
+
"- \u300C\u53EF\u80FD\u7A7A\u6307\u9488\u300D\uFF1A\u4E0A\u4E00\u884C\u5DF2\u7C7B\u578B\u6536\u7A84\u6216\u6709 if guard\u3002",
|
|
261
|
+
"- \u300C\u9B54\u6CD5\u6570\u5B57\u300D\uFF1AHTTP \u72B6\u6001\u7801\u30011000ms\u300160\u300124\u30011024 \u7B49\u5DF2\u77E5\u5E38\u91CF\u8DF3\u8FC7\u3002",
|
|
262
|
+
"- \u300CN+1 \u67E5\u8BE2\u300D\uFF1A\u56FA\u5B9A\u57FA\u6570\u5FAA\u73AF\u6216\u5DF2\u7528 DataLoader/batching \u4E0D\u7B97\u3002",
|
|
263
|
+
"- \u300C\u51FD\u6570\u592A\u957F\u300D\uFF1A\u7A77\u4E3E switch\u3001\u914D\u7F6E\u5BF9\u8C61\u3001\u6D4B\u8BD5\u8868\u3001\u751F\u6210\u4EE3\u7801\u4E0D\u7B97\u3002",
|
|
264
|
+
"- \u300C\u7F3A\u5C11 await\u300D\uFF1A\u6709\u610F fire-and-forget\uFF08\u65E5\u5FD7/\u6307\u6807/\u540E\u53F0\u961F\u5217\uFF09\u3002",
|
|
265
|
+
"- \u300C\u5E94\u8BE5\u7528 TypeScript\u300D\uFF1AJS-only \u6587\u4EF6\u4E0D\u62A5\u3002",
|
|
266
|
+
"- \u300C\u786C\u7F16\u7801\u503C\u300D\uFF1A\u6D4B\u8BD5 fixture\u3001\u793A\u4F8B\u4EE3\u7801\u3001\u6587\u6863\u7247\u6BB5\u91CC\u7684\u786C\u7F16\u7801\u662F\u6B63\u786E\u7684\u3002",
|
|
267
|
+
"- \u300C\u5B89\u5168\u620F\u300D\uFF1A\u975E\u5BC6\u7801\u5B66\u573A\u666F\u7684 `Math.random()` \u4E0D\u62A5\u3002",
|
|
268
|
+
"- \u300CPrefer const over let\u300D\uFF1A\u53D8\u91CF\u88AB\u91CD\u65B0\u8D4B\u503C\u65F6\u4E0D\u62A5\u3002",
|
|
269
|
+
"- \u300CMissing JSDoc\u300D\uFF1A\u5355\u7528\u9014\u5185\u90E8 helper \u4E14\u540D\u79F0+\u7B7E\u540D\u81EA\u89E3\u91CA\u7684\u4E0D\u62A5\u3002",
|
|
270
|
+
"- \u300C\u5E94\u52A0 useMemo/useCallback\u300D\uFF1AReact Compiler \u8DEF\u5F84\u9ED8\u8BA4\u4E0D\u62A5\u3002",
|
|
271
|
+
"",
|
|
272
|
+
"## AI \u751F\u6210\u4EE3\u7801 review \u5173\u6CE8\u70B9\uFF08\u6240\u6709\u89D2\u8272\u901A\u7528\uFF09",
|
|
273
|
+
"1. **\u884C\u4E3A\u56DE\u5F52**\uFF1A\u6539 A \u5904\u65F6\u662F\u5426\u7834\u574F\u4E86\u4F9D\u8D56 A \u65E7\u884C\u4E3A\u7684 B \u5904\uFF1FAI \u4E0D\u8FFD\u8E2A\u5168\u8C03\u7528\u94FE\uFF0Creviewer \u8981\u8865\u67E5\u3002",
|
|
274
|
+
"2. **\u4FE1\u4EFB\u8FB9\u754C**\uFF1A\u65B0\u4EE3\u7801\u662F\u5426\u5047\u8BBE\u8F93\u5165\u6765\u81EA\u53EF\u4FE1\u6E90\uFF1F\u5916\u90E8\u8F93\u5165\uFF08\u7528\u6237/API/DB \u8BFB\u51FA\uFF09\u662F\u5426\u9A8C\u8BC1\u540E\u624D\u7528\uFF1F",
|
|
275
|
+
"3. **\u9690\u85CF\u8026\u5408**\uFF1A\u662F\u5426\u65B0\u589E\u4E86\u4E0E\u73B0\u6709\u62BD\u8C61\u91CD\u590D\u7684\u80FD\u529B\uFF1F**\u662F\u5426\u5236\u9020\u4E86\u7B2C\u4E8C\u4EFD\u771F\u503C\uFF1F**",
|
|
276
|
+
"4. **\u6210\u672C\u590D\u6742\u5EA6**\uFF1A\u662F\u5426\u8FC7\u5EA6\u5DE5\u7A0B\uFF1F\u5355\u8C03\u7528\u573A\u666F\u662F\u5426\u52A0\u4E86\u62BD\u8C61\u5C42/retry/\u914D\u7F6E\u9879\uFF1F",
|
|
277
|
+
"> \u770B\u5230\u7B2C\u4E8C\u4EFD\u771F\u503C\u5C31\u62A5\uFF0C\u522B\u5F53\u98CE\u683C\u95EE\u9898\u2014\u2014\u5B83\u6709\u5B9E\u6D4B\u4EE3\u4EF7\uFF1A\u540C\u4E00\u4E2A\u5224\u5B9A\u903B\u8F91\u5728\u4E24\u4E2A\u5305\u5404\u5B58\u4E00\u4EFD\u6084\u6084\u6F02\u79FB\uFF0C\u4F1A\u5BFC\u81F4\u7EBF\u4E0A\u6545\u969C\u88AB\u4F2A\u88C5\u6210\u65E0\u5173\u73B0\u8C61\u3002",
|
|
278
|
+
"",
|
|
279
|
+
"## \u8F93\u51FA\u683C\u5F0F",
|
|
280
|
+
"\u6309\u4E25\u91CD\u5EA6\u7EC4\u7EC7\uFF0C\u6BCF\u6761 finding\uFF1A",
|
|
281
|
+
"`[CRITICAL] \u6807\u9898` / `File: path/to/file.ts:42` / `Issue: \u5177\u4F53\u95EE\u9898` / `Fix: \u4EE3\u7801\u7EA7\u4FEE\u590D\u5EFA\u8BAE`",
|
|
282
|
+
"",
|
|
283
|
+
"### \u7ED3\u5C3E\u5FC5\u987B\u5E26 Summary",
|
|
284
|
+
"```",
|
|
285
|
+
"## Review Summary",
|
|
286
|
+
"| Severity | Count | Status |",
|
|
287
|
+
"|----------|-------|--------|",
|
|
288
|
+
"| CRITICAL | 0 | pass |",
|
|
289
|
+
"| HIGH | 2 | warn |",
|
|
290
|
+
"| MEDIUM | 3 | info |",
|
|
291
|
+
"| LOW | 1 | note |",
|
|
292
|
+
"",
|
|
293
|
+
"Verdict: APPROVE / WARNING / BLOCK",
|
|
294
|
+
"```",
|
|
295
|
+
"- APPROVE\uFF1A\u65E0 CRITICAL \u6216 HIGH\uFF0C\u542B\u96F6 finding \u5E72\u51C0 review\uFF1BWARNING\uFF1A\u4EC5 HIGH\uFF1BBLOCK\uFF1A\u6709 CRITICAL\u3002",
|
|
296
|
+
"\u4E0D\u8981\u4E3A\u4E86\u663E\u5F97\u4E25\u683C\u800C\u62D2\u7EDD\u6279\u51C6\u3002diff \u5E72\u51C0\u5C31 APPROVE\u3002"
|
|
297
|
+
].join("\n")
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
slug: "coding-review-code-quality",
|
|
301
|
+
title: "coding-review-code-quality",
|
|
302
|
+
description: "Code-quality review role: readability, maintainability, composability, duplication, deletability, missing tests, dead code, in-place mutation. **Mandatory role** \u2014 always dispatched, never skipped.",
|
|
303
|
+
body: [
|
|
304
|
+
"# coding-review-code-quality",
|
|
305
|
+
"",
|
|
306
|
+
"Code-quality review role. Mandatory \u2014 always dispatched."
|
|
307
|
+
].join("\n"),
|
|
308
|
+
triggerMode: "required",
|
|
309
|
+
promptPatch: [
|
|
310
|
+
"# \u4EE3\u7801\u8D28\u91CF\u68C0\u67E5\u9879\uFF08\u5FC5\u8DD1\uFF09",
|
|
311
|
+
"",
|
|
312
|
+
"### \u53EF\u8BFB\u6027",
|
|
313
|
+
"- \u4E4B\u540E\u7684 AI / \u65B0\u4EBA\u80FD\u5426\u770B\u61C2\u8FD9\u6BB5\u4EE3\u7801\uFF1F\u547D\u540D\u662F\u5426\u81EA\u89E3\u91CA\uFF1F",
|
|
314
|
+
"- \u662F\u5426\u5BB9\u6613\u641C\u7D22\uFF08\u51FD\u6570/\u53D8\u91CF\u540D\u662F\u5426\u7528\u8BCD\u51C6\u786E\u3001\u53EF grep \u5230\uFF09\uFF1F",
|
|
315
|
+
"- \u63A7\u5236\u6D41\u662F\u5426\u6E05\u6670\uFF0C\u6709\u6CA1\u6709\u7ED5\u5F2F\u7684\u5199\u6CD5\uFF1F",
|
|
316
|
+
"",
|
|
317
|
+
"### \u53EF\u7EF4\u62A4\u6027",
|
|
318
|
+
"- \u5047\u8BBE\u4E4B\u540E\u8981\u5220\u9664\u6216\u6539\u52A8\u8FD9\u4E2A\u529F\u80FD\uFF0C\u662F\u5426\u5BB9\u6613\u6539\uFF1F",
|
|
319
|
+
"- \u6539\u52A8\u662F\u5426\u88AB\u786C\u7F16\u7801/\u9B54\u6CD5\u503C/\u6563\u843D\u7684\u91CD\u590D\u903B\u8F91\u9501\u6B7B\uFF1F",
|
|
320
|
+
"- \u662F\u5426\u8FC7\u5EA6\u8026\u5408\uFF0C\u6539\u4E00\u5904\u8981\u8FDE\u5E26\u6539\u591A\u5904\uFF1F",
|
|
321
|
+
"",
|
|
322
|
+
"### \u53EF\u7EC4\u5408\u6027",
|
|
323
|
+
"- \u662F\u5426\u51FD\u6570\u5F0F\u3001\u7EAF\u51FD\u6570\u4F18\u5148\uFF1F\u526F\u4F5C\u7528\u662F\u5426\u9694\u79BB\uFF1F",
|
|
324
|
+
"- \u65B0\u529F\u80FD\u80FD\u5426\u590D\u7528\u5DF2\u6709\u51FD\u6570\uFF0C\u800C\u4E0D\u662F\u590D\u5236\u7C98\u8D34\u518D\u6539\uFF1F",
|
|
325
|
+
"- \u662F\u5426\u628A\u53EF\u590D\u7528\u7684\u903B\u8F91\u5185\u8054\u8FDB\u4E86\u5355\u4E00\u8C03\u7528\u70B9\uFF0C\u5BFC\u81F4\u65E0\u6CD5\u4E8C\u6B21\u4F7F\u7528\uFF1F",
|
|
326
|
+
"",
|
|
327
|
+
"### \u91CD\u590D\u6027",
|
|
328
|
+
"- \u662F\u5426\u6709\u76F8\u540C\u4EE3\u7801\u5728\u5E72\u76F8\u540C\u4E8B\u60C5\uFF08DRY\uFF09\uFF1F",
|
|
329
|
+
"- \u80FD\u5426\u62BD\u53D6\u4E3A\u540C\u4E00\u4E2A\u51FD\u6570/\u5DE5\u5177\uFF0C\u800C\u4E0D\u662F\u591A\u5904\u5404\u5199\u4E00\u4EFD\uFF1F",
|
|
330
|
+
"- \u6CE8\u610F\uFF1A\u91CD\u590D\u7684**\u6D4B\u8BD5** fixture \u4E0D\u7B97\u3002",
|
|
331
|
+
"",
|
|
332
|
+
"### \u53EF\u5220\u9664\u6027",
|
|
333
|
+
"- \u54EA\u4E9B\u4EE3\u7801\u4E0D\u518D\u4F7F\u7528\uFF08\u6B7B\u4EE3\u7801\u3001\u672A\u4F7F\u7528 import\u3001\u4E0D\u53EF\u8FBE\u5206\u652F\u3001\u6CE8\u91CA\u6389\u7684\u5927\u5757\uFF09\uFF1F",
|
|
334
|
+
"- \u54EA\u4E9B\u4EE3\u7801\u6709\u66F4\u597D\u7684\u8868\u8FBE\u65B9\u5F0F\uFF08\u66F4\u77ED\u3001\u66F4\u6E05\u6670\u3001\u7528\u6807\u51C6\u5E93\u66FF\u4EE3\u624B\u5199\uFF09\uFF1F",
|
|
335
|
+
"",
|
|
336
|
+
"### \u5176\u4ED6",
|
|
337
|
+
"- \u65B0\u4EE3\u7801\u8DEF\u5F84\u660E\u663E\u7F3A\u6D4B\u8BD5\uFF08\u6709\u53EF\u6D4B\u884C\u4E3A\u5374\u65E0\u5BF9\u5E94\u7528\u4F8B\uFF09",
|
|
338
|
+
"- \u539F\u5730 mutation\uFF08\u5E94 immutable \u66F4\u65B0\u65F6\uFF09"
|
|
339
|
+
].join("\n")
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
slug: "coding-review-architecture",
|
|
343
|
+
title: "coding-review-architecture",
|
|
344
|
+
description: "Architecture review role: design boundaries, circular deps, maintainability, second source of truth, API compatibility, file/function size. **Dispatch separately** for mid-level+ issues.",
|
|
345
|
+
body: [
|
|
346
|
+
"# coding-review-architecture",
|
|
347
|
+
"",
|
|
348
|
+
"Architecture review role. Dispatch separately for mid-level+ issues."
|
|
349
|
+
].join("\n"),
|
|
350
|
+
triggerMode: "required",
|
|
351
|
+
promptPatch: [
|
|
352
|
+
"# \u67B6\u6784\u5BA1\u8BA1\u5458\u68C0\u67E5\u9879",
|
|
353
|
+
"",
|
|
354
|
+
"- \u8BBE\u8BA1\u8FB9\u754C\uFF08\u65B0\u589E\u8026\u5408\u662F\u5426\u5408\u7406\uFF09",
|
|
355
|
+
"- \u5FAA\u73AF\u4F9D\u8D56",
|
|
356
|
+
"- \u53EF\u7EF4\u62A4\u6027\uFF08\u662F\u5426\u8FC7\u5EA6\u5DE5\u7A0B\u3001\u5355\u5B9E\u73B0\u62BD\u8C61\u3001\u65E0\u4EBA config\uFF09",
|
|
357
|
+
"- \u662F\u5426\u4E0E\u73B0\u6709\u62BD\u8C61\u91CD\u590D\uFF08**\u5236\u9020\u7B2C\u4E8C\u4EFD\u771F\u503C**\uFF09",
|
|
358
|
+
"- API \u517C\u5BB9\u6027\uFF08\u7B7E\u540D\u53D8\u66F4\u662F\u5426\u7834\u574F\u8C03\u7528\u65B9\uFF09",
|
|
359
|
+
"- \u6587\u4EF6/\u51FD\u6570\u4F53\u91CF\uFF1A\u5178\u578B 200\u2013400 \u884C\u3001\u5355\u6587\u4EF6 >800 / \u51FD\u6570 >50 \u4E14\u53EF\u62C6\u65F6\u518D\u62A5\uFF08\u7A77\u4E3E switch/\u914D\u7F6E\u8868\u9664\u5916\uFF09"
|
|
360
|
+
].join("\n")
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
slug: "coding-review-security",
|
|
364
|
+
title: "coding-review-security",
|
|
365
|
+
description: "Security review role: hardcoded credentials, injection, XSS, path traversal, CSRF, auth bypass, log leakage, vulnerable deps, error-info leakage. On-demand + mandatory when diff touches security-sensitive surfaces.",
|
|
366
|
+
body: [
|
|
367
|
+
"# coding-review-security",
|
|
368
|
+
"",
|
|
369
|
+
"Security review role. On-demand + mandatory on security-sensitive diffs."
|
|
370
|
+
].join("\n"),
|
|
371
|
+
triggerMode: "required",
|
|
372
|
+
promptPatch: [
|
|
373
|
+
"# \u5B89\u5168\u5BA1\u8BA1\u5458\u68C0\u67E5\u9879",
|
|
374
|
+
"",
|
|
375
|
+
"- \u786C\u7F16\u7801\u51ED\u8BC1\uFF08API key/password/token/connection string in source\uFF09",
|
|
376
|
+
"- SQL \u6CE8\u5165\uFF08\u5B57\u7B26\u4E32\u62FC\u63A5 vs \u53C2\u6570\u5316\u67E5\u8BE2\uFF09",
|
|
377
|
+
"- XSS\uFF08\u672A\u8F6C\u4E49\u7684\u7528\u6237\u8F93\u5165\u6E32\u67D3\u5230 HTML/JSX\uFF09",
|
|
378
|
+
"- \u8DEF\u5F84\u7A7F\u8D8A\uFF08\u7528\u6237\u63A7\u5236\u7684\u6587\u4EF6\u8DEF\u5F84\u672A\u6D88\u6BD2\uFF09",
|
|
379
|
+
"- CSRF\uFF08\u72B6\u6001\u53D8\u66F4\u7AEF\u70B9\u7F3A CSRF \u4FDD\u62A4\uFF09",
|
|
380
|
+
"- \u8BA4\u8BC1\u7ED5\u8FC7\uFF08\u53D7\u4FDD\u62A4\u8DEF\u7531\u7F3A auth \u68C0\u67E5\uFF09",
|
|
381
|
+
"- \u65E5\u5FD7\u6CC4\u9732\u654F\u611F\u6570\u636E\uFF08token/password/PII \u51FA\u73B0\u5728\u65E5\u5FD7\u91CC\uFF09",
|
|
382
|
+
"- \u5DF2\u77E5\u8106\u5F31\u4F9D\u8D56\uFF08\u82E5 diff \u5347\u7EA7\u4E86\u6709\u516C\u5F00 CVE \u7684\u5305\u4E14\u53EF\u8BC1\u5B9E\uFF09",
|
|
383
|
+
"- \u9519\u8BEF\u4FE1\u606F\u628A\u5185\u90E8\u5806\u6808/\u5BC6\u94A5\u7EC6\u8282\u8FD4\u56DE\u7ED9\u5BA2\u6237\u7AEF",
|
|
384
|
+
"",
|
|
385
|
+
"## \u5B89\u5168\u654F\u611F\u89E6\u53D1\uFF08\u5FC5\u8DD1\uFF09",
|
|
386
|
+
"diff \u89E6\u53CA\u4E0B\u5217\u4EFB\u4E00\u7C7B\u65F6\uFF0C\u5B89\u5168\u5BA1\u8BA1\u5458\u68C0\u67E5\u9879\u89C6\u4E3A**\u5FC5\u8DD1**\uFF08\u5373\u4F7F spec \u672A\u70B9\u540D\u5B89\u5168\u89D2\u8272\uFF09\uFF1A",
|
|
387
|
+
"- \u8BA4\u8BC1 / \u6388\u6743 / session / token",
|
|
388
|
+
"- \u7528\u6237\u8F93\u5165\u8FDB\u5165\u67E5\u8BE2\u3001HTML\u3001shell\u3001\u6587\u4EF6\u8DEF\u5F84",
|
|
389
|
+
"- \u652F\u4ED8 / \u8BA1\u8D39 / \u914D\u989D",
|
|
390
|
+
"- \u5BC6\u94A5\u3001\u51ED\u8BC1\u3001`.env`\u3001\u5BC6\u94A5\u5B58\u50A8",
|
|
391
|
+
"- \u6587\u4EF6\u7CFB\u7EDF\u8BFB\u5199\u3001\u4EFB\u610F URL fetch\uFF08SSRF \u9762\uFF09"
|
|
392
|
+
].join("\n")
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
slug: "coding-review-frontend-ux",
|
|
396
|
+
title: "coding-review-frontend-ux",
|
|
397
|
+
description: "Frontend/UX review role: React implementation (index key, setState during render, loading/error/empty, stale closure) + UX (i18n, stuck state, error handling, accessibility). On-demand when diff touches UI.",
|
|
398
|
+
body: [
|
|
399
|
+
"# coding-review-frontend-ux",
|
|
400
|
+
"",
|
|
401
|
+
"Frontend/UX review role. On-demand when diff touches UI."
|
|
402
|
+
].join("\n"),
|
|
403
|
+
triggerMode: "required",
|
|
404
|
+
promptPatch: [
|
|
405
|
+
"# \u524D\u7AEF / UX \u68C0\u67E5\u9879\uFF08\u6D89\u53CA `packages/**` UI \u65F6\uFF09",
|
|
406
|
+
"",
|
|
407
|
+
"### \u524D\u7AEF / React",
|
|
408
|
+
"- \u53EF\u91CD\u6392\u5217\u8868\u7528 index \u5F53 key",
|
|
409
|
+
"- render \u671F\u95F4 setState",
|
|
410
|
+
"- \u7F3A loading/error/empty\uFF0C\u6613 stuck",
|
|
411
|
+
"- \u4E8B\u4EF6\u5904\u7406\u5668\u660E\u663E stale closure\uFF08\u6709\u8BC1\u636E\u518D\u62A5\uFF09",
|
|
412
|
+
"- \u786C\u7F16\u7801\u7528\u6237\u53EF\u89C1\u6587\u6848\uFF08\u5E94\u8D70 i18n\uFF09",
|
|
413
|
+
"",
|
|
414
|
+
"### \u7528\u6237\u4F53\u9A8C",
|
|
415
|
+
"- i18n\uFF08\u786C\u7F16\u7801\u7528\u6237\u53EF\u89C1\u5B57\u7B26\u4E32\uFF09",
|
|
416
|
+
"- stuck state\uFF08loading/error/empty \u72B6\u6001\u662F\u5426\u8986\u76D6\uFF09",
|
|
417
|
+
"- error handling\uFF08\u7528\u6237\u53EF\u89C1\u9519\u8BEF\u662F\u5426\u53CB\u597D\u4E14\u4E0D\u6CC4\u9732\u5185\u90E8\u7EC6\u8282\uFF09",
|
|
418
|
+
"- \u53EF\u8BBF\u95EE\u6027\uFF08ARIA\u3001\u952E\u76D8\u5BFC\u822A\u3001\u8BED\u4E49 HTML\uFF09"
|
|
419
|
+
].join("\n")
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
slug: "coding-review-backend-data",
|
|
423
|
+
title: "coding-review-backend-data",
|
|
424
|
+
description: "Backend/data-integrity review role: request validation, unbounded scans, missing timeout, missing rate limit, CORS + idempotency, race conditions, transaction atomicity, data-loss risk, cross-boundary leakage + silent failure (empty catch, dangerous fallback, lost stack, missing rollback, log-and-forget, debug residue). On-demand when diff touches server.",
|
|
425
|
+
body: [
|
|
426
|
+
"# coding-review-backend-data",
|
|
427
|
+
"",
|
|
428
|
+
"Backend/data-integrity review role. On-demand when diff touches server."
|
|
429
|
+
].join("\n"),
|
|
430
|
+
triggerMode: "required",
|
|
431
|
+
promptPatch: [
|
|
432
|
+
"# \u540E\u7AEF / \u6570\u636E\u5B8C\u6574\u6027\u68C0\u67E5\u9879\uFF08\u6D89\u53CA server/cli/handlers \u65F6\uFF09",
|
|
433
|
+
"",
|
|
434
|
+
"### \u540E\u7AEF / API",
|
|
435
|
+
"- \u8BF7\u6C42\u4F53/\u53C2\u6570\u672A\u6821\u9A8C\u5373\u4F7F\u7528",
|
|
436
|
+
"- \u9762\u5411\u7528\u6237\u7684\u67E5\u8BE2\u65E0 LIMIT / \u65E0\u754C\u626B\u63CF",
|
|
437
|
+
"- \u5916\u90E8 HTTP/DB \u8C03\u7528\u7F3A timeout",
|
|
438
|
+
"- \u516C\u5F00\u7AEF\u70B9\u7F3A\u5408\u7406\u9650\u6D41\uFF08\u82E5\u8BE5\u9762\u672C\u5E94\u6709\uFF09",
|
|
439
|
+
"- CORS / \u8DE8\u6E90\u7B56\u7565\u660E\u663E\u8FC7\u5BBD\u4E14\u5728\u672C\u6B21 diff \u5F15\u5165",
|
|
440
|
+
"",
|
|
441
|
+
"### \u6570\u636E\u5B8C\u6574\u6027",
|
|
442
|
+
"- \u5E42\u7B49\u6027\uFF08\u91CD\u590D\u8C03\u7528\u662F\u5426\u5B89\u5168\uFF09",
|
|
443
|
+
"- \u7ADE\u6001\u6761\u4EF6\uFF08TOCTOU\u3001\u5E76\u53D1\u5199\u3001\u7F3A\u9501\uFF09",
|
|
444
|
+
"- \u4E8B\u52A1\u539F\u5B50\u6027\uFF08\u90E8\u5206\u5931\u8D25\u662F\u5426\u56DE\u6EDA\uFF09",
|
|
445
|
+
"- \u6570\u636E\u4E22\u5931\u98CE\u9669\uFF08\u5220\u9664\u8DEF\u5F84\u3001\u8D26\u53F7\u5207\u6362\u3001\u8FC1\u79FB\uFF09",
|
|
446
|
+
"- \u8DE8\u8FB9\u754C\u6CC4\u6F0F\uFF08\u5185\u90E8 ID/\u72B6\u6001\u66B4\u9732\u5230\u5916\u90E8 API\uFF09",
|
|
447
|
+
"",
|
|
448
|
+
"### \u9759\u9ED8\u5931\u8D25",
|
|
449
|
+
"- \u7A7A catch \u5757\uFF08`catch {}` \u6216\u5FFD\u7565\u5F02\u5E38\uFF09",
|
|
450
|
+
"- \u5371\u9669\u964D\u7EA7\uFF08`.catch(() => [])`\u3001\u9ED8\u8BA4\u503C\u63A9\u76D6\u771F\u5B9E\u5931\u8D25\uFF09",
|
|
451
|
+
"- \u4E22\u5931\u5806\u6808\uFF08generic rethrow\u3001\u7F3A async \u5904\u7406\uFF09",
|
|
452
|
+
"- \u7F3A\u8D85\u65F6\uFF08\u5916\u90E8 HTTP/DB \u8C03\u7528\u65E0 timeout\uFF09",
|
|
453
|
+
"- \u7F3A\u56DE\u6EDA\uFF08\u4E8B\u52A1\u6027\u64CD\u4F5C\u5931\u8D25\u540E\u4E0D\u56DE\u6EDA\uFF09",
|
|
454
|
+
"- log-and-forget\uFF08\u8BB0\u4E86\u65E5\u5FD7\u4F46\u6CA1\u4F20\u64AD\u9519\u8BEF\uFF09",
|
|
455
|
+
"- \u5408\u5E76\u524D\u9057\u7559\u7684 `console.log` / \u8C03\u8BD5\u6B8B\u7559\uFF08\u6D4B\u8BD5/\u811A\u672C\u9664\u5916\uFF09"
|
|
456
|
+
].join("\n")
|
|
457
|
+
}
|
|
458
|
+
];
|
|
459
|
+
function seedBySlug(slug) {
|
|
460
|
+
const seed = CODING_SKILL_SEEDS.find((item) => item.slug === slug);
|
|
461
|
+
if (!seed) {
|
|
462
|
+
throw new Error(`Unknown Coding skill slug: ${slug}`);
|
|
463
|
+
}
|
|
464
|
+
return seed;
|
|
465
|
+
}
|
|
466
|
+
function collectCodingReachableSkillSlugs(rootSlug = CODING_ROOT_SKILL_SLUG) {
|
|
467
|
+
const ordered = [];
|
|
468
|
+
const seen = /* @__PURE__ */ new Set();
|
|
469
|
+
const visit = (slug) => {
|
|
470
|
+
if (seen.has(slug)) return;
|
|
471
|
+
seen.add(slug);
|
|
472
|
+
ordered.push(slug);
|
|
473
|
+
for (const child of seedBySlug(slug).requiredSkillSlugs ?? []) {
|
|
474
|
+
visit(child);
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
visit(rootSlug);
|
|
478
|
+
return ordered;
|
|
479
|
+
}
|
|
480
|
+
function compileCodingEffectiveTools() {
|
|
481
|
+
const tools = [];
|
|
482
|
+
const seen = /* @__PURE__ */ new Set();
|
|
483
|
+
for (const slug of collectCodingReachableSkillSlugs()) {
|
|
484
|
+
for (const toolName of seedBySlug(slug).toolNames ?? []) {
|
|
485
|
+
if (seen.has(toolName)) continue;
|
|
486
|
+
seen.add(toolName);
|
|
487
|
+
tools.push(toolName);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return tools;
|
|
491
|
+
}
|
|
492
|
+
var CODING_COMPILED_EFFECTIVE_TOOLS = compileCodingEffectiveTools();
|
|
493
|
+
function buildCodingSkillConfig(slug, options) {
|
|
494
|
+
const seed = seedBySlug(slug);
|
|
495
|
+
const requiredSkills = options?.requiredSkills ?? seed.requiredSkillSlugs?.map((childSlug) => buildCodingSkillId(childSlug));
|
|
496
|
+
return {
|
|
497
|
+
version: "0.1",
|
|
498
|
+
kind: "skill",
|
|
499
|
+
id: buildCodingSkillId(slug),
|
|
500
|
+
name: seed.title,
|
|
501
|
+
description: seed.description,
|
|
502
|
+
...seed.triggerMode ? { triggerMode: seed.triggerMode } : {},
|
|
503
|
+
...seed.toolNames?.length ? { toolNames: [...seed.toolNames] } : {},
|
|
504
|
+
...requiredSkills?.length ? { requiredSkills: [...requiredSkills] } : {},
|
|
505
|
+
...seed.promptPatch ? { promptPatch: seed.promptPatch } : {}
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
function buildCodingSkillContentBySlug(slug) {
|
|
509
|
+
const seed = seedBySlug(slug);
|
|
510
|
+
const skillConfig = buildCodingSkillConfig(slug);
|
|
511
|
+
return buildSkillDocMarkdown({
|
|
512
|
+
body: seed.body,
|
|
513
|
+
skillConfig
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// packages/ai/skills/specialistSkills.ts
|
|
518
|
+
var SPECIALIST_SKILL_SLUGS = [
|
|
519
|
+
"feedback",
|
|
520
|
+
"agent-creator",
|
|
521
|
+
"app-builder"
|
|
522
|
+
];
|
|
523
|
+
function deterministicId2(prefix, seed) {
|
|
524
|
+
let h = 2166136261;
|
|
525
|
+
for (let i = 0; i < seed.length; i++) {
|
|
526
|
+
h ^= seed.charCodeAt(i);
|
|
527
|
+
h = h * 16777619 >>> 0;
|
|
528
|
+
}
|
|
529
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
530
|
+
return (prefix + suffix).slice(0, 26);
|
|
531
|
+
}
|
|
532
|
+
function normalizeSkillSeed2(input) {
|
|
533
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
534
|
+
}
|
|
535
|
+
function buildSpecialistSkillId(slug) {
|
|
536
|
+
return deterministicId2("01SK", normalizeSkillSeed2(slug) || slug);
|
|
537
|
+
}
|
|
538
|
+
function buildSpecialistSkillPageKey(userId, slug) {
|
|
539
|
+
return `page-${userId}-${buildSpecialistSkillId(slug)}`;
|
|
540
|
+
}
|
|
541
|
+
var SPECIALIST_SKILL_SEEDS = [
|
|
542
|
+
{
|
|
543
|
+
slug: "feedback",
|
|
544
|
+
title: "feedback",
|
|
545
|
+
description: "\u53CD\u9988\u6536\u96C6\uFF1A\u628A\u7528\u6237\u7684\u529F\u80FD\u9700\u6C42\u3001\u95EE\u9898\u53CD\u9988\u548C\u4F53\u9A8C\u5EFA\u8BAE\u89C4\u8303\u8BB0\u5F55\u5230\u7528\u6237\u53CD\u9988\u8868\uFF1B\u7D27\u6025\u53CD\u9988\u540C\u65F6\u5199\u5165\u4EFB\u52A1\u770B\u677F\u5E76\u901A\u77E5\u3002",
|
|
546
|
+
body: [
|
|
547
|
+
"\u4F60\u662F\u201C\u53CD\u9988\u5165\u53E3\u201DAgent\uFF0C\u8D1F\u8D23\u6536\u96C6\u7528\u6237\u7684\u65B0\u529F\u80FD\u9700\u6C42\u3001\u95EE\u9898\u53CD\u9988\u548C\u4F53\u9A8C\u5EFA\u8BAE\uFF0C\u5E76\u5C06\u5176\u89C4\u8303\u8BB0\u5F55\u5230\u6307\u5B9A\u8868\u683C\u4E2D\u3002",
|
|
548
|
+
"",
|
|
549
|
+
"\u4F60\u7684\u76EE\u6807\uFF1A",
|
|
550
|
+
"1. \u4E3B\u52A8\u5F15\u5BFC\u7528\u6237\u63CF\u8FF0\u9047\u5230\u7684\u95EE\u9898\u3001\u60F3\u8981\u7684\u65B0\u529F\u80FD\u6216\u6539\u8FDB\u5EFA\u8BAE\u3002",
|
|
551
|
+
"2. \u6BCF\u6B21\u6536\u5230\u53CD\u9988\u540E\uFF0C\u5148\u505A\u6781\u7B80\u6F84\u6E05\uFF1B\u5982\u679C\u4FE1\u606F\u5DF2\u7ECF\u8DB3\u591F\uFF0C\u5C31\u4E0D\u8981\u8FFD\u95EE\u8FC7\u591A\u3002",
|
|
552
|
+
"3. \u5C06\u53CD\u9988\u6574\u7406\u6210\u7ED3\u6784\u5316\u4FE1\u606F\uFF0C\u5199\u5165\u201C\u7528\u6237\u53CD\u9988\u201D\u8868\u3002",
|
|
553
|
+
`4. \u5982\u679C\u53CD\u9988\u8FBE\u5230\u201C\u7D27\u6025\u201D\u7EA7\u522B\uFF0C\u9664\u5199\u5165\u7528\u6237\u53CD\u9988\u8868\u5916\uFF0C\u8FD8\u8981\u76F4\u63A5\u5199\u5165 Nolo \u4EFB\u52A1\u770B\u677F\uFF0C\u5E76\u901A\u77E5\u7528\u6237 ${nolotusId}\u3002`,
|
|
554
|
+
"5. \u8BB0\u5F55\u63D0\u4EA4\u53CD\u9988\u7684\u7528\u6237 ID\uFF0C\u65B9\u4FBF\u4EFB\u52A1\u5B8C\u6210\u6216\u8FDB\u5165 main \u540E\u901A\u77E5\u539F\u7528\u6237\u3002",
|
|
555
|
+
"6. \u56DE\u590D\u98CE\u683C\u7B80\u6D01\u3001\u81EA\u7136\u3001\u50CF\u4EA7\u54C1\u56E2\u961F\u7684\u53CD\u9988\u6536\u96C6\u5165\u53E3\u3002",
|
|
556
|
+
"",
|
|
557
|
+
"\u5DE5\u4F5C\u89C4\u5219\uFF1A",
|
|
558
|
+
"- \u4F18\u5148\u5224\u65AD\u53CD\u9988\u7C7B\u578B\uFF1A\u529F\u80FD\u9700\u6C42 / \u95EE\u9898\u53CD\u9988 / \u4F53\u9A8C\u5EFA\u8BAE / \u5176\u4ED6\u3002",
|
|
559
|
+
"- \u9ED8\u8BA4\u72B6\u6001\u5199\u4E3A\u201C\u5F85\u5904\u7406\u201D\u3002",
|
|
560
|
+
"- \u6839\u636E\u5185\u5BB9\u7C97\u7565\u5224\u65AD\u4F18\u5148\u7EA7\uFF1A",
|
|
561
|
+
" - \u6570\u636E\u4E22\u5931\u3001\u65E0\u6CD5\u767B\u5F55\u3001\u65E0\u6CD5\u6253\u5F00\u4E3B\u5165\u53E3\u3001\u6838\u5FC3\u7F16\u8F91/\u521B\u5EFA/\u652F\u4ED8/\u4FDD\u5B58\u5B8C\u5168\u4E0D\u53EF\u7528\u3001\u963B\u65AD\u5927\u90E8\u5206\u7528\u6237\u6838\u5FC3\u6D41\u7A0B -> \u7D27\u6025",
|
|
562
|
+
" - \u660E\u663E\u5F71\u54CD\u6B63\u5E38\u4F7F\u7528\u3001\u65E0\u6CD5\u5B8C\u6210\u67D0\u4E2A\u6838\u5FC3\u6D41\u7A0B\u3001\u4E25\u91CD\u4FDD\u5B58\u5931\u8D25 -> \u9AD8",
|
|
563
|
+
" - \u4E00\u822C bug\u3001\u660E\u786E\u9700\u6C42\u3001\u5F71\u54CD\u5E38\u7528\u7F16\u8F91/\u521B\u5EFA\u6D41\u7A0B -> \u4E2D",
|
|
564
|
+
" - \u666E\u901A\u5EFA\u8BAE\u6216\u8F7B\u5FAE\u4F53\u9A8C\u95EE\u9898 -> \u4F4E",
|
|
565
|
+
"- \u5982\u679C\u7CFB\u7EDF\u6216\u5DE5\u5177\u4E0A\u4E0B\u6587\u80FD\u63D0\u4F9B\u5F53\u524D\u7528\u6237 ID\uFF0C\u628A\u5B83\u5199\u5165 submitterUserId\uFF1B\u5982\u679C\u770B\u4E0D\u5230\u7528\u6237 ID\uFF0C\u53EF\u4EE5\u7559\u7A7A\uFF0C\u670D\u52A1\u7AEF\u4F1A\u515C\u5E95\u8865\u5199\u3002",
|
|
566
|
+
"- \u5982\u679C\u7528\u6237\u6CA1\u6709\u63D0\u4F9B\u8054\u7CFB\u65B9\u5F0F\uFF0C\u4E0D\u8981\u5F3A\u6C42\uFF0C\u53EF\u7559\u7A7A\u3002",
|
|
567
|
+
"- \u5982\u679C\u7528\u6237\u63D0\u4F9B\u4E86\u7AEF\u3001\u9875\u9762\u3001\u7248\u672C\u3001\u670D\u52A1\u5668\u3001\u6D4F\u89C8\u5668\u3001\u622A\u56FE\u8BF4\u660E\u3001\u590D\u73B0\u6B65\u9AA4\u3001\u671F\u671B\u7ED3\u679C\u3001\u5B9E\u9645\u7ED3\u679C\uFF0C\u8981\u5C3D\u91CF\u5199\u8FDB\u5BF9\u5E94\u5B57\u6BB5\u3002",
|
|
568
|
+
"- \u5982\u679C\u7F3A\u5C11\u5173\u952E\u4FE1\u606F\u4F46\u4ECD\u80FD\u7406\u89E3\u6838\u5FC3\u53CD\u9988\uFF0C\u5148\u8BB0\u5F55\uFF0C\u4E0D\u8981\u56E0\u4E3A\u5B57\u6BB5\u4E0D\u5168\u800C\u963B\u585E\u3002",
|
|
569
|
+
"- source \u56FA\u5B9A\u5199\u201C\u53CD\u9988\u5165\u53E3\u201D\u3002",
|
|
570
|
+
"- createdAtNote \u5199\u201C\u7531\u53CD\u9988\u5165\u53E3\u8BB0\u5F55\u201D\u3002",
|
|
571
|
+
"",
|
|
572
|
+
"\u666E\u901A\u5199\u8868\u89C4\u5219\uFF1A",
|
|
573
|
+
"- \u975E\u7D27\u6025\u53CD\u9988\u53EA\u8C03\u7528\u4E00\u6B21 addTableRow\uFF0C\u5199\u5165\u7528\u6237\u53CD\u9988\u8868\uFF1B\u6210\u529F\u5199\u5165\u540E\u4E0D\u8981\u91CD\u590D\u5199\u5165\u540C\u4E00\u5185\u5BB9\u3002",
|
|
574
|
+
`- \u4F7F\u7528 addTableRow \u5DE5\u5177\uFF0C\u628A\u53CD\u9988\u5199\u5165 dbKey \u4E3A meta-${nolotusId}-01NOLOFEEDBACKT000000000R1 \u7684\u8868\u3002`,
|
|
575
|
+
`- \u663E\u5F0F\u4F20\u5165 tenantId="${nolotusId}" \u548C tableId="01NOLOFEEDBACKT000000000R1"\u3002`,
|
|
576
|
+
"- \u5B57\u6BB5\u6620\u5C04\uFF1A",
|
|
577
|
+
" - content: \u7528\u6237\u53CD\u9988\u5185\u5BB9\u7684\u7B80\u6D01\u6574\u7406\u7248\uFF0C\u4FDD\u7559\u5177\u4F53\u5BF9\u8C61\u548C\u75C7\u72B6",
|
|
578
|
+
" - feedbackType: \u53CD\u9988\u7C7B\u578B",
|
|
579
|
+
" - status: \u56FA\u5B9A\u4E3A\u201C\u5F85\u5904\u7406\u201D",
|
|
580
|
+
" - priority: \u6309\u89C4\u5219\u5224\u65AD",
|
|
581
|
+
" - contact: \u7528\u6237\u4E3B\u52A8\u63D0\u4F9B\u7684\u8054\u7CFB\u65B9\u5F0F\uFF0C\u6CA1\u6709\u5C31\u7559\u7A7A",
|
|
582
|
+
" - source: \u56FA\u5B9A\u4E3A\u201C\u53CD\u9988\u5165\u53E3\u201D",
|
|
583
|
+
" - submitterUserId: \u5F53\u524D\u63D0\u4EA4\u53CD\u9988\u7684\u7528\u6237 ID\uFF1B\u770B\u4E0D\u5230\u5C31\u7559\u7A7A\uFF0C\u670D\u52A1\u7AEF\u4F1A\u8865\u5199",
|
|
584
|
+
" - environment: \u7528\u6237\u4E3B\u52A8\u63D0\u5230\u7684\u7AEF\u3001\u670D\u52A1\u5668\u3001\u9875\u9762\u3001\u6D4F\u89C8\u5668\u3001\u7CFB\u7EDF\u6216\u7248\u672C\uFF1B\u6CA1\u6709\u5C31\u7559\u7A7A",
|
|
585
|
+
" - reproductionSteps: \u7528\u6237\u63CF\u8FF0\u7684\u590D\u73B0\u6B65\u9AA4\uFF1B\u6CA1\u6709\u5C31\u7559\u7A7A",
|
|
586
|
+
" - expectedResult: \u7528\u6237\u8868\u8FBE\u7684\u671F\u671B\u884C\u4E3A\uFF1B\u6CA1\u6709\u5C31\u7559\u7A7A",
|
|
587
|
+
" - actualResult: \u7528\u6237\u8868\u8FBE\u7684\u5B9E\u9645\u5F02\u5E38\uFF1B\u6CA1\u6709\u5C31\u7559\u7A7A",
|
|
588
|
+
" - userImpact: \u5BF9\u7528\u6237\u6D41\u7A0B\u7684\u5F71\u54CD\uFF1B\u6CA1\u6709\u5C31\u6839\u636E\u5185\u5BB9\u7B80\u77ED\u5F52\u7EB3",
|
|
589
|
+
" - createdAtNote: \u56FA\u5B9A\u4E3A\u201C\u7531\u53CD\u9988\u5165\u53E3\u8BB0\u5F55\u201D",
|
|
590
|
+
"",
|
|
591
|
+
"\u7D27\u6025\u53CD\u9988\u989D\u5916\u89C4\u5219\uFF1A",
|
|
592
|
+
"- \u5F53 priority \u5224\u65AD\u4E3A\u201C\u7D27\u6025\u201D\u65F6\uFF0C\u5141\u8BB8\u989D\u5916\u8C03\u7528\u4E00\u6B21 addTableRow\uFF0C\u628A\u540C\u4E00\u4E8B\u9879\u76F4\u63A5\u5199\u5165 Nolo \u4EFB\u52A1\u770B\u677F\u3002",
|
|
593
|
+
`- \u4EFB\u52A1\u770B\u677F\u56FA\u5B9A\u4E3A tenantId="${nolotusId}", tableId="NOLOTASKBOARD", dbKey="meta-${nolotusId}-NOLOTASKBOARD"\u3002`,
|
|
594
|
+
"- \u4EFB\u52A1\u770B\u677F\u5B57\u6BB5\uFF1A",
|
|
595
|
+
" - title: \u7528\u201CURGENT \u53CD\u9988\uFF1A\u201D\u5F00\u5934\uFF0C\u540E\u63A5\u95EE\u9898\u4E3B\u9898",
|
|
596
|
+
" - status: \u201C\u5F85\u5904\u7406\u201D",
|
|
597
|
+
" - priority: \u201C\u7D27\u6025\u201D",
|
|
598
|
+
" - executionMode: \u201C\u7ACB\u5373\u6267\u884C\u201D",
|
|
599
|
+
" - owner: \u201Cnolo \u9879\u76EE\u7ECF\u7406\u201D",
|
|
600
|
+
" - source: \u201C\u53CD\u9988\u5165\u53E3\u201D",
|
|
601
|
+
" - feedbackSubmitterUserId: \u5F53\u524D\u63D0\u4EA4\u53CD\u9988\u7684\u7528\u6237 ID\uFF1B\u770B\u4E0D\u5230\u5C31\u7559\u7A7A\uFF0C\u670D\u52A1\u7AEF\u4F1A\u8865\u5199",
|
|
602
|
+
" - acceptance: \u590D\u8FF0\u53EF\u9A8C\u8BC1\u7684\u4FEE\u590D\u6807\u51C6",
|
|
603
|
+
" - progress: \u201C\u7531\u53CD\u9988\u5165\u53E3\u6839\u636E\u7D27\u6025\u53CD\u9988\u81EA\u52A8\u5165\u8868\uFF0C\u7B49\u5F85\u9879\u76EE\u7ECF\u7406\u5206\u6D3E\u3002\u201D",
|
|
604
|
+
" - codeStatus: \u201C\u672A\u5F00\u59CB\u201D",
|
|
605
|
+
"- \u7D27\u6025\u53CD\u9988\u5199\u5165\u4EFB\u52A1\u8868\u540E\uFF0C\u8C03\u7528 notifyUser\uFF1A",
|
|
606
|
+
" - title: \u201C\u7D27\u6025\u53CD\u9988\u5DF2\u8FDB\u5165\u4EFB\u52A1\u8868\u201D",
|
|
607
|
+
" - message: \u7B80\u8981\u8BF4\u660E\u53CD\u9988\u5185\u5BB9\u548C\u4EFB\u52A1\u8868\u72B6\u6001",
|
|
608
|
+
" - severity: \u201Ccritical\u201D",
|
|
609
|
+
` - targetUserId: "${nolotusId}"`,
|
|
610
|
+
"- \u5982\u679C notifyUser \u5DE5\u5177\u8FD4\u56DE\u9519\u8BEF\uFF0C\u4E0D\u8981\u91CD\u590D\u5199\u4EFB\u52A1\u8868\uFF1B\u5728\u56DE\u590D\u4E2D\u8BF4\u660E\u201C\u5DF2\u8FDB\u5165\u4EFB\u52A1\u8868\uFF0C\u901A\u77E5\u53D1\u9001\u5931\u8D25/\u5F85\u91CD\u8BD5\u201D\u3002",
|
|
611
|
+
"",
|
|
612
|
+
"\u4EA4\u4E92\u89C4\u5219\uFF1A",
|
|
613
|
+
"- \u5982\u679C\u7528\u6237\u53EA\u8BF4\u201C\u6709\u95EE\u9898\u201D\u201C\u60F3\u63D0\u9700\u6C42\u201D\u8FD9\u7C7B\u4E0D\u5B8C\u6574\u8868\u8FBE\uFF0C\u5148\u7528\u4E00\u53E5\u8BDD\u8FFD\u95EE\u6700\u5173\u952E\u7684\u4FE1\u606F\u3002",
|
|
614
|
+
"- \u5982\u679C\u7528\u6237\u5DF2\u7ECF\u6E05\u695A\u63CF\u8FF0\u95EE\u9898\u6216\u9700\u6C42\uFF0C\u76F4\u63A5\u8BB0\u5F55\uFF0C\u4E0D\u8981\u8FDB\u884C\u5197\u957F\u5206\u6790\u3002",
|
|
615
|
+
"- \u6210\u529F\u8BB0\u5F55\u540E\uFF0C\u660E\u786E\u544A\u8BC9\u7528\u6237\u201C\u5DF2\u7ECF\u5E2E\u4F60\u8BB0\u4E0B\u201D\uFF0C\u5E76\u7528\u4E00\u53E5\u8BDD\u590D\u8FF0\u6838\u5FC3\u5185\u5BB9\u3002",
|
|
616
|
+
"- \u7D27\u6025\u53CD\u9988\u6210\u529F\u8FDB\u5165\u4EFB\u52A1\u8868\u540E\uFF0C\u544A\u8BC9\u7528\u6237\u201C\u5DF2\u6309\u7D27\u6025\u53CD\u9988\u8FDB\u5165\u4EFB\u52A1\u8868\u201D\u3002",
|
|
617
|
+
"- \u4E0D\u8981\u627F\u8BFA\u4E00\u5B9A\u4FEE\u590D\u3001\u4E00\u5B9A\u5F00\u53D1\uFF0C\u53EA\u627F\u8BFA\u201C\u5DF2\u8BB0\u5F55\u53CD\u9988\u201D\u6216\u201C\u5DF2\u8FDB\u5165\u4EFB\u52A1\u8868\u201D\u3002"
|
|
618
|
+
].join("\n"),
|
|
619
|
+
toolNames: ["addTableRow", "notifyUser"]
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
slug: "agent-creator",
|
|
623
|
+
title: "agent-creator",
|
|
624
|
+
description: "\u521B\u5EFA Agent\uFF1A\u901A\u8FC7\u5BF9\u8BDD\u628A\u7528\u6237\u7684\u60F3\u6CD5\u62C6\u6210 prompt\u3001\u77E5\u8BC6\u3001\u5DE5\u5177\u3001skill/workflow \u548C eval\uFF0C\u751F\u6210\u53EF\u9884\u89C8\u8349\u7A3F\u5E76\u5728\u7528\u6237\u786E\u8BA4\u540E\u521B\u5EFA\u771F\u5B9E Agent\u3002",
|
|
625
|
+
body: [
|
|
626
|
+
"\u4F60\u662F Nolo \u7684 AI \u521B\u5EFA\u52A9\u624B\uFF0C\u53EA\u8D1F\u8D23\u901A\u8FC7\u5BF9\u8BDD\u5E2E\u52A9\u7528\u6237\u521B\u5EFA\u6216\u8C03\u6574\u4E00\u4E2A\u65B0\u7684 Agent\u3002",
|
|
627
|
+
"\u6838\u5FC3\u539F\u5219\uFF1AAgent = prompt + knowledge + tools + skills/workflows + eval \u7684\u53EF\u8FD0\u884C\u5C01\u88C5\u3002",
|
|
628
|
+
"\u521B\u5EFA\u6D41\u7A0B\u8981\u5E2E\u52A9\u7528\u6237\u628A\u4E13\u4E1A\u7ECF\u9A8C\u62C6\u5230\u5DF2\u6709\u8D44\u4EA7\u91CC\uFF0C\u4E0D\u8981\u628A\u6240\u6709\u7ECF\u9A8C\u90FD\u585E\u8FDB prompt\u3002",
|
|
629
|
+
"\u5148\u7406\u89E3\u7528\u6237\u60F3\u8BA9\u8FD9\u4E2A AI \u670D\u52A1\u8C01\u3001\u5B8C\u6210\u4EC0\u4E48\u4EFB\u52A1\u3001\u4F7F\u7528\u4EC0\u4E48\u8BED\u6C14\u3001\u9700\u8981\u54EA\u4E9B\u80FD\u529B\u3001\u662F\u5426\u9700\u8981\u77E5\u8BC6\u5F15\u7528\uFF0C\u4EE5\u53CA\u662F\u5426\u9002\u5408\u516C\u5F00\u3002",
|
|
630
|
+
"\u62C6\u89E3\u80FD\u529B\u65F6\u533A\u5206\uFF1Aprompt \u8D1F\u8D23\u89D2\u8272\u548C\u884C\u4E3A\u8FB9\u754C\uFF1Bknowledge/references \u8D1F\u8D23\u8D44\u6599\u6765\u6E90\uFF1Btools \u8D1F\u8D23\u52A8\u4F5C\uFF1Bskills/workflows \u8D1F\u8D23\u7A33\u5B9A\u6D41\u7A0B\u548C\u4E13\u5BB6\u65B9\u6CD5\uFF1Beval \u8D1F\u8D23\u6210\u529F/\u5931\u8D25\u6837\u4F8B\u548C\u9A8C\u6536\u3002",
|
|
631
|
+
"\u5F53\u4FE1\u606F\u8DB3\u591F\u5F62\u6210\u521D\u7248\u914D\u7F6E\u65F6\uFF0C\u5148\u8C03\u7528 prepareAgentDraft\uFF0C\u751F\u6210\u53EF\u9884\u89C8\u8349\u7A3F\uFF1B\u4FE1\u606F\u4E0D\u8DB3\u65F6\u6BCF\u6B21\u53EA\u95EE\u4E00\u4E2A\u5173\u952E\u95EE\u9898\u3002",
|
|
632
|
+
"prepareAgentDraft \u53EA\u751F\u6210\u8349\u7A3F\uFF0C\u4E0D\u4EE3\u8868\u5DF2\u7ECF\u521B\u5EFA\u771F\u5B9E Agent\u3002",
|
|
633
|
+
"\u5982\u679C\u7528\u6237\u63CF\u8FF0\u4E86\u7A33\u5B9A\u6D41\u7A0B\u3001\u4E13\u5BB6\u65B9\u6CD5\u6216\u64CD\u4F5C\u6B65\u9AA4\uFF0C\u5148\u653E\u8FDB suggestedSkillIdeas / suggestedWorkflowIdeas\uFF1B\u7528\u6237\u660E\u786E\u786E\u8BA4\u8981\u6C89\u6DC0\u6D41\u7A0B\u540E\uFF0C\u624D\u53EF\u7528 createSkillDoc \u6216 updateDoc \u521B\u5EFA/\u66F4\u65B0 skill \u6216 workflow \u6587\u6863\uFF0C\u518D\u7528 updateAgent \u6302\u5230 references\u3002",
|
|
634
|
+
"\u5982\u679C\u7528\u6237\u63CF\u8FF0\u4E86\u9A8C\u6536\u3001\u5931\u8D25\u8FB9\u754C\u6216\u771F\u5B9E\u6848\u4F8B\uFF0C\u5148\u653E\u8FDB suggestedEvalCases\uFF1B\u9ED8\u8BA4\u53EA\u751F\u6210 eval case \u8349\u7A3F\uFF0C\u4E0D\u8981\u81EA\u52A8\u8DD1 live eval\uFF0C\u4E5F\u4E0D\u8981\u6697\u4E2D\u4EA7\u751F\u4ED8\u8D39\u8BC4\u4F30\u3002",
|
|
635
|
+
"\u8349\u7A3F\u5C55\u793A\u540E\uFF0C\u7B49\u5F85\u7528\u6237\u660E\u786E\u786E\u8BA4\uFF0C\u4F8B\u5982\u201C\u786E\u8BA4\u521B\u5EFA\u201D\u201C\u5C31\u6309\u8FD9\u4E2A\u521B\u5EFA\u201D\u201C\u521B\u5EFA\u8FD9\u4E2A AI\u201D\u3002",
|
|
636
|
+
"\u53EA\u6709\u5F97\u5230\u660E\u786E\u786E\u8BA4\u540E\uFF0C\u624D\u8C03\u7528 createAgent \u521B\u5EFA\u771F\u5B9E Agent\u3002",
|
|
637
|
+
"\u7528\u6237\u53EA\u662F\u8BA8\u8BBA\u3001\u8865\u5145\u3001\u4FEE\u6539\u6216\u8BF4\u201C\u5148\u770B\u770B\u201D\u65F6\uFF0C\u4E0D\u8981\u8C03\u7528 createAgent\u3002",
|
|
638
|
+
"\u9ED8\u8BA4\u6A21\u578B\u4F7F\u7528 provider=nolo, model=deepseek-v4-flash\uFF1B\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u4E14\u5E73\u53F0\u5DF2\u77E5\u652F\u6301\uFF0C\u4E0D\u8981\u9009\u62E9 Claude/Anthropic \u7B49\u5F53\u524D runtime \u4E0D\u652F\u6301\u7684 provider\u3002",
|
|
639
|
+
"\u516C\u5F00\u72B6\u6001\u4FDD\u6301\u4FDD\u5B88\uFF1A\u4F60\u53EF\u4EE5\u5EFA\u8BAE\u516C\u5F00\uFF0C\u4F46\u53EA\u6709\u7528\u6237\u660E\u786E\u8981\u6C42\u516C\u5F00\u53D1\u5E03\u65F6\uFF0CcreateAgent \u7684 isPublic \u624D\u80FD\u4E3A true\u3002",
|
|
640
|
+
"\u5982\u679C\u7528\u6237\u60F3\u624B\u52A8\u5FAE\u8C03\u6A21\u578B\u3001\u5DE5\u5177\u3001\u77E5\u8BC6\u5F15\u7528\u6216\u53D1\u5E03\u72B6\u6001\uFF0C\u53EF\u4EE5\u5F15\u5BFC\u7528\u6237\u8FDB\u5165 /create/agent \u9AD8\u7EA7\u7F16\u8F91\u9875\u3002"
|
|
641
|
+
].join("\n"),
|
|
642
|
+
toolNames: [
|
|
643
|
+
"prepareAgentDraft",
|
|
644
|
+
"createAgent",
|
|
645
|
+
"createSkillDoc",
|
|
646
|
+
"readDoc",
|
|
647
|
+
"updateDoc",
|
|
648
|
+
"updateAgent"
|
|
649
|
+
]
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
slug: "app-builder",
|
|
653
|
+
title: "app-builder",
|
|
654
|
+
description: "\u5E94\u7528\u6784\u5EFA\uFF1A\u5E2E\u7528\u6237\u6784\u5EFA\u548C\u4FEE\u6539 Web \u5E94\u7528\uFF08\u54C1\u724C\u7AD9\u3001\u535A\u5BA2\u3001\u9884\u7EA6\u7AD9\u3001\u4F5C\u54C1\u96C6\u3001\u77E5\u8BC6\u7AD9\u3001\u8F7B\u5DE5\u5177\uFF09\uFF0C\u652F\u6301\u5BF9\u8BDD\u521B\u5EFA\u3001\u8FED\u4EE3\u4FEE\u6539\u3001\u9884\u68C0\u548C\u53D1\u5E03\uFF0C\u65E0\u9700\u7F16\u7A0B\u7ECF\u9A8C\u3002",
|
|
655
|
+
body: [
|
|
656
|
+
"\u4F60\u662F\u300C\u5E94\u7528\u6784\u5EFA\u52A9\u624B\u300D\uFF0C\u5E2E\u7528\u6237\u6784\u5EFA\u548C\u4FEE\u6539 Web \u5E94\u7528\u3002\u6838\u5FC3\u539F\u5219\uFF1A**\u7528\u6700\u5C11\u7684\u6B65\u9AA4\u548C\u6700\u5C11\u7684\u8BDD\u628A\u4E8B\u505A\u6210**\u3002",
|
|
657
|
+
"",
|
|
658
|
+
"## \u89D2\u8272",
|
|
659
|
+
"- \u670D\u52A1\u5BF9\u8C61\uFF1A\u6CA1\u6709\u7F16\u7A0B\u7ECF\u9A8C\u7684\u7528\u6237\u3002\u8BED\u6C14\u8F7B\u677E\u53CB\u597D\uFF0C\u907F\u514D\u6280\u672F\u672F\u8BED\uFF08Worker\u3001JavaScript\u3001API \u7B49\uFF09\u3002",
|
|
660
|
+
"- \u9664\u975E\u7528\u6237\u660E\u786E\u8981\u770B\u4EE3\u7801\uFF0C\u5426\u5219\u4E0D\u5C55\u793A\u5927\u6BB5\u4EE3\u7801\u3002",
|
|
661
|
+
"- \u4F18\u5148\u6536\u655B\u6210\u5185\u5BB9\u9A71\u52A8\u7684\u7F51\u7AD9\u578B\u5C0F\u5E94\u7528\uFF1A\u54C1\u724C\u7AD9\u3001\u535A\u5BA2\u3001\u9884\u7EA6\u7AD9\u3001\u4F5C\u54C1\u96C6\u3001\u77E5\u8BC6\u7AD9\u3001\u8F7B\u5DE5\u5177\u3002",
|
|
662
|
+
"",
|
|
663
|
+
"## \u5DE5\u4F5C\u65B9\u5F0F",
|
|
664
|
+
"1. \u7406\u89E3\u9700\u6C42\uFF1A\u7528\u7B80\u5355\u5BF9\u8BDD\u4E86\u89E3\u7528\u6237\u60F3\u8981\u4EC0\u4E48\uFF0C\u6700\u591A\u95EE 1-2 \u4E2A\u5173\u952E\u95EE\u9898\u3002",
|
|
665
|
+
"2. \u81EA\u52A8\u6784\u5EFA\uFF1A\u6839\u636E\u63CF\u8FF0\u751F\u6210\u6216\u4FEE\u6539\u5E94\u7528\uFF0C\u7528\u6237\u9ED8\u8BA4\u4E0D\u9700\u8981\u770B\u5230\u4EE3\u7801\u3002",
|
|
666
|
+
"3. \u7ED9\u51FA\u7ED3\u679C\uFF1A\u90E8\u7F72\u6210\u529F\u540E\u7ACB\u5373\u544A\u8BC9\u7528\u6237\u53EF\u8BBF\u95EE\u94FE\u63A5\uFF0C1-2 \u53E5\u8BDD\u8BF4\u660E\u5E94\u7528\u80FD\u505A\u4EC0\u4E48\u3002",
|
|
667
|
+
"4. \u6301\u7EED\u8FED\u4EE3\uFF1A\u8981\u6539\u529F\u80FD\u6216\u6837\u5F0F\u65F6\uFF0C\u5148\u7528 appList \u627E\u5230\u76EE\u6807\u5E94\u7528\uFF0C\u518D\u6309\u300C\u5E94\u7528\u6784\u5EFA\u80FD\u529B\u5305\u300D\u7684\u64CD\u4F5C\u7EAA\u5F8B\u6267\u884C\uFF08\u6548\u7387\u4F18\u5148\u3001\u5B9A\u70B9\u4FEE\u6539\u3001SSR \u7EF4\u62A4\u3001\u9884\u68C0\u90E8\u7F72\uFF09\u3002",
|
|
668
|
+
"",
|
|
669
|
+
"## \u65B0\u5EFA\u5E94\u7528",
|
|
670
|
+
"- \u63CF\u8FF0\u6E05\u6670\u5C31\u76F4\u63A5\u6784\u5EFA\u5E76\u90E8\u7F72\uFF0C\u7ED9\u51FA\u53EF\u8BBF\u95EE\u94FE\u63A5\u3002\u4E0D\u8981\u53CD\u95EE\u4E00\u5806\u7EC6\u8282\uFF0C\u5148\u505A\u51FA\u53EF\u7528\u7684\u7B2C\u4E00\u7248\u518D\u8FED\u4EE3\u3002",
|
|
671
|
+
"",
|
|
672
|
+
"## \u6536\u5C3E",
|
|
673
|
+
"- \u90E8\u7F72\u6210\u529F\u540E\u4E00\u53E5\u8BDD\u7ED9\u94FE\u63A5\u5373\u53EF\u3002\u5931\u8D25\u5219\u6309\u8FD4\u56DE\u7684 issues \u5B9A\u70B9\u4FEE\u590D\u540E\u91CD\u8BD5\uFF0C\u4E0D\u8981\u505C\u4E0B\u6765\u95EE\u3002",
|
|
674
|
+
"",
|
|
675
|
+
"## \u5DE5\u5177",
|
|
676
|
+
"- \u672C skill \u7684\u5DE5\u5177\uFF08app* / \u8868 / openAIGptImage \u7B49\uFF09\u7531\u300Capp-builder\u300D\u80FD\u529B\u5305\u6CE8\u5165",
|
|
677
|
+
" \uFF08packages/ai/tools/toolPacks.ts \u7684 CAPABILITY_PACKS\uFF09\u3002\u82E5\u5F53\u524D runtime \u672A\u542F\u7528",
|
|
678
|
+
" \u8BE5\u80FD\u529B\u5305\uFF0C\u5DE5\u5177\u9762\u4E0D\u4F1A\u5C55\u5F00\uFF0C\u9700\u8981\u5148\u786E\u8BA4\u8FD0\u884C\u73AF\u5883\u3002"
|
|
679
|
+
].join("\n"),
|
|
680
|
+
toolNames: []
|
|
681
|
+
}
|
|
682
|
+
];
|
|
683
|
+
function seedBySlug2(slug) {
|
|
684
|
+
const seed = SPECIALIST_SKILL_SEEDS.find((item) => item.slug === slug);
|
|
685
|
+
if (!seed) {
|
|
686
|
+
throw new Error(`Unknown specialist skill slug: ${slug}`);
|
|
687
|
+
}
|
|
688
|
+
return seed;
|
|
689
|
+
}
|
|
690
|
+
function buildSpecialistSkillConfig(slug) {
|
|
691
|
+
const seed = seedBySlug2(slug);
|
|
692
|
+
return {
|
|
693
|
+
version: "0.1",
|
|
694
|
+
kind: "skill",
|
|
695
|
+
id: buildSpecialistSkillId(slug),
|
|
696
|
+
name: seed.title,
|
|
697
|
+
description: seed.description,
|
|
698
|
+
...seed.toolNames?.length ? { toolNames: [...seed.toolNames] } : {}
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
function buildSpecialistSkillContentBySlug(slug) {
|
|
702
|
+
const seed = seedBySlug2(slug);
|
|
703
|
+
const skillConfig = buildSpecialistSkillConfig(slug);
|
|
704
|
+
return buildSkillDocMarkdown({
|
|
705
|
+
body: seed.body,
|
|
706
|
+
skillConfig
|
|
707
|
+
});
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
// packages/ai/skills/codePlannerSkills.ts
|
|
711
|
+
var CODE_PLANNER_SKILL_SLUGS = [
|
|
712
|
+
"code-planning",
|
|
713
|
+
"search-first",
|
|
714
|
+
"workspace-code",
|
|
715
|
+
"web-research-lite",
|
|
716
|
+
"dispatch-executors"
|
|
717
|
+
];
|
|
718
|
+
var CODE_PLANNER_ROOT_SKILL_SLUG = "code-planning";
|
|
719
|
+
function deterministicId3(prefix, seed) {
|
|
720
|
+
let h = 2166136261;
|
|
721
|
+
for (let i = 0; i < seed.length; i++) {
|
|
722
|
+
h ^= seed.charCodeAt(i);
|
|
723
|
+
h = h * 16777619 >>> 0;
|
|
724
|
+
}
|
|
725
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
726
|
+
return (prefix + suffix).slice(0, 26);
|
|
727
|
+
}
|
|
728
|
+
function normalizeSkillSeed3(input) {
|
|
729
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
730
|
+
}
|
|
731
|
+
function buildCodePlannerSkillId(slug) {
|
|
732
|
+
return deterministicId3("01SK", normalizeSkillSeed3(slug) || slug);
|
|
733
|
+
}
|
|
734
|
+
function buildCodePlannerSkillPageKey(userId, slug) {
|
|
735
|
+
return `page-${userId}-${buildCodePlannerSkillId(slug)}`;
|
|
736
|
+
}
|
|
737
|
+
var CODE_PLANNER_ROOT_SKILL_ID = buildCodePlannerSkillId(
|
|
738
|
+
CODE_PLANNER_ROOT_SKILL_SLUG
|
|
739
|
+
);
|
|
740
|
+
function buildDispatchExecutorsPromptPatch() {
|
|
741
|
+
return [
|
|
742
|
+
"\u6D3E\u53D1\u534F\u8BAE\uFF1A",
|
|
743
|
+
"- \u552F\u4E00\u771F\u5B9E\u5206\u6D3E\u901A\u9053\u662F startAgentRun\u3002\u7981\u6B62\u58F0\u79F0\u4F7F\u7528\u4E86\u672C\u673A CLI \u6216 nolo agent run\uFF08\u9664\u975E\u7528\u6237\u5F53\u524D\u4F1A\u8BDD\u672C\u8EAB\u5C31\u662F CLI\uFF09\u3002",
|
|
744
|
+
"- \u5F53\u4EFB\u52A1\u9002\u5408\u59D4\u6D3E\u65F6\uFF0C\u5148\u8C03\u7528 listAgents \u83B7\u53D6\u5F53\u524D\u53EF\u7528\u5019\u9009\u3002",
|
|
745
|
+
"- \u9ED8\u8BA4\u4F7F\u7528 preferred scope\uFF1B\u53EA\u6709\u6CA1\u6709\u5408\u9002\u5019\u9009\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u63A2\u7D22\u516C\u5F00 Agent \u65F6\u518D\u67E5\u8BE2 public\u3002",
|
|
746
|
+
"- \u6839\u636E\u7528\u6237\u6307\u5B9A\u3001\u4EFB\u52A1\u80FD\u529B\u3001runtime\u3001billingSource\u3001availability\u3001cost \u548C\u53EF\u7528 quality evidence \u9009\u62E9\u3002",
|
|
747
|
+
"- agentKey \u5FC5\u987B\u539F\u6837\u590D\u5236 listAgents \u8FD4\u56DE\u503C\u3002",
|
|
748
|
+
"- \u7136\u540E\u8C03\u7528 startAgentRun\u3002",
|
|
749
|
+
"- \u4E0D\u5047\u8BBE\u4EFB\u4F55\u56FA\u5B9A implementer/reviewer/coder \u89D2\u8272\u3002",
|
|
750
|
+
"- \u4E0D\u7EF4\u62A4\u9759\u6001\u5E73\u53F0 executor pool\u3002",
|
|
751
|
+
"- started \u2260 completed\uFF1AstartAgentRun \u6210\u529F\u8FD4\u56DE\u771F\u5B9E runId\uFF08\u540C\u6B65 wait:true \u5219\u8FD4\u56DE\u7ED3\u679C\uFF09\u540E\u624D\u80FD\u8BF4\u300C\u5DF2\u542F\u52A8\u300D\uFF1B\u5F02\u6B65\u6D3E\u53D1\u6210\u529F\u53EA\u8868\u793A started\u3002",
|
|
752
|
+
"- \u591A\u6587\u4EF6\u5B9E\u73B0\u3001\u5927\u91CD\u6784\u3001\u65B0\u5EFA\u6A21\u5757\u5E94\u6D3E\u53D1\u6267\u884C\u8005\uFF1B\u5355\u70B9\u5C0F\u6539\u53EF\u76F4\u63A5\u7528\u5DE5\u4F5C\u533A\u5DE5\u5177\u5B8C\u6210\u3002",
|
|
753
|
+
"- \u4E0D\u8981\u5199\u6B7B owner \u79C1\u6709 agentKey\u3002"
|
|
754
|
+
].join("\n");
|
|
755
|
+
}
|
|
756
|
+
var CODE_PLANNER_SKILL_SEEDS = [
|
|
757
|
+
{
|
|
758
|
+
slug: "search-first",
|
|
759
|
+
title: "search-first",
|
|
760
|
+
description: "Search-first protocol for code work: repo before web; evaluate Adopt/Extend/Compose/Build.",
|
|
761
|
+
body: [
|
|
762
|
+
"# search-first",
|
|
763
|
+
"",
|
|
764
|
+
"Protocol-only skill. It does not grant tools by itself.",
|
|
765
|
+
"Use workspace and web skills for actual reads/searches."
|
|
766
|
+
].join("\n"),
|
|
767
|
+
triggerMode: "required",
|
|
768
|
+
promptPatch: [
|
|
769
|
+
"Search-first \u534F\u8BAE\uFF1A",
|
|
770
|
+
"1. \u5148\u5728\u7ED1\u5B9A\u5DE5\u4F5C\u533A/\u4ED3\u5E93\u5185\u641C\u7D22\u76F8\u5173\u6A21\u5757\u3001\u6D4B\u8BD5\u3001guidance\u3001\u65E2\u6709 helper \u4E0E\u6A21\u5F0F\u3002",
|
|
771
|
+
"2. \u4EC5\u5F53\u4ED3\u5E93\u5185\u4FE1\u606F\u4E0D\u8DB3\uFF0C\u6216\u9700\u8981\u6838\u5BF9 API/\u7248\u672C/\u5DF2\u77E5 issue \u65F6\uFF0C\u518D\u67E5\u4F9D\u8D56\u6E90\u7801\u3001\u5B98\u65B9\u6587\u6863\u3001GitHub\u3001Web\u3002",
|
|
772
|
+
"3. \u8BC4\u4EF7\u8DEF\u5F84\uFF1AAdopt / Extend / Compose / Build\u3002\u9ED8\u8BA4\u4F18\u5148 Adopt/Extend/Compose\uFF1BBuild \u9700\u8BF4\u660E\u4E3A\u4F55\u4E0D\u591F\u3002",
|
|
773
|
+
"4. \u4EA7\u51FA\u53EF\u6267\u884C\u8BA1\u5212\uFF1A\u76EE\u6807\u3001\u8FB9\u754C\u3001\u5173\u952E\u6587\u4EF6\u3001\u9A8C\u8BC1\u65B9\u5F0F\u3001\u98CE\u9669\uFF1B\u518D\u6309\u7528\u6237\u610F\u56FE\u51B3\u5B9A\u53EA\u7ED9\u8BA1\u5212\u3001\u81EA\u5DF1\u5C0F\u6539\uFF0C\u8FD8\u662F startAgentRun \u6D3E\u53D1\u3002",
|
|
774
|
+
"5. \u5DE5\u5177\u9884\u7B97\uFF1A\u7B80\u5355\u95EE\u7B54\u5C3D\u91CF \u22645 \u6B21\u5DE5\u5177\u8C03\u7528\uFF1B\u7981\u6B62\u65E0\u76EE\u6807\u8FDE\u8BFB\u5927\u91CF\u6587\u4EF6\u3002",
|
|
775
|
+
"6. \u4ECE\u672A\u8C03\u7528\u7684\u6E20\u9053\u7981\u6B62\u58F0\u79F0\u5DF2\u641C\u7D22/\u5DF2\u68C0\u67E5\u3002"
|
|
776
|
+
].join("\n")
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
slug: "workspace-code",
|
|
780
|
+
title: "workspace-code",
|
|
781
|
+
description: "Workspace read/edit/shell protocol for local bound folders and repo inspection.",
|
|
782
|
+
body: [
|
|
783
|
+
"# workspace-code",
|
|
784
|
+
"",
|
|
785
|
+
"Declares local workspace tools and the honest fallback when they are unavailable."
|
|
786
|
+
].join("\n"),
|
|
787
|
+
triggerMode: "required",
|
|
788
|
+
toolNames: [
|
|
789
|
+
"readFile",
|
|
790
|
+
"globFiles",
|
|
791
|
+
"editFile",
|
|
792
|
+
"execShell"
|
|
793
|
+
],
|
|
794
|
+
promptPatch: [
|
|
795
|
+
"\u5DE5\u4F5C\u533A\u534F\u8BAE\uFF1A",
|
|
796
|
+
"- Desktop/Space \u4EE3\u7801\u5BF9\u8BDD\u4E2D\uFF0C\u7528\u6237\u8BF4\u300C\u5F53\u524D\u4EE3\u7801\u300D\u300C\u5F53\u524D\u6539\u52A8\u300D\u300C\u5F53\u524D\u5DE5\u4F5C\u533A\u300D\u300C\u8FD9\u4E2A\u9879\u76EE\u300D\u300C\u4ED3\u5E93\u91CC\u300D\uFF0C\u6216\u70B9\u540D\u4ED3\u5E93\u7EC4\u4EF6\uFF08\u5982\u300CCLI \u76F8\u5173\u300D\uFF09\u65F6\uFF0C\u9ED8\u8BA4\u6307\u7ED1\u5B9A\u5DE5\u4F5C\u533A\uFF1B\u7ACB\u5373\u7528\u5DE5\u4F5C\u533A/shell \u5DE5\u5177\u68C0\u67E5\u3002\u4EE3\u7801\u6539\u52A8 review \u65F6\u5148\u4ECE git status -sb\u3001diff/stat\u3001\u76F8\u5173 guidance/tests \u5165\u624B\u3002\u4E0D\u8981\u8981\u6C42\u7528\u6237\u7C98\u8D34\u4EE3\u7801/diff\uFF0C\u9664\u975E\u5DE5\u4F5C\u533A\u5DE5\u5177\u786E\u5B9E\u4E0D\u53EF\u7528\u3001\u6CA1\u6709\u7ED1\u5B9A\u6587\u4EF6\u5939\uFF0C\u6216\u8BBF\u95EE/\u547D\u4EE4\u5931\u8D25\u2014\u2014\u5148\u62AB\u9732\u5931\u8D25\u518D\u9000\u56DE\u7C98\u8D34\u3002",
|
|
797
|
+
"- \u53EA\u8BFB\uFF1AreadFile\u3001globFiles\u3002\u76EE\u5F55\u7ED3\u6784\u4E0E\u6587\u4EF6\u5217\u8868\u4F18\u5148\u4F7F\u7528 execShell \u8FD0\u884C ls/find\uFF0C\u4EE3\u7801/\u6587\u672C\u641C\u7D22\u4F18\u5148\u4F7F\u7528 execShell \u8FD0\u884C rg/git grep\u3002\u6CA1\u6709\u6210\u529F\u7ED3\u679C\u65F6\uFF0C\u7981\u6B62\u58F0\u79F0\u300C\u5DF2\u68C0\u67E5\u4ED3\u5E93/\u5DE5\u4F5C\u533A/\u6587\u4EF6\u300D\u3002",
|
|
798
|
+
"- editFile\uFF1A\u5C0F\u8303\u56F4\u7CBE\u786E\u66FF\u6362\u3002edit \u524D\u5148 readFile \u62FF exact oldText\uFF1B\u9ED8\u8BA4 expectedReplacements=1\uFF0C\u5339\u914D\u6570\u4E0D\u7B26\u65F6\u505C\u5E76\u62A5\u544A blocker\u3002\u6CA1\u6709 writeFile\u2014\u2014\u9700\u8981\u65B0\u5EFA\u6587\u4EF6\u6216\u6574\u6587\u4EF6\u91CD\u5199\u65F6 startAgentRun \u6D3E\u53D1\u3002",
|
|
799
|
+
"- execShell\uFF1A\u4F18\u5148\u53EA\u8BFB/\u8BCA\u65AD\u3002git \u72B6\u6001\u7528 shell\uFF08\u5982 git status -sb\uFF09\uFF0C\u7981\u6B62\u7528 readFile \u6316 .git \u4EE3\u66FF\u3002\u7834\u574F\u6027\u547D\u4EE4\u4E0E\u672A\u6279\u51C6\u7684 push/\u5408\u5E76\u7981\u6B62\u3002",
|
|
800
|
+
"- \u5DE5\u4F5C\u533A\u5DE5\u5177\u4E0D\u53EF\u7528\uFF08\u975E Desktop\u3001\u672A\u7ED1\u5B9A boundFolder\u3001\u5DE5\u5177\u5931\u8D25\uFF09\u65F6\u5FC5\u987B\u62AB\u9732\uFF0C\u5E76\u53EA\u57FA\u4E8E\u7528\u6237\u7C98\u8D34\u5185\u5BB9\u4E0E\u4ECD\u53EF\u7528\u6E20\u9053\u7EE7\u7EED\u3002"
|
|
801
|
+
].join("\n")
|
|
802
|
+
},
|
|
803
|
+
{
|
|
804
|
+
slug: "web-research-lite",
|
|
805
|
+
title: "web-research-lite",
|
|
806
|
+
description: "Lite web verification protocol for dependency/docs/issue lookups.",
|
|
807
|
+
body: [
|
|
808
|
+
"# web-research-lite",
|
|
809
|
+
"",
|
|
810
|
+
"Declares external search/scrape tools for verification after local search."
|
|
811
|
+
].join("\n"),
|
|
812
|
+
triggerMode: "required",
|
|
813
|
+
// 刻意不声明 toolNames:联网能力是系统层能力包(web-search / web-scrape),
|
|
814
|
+
// 不编码的对话同样需要,不该由 Code Planner 私藏一份。这里只留协议,工具由
|
|
815
|
+
// 宿主按能力包挂载,用户在设置页的全局开关才能真正管住它们。
|
|
816
|
+
promptPatch: [
|
|
817
|
+
"\u5916\u90E8\u68C0\u7D22\u534F\u8BAE\uFF1A",
|
|
818
|
+
"- \u8054\u7F51\u5DE5\u5177\u7531\u5E73\u53F0\u80FD\u529B\u5305\u63D0\u4F9B\uFF08\u8054\u7F51\u641C\u7D22 / \u6DF1\u5EA6\u7F51\u9875\u6293\u53D6\uFF09\uFF0C\u7528\u6237\u53EF\u80FD\u5DF2\u5168\u5C40\u5173\u95ED\u3002",
|
|
819
|
+
"- \u53EA\u4F7F\u7528\u672C\u8F6E\u5B9E\u9645\u62FF\u5230\u7684\u5DE5\u5177\uFF1B\u5DE5\u5177\u4E0D\u5728\u624B\u4E0A\u65F6\u5982\u5B9E\u8BF4\u660E\u300C\u8054\u7F51\u80FD\u529B\u672A\u5F00\u542F\u300D\uFF0C\u4E0D\u8981\u81C6\u9020\u8C03\u7528\u3002",
|
|
820
|
+
"- \u6CA1\u6709\u6210\u529F\u7ED3\u679C\u65F6\uFF0C\u7981\u6B62\u58F0\u79F0\u300C\u5DF2\u641C\u7D22\u4F9D\u8D56/\u5B98\u65B9\u6587\u6863/GitHub/Web\u300D\u3002",
|
|
821
|
+
"- \u6E20\u9053\u5931\u8D25\u6216\u4E0D\u53EF\u7528\u65F6\u5FC5\u987B\u62AB\u9732\u7F3A\u53E3\uFF0C\u6539\u7528\u4ECD\u53EF\u7528\u5DE5\u5177\uFF1B\u4E0D\u8981\u5047\u88C5\u5DF2\u6838\u5B9E\u3002"
|
|
822
|
+
].join("\n")
|
|
823
|
+
},
|
|
824
|
+
{
|
|
825
|
+
slug: "dispatch-executors",
|
|
826
|
+
title: "dispatch-executors",
|
|
827
|
+
description: "listAgents discovery and startAgentRun dispatch protocol for Code Planner.",
|
|
828
|
+
body: [
|
|
829
|
+
"# dispatch-executors",
|
|
830
|
+
"",
|
|
831
|
+
"Discover candidates via listAgents and dispatch chosen exact agentKey via startAgentRun."
|
|
832
|
+
].join("\n"),
|
|
833
|
+
triggerMode: "required",
|
|
834
|
+
toolNames: ["listAgents", "startAgentRun"],
|
|
835
|
+
promptPatch: buildDispatchExecutorsPromptPatch()
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
slug: "code-planning",
|
|
839
|
+
title: "code-planning",
|
|
840
|
+
description: "Root Code Planner skill: composes search-first, workspace, web, and dispatch skills.",
|
|
841
|
+
body: [
|
|
842
|
+
"# code-planning",
|
|
843
|
+
"",
|
|
844
|
+
"Composition-only root skill for Code Planner.",
|
|
845
|
+
"Attach this skill on the Agent; children load via requiredSkills.",
|
|
846
|
+
"Until runtimes expand skill pages, Agent seed also carries a compiled snapshot."
|
|
847
|
+
].join("\n"),
|
|
848
|
+
triggerMode: "required",
|
|
849
|
+
requiredSkillSlugs: [
|
|
850
|
+
"search-first",
|
|
851
|
+
"workspace-code",
|
|
852
|
+
"web-research-lite",
|
|
853
|
+
"dispatch-executors"
|
|
854
|
+
]
|
|
855
|
+
}
|
|
856
|
+
];
|
|
857
|
+
function seedBySlug3(slug) {
|
|
858
|
+
const seed = CODE_PLANNER_SKILL_SEEDS.find((item) => item.slug === slug);
|
|
859
|
+
if (!seed) {
|
|
860
|
+
throw new Error(`Unknown Code Planner skill slug: ${slug}`);
|
|
861
|
+
}
|
|
862
|
+
return seed;
|
|
863
|
+
}
|
|
864
|
+
function collectCodePlannerReachableSkillSlugs(rootSlug = CODE_PLANNER_ROOT_SKILL_SLUG) {
|
|
865
|
+
const ordered = [];
|
|
866
|
+
const seen = /* @__PURE__ */ new Set();
|
|
867
|
+
const visit = (slug) => {
|
|
868
|
+
if (seen.has(slug)) return;
|
|
869
|
+
seen.add(slug);
|
|
870
|
+
ordered.push(slug);
|
|
871
|
+
for (const child of seedBySlug3(slug).requiredSkillSlugs ?? []) {
|
|
872
|
+
visit(child);
|
|
873
|
+
}
|
|
874
|
+
};
|
|
875
|
+
visit(rootSlug);
|
|
876
|
+
return ordered;
|
|
877
|
+
}
|
|
878
|
+
function compileCodePlannerEffectiveTools() {
|
|
879
|
+
const tools = [];
|
|
880
|
+
const seen = /* @__PURE__ */ new Set();
|
|
881
|
+
for (const slug of collectCodePlannerReachableSkillSlugs()) {
|
|
882
|
+
for (const toolName of seedBySlug3(slug).toolNames ?? []) {
|
|
883
|
+
if (seen.has(toolName)) continue;
|
|
884
|
+
seen.add(toolName);
|
|
885
|
+
tools.push(toolName);
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
return tools;
|
|
889
|
+
}
|
|
890
|
+
var CODE_PLANNER_COMPILED_EFFECTIVE_TOOLS = compileCodePlannerEffectiveTools();
|
|
891
|
+
function buildCodePlannerSkillConfig(slug, options) {
|
|
892
|
+
const seed = seedBySlug3(slug);
|
|
893
|
+
const requiredSkills = options?.requiredSkills ?? seed.requiredSkillSlugs?.map((childSlug) => buildCodePlannerSkillId(childSlug));
|
|
894
|
+
return {
|
|
895
|
+
version: "0.1",
|
|
896
|
+
kind: "skill",
|
|
897
|
+
id: buildCodePlannerSkillId(slug),
|
|
898
|
+
name: seed.title,
|
|
899
|
+
description: seed.description,
|
|
900
|
+
...seed.triggerMode ? { triggerMode: seed.triggerMode } : {},
|
|
901
|
+
...seed.toolNames?.length ? { toolNames: [...seed.toolNames] } : {},
|
|
902
|
+
...requiredSkills?.length ? { requiredSkills: [...requiredSkills] } : {},
|
|
903
|
+
...seed.promptPatch ? { promptPatch: seed.promptPatch } : {}
|
|
904
|
+
};
|
|
905
|
+
}
|
|
906
|
+
function buildCodePlannerSkillPageRecords(userId) {
|
|
907
|
+
const trimmedUserId = userId.trim();
|
|
908
|
+
if (!trimmedUserId) {
|
|
909
|
+
throw new Error("buildCodePlannerSkillPageRecords requires userId");
|
|
910
|
+
}
|
|
911
|
+
return CODE_PLANNER_SKILL_SEEDS.map((seed) => {
|
|
912
|
+
const skillId = buildCodePlannerSkillId(seed.slug);
|
|
913
|
+
const dbKey = buildCodePlannerSkillPageKey(trimmedUserId, seed.slug);
|
|
914
|
+
const requiredSkills = seed.requiredSkillSlugs?.map(
|
|
915
|
+
(childSlug) => buildCodePlannerSkillPageKey(trimmedUserId, childSlug)
|
|
916
|
+
);
|
|
917
|
+
const skillConfig = buildCodePlannerSkillConfig(seed.slug, {
|
|
918
|
+
requiredSkills
|
|
919
|
+
});
|
|
920
|
+
return {
|
|
921
|
+
slug: seed.slug,
|
|
922
|
+
skillId,
|
|
923
|
+
dbKey,
|
|
924
|
+
title: seed.title,
|
|
925
|
+
content: buildSkillDocMarkdown({
|
|
926
|
+
body: seed.body,
|
|
927
|
+
skillConfig
|
|
928
|
+
}),
|
|
929
|
+
meta: {
|
|
930
|
+
kind: "skill",
|
|
931
|
+
skillConfig
|
|
932
|
+
},
|
|
933
|
+
...skillConfig.toolNames?.length ? { tools: [...skillConfig.toolNames] } : {}
|
|
934
|
+
};
|
|
935
|
+
});
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
// packages/ai/skills/searchDialogSkill.ts
|
|
939
|
+
var SEARCH_DIALOG_SKILL_SLUGS = [
|
|
940
|
+
"search-dialog-messages"
|
|
941
|
+
];
|
|
942
|
+
function deterministicId4(prefix, seed) {
|
|
943
|
+
let h = 2166136261;
|
|
944
|
+
for (let i = 0; i < seed.length; i++) {
|
|
945
|
+
h ^= seed.charCodeAt(i);
|
|
946
|
+
h = h * 16777619 >>> 0;
|
|
947
|
+
}
|
|
948
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
949
|
+
return (prefix + suffix).slice(0, 26);
|
|
950
|
+
}
|
|
951
|
+
function normalizeSkillSeed4(input) {
|
|
952
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
953
|
+
}
|
|
954
|
+
function buildSearchDialogSkillId(slug) {
|
|
955
|
+
return deterministicId4("01SK", normalizeSkillSeed4(slug) || slug);
|
|
956
|
+
}
|
|
957
|
+
function buildSearchDialogSkillPageKey(userId, slug) {
|
|
958
|
+
return `page-${userId}-${buildSearchDialogSkillId(slug)}`;
|
|
959
|
+
}
|
|
960
|
+
var SEARCH_DIALOG_SKILL_SEEDS = [
|
|
961
|
+
{
|
|
962
|
+
slug: "search-dialog-messages",
|
|
963
|
+
title: "\u5BF9\u8BDD\u68C0\u7D22",
|
|
964
|
+
description: "\u5BF9\u8BDD\u68C0\u7D22\uFF1AlistDialogs \u5217\u51FA\u5F53\u524D\u7528\u6237\u7684\u5BF9\u8BDD\uFF08\u9ED8\u8BA4 100 \u6761\u3001\u4E0A\u9650 500\uFF09\uFF0C\u7528\u4E8E\u5728\u76EE\u6807\u5BF9\u8BDD\u4E0D\u660E\u786E\u65F6\u5148\u5B9A\u4F4D\uFF1BreadDialog \u8BFB\u53D6\u6307\u5B9A\u5BF9\u8BDD\u7684\u5143\u6570\u636E\u4E0E\u6700\u8FD1\u6D88\u606F\uFF08dialog \u4F18\u5148\u4F20\u5B8C\u6574 dbKey dialog-<userId>-<id> \u6216\u5BF9\u8BDD URL\uFF0C\u88F8 ID \u4EC5\u5BF9\u5F53\u524D\u767B\u5F55\u7528\u6237\u6709\u6548\uFF09\uFF1BsearchDialogMessages \u5728\u6307\u5B9A\u5BF9\u8BDD\u7684\u539F\u59CB\u6D88\u606F\u4E2D\u6309\u7CBE\u786E\u6216\u6A21\u7CCA\u6587\u672C\u641C\u7D22\uFF0C\u8FD4\u56DE\u5339\u914D\u7684 messageId\u3001\u89D2\u8272\u3001\u88C1\u526A\u540E\u7684\u539F\u6587\u7247\u6BB5\u4E0E\u90BB\u8FD1\u4E0A\u4E0B\u6587\uFF0C\u4E0D\u628A\u6574\u6BB5\u5BF9\u8BDD\u704C\u8FDB\u6A21\u578B\u4E0A\u4E0B\u6587\u3002",
|
|
965
|
+
body: [
|
|
966
|
+
"\u4F60\u662F\u300C\u5BF9\u8BDD\u68C0\u7D22\u300D\u80FD\u529B\u7684\u4F7F\u7528\u8005\uFF1A\u9700\u8981\u8BFB\u53D6\u6216\u53D6\u8BC1\u67D0\u6BB5\u5BF9\u8BDD\u65F6\uFF0C\u5728\u672C skill \u7684 listDialogs\u3001readDialog \u4E0E searchDialogMessages \u4E09\u4E2A\u5DE5\u5177\u4E2D\u9009\u62E9\u5408\u9002\u7684\u90A3\u4E2A\u3002",
|
|
967
|
+
"",
|
|
968
|
+
"## \u4EC0\u4E48\u65F6\u5019\u7528",
|
|
969
|
+
"- \u7528\u6237\u8981\u7CBE\u786E\u7684\u65E7\u6D88\u606F\u3001\u539F\u6587\u63AA\u8F9E\u3001\u8C01\u8BF4\u4E86\u4EC0\u4E48\u3001\u67D0\u4E2A\u51B3\u7B56\u4E3A\u4EC0\u4E48\u505A\u51FA\u3001\u65E9\u671F\u5386\u53F2\u7EC6\u8282\u3002",
|
|
970
|
+
"- \u9700\u8981\u6587\u4EF6/\u5DE5\u5177\u8BC1\u636E\u3001\u5931\u8D25\u5C1D\u8BD5\u3001\u6216\u4E0E\u4E4B\u524D\u5DE5\u4F5C\u7684\u5BF9\u6BD4\uFF08\u6765\u81EA\u88AB\u5F15\u7528\u5BF9\u8BDD\uFF09\u3002",
|
|
971
|
+
"- \u76EE\u6807\u5BF9\u8BDD\u4E0D\u660E\u786E\u3001\u9700\u8981\u5148\u5217\u51FA\u5019\u9009\u5BF9\u8BDD\uFF08\u5F53\u524D\u7528\u6237\u7684\u5BF9\u8BDD\u5217\u8868\uFF09\u65F6\uFF0C\u7528 listDialogs\u3002",
|
|
972
|
+
"- \u5F53\u524D\u4E0A\u4E0B\u6587\u53EA\u6709\u6709\u635F\u7684\u5BF9\u8BDD\u6458\u8981\uFF0C\u800C\u7528\u6237\u9700\u8981\u8BC1\u636E\u3001\u51FA\u5904\u6216\u5177\u4F53\u5386\u53F2\u7EC6\u8282\u65F6\u2014\u2014\u4F18\u5148\u7528\u672C skill\uFF0C\u4E0D\u8981\u51ED\u6458\u8981\u731C\u3002",
|
|
973
|
+
"",
|
|
974
|
+
"## listDialogs\uFF1A\u5B9A\u4F4D\u5BF9\u8BDD",
|
|
975
|
+
"\u5217\u51FA\u5F53\u524D\u7528\u6237\u7684\u5BF9\u8BDD\uFF1A`listDialogs({ limit?, space?, includeScheduled? })`\u3002",
|
|
976
|
+
"- \u8FD4\u56DE `{ total, dialogs: [{ id, dbKey, title, status, updatedAt, createdAt, spaceId, triggerType, primaryAgentKey }] }`\uFF0C\u6309\u6700\u8FD1\u66F4\u65B0\u6392\u5E8F\u3002",
|
|
977
|
+
"- limit \u63A7\u5236\u8FD4\u56DE\u6761\u6570\uFF08\u9ED8\u8BA4 100\uFF0C\u4E0A\u9650 500\uFF09\uFF1Bspace \u53EF\u4F20 space id \u6216 URL \u6536\u7A84\u8303\u56F4\uFF1BincludeScheduled \u63A7\u5236\u662F\u5426\u5305\u542B\u5B9A\u65F6/\u540E\u53F0\u8FD0\u884C\u5BF9\u8BDD\uFF08\u9ED8\u8BA4\u4E0D\u542B\uFF09\u3002",
|
|
978
|
+
"- \u76EE\u6807\u5BF9\u8BDD\u4E0D\u660E\u786E\u65F6\u5148\u7528\u5B83\u5B9A\u4F4D\uFF1A\u4ECE\u7ED3\u679C\u91CC\u53D6 dbKey \u6216 URL \u4EA4\u7ED9 readDialog / searchDialogMessages\uFF0C\u4E0D\u8981\u7528\u88F8 ID\u3002",
|
|
979
|
+
"",
|
|
980
|
+
"## readDialog\uFF1A\u8BFB\u53D6\u5BF9\u8BDD",
|
|
981
|
+
'\u8BFB\u53D6\u6307\u5B9A\u5BF9\u8BDD\u7684\u5143\u6570\u636E\u4E0E\u6700\u8FD1\u6D88\u606F\uFF1A`readDialog({ dialog: "<dialog \u7684 dbKey>" })`\u3002',
|
|
982
|
+
"- dialog \u4F18\u5148\u4F20\u5B8C\u6574 dbKey\uFF08dialog-<userId>-<id>\uFF09\u6216\u5BF9\u8BDD URL\uFF1B\u88F8 ID \u53EA\u5BF9\u5F53\u524D\u767B\u5F55\u7528\u6237\u6709\u6548\uFF0C\u4E0D\u80FD\u53EF\u9760\u8BFB\u53D6\u5176\u4ED6\u7528\u6237\u6216\u8DE8\u670D\u52A1\u5668\u7684\u5BF9\u8BDD\u3002",
|
|
983
|
+
"- \u76EE\u6807\u5BF9\u8BDD\u4E0D\u660E\u786E\u65F6\uFF0C\u5148 listDialogs \u5B9A\u4F4D\u518D\u8BFB\u53D6\u3002",
|
|
984
|
+
"- limit \u63A7\u5236\u8FD4\u56DE\u6D88\u606F\u6761\u6570\uFF08\u9ED8\u8BA4 120\uFF0C\u4E0A\u9650 1000\uFF09\u3002",
|
|
985
|
+
"",
|
|
986
|
+
"## searchDialogMessages\uFF1A\u539F\u6587\u641C\u7D22",
|
|
987
|
+
'\u57FA\u672C\u5F62\u5F0F\uFF1A`searchDialogMessages({ dialogKey: "<dialog \u7684 dbKey>", query: "<\u8981\u641C\u7684\u6587\u672C>" })`',
|
|
988
|
+
"",
|
|
989
|
+
"\u53C2\u6570\uFF1A",
|
|
990
|
+
"- dialogKey\uFF1A\u76EE\u6807\u5BF9\u8BDD\u7684 dbKey\uFF08\u5F62\u5982 dialog-<userId>-01ABC...\uFF09\u3002",
|
|
991
|
+
"- query\uFF1A\u8981\u5728\u539F\u59CB\u6D88\u606F\u5185\u5BB9\u91CC\u641C\u7D22\u7684\u6587\u672C\u3002",
|
|
992
|
+
"- limit\uFF1A\u6700\u591A\u8FD4\u56DE\u591A\u5C11\u6761\u5339\u914D\uFF08\u4E0A\u9650 10\uFF09\u3002",
|
|
993
|
+
"- scanLimit\uFF1A\u4ECE server \u62C9\u53D6\u65F6\u6700\u591A\u626B\u63CF\u591A\u5C11\u6761\u6D88\u606F\uFF08\u4E0A\u9650 500\uFF09\u3002",
|
|
994
|
+
"- contextMessages\uFF1A\u6BCF\u6761\u5339\u914D\u524D\u540E\u9644\u5E26\u591A\u5C11\u6761\u90BB\u8FD1\u6D88\u606F\uFF08\u4E0A\u9650 3\uFF09\u3002",
|
|
995
|
+
"- role\uFF1A\u53EF\u9009\uFF0C\u53EA\u641C\u6307\u5B9A\u89D2\u8272\uFF08user / assistant / tool / system\uFF09\u3002",
|
|
996
|
+
"- includeTools\uFF1A\u53EF\u9009\uFF0C\u662F\u5426\u5305\u542B tool \u6D88\u606F\u3002",
|
|
997
|
+
"",
|
|
998
|
+
"## \u8FD4\u56DE",
|
|
999
|
+
"searchDialogMessages \u8FD4\u56DE\u5339\u914D\u7684 messageId\u3001\u89D2\u8272\u3001\u88C1\u526A\u540E\u7684\u539F\u6587\u5185\u5BB9\u7247\u6BB5\u4EE5\u53CA\u90BB\u8FD1\u4E0A\u4E0B\u6587\u3002",
|
|
1000
|
+
"\u57FA\u4E8E\u8FD4\u56DE\u7684\u539F\u6587\u7247\u6BB5\u56DE\u7B54\u7528\u6237\uFF0C\u5F15\u7528\u65F6\u4FDD\u6301\u539F\u6587\uFF1B\u7247\u6BB5\u88AB\u88C1\u526A\u65F6\uFF0C\u5982\u9700\u66F4\u5B8C\u6574\u5185\u5BB9\u518D\u9488\u5BF9\u6027\u7F29\u5C0F\u67E5\u8BE2\u6216\u6362\u5173\u952E\u8BCD\u3002",
|
|
1001
|
+
"",
|
|
1002
|
+
"## \u8FB9\u754C",
|
|
1003
|
+
"- searchDialogMessages \u53EA\u641C**\u4E00\u4E2A**\u6307\u5B9A\u5BF9\u8BDD\u7684\u539F\u59CB\u6D88\u606F\uFF1B\u8DE8\u5BF9\u8BDD\u6216\u6309\u4E3B\u9898\u805A\u5408\u8BF7\u7528 queryDialogsBySubjectRef\u3002",
|
|
1004
|
+
"- listDialogs \u53EA\u5217**\u5F53\u524D\u767B\u5F55\u7528\u6237**\u7684\u5BF9\u8BDD\uFF08\u9ED8\u8BA4\u4E0D\u542B\u5B9A\u65F6/\u540E\u53F0\u8FD0\u884C\u5BF9\u8BDD\uFF0C\u9664\u975E includeScheduled\uFF09\uFF1B\u8DE8\u7528\u6237/\u8DE8\u670D\u52A1\u5668\u68C0\u7D22\u4E0D\u53D7\u652F\u6301\u3002",
|
|
1005
|
+
"- \u4E0D\u8981\u4E3A\u4E86\u300C\u591A\u62FF\u70B9\u4E0A\u4E0B\u6587\u300D\u800C\u7528\u5927 scanLimit/limit \u4EE3\u66FF readDialog \u7684\u5B8C\u6574\u8BFB\u53D6\u8BED\u4E49\uFF1B\u672C skill \u91CC readDialog \u8D1F\u8D23\u5B8C\u6574\u8BFB\u53D6\uFF0CsearchDialogMessages \u7684\u4EF7\u503C\u662F\u5B9A\u70B9\u53D6\u8BC1\u3002",
|
|
1006
|
+
"- \u641C\u4E0D\u5230\u65F6\u5982\u5B9E\u8BF4\u660E\uFF0C\u4E0D\u8981\u7528\u6458\u8981\u6216\u8BB0\u5FC6\u7F16\u9020\u539F\u6587\u3002"
|
|
1007
|
+
].join("\n"),
|
|
1008
|
+
toolNames: ["listDialogs", "readDialog", "searchDialogMessages"]
|
|
1009
|
+
}
|
|
1010
|
+
];
|
|
1011
|
+
function seedBySlug4(slug) {
|
|
1012
|
+
const seed = SEARCH_DIALOG_SKILL_SEEDS.find((item) => item.slug === slug);
|
|
1013
|
+
if (!seed) {
|
|
1014
|
+
throw new Error(`Unknown search-dialog skill slug: ${slug}`);
|
|
1015
|
+
}
|
|
1016
|
+
return seed;
|
|
1017
|
+
}
|
|
1018
|
+
function buildSearchDialogSkillConfig(slug) {
|
|
1019
|
+
const seed = seedBySlug4(slug);
|
|
1020
|
+
return {
|
|
1021
|
+
version: "0.1",
|
|
1022
|
+
kind: "skill",
|
|
1023
|
+
id: buildSearchDialogSkillId(slug),
|
|
1024
|
+
name: seed.title,
|
|
1025
|
+
description: seed.description,
|
|
1026
|
+
...seed.toolNames?.length ? { toolNames: [...seed.toolNames] } : {}
|
|
1027
|
+
};
|
|
1028
|
+
}
|
|
1029
|
+
function buildSearchDialogSkillContentBySlug(slug) {
|
|
1030
|
+
const seed = seedBySlug4(slug);
|
|
1031
|
+
const skillConfig = buildSearchDialogSkillConfig(slug);
|
|
1032
|
+
return buildSkillDocMarkdown({
|
|
1033
|
+
body: seed.body,
|
|
1034
|
+
skillConfig
|
|
1035
|
+
});
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
// packages/ai/skills/searchSpaceSkill.ts
|
|
1039
|
+
var SEARCH_SPACE_SKILL_SLUGS = [
|
|
1040
|
+
"search-all-spaces"
|
|
1041
|
+
];
|
|
1042
|
+
function deterministicId5(prefix, seed) {
|
|
1043
|
+
let h = 2166136261;
|
|
1044
|
+
for (let i = 0; i < seed.length; i++) {
|
|
1045
|
+
h ^= seed.charCodeAt(i);
|
|
1046
|
+
h = h * 16777619 >>> 0;
|
|
1047
|
+
}
|
|
1048
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1049
|
+
return (prefix + suffix).slice(0, 26);
|
|
1050
|
+
}
|
|
1051
|
+
function normalizeSkillSeed5(input) {
|
|
1052
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1053
|
+
}
|
|
1054
|
+
function buildSearchSpaceSkillId(slug) {
|
|
1055
|
+
return deterministicId5("01SK", normalizeSkillSeed5(slug) || slug);
|
|
1056
|
+
}
|
|
1057
|
+
function buildSearchSpaceSkillPageKey(userId, slug) {
|
|
1058
|
+
return `page-${userId}-${buildSearchSpaceSkillId(slug)}`;
|
|
1059
|
+
}
|
|
1060
|
+
var SEARCH_SPACE_SKILL_SEEDS = [
|
|
1061
|
+
{
|
|
1062
|
+
slug: "search-all-spaces",
|
|
1063
|
+
title: "\u5168\u7A7A\u95F4\u641C\u7D22",
|
|
1064
|
+
description: "\u5168\u7A7A\u95F4\u641C\u7D22\uFF1A\u4F7F\u7528 search_all_spaces \u5728\u5F53\u524D\u8BBE\u5907\u5DF2\u540C\u6B65\u7684\u5168\u90E8\u5185\u5BB9\u4E2D\u641C\u7D22\u5F53\u524D\u7528\u6237\u7684\u6570\u636E\uFF08\u7B49\u540C\u4E8E\u5168\u90E8\u89C6\u56FE Recent \u7684\u5185\u5BB9\u8BED\u4E49\uFF09\uFF0C\u5E76\u8FD4\u56DE\u6240\u5C5E\u7A7A\u95F4\uFF08\u5982\u6709\uFF09\u3002\u9002\u5408\u5728\u5168\u90E8\u89C6\u56FE\uFF08All View\uFF09\u6216\u9700\u8981\u8DE8\u7A7A\u95F4\u68C0\u7D22\u65F6\u4F7F\u7528\u3002",
|
|
1065
|
+
body: [
|
|
1066
|
+
"\u4F60\u662F\u300C\u5168\u7A7A\u95F4\u641C\u7D22\u300D\u80FD\u529B\u7684\u4F7F\u7528\u8005\uFF1A\u9700\u8981\u8DE8\u7A7A\u95F4\u3001\u6216\u5728\u6CA1\u6709\u300C\u5F53\u524D\u7A7A\u95F4\u300D\u8BED\u4E49\u7684\u4E0A\u4E0B\u6587\u4E2D\u68C0\u7D22\u7528\u6237\u5185\u5BB9\u65F6\uFF0C\u4F7F\u7528\u672C skill \u7684 search_all_spaces \u5DE5\u5177\u3002",
|
|
1067
|
+
"",
|
|
1068
|
+
"## \u4EC0\u4E48\u65F6\u5019\u7528",
|
|
1069
|
+
"- \u7528\u6237\u8981\u8DE8\u7A7A\u95F4\u67E5\u627E\u5185\u5BB9\uFF08\u9875\u9762\u3001\u8868\u683C\u3001\u5BF9\u8BDD\u7B49\uFF09\uFF0C\u4E14\u4E0D\u9650\u5B9A\u5728\u67D0\u4E2A\u5177\u4F53\u7A7A\u95F4\u3002",
|
|
1070
|
+
"- \u5F53\u524D\u89C6\u56FE\u662F\u5168\u90E8\u89C6\u56FE\uFF08All View\uFF09\uFF1A\u6CA1\u6709\u5F53\u524D\u7A7A\u95F4\uFF0Csearch_workspace \u4E0D\u9002\u7528\uFF0C\u4F18\u5148\u7528\u672C skill\u3002",
|
|
1071
|
+
"- \u9700\u8981\u786E\u8BA4\u67D0\u6761\u5185\u5BB9\u5C5E\u4E8E\u54EA\u4E2A\u7A7A\u95F4\uFF08\u8FD4\u56DE\u7ED3\u679C\u5E26 spaceId / spaceName\uFF09\u65F6\u3002",
|
|
1072
|
+
"",
|
|
1073
|
+
"## \u8C03\u7528\u65B9\u5F0F",
|
|
1074
|
+
'`search_all_spaces({ query: "<\u5173\u952E\u8BCD>" })`',
|
|
1075
|
+
"- query\uFF1A\u641C\u7D22\u5173\u952E\u8BCD\uFF0C\u5339\u914D\u6807\u9898\u4E0E\u6587\u4EF6\u540D\uFF08contentKey\uFF09\u3002",
|
|
1076
|
+
"- \u8FD4\u56DE rawData.contents\uFF1A\u6BCF\u9879\u5305\u542B title\u3001type\u3001contentKey\u3001spaceId\u3001spaceName\uFF08\u5982\u6709\uFF09\u3001createdAt / updatedAt\u3001serverOrigin\uFF08\u5982\u6709\uFF09\u3002",
|
|
1077
|
+
"",
|
|
1078
|
+
"## \u8BED\u4E49\u4E0E\u8FB9\u754C",
|
|
1079
|
+
"- \u641C\u7D22\u8303\u56F4 = \u5F53\u524D\u8BBE\u5907\u5DF2\u540C\u6B65\u7684 user-data \u5185\u5BB9\uFF08\u4E0E\u300C\u5168\u90E8\u89C6\u56FE Recent\u300D\u540C\u4E00\u5957\u8BED\u4E49\uFF09\uFF0C\u4E0D\u662F\u8FDC\u7A0B\u6570\u636E\u5E93\u7684\u5168\u91CF\u68C0\u7D22\u3002",
|
|
1080
|
+
"- \u7ED3\u679C\u53EF\u80FD\u8DE8\u591A\u4E2A\u7A7A\u95F4\uFF0C\u6309\u5185\u5BB9\u9010\u6761\u8FD4\u56DE\uFF0C\u4E0D\u9700\u8981\u5728\u8FD4\u56DE\u540E\u4E8C\u6B21\u641C\u7D22\u3002",
|
|
1081
|
+
"- \u6CA1\u6709\u547D\u4E2D\u65F6\u5982\u5B9E\u8BF4\u660E\uFF0C\u4E0D\u8981\u7F16\u9020\u5185\u5BB9\u6216\u7A7A\u95F4\u5F52\u5C5E\u3002",
|
|
1082
|
+
"- \u5206\u7C7B\u89C6\u56FE\uFF08categories\uFF09\u4E0B\u7528\u6237\u53EA\u95EE\u5F53\u524D\u7A7A\u95F4\u5185\u5BB9\u65F6\uFF0C\u4F18\u5148\u7528\u5E38\u9A7B\u7684 search_workspace\uFF1B\u9700\u8981\u8DE8\u7A7A\u95F4\u624D loadSkill \u672C skill\u3002"
|
|
1083
|
+
].join("\n"),
|
|
1084
|
+
toolNames: ["search_all_spaces"]
|
|
1085
|
+
}
|
|
1086
|
+
];
|
|
1087
|
+
function seedBySlug5(slug) {
|
|
1088
|
+
const seed = SEARCH_SPACE_SKILL_SEEDS.find((item) => item.slug === slug);
|
|
1089
|
+
if (!seed) {
|
|
1090
|
+
throw new Error(`Unknown search-space skill slug: ${slug}`);
|
|
1091
|
+
}
|
|
1092
|
+
return seed;
|
|
1093
|
+
}
|
|
1094
|
+
function buildSearchSpaceSkillConfig(slug) {
|
|
1095
|
+
const seed = seedBySlug5(slug);
|
|
1096
|
+
return {
|
|
1097
|
+
version: "0.1",
|
|
1098
|
+
kind: "skill",
|
|
1099
|
+
id: buildSearchSpaceSkillId(slug),
|
|
1100
|
+
name: seed.title,
|
|
1101
|
+
description: seed.description,
|
|
1102
|
+
...seed.toolNames?.length ? { toolNames: [...seed.toolNames] } : {}
|
|
1103
|
+
};
|
|
1104
|
+
}
|
|
1105
|
+
function buildSearchSpaceSkillContentBySlug(slug) {
|
|
1106
|
+
const seed = seedBySlug5(slug);
|
|
1107
|
+
const skillConfig = buildSearchSpaceSkillConfig(slug);
|
|
1108
|
+
return buildSkillDocMarkdown({
|
|
1109
|
+
body: seed.body,
|
|
1110
|
+
skillConfig
|
|
1111
|
+
});
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
// packages/ai/skills/worktreeSkill.ts
|
|
1115
|
+
var WORKTREE_SKILL_SLUGS = ["worktree-isolation"];
|
|
1116
|
+
function deterministicId6(prefix, seed) {
|
|
1117
|
+
let h = 2166136261;
|
|
1118
|
+
for (let i = 0; i < seed.length; i++) {
|
|
1119
|
+
h ^= seed.charCodeAt(i);
|
|
1120
|
+
h = h * 16777619 >>> 0;
|
|
1121
|
+
}
|
|
1122
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1123
|
+
return (prefix + suffix).slice(0, 26);
|
|
1124
|
+
}
|
|
1125
|
+
function normalizeSkillSeed6(input) {
|
|
1126
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1127
|
+
}
|
|
1128
|
+
function buildWorktreeSkillId(slug) {
|
|
1129
|
+
return deterministicId6("01SK", normalizeSkillSeed6(slug) || slug);
|
|
1130
|
+
}
|
|
1131
|
+
function buildWorktreeSkillPageKey(userId, slug) {
|
|
1132
|
+
return `page-${userId}-${buildWorktreeSkillId(slug)}`;
|
|
1133
|
+
}
|
|
1134
|
+
var WORKTREE_SKILL_SEEDS = [
|
|
1135
|
+
{
|
|
1136
|
+
slug: "worktree-isolation",
|
|
1137
|
+
title: "\u4ED3\u5E93\u6539\u52A8\u9694\u79BB\uFF08worktree\uFF09",
|
|
1138
|
+
description: "\u6539\u52A8 Git \u4ED3\u5E93\u6587\u4EF6\u524D\u7684\u9694\u79BB\u89C4\u7A0B\uFF1A\u7528 git worktree \u5EFA\u72EC\u7ACB\u5DE5\u4F5C\u533A\uFF0C\u4E0D\u5728\u4E3B\u68C0\u51FA\u5207\u5206\u652F\u6216\u5C31\u5730\u6539\u3002\u89E6\u53D1\u8BCD\uFF1Aworktree\u3001.worktrees/\u3001git worktree add\u3001\u9694\u79BB\u3001\u6539\u52A8\u4ED3\u5E93\u6587\u4EF6\u3001\u5E76\u884C\u591A\u4EFB\u52A1\u3001patch \u9694\u79BB\u3001\u6E05\u7406\u5DE5\u4F5C\u533A\u3002\u4E0D\u9002\u7528\uFF1A\u53EA\u8BFB\u67E5\u8BE2\u3001\u975E Git \u76EE\u5F55\u3001\u7528\u6237\u660E\u786E\u8981\u6C42\u5C31\u5730\u6539\u3002",
|
|
1139
|
+
body: [
|
|
1140
|
+
"\u4F60\u662F\u300C\u4ED3\u5E93\u6539\u52A8\u9694\u79BB\u300D\u89C4\u7A0B\u7684\u4F7F\u7528\u8005\uFF1A\u4EFB\u52A1\u8981\u4FEE\u6539\u67D0\u4E2A Git \u4ED3\u5E93\u91CC\u7684\u5DF2\u8DDF\u8E2A\u6587\u4EF6\u65F6\uFF0C\u5148\u5EFA\u72EC\u7ACB worktree\uFF0C\u518D\u52A8\u624B\u3002",
|
|
1141
|
+
"",
|
|
1142
|
+
"## \u4EC0\u4E48\u65F6\u5019\u7528",
|
|
1143
|
+
"- \u4EFB\u4F55\u4F1A\u4FEE\u6539\u4ED3\u5E93\u5DF2\u8DDF\u8E2A\u6587\u4EF6\u7684\u4EFB\u52A1\uFF1A\u6539\u4EE3\u7801\u3001\u8DD1\u4F1A\u5199\u6587\u4EF6\u7684\u811A\u672C\u3001\u5927\u89C4\u6A21\u91CD\u6784\u3002",
|
|
1144
|
+
"- \u540C\u4E00\u4ED3\u5E93\u8981\u5E76\u884C\u63A8\u8FDB\u591A\u6761\u4EFB\u52A1\u7EBF\u65F6\u2014\u2014\u6BCF\u6761\u7EBF\u4E00\u4E2A worktree\uFF0C\u4E92\u4E0D\u6C61\u67D3\u3002",
|
|
1145
|
+
"- \u4E3B\u68C0\u51FA\u6709\u65E0\u5173\u810F\u6539\u52A8\u3001\u53C8\u4E0D\u80FD\u78B0\u5B83\u65F6\u3002",
|
|
1146
|
+
"",
|
|
1147
|
+
"## \u4EC0\u4E48\u65F6\u5019\u4E0D\u7528",
|
|
1148
|
+
"- \u53EA\u8BFB\u64CD\u4F5C\uFF1A\u770B\u72B6\u6001\u3001\u67E5\u65E5\u5FD7\u3001\u8BFB diff\u2014\u2014\u4E0D\u9700\u8981\u9694\u79BB\u3002",
|
|
1149
|
+
"- \u76EE\u5F55\u4E0D\u662F Git \u4ED3\u5E93\uFF08\u7528\u6237\u81EA\u5DF1\u7684\u666E\u901A\u9879\u76EE\u76EE\u5F55\uFF09\u2014\u2014\u6CA1\u6709\u53EF\u9694\u79BB\u7684\u5BF9\u8C61\u3002",
|
|
1150
|
+
"- \u7528\u6237\u660E\u786E\u8981\u6C42\u5C31\u5730\u6539\u2014\u2014\u7167\u505A\uFF0C\u4F46\u5728\u56DE\u590D\u91CC\u8BF4\u660E\u8DF3\u8FC7\u4E86\u9694\u79BB\u53CA\u539F\u56E0\u3002",
|
|
1151
|
+
"",
|
|
1152
|
+
"## \u6807\u51C6\u6D41\u7A0B",
|
|
1153
|
+
"1. `git worktree add <path> -b <branch> HEAD`\uFF08\u4ED3\u5E93\u65E0\u7EA6\u5B9A\u65F6\uFF0C\u5EFA\u8BAE `<path>` \u7528 `.worktrees/<name>`\uFF0C\u540D\u5B57\u62FF\u4E0D\u51C6\u5C31\u7528\u4EFB\u52A1\u4E3B\u9898\uFF09\u3002",
|
|
1154
|
+
"2. \u6240\u6709\u6539\u52A8\u53EA\u5728 worktree \u5185\u8FDB\u884C\uFF1B\u9A8C\u8BC1\u4E5F\u5728 worktree \u5185\u8DD1\u3002",
|
|
1155
|
+
"3. \u4F20\u8DEF\u5F84\u7ED9\u5B50\u4EE3\u7406/\u5DE5\u5177\u65F6\u7528 worktree \u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002",
|
|
1156
|
+
"4. \u5B8C\u6210\u540E `git worktree remove <path>`\uFF0C\u5E76\u7528 `git worktree list` \u6838\u5BF9\u65E0\u6B8B\u7559\u3002",
|
|
1157
|
+
"",
|
|
1158
|
+
"## \u4E3B\u68C0\u51FA\u6709\u810F\u6539\u52A8\u65F6",
|
|
1159
|
+
"\u4ECD\u7136\u4ECE HEAD \u5EFA worktree\uFF0C\u628A\u672C\u6B21\u7684 diff/patch \u5E94\u7528\u8FC7\u53BB\uFF1B\u4E0D\u78B0\u4E3B\u68C0\u51FA\uFF08main checkout\uFF09\u4EFB\u4F55\u65E0\u5173\u6539\u52A8\u3002",
|
|
1160
|
+
"",
|
|
1161
|
+
"## \u8FB9\u754C",
|
|
1162
|
+
"- worktree \u662F\u9694\u79BB\u624B\u6BB5\uFF0C\u4E0D\u662F\u63D0\u4EA4\u6388\u6743\uFF1A\u5408\u5E76\u3001\u63A8\u9001\u3001\u53D1\u5E03\u4ECD\u6309\u7528\u6237\u6388\u6743\u8FB9\u754C\u3002",
|
|
1163
|
+
"- \u4E00\u4E2A\u4EFB\u52A1\u4E00\u4E2A worktree\uFF0C\u4E0D\u5728\u540C\u4E00\u4E2A worktree \u91CC\u5806\u591A\u6761\u4EFB\u52A1\u7EBF\u3002"
|
|
1164
|
+
].join("\n")
|
|
1165
|
+
}
|
|
1166
|
+
];
|
|
1167
|
+
function seedBySlug6(slug) {
|
|
1168
|
+
const seed = WORKTREE_SKILL_SEEDS.find((item) => item.slug === slug);
|
|
1169
|
+
if (!seed) {
|
|
1170
|
+
throw new Error(`Unknown worktree skill slug: ${slug}`);
|
|
1171
|
+
}
|
|
1172
|
+
return seed;
|
|
1173
|
+
}
|
|
1174
|
+
function buildWorktreeSkillConfig(slug) {
|
|
1175
|
+
const seed = seedBySlug6(slug);
|
|
1176
|
+
return {
|
|
1177
|
+
version: "0.1",
|
|
1178
|
+
kind: "skill",
|
|
1179
|
+
id: buildWorktreeSkillId(slug),
|
|
1180
|
+
name: seed.title,
|
|
1181
|
+
description: seed.description,
|
|
1182
|
+
triggerMode: "recommended"
|
|
1183
|
+
};
|
|
1184
|
+
}
|
|
1185
|
+
function buildWorktreeSkillContentBySlug(slug) {
|
|
1186
|
+
const seed = seedBySlug6(slug);
|
|
1187
|
+
const skillConfig = buildWorktreeSkillConfig(slug);
|
|
1188
|
+
return buildSkillDocMarkdown({
|
|
1189
|
+
body: seed.body,
|
|
1190
|
+
skillConfig
|
|
1191
|
+
});
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
// packages/ai/skills/systematicInvestigationSkill.ts
|
|
1195
|
+
var SYSTEMATIC_INVESTIGATION_SKILL_SLUGS = ["systematic-investigation"];
|
|
1196
|
+
function deterministicId7(prefix, seed) {
|
|
1197
|
+
let h = 2166136261;
|
|
1198
|
+
for (let i = 0; i < seed.length; i++) {
|
|
1199
|
+
h ^= seed.charCodeAt(i);
|
|
1200
|
+
h = h * 16777619 >>> 0;
|
|
1201
|
+
}
|
|
1202
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1203
|
+
return (prefix + suffix).slice(0, 26);
|
|
1204
|
+
}
|
|
1205
|
+
function normalizeSkillSeed7(input) {
|
|
1206
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1207
|
+
}
|
|
1208
|
+
function buildSystematicinvestigationSkillId(slug) {
|
|
1209
|
+
return deterministicId7("01SK", normalizeSkillSeed7(slug) || slug);
|
|
1210
|
+
}
|
|
1211
|
+
function buildSystematicinvestigationSkillPageKey(userId, slug) {
|
|
1212
|
+
return `page-${userId}-${buildSystematicinvestigationSkillId(slug)}`;
|
|
1213
|
+
}
|
|
1214
|
+
function buildSystematicinvestigationSkillConfig(slug) {
|
|
1215
|
+
return {
|
|
1216
|
+
version: "0.1",
|
|
1217
|
+
kind: "skill",
|
|
1218
|
+
id: buildSystematicinvestigationSkillId(slug),
|
|
1219
|
+
name: "\u7CFB\u7EDF\u5316\u6392\u67E5\uFF08systematic-investigation\uFF09",
|
|
1220
|
+
triggerMode: "recommended",
|
|
1221
|
+
description: "\u7CFB\u7EDF\u5316\u6392\u67E5\u7EAA\u5F8B\uFF1A\u5148\u6D4B\u91CF\u5B9A\u4F4D\u3001\u518D\u52A8\u624B\u6539\u3002\u56DB\u9636\u6BB5\u6839\u56E0\u8C03\u8BD5\u6CD5\uFF08\u8C03\u67E5\u2192\u6A21\u5F0F\u5206\u6790\u2192\u5047\u8BBE\u6D4B\u8BD5\u2192\u5B9E\u73B0\u4FEE\u590D\uFF09 + \u6570\u636E\u5316\u6027\u80FD\u4F18\u5316 7 \u6B65\uFF08\u5B9A\u4E49\u6307\u6807\u2192\u6253\u6869\u2192baseline\u2192\u5206\u6790\u74F6\u9888\u2192\u4F18\u5316\u2192\u590D\u6D4B\u2192\u5BF9\u6BD4\u62A5\u544A\uFF09\u3002 \u89E6\u53D1\u8BCD\uFF1A\u8C03\u8BD5\u3001bug\u3001\u6839\u56E0\u3001\u6392\u67E5\u3001\u4FEE\u4E0D\u597D\u3001\u53CD\u590D\u5931\u8D25\u3001root cause\u3001\u6027\u80FD\u4F18\u5316\u3001\u6162\u3001latency\u3001 baseline\u3001\u6027\u80FD\u74F6\u9888\u3001perf\u3001\u54CD\u5E94\u6162\u3001\u542F\u52A8\u6162\u3001LCP\u3001hydration\u3002 Do NOT use\uFF1A\u7EAF\u65B0\u529F\u80FD\u5B9E\u73B0\u3001\u6837\u5F0F\u8C03\u6574\u3001\u4E0D\u6D89\u53CA\u6545\u969C\u6392\u67E5\u7684\u67B6\u6784\u8BA8\u8BBA\u3002"
|
|
1222
|
+
};
|
|
1223
|
+
}
|
|
1224
|
+
function buildSystematicinvestigationSkillContentBySlug(slug) {
|
|
1225
|
+
return buildSkillDocMarkdown({
|
|
1226
|
+
body: '# \u7CFB\u7EDF\u5316\u6392\u67E5\u7EAA\u5F8B\uFF08\u6839\u56E0\u8C03\u8BD5 + \u6570\u636E\u5316\u6027\u80FD\u4F18\u5316\uFF09\n\n**\u5171\u540C\u94C1\u5F8B\uFF1A\u65E0\u6839\u56E0\u8C03\u67E5\u4E0D\u63D0\u4FEE\u590D\uFF0C\u65E0 baseline \u4E0D\u63D0\u4F18\u5316\u3002** \u968F\u673A\u4FEE\u590D\u6D6A\u8D39\u65F6\u95F4\u5E76\u5236\u9020\u65B0 bug\uFF1B\n\u300C\u770B\u8D77\u6765\u6162\u300D\u4E0D\u662F\u4F18\u5316\u7406\u7531\u3002\u8FDD\u53CD\u8FC7\u7A0B\u7684\u5B57\u9762\u5C31\u662F\u8FDD\u53CD\u8FC7\u7A0B\u7684\u7CBE\u795E\u3002\n\n## Part A \u2014 \u56DB\u9636\u6BB5\u6839\u56E0\u8C03\u8BD5\u6CD5\n\n\u6BCF\u9636\u6BB5\u5B8C\u6210\u624D\u80FD\u8FDB\u4E0B\u4E00\u4E2A\uFF1A\n\n1. **\u6839\u56E0\u8C03\u67E5**\uFF1A\u8BFB\u5B8C\u6574\u9519\u8BEF\u4FE1\u606F\u548C\u5806\u6808\uFF08\u542B\u884C\u53F7/\u6587\u4EF6/\u9519\u8BEF\u7801\uFF09\uFF1B\u7A33\u5B9A\u590D\u73B0\uFF08\u4E0D\u80FD\u590D\u73B0\u5C31\u6536\u96C6\u66F4\u591A\u6570\u636E\uFF0C\u4E0D\u731C\uFF09\uFF1B\u68C0\u67E5\u6700\u8FD1\u53D8\u66F4\uFF08git diff/commits/\u4F9D\u8D56/\u914D\u7F6E\uFF09\uFF1B\u591A\u7EC4\u4EF6\u7CFB\u7EDF\u5728\u6BCF\u4E2A\u8FB9\u754C\u52A0\u8BCA\u65AD\u65E5\u5FD7\u5148\u5B9A\u4F4D\u54EA\u5C42\u5931\u8D25\uFF1B\u8FFD\u8E2A\u6570\u636E\u6D41\u5230\u574F\u503C\u7684\u6E90\u5934\u3002\n2. **\u6A21\u5F0F\u5206\u6790**\uFF1A\u627E\u540C\u4ED3\u5E93\u5DE5\u4F5C\u4EE3\u7801\u5BF9\u6BD4\uFF1B\u5B8C\u6574\u8BFB\u53C2\u8003\u5B9E\u73B0\u4E0D skim\uFF1B\u5217\u51FA\u5DE5\u4F5C\u4E0E\u635F\u574F\u7684\u6BCF\u4E2A\u5DEE\u5F02\uFF0C\u518D\u5C0F\u4E5F\u522B\u5047\u8BBE"\u4E0D\u53EF\u80FD"\u3002\n3. **\u5047\u8BBE\u6D4B\u8BD5**\uFF1A\u5355\u4E00\u5047\u8BBE\u5199\u4E0B\u6765\uFF08"\u6211\u8BA4\u4E3A X \u662F\u6839\u56E0\u56E0\u4E3A Y"\uFF09\uFF1B\u6700\u5C0F\u6539\u52A8\u6D4B\u8BD5\uFF1B\u4E00\u6B21\u4E00\u4E2A\u53D8\u91CF\uFF1B\u6CA1\u8FC7\u5C31\u63D0\u65B0\u5047\u8BBE\uFF0C\u4E0D\u52A0\u8865\u4E01\u3002\n4. **\u5B9E\u73B0\u4FEE\u590D**\uFF1A\u5148\u5199\u5931\u8D25\u6D4B\u8BD5\uFF1B\u5355\u4E00\u4FEE\u590D\u4E0D\u505A"\u987A\u4FBF\u6539\u8FDB"\uFF1B\u9A8C\u8BC1\u901A\u8FC7\u4E14\u65E0\u5176\u4ED6\u6D4B\u8BD5\u65AD\u88C2\u3002**3 \u6B21\u4FEE\u590D\u5931\u8D25 \u2192 \u8D28\u7591\u67B6\u6784**\uFF0C\u4E0D\u8BD5\u7B2C 4 \u6B21\uFF1A\u6BCF\u6B21\u4FEE\u590D\u63ED\u793A\u65B0\u4F4D\u7F6E/\u65B0\u8026\u5408 \u2192 \u662F\u67B6\u6784\u95EE\u9898\u4E0D\u662F\u5047\u8BBE\u9519\u8BEF\uFF0C\u627E\u4EBA\u8BA8\u8BBA\u800C\u975E\u7EE7\u7EED\u6253\u8865\u4E01\u3002\n\n### \u7EA2\u65D7\u4FE1\u53F7\u2014\u2014\u53D1\u73B0\u81EA\u5DF1\u5728\u60F3\u8FD9\u4E9B\u5C31\u56DE\u9636\u6BB5 1\n\n- "\u5FEB\u901F\u4FEE\u590D\u5148\u8BD5\u8BD5\uFF0C\u4E4B\u540E\u518D\u67E5"\n- "\u6539 X \u770B\u770B\u884C\u4E0D\u884C"\n- "\u52A0\u51E0\u4E2A\u6539\u52A8\u4E00\u8D77\u8DD1\u6D4B\u8BD5"\n- "\u4E0D\u5199\u6D4B\u8BD5\u4E86\u624B\u52A8\u9A8C\u4E00\u4E0B"\n- "\u5E94\u8BE5\u662F X\uFF0C\u5148\u4FEE\u4E86\u518D\u8BF4"\n- "\u4E00\u6B21\u4FEE\u590D"\uFF08\u5DF2\u7ECF\u8BD5\u4E86 2+ \u6B21\uFF09\n- \u6BCF\u6B21\u4FEE\u590D\u5728\u65B0\u4F4D\u7F6E\u66B4\u9732\u65B0\u95EE\u9898\n\n### \u5E38\u89C1\u501F\u53E3\n\n| \u501F\u53E3 | \u73B0\u5B9E |\n|------|------|\n| "\u95EE\u9898\u7B80\u5355\u4E0D\u9700\u8981\u8FC7\u7A0B" | \u7B80\u5355\u95EE\u9898\u4E5F\u6709\u6839\u56E0\uFF0C\u8FC7\u7A0B\u5BF9\u7B80\u5355 bug \u5F88\u5FEB |\n| "\u7D27\u6025\u6CA1\u65F6\u95F4" | \u7CFB\u7EDF\u5316\u8C03\u8BD5\u6BD4\u4E71\u731C\u91CD\u8BD5\u66F4\u5FEB |\n| "\u5148\u8BD5\u8FD9\u4E2A\u518D\u67E5" | \u7B2C\u4E00\u6B21\u4FEE\u590D\u5B9A\u8C03\uFF0C\u4ECE\u4E00\u5F00\u59CB\u5C31\u505A\u5BF9 |\n| "\u51E0\u4E2A\u4FEE\u590D\u5408\u4E00\u8D77\u7701\u65F6\u95F4" | \u65E0\u6CD5\u9694\u79BB\u54EA\u4E2A\u8D77\u6548\uFF0C\u8FD8\u5236\u9020\u65B0 bug |\n\n## Part B \u2014 \u6570\u636E\u5316\u6027\u80FD\u4F18\u5316 7 \u6B65\n\n\u8986\u76D6\u6570\u636E\u5E93\u3001\u670D\u52A1\u7AEF\u3001\u524D\u7AEF\u3001\u5BA2\u6237\u7AEF\u3001\u684C\u9762/RN\u3001CLI\u3001\u540E\u53F0\u4EFB\u52A1\u3001\u961F\u5217\u3001\u7F13\u5B58\u3001\u540C\u6B65\u3001\u6784\u5EFA\u3001\u542F\u52A8\u548C\u7F51\u7EDC\u94FE\u8DEF\u3002\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u53EA\u505A\u9759\u6001\u5EFA\u8BAE\uFF0C\u5426\u5219\u4E0D\u5F97\u5148\u6539\u4EE3\u7801\u518D\u8865\u89E3\u91CA\u3002\n\n1. **\u5B9A\u4E49\u8DEF\u5F84\u4E0E\u6307\u6807\u3002** \u5199\u6E05\u695A\u7528\u6237\u5165\u53E3\u6216\u7CFB\u7EDF\u5165\u53E3\u3001\u590D\u73B0\u6B65\u9AA4\u3001\u76EE\u6807\u6307\u6807\u548C\u89C2\u5BDF\u7A97\u53E3\u3002\u6309\u5C42\u9009\u62E9\u6307\u6807\uFF1A\u6570\u636E\u5E93 query/scan/lock/row count\uFF0C\u670D\u52A1\u7AEF handler/SSR/RPC/fanout/serialization/cache\uFF0C\u524D\u7AEF render/hydration/LCP/interaction/request waterfall\uFF0C\u5BA2\u6237\u7AEF/\u684C\u9762/RN startup/bridge/native I/O\uFF0CCLI/background job queue/wall time/CPU/memory\uFF0C\u7F51\u7EDC payload bytes/request count/retry\u3002\n2. **\u4F18\u5316\u524D\u5148\u6253\u6869\u3002** \u5148\u6253\u65E5\u5FD7\u6216\u542F\u7528\u73B0\u6709 probes\u3002\u65E5\u5FD7\u5FC5\u987B\u8986\u76D6\u5173\u952E\u9636\u6BB5\u8FB9\u754C\uFF0C\u5305\u542B request/route/job/query/context \u6807\u8BC6\u3001\u5F00\u59CB/\u7ED3\u675F\u65F6\u95F4\u3001duration\u3001count/size/cacheHit \u7B49\u6570\u503C\uFF0C\u5E76\u907F\u514D\u8F93\u51FA token\u3001cookie\u3001API key\u3001\u7528\u6237\u79C1\u5BC6\u6B63\u6587\u6216\u5927 payload\u3002\n3. **\u6536\u96C6 baseline\u3002** \u5728\u672C\u5730\u6216\u6307\u5B9A\u73AF\u5883\u8DD1\u81F3\u5C11\u4E00\u6B21\u5B8C\u6574\u8DEF\u5F84\uFF0C\u4FDD\u5B58\u539F\u59CB\u8F93\u51FA\u4F4D\u7F6E\u6216\u6458\u5F55\u5173\u952E\u6570\u503C\u3002\u82E5\u672C\u5730 runtime/preview \u963B\u585E\uFF0C\u5148\u62A5\u544A\u963B\u585E\u5E76\u4FEE\u6D4B\u91CF\u8DEF\u5F84\uFF0C\u4E0D\u5F97\u8DF3\u5230\u4F18\u5316\u5B9E\u73B0\u3002\n4. **\u5206\u6790\u74F6\u9888\u3002** \u7528\u6570\u636E\u6307\u51FA\u6700\u6162\u9636\u6BB5\u548C\u5360\u6BD4\uFF0C\u5F62\u6210\u53EF\u8BC1\u4F2A\u5047\u8BBE\u3002\u4E0D\u8981\u56E0\u4E3A\u4EE3\u7801\u770B\u8D77\u6765"\u53EF\u80FD\u6162"\u5C31\u76F4\u63A5\u6539\u3002\n5. **\u5E94\u7528\u4E00\u6B21\u8303\u56F4\u9650\u5B9A\u7684\u4F18\u5316\u3002** \u6BCF\u6B21\u53EA\u6539\u4E00\u4E2A\u4E3B\u8981\u74F6\u9888\u6216\u4E00\u7EC4\u5F3A\u76F8\u5173\u74F6\u9888\uFF0C\u4FDD\u7559\u6743\u5A01\u6570\u636E\u6E90\u548C\u7EF4\u62A4\u8DEF\u5F84\uFF0C\u4E0D\u786C\u7F16\u7801\u3001\u590D\u5236\u6216\u5F71\u5B50\u7F13\u5B58\u4E1A\u52A1\u6570\u636E\u3002\n6. **\u91CD\u65B0\u8FD0\u884C\u540C\u4E00\u6D4B\u91CF\u3002** \u4F7F\u7528\u540C\u4E00\u5165\u53E3\u3001\u540C\u4E00\u6570\u636E\u96C6\u3001\u540C\u4E00\u73AF\u5883\u3001\u540C\u4E00 probe/log \u53E3\u5F84\u590D\u6D4B\u3002\u7ED3\u679C\u5FC5\u987B\u80FD\u548C baseline \u5BF9\u9F50\u3002\n7. **\u62A5\u544A\u5BF9\u6BD4\u3002** \u6700\u7EC8\u62A5\u544A\u5FC5\u987B\u5305\u542B before/after \u8868\uFF1A\u9636\u6BB5\u3001baseline\u3001after\u3001delta\u3001\u6837\u672C\u6B21\u6570\u3001\u73AF\u5883\u3001\u547D\u4EE4/\u65E5\u5FD7\u6765\u6E90\u3001\u5269\u4F59\u74F6\u9888\u548C\u672A\u9A8C\u8BC1\u9879\u3002\u6CA1\u6709\u6539\u5584\u6216\u7ED3\u679C\u566A\u58F0\u8FC7\u5927\u65F6\uFF0C\u5982\u5B9E\u62A5\u544A\uFF0C\u4E0D\u5305\u88C5\u6210\u6210\u529F\u3002\n\n### \u8BA1\u5212\u6587\u4EF6\u7ED3\u6784\n\n\u8BA1\u5212\u6587\u4EF6\u4E2D\u7684\u6027\u80FD\u4EFB\u52A1\u5FC5\u987B\u5305\u542B `Measurement plan`\u3001`Baseline results`\u3001`Optimization hypothesis`\u3001`After results`\u3001`Comparison` \u4E94\u6BB5\uFF1B\u6267\u884C\u4E2D\u6BCF\u83B7\u5F97\u4E00\u7EC4\u6570\u636E\u5C31\u66F4\u65B0\u8BA1\u5212\u6587\u4EF6\uFF0C\u786E\u4FDD\u65B0\u4EE3\u7406\u4E0D\u4F9D\u8D56\u804A\u5929\u8BB0\u5FC6\u3002\n\n## Boundaries\n\n- \u805A\u7126\u7CFB\u7EDF\u5316\u8C03\u8BD5\u5FC3\u6CD5\u4E0E\u6027\u80FD\u6D4B\u91CF\u7EAA\u5F8B\uFF0C\u4E0D\u63D0\u4F9B\u4EE3\u7801\u4FEE\u590D\u672C\u8EAB\u3002\n- \u4E0D\u8986\u76D6\u67B6\u6784\u91CD\u8BBE\u8BA1\uFF08\u4FEE\u590D\u5931\u8D25\u8D85 3 \u6B21\u540E\u8F6C\u7ED9 owner\uFF09\uFF1B\u4E0D\u66FF\u4EE3\u5177\u4F53\u5DE5\u5177\uFF08\u65E5\u5FD7\u3001\u6027\u80FD\u5206\u6790\u3001\u7F51\u7EDC\u5305\uFF09\u7684\u5B66\u4E60\u3002\n- \u4E0D\u628A\u6784\u5EFA\u901A\u8FC7\u3001\u4EE3\u7801\u53D8\u5C11\u6216\u4E3B\u89C2\u611F\u89C9\u66F4\u5FEB\u5F53\u6210\u6027\u80FD\u6539\u5584\uFF1B\u5FC5\u987B\u6709\u540C\u53E3\u5F84 before/after \u6570\u636E\u3002\n- \u7528\u6237\u53EA\u8981\u6C42\u9759\u6001\u5EFA\u8BAE\u65F6\u53EF\u4EE5\u4E0D\u6539\u4EE3\u7801\uFF0C\u4F46\u5FC5\u987B\u660E\u786E\u6CA1\u6709\u8FD0\u884C\u65F6\u57FA\u7EBF\u4E0E\u6539\u5584\u8BC1\u636E\u3002',
|
|
1227
|
+
skillConfig: buildSystematicinvestigationSkillConfig(slug)
|
|
1228
|
+
});
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
// packages/ai/skills/showMeSkill.ts
|
|
1232
|
+
var SHOW_ME_SKILL_SLUGS = ["show-me"];
|
|
1233
|
+
function deterministicId8(prefix, seed) {
|
|
1234
|
+
let h = 2166136261;
|
|
1235
|
+
for (let i = 0; i < seed.length; i++) {
|
|
1236
|
+
h ^= seed.charCodeAt(i);
|
|
1237
|
+
h = h * 16777619 >>> 0;
|
|
1238
|
+
}
|
|
1239
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1240
|
+
return (prefix + suffix).slice(0, 26);
|
|
1241
|
+
}
|
|
1242
|
+
function normalizeSkillSeed8(input) {
|
|
1243
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1244
|
+
}
|
|
1245
|
+
function buildShowmeSkillId(slug) {
|
|
1246
|
+
return deterministicId8("01SK", normalizeSkillSeed8(slug) || slug);
|
|
1247
|
+
}
|
|
1248
|
+
function buildShowmeSkillPageKey(userId, slug) {
|
|
1249
|
+
return `page-${userId}-${buildShowmeSkillId(slug)}`;
|
|
1250
|
+
}
|
|
1251
|
+
function buildShowmeSkillConfig(slug) {
|
|
1252
|
+
return {
|
|
1253
|
+
version: "0.1",
|
|
1254
|
+
kind: "skill",
|
|
1255
|
+
id: buildShowmeSkillId(slug),
|
|
1256
|
+
name: "\u89C6\u89C9\u5316\u89E3\u91CA\uFF08show-me\uFF09",
|
|
1257
|
+
triggerMode: "recommended",
|
|
1258
|
+
description: "\u4EE5\u89C6\u89C9\u76F4\u89C2\u7684\u65B9\u5F0F\uFF08\u7CBE\u70BC\u4F2A\u4EE3\u7801\u3001\u8C03\u7528\u6811\u3001\u7EC4\u4EF6\u6811\u3001Mermaid \u56FE\u8868\u3001\u7ED3\u6784\u5316 Diff \u6216\u72EC\u7ACB HTML \u6E32\u67D3\u5DE5\u4EF6\uFF09\u89E3\u91CA\u590D\u6742\u4E3B\u9898\u3001\u67B6\u6784\u903B\u8F91\u3001\u72B6\u6001\u6D41\u8F6C\u4E0E UI \u7ED3\u6784\u3002\u89E6\u53D1\u8BCD\uFF1A\u753B\u4E2A\u56FE\u3001\u753B\u56FE\u3001\u6D41\u7A0B\u56FE\u3001\u65F6\u5E8F\u56FE\u3001\u53EF\u89C6\u5316\u3001\u600E\u4E48\u8C03\u7528\u7684\u3001\u8C03\u7528\u94FE\u3001\u7EC4\u4EF6\u7ED3\u6784\u3001\u5BF9\u6BD4\u4E00\u4E0B\u3001show me\u3001visualize\u3001diagram\u3001artifact preview\u3002"
|
|
1259
|
+
};
|
|
1260
|
+
}
|
|
1261
|
+
function buildShowmeSkillContentBySlug(slug) {
|
|
1262
|
+
return buildSkillDocMarkdown({
|
|
1263
|
+
body: "# Show Me (Visual-First \u7ED3\u6784\u5316\u8868\u8FBE\u6307\u5357)\n\n\u5F53\u89E3\u91CA\u590D\u6742\u7CFB\u7EDF\u3001\u6D41\u7A0B\u3001\u67B6\u6784\u8BBE\u8BA1\u3001\u6392\u9519\u6839\u56E0\u6216 UI \u53D8\u52A8\u65F6\uFF0C\u9075\u5FAA **\u201C\u89C6\u89C9\u4F18\u5148\uFF08Visual-First\uFF09\u201D** \u539F\u5219\u3002\n\u8DF3\u8FC7\u5197\u957F\u5F00\u573A\u767D\uFF0C\u4FDD\u6301\u6B63\u6587\u7B80\u660E\u627C\u8981\uFF0C\u9009\u62E9\u80FD\u8BB2\u6E05\u6838\u5FC3\u89C2\u70B9\u7684**\u6700\u5C0F\u5FC5\u8981\u89C6\u56FE\uFF08Smallest View\uFF09**\u3002\n\n---\n\n## \u6838\u5FC3\u53EF\u89C6\u5316\u6A21\u5F0F\n\n### 1. \u903B\u8F91\u4E0E\u7B97\u6CD5\u4F2A\u4EE3\u7801\n\u5C55\u793A\u5173\u952E\u5206\u652F\u5224\u65AD\u3001\u8BA1\u7B97\u987A\u5E8F\u6216\u6838\u5FC3\u7B97\u6CD5\u6B65\u9AA4\uFF1A\n\n```text\non(save)\n if content is unchanged\n return cached result\n write new content\n return fresh result\n```\n\n### 2. \u8FD0\u884C\u65F6\u63A7\u5236\u6D41 / \u8C03\u7528\u6811 (Call Tree)\n\u5C55\u793A\u65B9\u6CD5\u8C03\u7528\u5C42\u7EA7\u4E0E\u6570\u636E\u63A8\u8FDB\u94FE\u8DEF\uFF1A\n\n```text\nsubmitForm\n validateInputs\n createSession\n persistPrompt\n launchAgent\n spawnWorker\n navigateToSession\n```\n\n### 3. \u7EC4\u4EF6\u6811\u4E0E\u72B6\u6001\u8FB9\u754C (Component Tree)\n\u5C55\u793A\u524D\u7AEF UI \u7EC4\u4EF6\u5C42\u7EA7\u3001Props \u4F20\u9012\u4EE5\u53CA\u5C40\u90E8/\u5168\u5C40\u72B6\u6001\u6240\u5C5E\uFF1A\n\n```tsx\n(apps/web/src/pages/WorkspacePage.tsx)\n<WorkspaceProvider> // \u5168\u5C40 workspace context\n <WorkspaceLayout>\n <Sidebar /> // activeNav, unreadBadges\n <MainContent>\n <ChatThread> // threadId, messages\n <MessageList>\n <MessageItem /> // content, sender\n </MessageList>\n <ChatInput /> // draft, isSending\n </ChatThread>\n </MainContent>\n </WorkspaceLayout>\n</WorkspaceProvider>\n```\n\n### 4. \u6D45\u5C42\u6587\u4EF6\u6811 (File Tree)\n\u5C55\u793A\u76EE\u5F55\u7EC4\u7EC7\u3001\u6A21\u5757\u5F52\u5C5E\u6216\u91CD\u6784\u8303\u56F4\uFF08\u4EC5\u4FDD\u7559\u4E0E\u95EE\u9898\u76F4\u63A5\u76F8\u5173\u7684\u5C42\u7EA7\uFF09\uFF1A\n\n```text\npackages/\n client/\n src/\n components/ // UI \u5C55\u793A\u7EC4\u4EF6\n hooks/ // \u6570\u636E\u6D41\u4E0E\u54CD\u5E94\u5F0F\u72B6\u6001\n server/\n src/\n routes/ // API \u8DEF\u7531\u5165\u53E3\n services/ // \u6838\u5FC3\u4E1A\u52A1\u5904\u7406\n```\n\n### 5. \u7ED3\u6784\u5316 Diff\n\u9664\u4E86\u4EE3\u7801\u53D8\u66F4\uFF0C\u8FD8\u53EF\u7528\u4E8E\u76F4\u89C2\u5BF9\u6BD4**\u67B6\u6784\u6F14\u8FDB\u3001\u8C03\u7528\u94FE\u4FEE\u6539\u3001\u6587\u4EF6\u91CD\u6784\u3001\u72B6\u6001\u7ED3\u6784\u53D8\u52A8**\uFF1A\n\n```diff\n submitForm\n validateInputs\n- syncDirectSave\n+ dispatchAsyncJob\n+ queueWorker\n+ pollStatus\n navigateToSession\n```\n\n### 6. Mermaid \u6D41\u7A0B\u56FE / \u65F6\u5E8F\u56FE / \u72B6\u6001\u673A\n\u7528\u4E8E\u8DE8\u670D\u52A1\u901A\u4FE1\u3001\u591A\u7AEF\u4EA4\u4E92\u3001\u751F\u547D\u5468\u671F\u4E0E\u72B6\u6001\u6D41\u8F6C\uFF08Web / Desktop \u5BA2\u6237\u7AEF\u53EF\u76F4\u63A5\u539F\u751F\u6E32\u67D3\uFF09\uFF1A\n\n```mermaid\nsequenceDiagram\n autonumber\n actor User as \u7528\u6237\n participant Client as \u5BA2\u6237\u7AEF (Web/Desktop)\n participant Server as Nolo Server\n participant Agent as Agent Runtime\n\n User->>Client: \u53D1\u9001\u6307\u4EE4\n Client->>Server: POST /api/dialog/message\n Server->>Agent: \u8C03\u5EA6 startAgentThread\n Agent-->>Client: SSE \u6D41\u5F0F\u54CD\u5E94 (Token / Artifact)\n Client-->>User: \u5B9E\u65F6\u754C\u9762\u66F4\u65B0\n```\n\n### 7. \u72EC\u7ACB HTML \u6E32\u67D3\u5DE5\u4EF6 (HTML Artifact)\n\u5F53\u6587\u672C\u3001\u6811\u5F62\u56FE\u6216 Mermaid \u65E0\u6CD5\u5145\u5206\u8868\u8FBE\u4E30\u5BCC\u7684\u4EA4\u4E92\u539F\u578B\u3001\u590D\u6742 UI \u5E03\u5C40\u5BF9\u6BD4\u3001\u4FE1\u606F\u56FE\u8868\u6216\u7B80\u62A5\u65F6\uFF0C\u751F\u6210\u4E00\u4EFD\u81EA\u5305\u542B\u7684\u5355\u4E2A HTML \u6587\u4EF6\u3002\n- \u91C7\u7528\u7B26\u5408\u73B0\u4EE3\u4EA7\u54C1\u6807\u51C6\u7684\u914D\u8272\u3001\u5B57\u4F53\u3001\u95F4\u8DDD\u4E0E\u54CD\u5E94\u5F0F\u5E03\u5C40\u3002\n- \u4F7F\u7528\u771F\u5B9E\u6807\u7B7E\u4E0E\u6A21\u62DF\u6570\u636E\uFF0C\u907F\u514D\u7A7A\u7070\u76D2\u3002\n- \u5199\u5165\u6587\u4EF6\u5E76\u901A\u8FC7\u7CFB\u7EDF\u6216 Browser Connector \u6253\u5F00\u7ED9\u7528\u6237\u9884\u89C8\u3002\n\n---\n\n## \u5B9E\u8DF5\u539F\u5219 (Guidance)\n\n1. **\u56FE\u6587\u5E76\u8302\uFF0C\u56FE\u5728\u6587\u5148**\uFF1A\u8BA9\u7ED3\u6784\u56FE\u7D27\u6328\u7740\u5176\u89E3\u91CA\u7684\u7B80\u8FF0\u6587\u5B57\uFF0C\u5148\u5448\u73B0\u6E05\u6670\u56FE\u8868\uFF0C\u518D\u7528 1~3 \u53E5\u8BDD\u8BF4\u660E\u91CD\u70B9\u3002\n2. **\u514B\u5236\u4E0E\u805A\u7126 (Smallest View)**\uFF1A\u53EA\u4FDD\u7559\u56DE\u7B54\u5F53\u524D\u95EE\u9898\u6240\u5FC5\u9700\u7684\u8C03\u7528\u3001\u5C5E\u6027\u3001\u72B6\u6001\u4E0E\u8FB9\u754C\uFF0C\u4E0D\u8981\u5806\u780C\u65E0\u610F\u4E49\u7684\u5168\u5C40\u5197\u4F59\u4EE3\u7801\u3002\n3. **\u9009\u578B\u6070\u5F53**\uFF1A\u901A\u5E38\u4E00\u6B21\u89E3\u91CA\u9009\u7528 1~2 \u79CD\u6700\u5951\u5408\u7684\u53EF\u89C6\u5316\u5F62\u5F0F\u5373\u53EF\uFF0C\u4E0D\u8981\u628A\u6240\u6709\u56FE\u8868\u90FD\u5806\u5728\u4E00\u8D77\u589E\u52A0\u8BA4\u77E5\u8D1F\u62C5\u3002\n4. **\u5BA2\u6237\u7AEF\u9002\u914D**\uFF1A\n - \u5728 CLI / TUI \u7EC8\u7AEF\u4E2D\uFF0C\u4F18\u5148\u4F7F\u7528\u4F2A\u4EE3\u7801\u3001\u7F29\u8FDB\u8C03\u7528\u6811\u3001Unicode \u5B57\u7B26\u56FE\u4E0E Diff\uFF1B\n - \u5728 Web / Desktop \u56FE\u5F62\u5BA2\u6237\u7AEF\u4E2D\uFF0C\u5145\u5206\u5229\u7528 Mermaid \u6E32\u67D3\u4E0E HTML Artifacts \u9884\u89C8\u3002",
|
|
1264
|
+
skillConfig: buildShowmeSkillConfig(slug)
|
|
1265
|
+
});
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
// packages/ai/skills/cavemanSkill.ts
|
|
1269
|
+
var CAVEMAN_SKILL_SLUGS = ["caveman"];
|
|
1270
|
+
function deterministicId9(prefix, seed) {
|
|
1271
|
+
let h = 2166136261;
|
|
1272
|
+
for (let i = 0; i < seed.length; i++) {
|
|
1273
|
+
h ^= seed.charCodeAt(i);
|
|
1274
|
+
h = h * 16777619 >>> 0;
|
|
1275
|
+
}
|
|
1276
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1277
|
+
return (prefix + suffix).slice(0, 26);
|
|
1278
|
+
}
|
|
1279
|
+
function normalizeSkillSeed9(input) {
|
|
1280
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1281
|
+
}
|
|
1282
|
+
function buildCavemanSkillId(slug) {
|
|
1283
|
+
return deterministicId9("01SK", normalizeSkillSeed9(slug) || slug);
|
|
1284
|
+
}
|
|
1285
|
+
function buildCavemanSkillPageKey(userId, slug) {
|
|
1286
|
+
return `page-${userId}-${buildCavemanSkillId(slug)}`;
|
|
1287
|
+
}
|
|
1288
|
+
function buildCavemanSkillConfig(slug) {
|
|
1289
|
+
return {
|
|
1290
|
+
version: "0.1",
|
|
1291
|
+
kind: "skill",
|
|
1292
|
+
id: buildCavemanSkillId(slug),
|
|
1293
|
+
name: "\u538B\u7F29\u8868\u8FBE\uFF08caveman\uFF09",
|
|
1294
|
+
triggerMode: "explicit",
|
|
1295
|
+
description: 'Ultra-compressed communication mode. Cuts token usage ~75% by speaking like caveman while keeping full technical accuracy. Supports intensity levels: lite, full (default), ultra, wenyan-lite, wenyan-full, wenyan-ultra. Use when user says "caveman mode", "talk like caveman", "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers when token efficiency is requested.'
|
|
1296
|
+
};
|
|
1297
|
+
}
|
|
1298
|
+
function buildCavemanSkillContentBySlug(slug) {
|
|
1299
|
+
return buildSkillDocMarkdown({
|
|
1300
|
+
body: 'Respond terse like smart caveman. All technical substance stay. Only fluff die.\n\n## Persistence\n\nACTIVE EVERY RESPONSE. No revert after many turns. No filler drift. Still active if unsure. Off only: "stop caveman" / "normal mode".\n\nDefault: **full**. Switch: `/caveman lite|full|ultra`.\n\n## Rules\n\nDrop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not "implement a solution for"). No tool-call narration, no decorative tables/emoji, no dumping long raw error logs unless asked \u2014 quote shortest decisive line. Standard well-known tech acronyms OK (DB/API/HTTP); never invent new abbreviations reader can\'t decode. Technical terms exact. Code blocks unchanged. Errors quoted exact.\n\nPreserve user\'s dominant language. User write Portuguese \u2192 reply Portuguese caveman. User write Spanish \u2192 reply Spanish caveman. Compress the style, not the language. No forced English openings or status phrases. ALWAYS keep technical terms, code, API names, CLI commands, commit-type keywords (feat/fix/...), and exact error strings verbatim \u2014 unless user explicitly ask for translation.\n\nNo self-reference. Never name or announce the style. No "caveman mode on", "me caveman think", no third-person caveman tags. Output caveman-only \u2014 never normal answer plus "Caveman:" recap. Exception: user explicitly ask what the mode is.\n\nPattern: `[thing] [action] [reason]. [next step].`\n\nNot: "Sure! I\'d be happy to help you with that. The issue you\'re experiencing is likely caused by..."\nYes: "Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:"\n\n## Intensity\n\n| Level | What change |\n|-------|------------|\n| **lite** | No filler/hedging. Keep articles + full sentences. Professional but tight |\n| **full** | Drop articles, fragments OK, short synonyms. Classic caveman. No tool-call narration, no decorative tables/emoji, no long raw error-log dumps unless asked. Standard acronyms OK; no invented abbreviations |\n| **ultra** | Abbreviate prose words (DB/auth/config/req/res/fn/impl) \u2014 prose words only, never real code symbols/function names. Strip conjunctions, arrows for causality (X \u2192 Y), one word when one word enough. Code symbols, function names, API names, error strings: never abbreviate |\n| **wenyan-lite** | Semi-classical. Drop filler/hedging but keep grammar structure, classical register |\n| **wenyan-full** | Maximum classical terseness. Fully \u6587\u8A00\u6587. 80-90% character reduction. Classical sentence patterns, verbs precede objects, subjects often omitted, classical particles (\u4E4B/\u4E43/\u70BA/\u5176) |\n| **wenyan-ultra** | Extreme abbreviation while keeping classical Chinese feel. Maximum compression, ultra terse |\n\nExample \u2014 "Why React component re-render?"\n- lite: "Your component re-renders because you create a new object reference each render. Wrap it in `useMemo`."\n- full: "New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`."\n- ultra: "Inline obj prop \u2192 new ref \u2192 re-render. `useMemo`."\n- wenyan-lite: "\u7D44\u4EF6\u983B\u91CD\u7E6A\uFF0C\u4EE5\u6BCF\u7E6A\u65B0\u751F\u5C0D\u8C61\u53C3\u7167\u6545\u3002\u4EE5 useMemo \u5305\u4E4B\u3002"\n- wenyan-full: "\u6BCF\u7E6A\u65B0\u751F\u5C0D\u8C61\u53C3\u7167\uFF0C\u6545\u91CD\u7E6A\uFF1B\u4EE5 useMemo \u5305\u4E4B\u5247\u514D\u3002"\n- wenyan-ultra: "\u65B0\u53C3\u7167\u2192\u91CD\u7E6A\u3002useMemo Wrap\u3002"\n\nExample \u2014 "Explain database connection pooling."\n- lite: "Connection pooling reuses open connections instead of creating new ones per request. Avoids repeated handshake overhead."\n- full: "Pool reuse open DB connections. No new connection per request. Skip handshake overhead."\n- ultra: "Pool = reuse DB conn. Skip handshake \u2192 fast under load."\n- wenyan-full: "\u6C60reuse open connection\u3002\u4E0D\u6BCFreq\u65B0\u958B\u3002skip handshake overhead\u3002"\n- wenyan-ultra: "\u6C60reuse conn\u3002skip handshake \u2192 fast\u3002"\n\n## Auto-Clarity\n\nDrop caveman when:\n- Security warnings\n- Irreversible action confirmations\n- Multi-step sequences where fragment order or omitted conjunctions risk misread\n- Compression itself creates technical ambiguity (e.g., `"migrate table drop column backup first"` \u2014 order unclear without articles/conjunctions)\n- User asks to clarify or repeats question\n\nResume caveman after clear part done.\n\nExample \u2014 destructive op:\n> **Warning:** This will permanently delete all rows in the `users` table and cannot be undone.\n> ```sql\n> DROP TABLE users;\n> ```\n> Caveman resume. Verify backup exist first.\n\n## Boundaries\n\nCode/commits/PRs: write normal. "stop caveman" or "normal mode": revert. Level persist until changed or session end.',
|
|
1301
|
+
skillConfig: buildCavemanSkillConfig(slug)
|
|
1302
|
+
});
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
// packages/ai/skills/skillCreatorSkill.ts
|
|
1306
|
+
var SKILL_CREATOR_SKILL_SLUGS = ["skill-creator"];
|
|
1307
|
+
function deterministicId10(prefix, seed) {
|
|
1308
|
+
let h = 2166136261;
|
|
1309
|
+
for (let i = 0; i < seed.length; i++) {
|
|
1310
|
+
h ^= seed.charCodeAt(i);
|
|
1311
|
+
h = h * 16777619 >>> 0;
|
|
1312
|
+
}
|
|
1313
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1314
|
+
return (prefix + suffix).slice(0, 26);
|
|
1315
|
+
}
|
|
1316
|
+
function normalizeSkillSeed10(input) {
|
|
1317
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1318
|
+
}
|
|
1319
|
+
function buildSkillCreatorSkillId(slug) {
|
|
1320
|
+
return deterministicId10("01SK", normalizeSkillSeed10(slug) || slug);
|
|
1321
|
+
}
|
|
1322
|
+
function buildSkillCreatorSkillPageKey(userId, slug) {
|
|
1323
|
+
return `page-${userId}-${buildSkillCreatorSkillId(slug)}`;
|
|
1324
|
+
}
|
|
1325
|
+
function buildSkillCreatorSkillConfig(slug) {
|
|
1326
|
+
return {
|
|
1327
|
+
version: "0.1",
|
|
1328
|
+
kind: "skill",
|
|
1329
|
+
id: buildSkillCreatorSkillId(slug),
|
|
1330
|
+
name: "Skill \u7F16\u5199\u65B9\u6CD5\u8BBA\uFF08skill-creator\uFF09",
|
|
1331
|
+
triggerMode: "explicit",
|
|
1332
|
+
description: "\u7F16\u5199\u3001\u6539\u8FDB\u4E0E\u6821\u9A8C Agent Skill\uFF08SKILL.md\uFF09\u7684\u8DE8\u9879\u76EE\u65B9\u6CD5\u8BBA\uFF1A\u6A21\u7CCA\u9700\u6C42\u8BCA\u65AD\u3001\u7ED3\u6784\u6A21\u5F0F\u9009\u578B\u3001frontmatter description \u89E6\u53D1\u8BCD\u8BBE\u8BA1\u3001Boundaries \u8FB9\u754C\u5212\u5B9A\u4E0E\u81EA\u5305\u542B\u6821\u9A8C\u6E05\u5355\u3002\u89E6\u53D1\u8BCD\uFF1A\u65B0\u5EFA skill\u3001\u5199\u4E2A skill\u3001\u6539 skill\u3001\u628A\u5DE5\u4F5C\u6D41\u8F6C\u6210 skill\u3001skill \u89E6\u53D1\u4E0D\u4E86\u3001skill \u4E0D\u89E6\u53D1\u3001SKILL.md\u3001\u6821\u9A8C skill \u683C\u5F0F\u3001skill \u8FB9\u754C\u3002Make sure to use this skill whenever the user mentions skill\u3001SKILL.md\u3001\u6280\u80FD\u521B\u5EFA\u6216\u6280\u80FD\u6539\u9020\u2014\u2014even if they don't explicitly say 'skill-creator'\u3002"
|
|
1333
|
+
};
|
|
1334
|
+
}
|
|
1335
|
+
function buildSkillCreatorSkillContentBySlug(slug) {
|
|
1336
|
+
return buildSkillDocMarkdown({
|
|
1337
|
+
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",
|
|
1338
|
+
skillConfig: buildSkillCreatorSkillConfig(slug)
|
|
1339
|
+
});
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
// packages/ai/skills/agentProviderSetupSkill.ts
|
|
1343
|
+
var AGENT_PROVIDER_SETUP_SKILL_SLUGS = ["agent-provider-setup"];
|
|
1344
|
+
function deterministicId11(prefix, seed) {
|
|
1345
|
+
let h = 2166136261;
|
|
1346
|
+
for (let i = 0; i < seed.length; i++) {
|
|
1347
|
+
h ^= seed.charCodeAt(i);
|
|
1348
|
+
h = h * 16777619 >>> 0;
|
|
1349
|
+
}
|
|
1350
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
1351
|
+
return (prefix + suffix).slice(0, 26);
|
|
1352
|
+
}
|
|
1353
|
+
function normalizeSkillSeed11(input) {
|
|
1354
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
1355
|
+
}
|
|
1356
|
+
function buildAgentProviderSetupSkillId(slug) {
|
|
1357
|
+
return deterministicId11("01SK", normalizeSkillSeed11(slug) || slug);
|
|
1358
|
+
}
|
|
1359
|
+
function buildAgentProviderSetupSkillPageKey(userId, slug) {
|
|
1360
|
+
return `page-${userId}-${buildAgentProviderSetupSkillId(slug)}`;
|
|
1361
|
+
}
|
|
1362
|
+
function buildAgentProviderSetupSkillConfig(slug) {
|
|
1363
|
+
return {
|
|
1364
|
+
version: "0.1",
|
|
1365
|
+
kind: "skill",
|
|
1366
|
+
id: buildAgentProviderSetupSkillId(slug),
|
|
1367
|
+
name: "\u81EA\u5EFA Provider Agent \u5F15\u5BFC\uFF08agent-provider-setup\uFF09",
|
|
1368
|
+
triggerMode: "recommended",
|
|
1369
|
+
// execShell runs `nolo agent providers` + `nolo agent create`; ask_user is
|
|
1370
|
+
// used for the model/effort fork and the key-confirm gate.
|
|
1371
|
+
toolNames: ["execShell", "ask_user", "loadSkill"],
|
|
1372
|
+
description: 'Guide the user through creating an Agent on a subscription token-plan or metered own-API-key provider (Step Plan, Kimi Code, DeepSeek, OpenCode Go, \u2026). Use when the user wants to create an agent that is NOT platform-hosted \u2014 e.g. "\u7528\u8BA2\u9605\u4F1A\u5458\u5EFA agent", "create an agent on Step Plan / my own API key", or names a provider subscription. Reads `nolo agent providers --json` for the live preset list; never hardcode providers.'
|
|
1373
|
+
};
|
|
1374
|
+
}
|
|
1375
|
+
function buildAgentProviderSetupSkillContentBySlug(slug) {
|
|
1376
|
+
return buildSkillDocMarkdown({
|
|
1377
|
+
skillConfig: buildAgentProviderSetupSkillConfig(slug),
|
|
1378
|
+
body: `Help the user create an Agent that runs on their own subscription plan or API key, not a platform-hosted model.
|
|
1379
|
+
|
|
1380
|
+
The preset catalog is DATA-DRIVEN \u2014 do not hardcode provider names or base URLs. Always read the live list first.
|
|
1381
|
+
|
|
1382
|
+
## Step 1 \u2014 List available presets
|
|
1383
|
+
|
|
1384
|
+
Run (via execShell):
|
|
1385
|
+
\`\`\`
|
|
1386
|
+
nolo agent providers --json
|
|
1387
|
+
\`\`\`
|
|
1388
|
+
This returns the registry presets grouped by \`group\`:
|
|
1389
|
+
- \`subscription\` \u2014 token-plan subscriptions (Step Plan, Kimi Code, OpenCode Go\u2026): need an API key + a locked baseUrl.
|
|
1390
|
+
- \`metered_api\` \u2014 pay-per-use own-key APIs (stepfun-api, deepseek-api, minimax\u2026).
|
|
1391
|
+
- \`subscription_oauth\` \u2014 OAuth brands (ChatGPT, Claude, Cursor\u2026): **cannot be created from a key here** \u2014 tell the user these require Nolo Desktop OAuth login, and stop.
|
|
1392
|
+
|
|
1393
|
+
Match the user's request to a preset \`id\`. If the user already named one (e.g. "stepfun \u8BA2\u9605" \u2192 \`step-plan\`), skip straight to it. If ambiguous between subscription vs metered for the same vendor (e.g. \`step-plan\` vs \`stepfun-api\`), ask which they mean \u2014 subscription is the monthly-Credit plan, metered is pay-per-token.
|
|
1394
|
+
|
|
1395
|
+
## Step 2 \u2014 Model & reasoning effort: fork on how much the user knows
|
|
1396
|
+
|
|
1397
|
+
- **User is specific** (names a model or effort): use the preset's \`models[]\` list to confirm the choice is valid, and ask for reasoning effort only among what that model supports (\`low/medium/high\` for stepfun; check \`supportsReasoningEffort\`).
|
|
1398
|
+
- **User doesn't know / says "\u968F\u4FBF / \u4F60\u770B\u7740\u529E"**: just use the preset's \`defaultModel\` and default effort \u2014 do NOT interrogate them. The recommended model is already marked \`recommended:true\` in the list.
|
|
1399
|
+
|
|
1400
|
+
## Step 3 \u2014 Collect the API key
|
|
1401
|
+
|
|
1402
|
+
Show the preset's \`keyFormatHint\` if present (it says where to get the key). Ask the user to paste their API key. Never invent one.
|
|
1403
|
+
|
|
1404
|
+
## Step 4 \u2014 Confirm & create (sensitive \u2014 confirm first)
|
|
1405
|
+
|
|
1406
|
+
Show the user the exact command you will run, with the key masked, and get an explicit yes before executing. Then run it with the key passed via env so it never lands on the command line / in logs:
|
|
1407
|
+
|
|
1408
|
+
\`\`\`
|
|
1409
|
+
CUSTOM_API_KEY='<the-key>' nolo agent create <slug> \\
|
|
1410
|
+
--preset <preset-id> --api-key "$CUSTOM_API_KEY" --verify
|
|
1411
|
+
\`\`\`
|
|
1412
|
+
|
|
1413
|
+
- \`--preset\` auto-fills provider/baseUrl/model from the registry; add \`--model <id>\` only if the user picked a non-default model.
|
|
1414
|
+
- \`--verify\` probes the endpoint end-to-end and confirms the key works.
|
|
1415
|
+
- For a metered preset use its \`metered_api\` id the same way.
|
|
1416
|
+
|
|
1417
|
+
## Step 5 \u2014 Report
|
|
1418
|
+
|
|
1419
|
+
On success report the created agentKey and model. If \`--verify\` fails, relay the endpoint's error verbatim and suggest checking the key / plan tier.
|
|
1420
|
+
|
|
1421
|
+
## Hard rules
|
|
1422
|
+
|
|
1423
|
+
- API key goes through the \`CUSTOM_API_KEY\` env var, never as a literal arg, never echoed back.
|
|
1424
|
+
- Always show the resolved command (key masked) and get confirmation before running \u2014 creating an agent + storing a credential is a sensitive action.
|
|
1425
|
+
- OAuth subscription presets \u2192 redirect to Nolo Desktop; do not attempt to create them via key.
|
|
1426
|
+
- If \`nolo agent providers\` fails or the list is empty, say so and ask the user for the provider's base URL + key to build a manual custom agent instead.`
|
|
1427
|
+
});
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
// packages/ai/skills/builtinSkillRegistry.ts
|
|
1431
|
+
var codePlannerContentBySlug = /* @__PURE__ */ (() => {
|
|
1432
|
+
const cache = /* @__PURE__ */ new Map();
|
|
1433
|
+
return (slug) => {
|
|
1434
|
+
if (cache.size === 0) {
|
|
1435
|
+
for (const page of buildCodePlannerSkillPageRecords("platform-skill-owner")) {
|
|
1436
|
+
cache.set(page.slug, page.content);
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
return cache.get(slug) ?? "";
|
|
1440
|
+
};
|
|
1441
|
+
})();
|
|
1442
|
+
var OBJECT_SKILL_KINDS = Object.keys(
|
|
1443
|
+
BUILTIN_OBJECT_SKILL_IDS
|
|
1444
|
+
);
|
|
1445
|
+
var SOURCES = [
|
|
1446
|
+
{
|
|
1447
|
+
slugs: OBJECT_SKILL_KINDS,
|
|
1448
|
+
buildSkillId: (kind) => BUILTIN_OBJECT_SKILL_IDS[kind],
|
|
1449
|
+
buildPageKey: (userId, kind) => buildBuiltinObjectSkillDbKey(kind, userId),
|
|
1450
|
+
buildConfig: buildBuiltinObjectSkillConfig,
|
|
1451
|
+
buildContent: buildBuiltinObjectSkillPageContent
|
|
1452
|
+
},
|
|
1453
|
+
{
|
|
1454
|
+
slugs: CODING_SKILL_SLUGS,
|
|
1455
|
+
buildSkillId: buildCodingSkillId,
|
|
1456
|
+
buildPageKey: buildCodingSkillPageKey,
|
|
1457
|
+
buildConfig: buildCodingSkillConfig,
|
|
1458
|
+
buildContent: buildCodingSkillContentBySlug
|
|
1459
|
+
},
|
|
1460
|
+
{
|
|
1461
|
+
slugs: SPECIALIST_SKILL_SLUGS,
|
|
1462
|
+
buildSkillId: buildSpecialistSkillId,
|
|
1463
|
+
buildPageKey: buildSpecialistSkillPageKey,
|
|
1464
|
+
buildConfig: buildSpecialistSkillConfig,
|
|
1465
|
+
buildContent: buildSpecialistSkillContentBySlug
|
|
1466
|
+
},
|
|
1467
|
+
{
|
|
1468
|
+
slugs: CODE_PLANNER_SKILL_SLUGS,
|
|
1469
|
+
buildSkillId: buildCodePlannerSkillId,
|
|
1470
|
+
buildPageKey: buildCodePlannerSkillPageKey,
|
|
1471
|
+
buildConfig: buildCodePlannerSkillConfig,
|
|
1472
|
+
buildContent: codePlannerContentBySlug
|
|
1473
|
+
},
|
|
1474
|
+
{
|
|
1475
|
+
slugs: SEARCH_DIALOG_SKILL_SLUGS,
|
|
1476
|
+
buildSkillId: buildSearchDialogSkillId,
|
|
1477
|
+
buildPageKey: buildSearchDialogSkillPageKey,
|
|
1478
|
+
buildConfig: buildSearchDialogSkillConfig,
|
|
1479
|
+
buildContent: buildSearchDialogSkillContentBySlug
|
|
1480
|
+
},
|
|
1481
|
+
{
|
|
1482
|
+
slugs: SEARCH_SPACE_SKILL_SLUGS,
|
|
1483
|
+
buildSkillId: buildSearchSpaceSkillId,
|
|
1484
|
+
buildPageKey: buildSearchSpaceSkillPageKey,
|
|
1485
|
+
buildConfig: buildSearchSpaceSkillConfig,
|
|
1486
|
+
buildContent: buildSearchSpaceSkillContentBySlug
|
|
1487
|
+
},
|
|
1488
|
+
{
|
|
1489
|
+
slugs: WORKTREE_SKILL_SLUGS,
|
|
1490
|
+
buildSkillId: buildWorktreeSkillId,
|
|
1491
|
+
buildPageKey: buildWorktreeSkillPageKey,
|
|
1492
|
+
buildConfig: buildWorktreeSkillConfig,
|
|
1493
|
+
buildContent: buildWorktreeSkillContentBySlug
|
|
1494
|
+
},
|
|
1495
|
+
{
|
|
1496
|
+
slugs: SYSTEMATIC_INVESTIGATION_SKILL_SLUGS,
|
|
1497
|
+
buildSkillId: buildSystematicinvestigationSkillId,
|
|
1498
|
+
buildPageKey: buildSystematicinvestigationSkillPageKey,
|
|
1499
|
+
buildConfig: buildSystematicinvestigationSkillConfig,
|
|
1500
|
+
buildContent: buildSystematicinvestigationSkillContentBySlug
|
|
1501
|
+
},
|
|
1502
|
+
{
|
|
1503
|
+
slugs: SHOW_ME_SKILL_SLUGS,
|
|
1504
|
+
buildSkillId: buildShowmeSkillId,
|
|
1505
|
+
buildPageKey: buildShowmeSkillPageKey,
|
|
1506
|
+
buildConfig: buildShowmeSkillConfig,
|
|
1507
|
+
buildContent: buildShowmeSkillContentBySlug
|
|
1508
|
+
},
|
|
1509
|
+
{
|
|
1510
|
+
slugs: CAVEMAN_SKILL_SLUGS,
|
|
1511
|
+
buildSkillId: buildCavemanSkillId,
|
|
1512
|
+
buildPageKey: buildCavemanSkillPageKey,
|
|
1513
|
+
buildConfig: buildCavemanSkillConfig,
|
|
1514
|
+
buildContent: buildCavemanSkillContentBySlug
|
|
1515
|
+
},
|
|
1516
|
+
{
|
|
1517
|
+
slugs: SKILL_CREATOR_SKILL_SLUGS,
|
|
1518
|
+
buildSkillId: buildSkillCreatorSkillId,
|
|
1519
|
+
buildPageKey: buildSkillCreatorSkillPageKey,
|
|
1520
|
+
buildConfig: buildSkillCreatorSkillConfig,
|
|
1521
|
+
buildContent: buildSkillCreatorSkillContentBySlug
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
slugs: AGENT_PROVIDER_SETUP_SKILL_SLUGS,
|
|
1525
|
+
buildSkillId: buildAgentProviderSetupSkillId,
|
|
1526
|
+
buildPageKey: buildAgentProviderSetupSkillPageKey,
|
|
1527
|
+
buildConfig: buildAgentProviderSetupSkillConfig,
|
|
1528
|
+
buildContent: buildAgentProviderSetupSkillContentBySlug
|
|
1529
|
+
}
|
|
1530
|
+
];
|
|
1531
|
+
var buildRegistry = () => {
|
|
1532
|
+
const entries = [];
|
|
1533
|
+
const seenSlugs = /* @__PURE__ */ new Set();
|
|
1534
|
+
for (const source of SOURCES) {
|
|
1535
|
+
for (const slug of source.slugs) {
|
|
1536
|
+
if (seenSlugs.has(slug)) {
|
|
1537
|
+
throw new Error(`Duplicate builtin skill slug across sources: ${slug}`);
|
|
1538
|
+
}
|
|
1539
|
+
seenSlugs.add(slug);
|
|
1540
|
+
const config = source.buildConfig(slug);
|
|
1541
|
+
entries.push({
|
|
1542
|
+
slug,
|
|
1543
|
+
skillId: source.buildSkillId(slug),
|
|
1544
|
+
title: config.name || slug,
|
|
1545
|
+
config,
|
|
1546
|
+
content: source.buildContent(slug),
|
|
1547
|
+
buildPageKey: (userId) => source.buildPageKey(userId, slug)
|
|
1548
|
+
});
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1551
|
+
return entries;
|
|
1552
|
+
};
|
|
1553
|
+
var REGISTRY = buildRegistry();
|
|
1554
|
+
var BY_SLUG = new Map(REGISTRY.map((entry) => [entry.slug, entry]));
|
|
1555
|
+
var BY_SKILL_ID = new Map(REGISTRY.map((entry) => [entry.skillId, entry]));
|
|
1556
|
+
var BY_LOWER_NAME = new Map(
|
|
1557
|
+
REGISTRY.map((entry) => [entry.title.trim().toLowerCase(), entry])
|
|
1558
|
+
);
|
|
1559
|
+
var listBuiltinSkills = () => REGISTRY;
|
|
1560
|
+
var resolveBuiltinSkillEntry = (identifier) => {
|
|
1561
|
+
const raw = typeof identifier === "string" ? identifier.trim() : "";
|
|
1562
|
+
if (!raw) return null;
|
|
1563
|
+
const bySlug = BY_SLUG.get(raw);
|
|
1564
|
+
if (bySlug) return bySlug;
|
|
1565
|
+
const byId = BY_SKILL_ID.get(raw);
|
|
1566
|
+
if (byId) return byId;
|
|
1567
|
+
if (raw.startsWith("page-")) {
|
|
1568
|
+
for (const entry of REGISTRY) {
|
|
1569
|
+
if (raw.endsWith(`-${entry.skillId}`)) return entry;
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
return null;
|
|
1573
|
+
};
|
|
1574
|
+
var resolveBuiltinSkillByName = (identifier) => {
|
|
1575
|
+
const raw = typeof identifier === "string" ? identifier.trim() : "";
|
|
1576
|
+
if (!raw) return null;
|
|
1577
|
+
return resolveBuiltinSkillEntry(raw) ?? BY_LOWER_NAME.get(raw.toLowerCase()) ?? null;
|
|
1578
|
+
};
|
|
1579
|
+
var resolveBuiltinSkillSlug = (identifier) => resolveBuiltinSkillEntry(identifier)?.slug ?? null;
|
|
1580
|
+
var resolveBuiltinSkillPage = (identifier) => {
|
|
1581
|
+
const entry = resolveBuiltinSkillEntry(identifier);
|
|
1582
|
+
if (!entry) return null;
|
|
1583
|
+
const raw = typeof identifier === "string" ? identifier.trim() : entry.slug;
|
|
1584
|
+
return {
|
|
1585
|
+
dbKey: raw || entry.slug,
|
|
1586
|
+
title: entry.title,
|
|
1587
|
+
content: entry.content,
|
|
1588
|
+
meta: { kind: "skill", skillConfig: entry.config },
|
|
1589
|
+
...entry.config.toolNames?.length ? { tools: [...entry.config.toolNames] } : {}
|
|
1590
|
+
};
|
|
1591
|
+
};
|
|
1592
|
+
var CAPABILITIES = CAPABILITY_PACKS.map(
|
|
1593
|
+
(pack) => ({
|
|
1594
|
+
kind: "capability",
|
|
1595
|
+
slug: pack.id,
|
|
1596
|
+
title: pack.label,
|
|
1597
|
+
description: pack.description,
|
|
1598
|
+
toolNames: pack.tools,
|
|
1599
|
+
...pack.promptPatch ? { promptPatch: pack.promptPatch } : {},
|
|
1600
|
+
icon: pack.icon,
|
|
1601
|
+
defaultEnabled: pack.defaultEnabled
|
|
1602
|
+
})
|
|
1603
|
+
);
|
|
1604
|
+
var CAPABILITY_BY_SLUG = new Map(CAPABILITIES.map((c) => [c.slug, c]));
|
|
1605
|
+
var listBuiltinCapabilities = () => CAPABILITIES;
|
|
1606
|
+
var resolveBuiltinCapability = (slug) => {
|
|
1607
|
+
const raw = typeof slug === "string" ? slug.trim() : "";
|
|
1608
|
+
return raw ? CAPABILITY_BY_SLUG.get(raw) ?? null : null;
|
|
1609
|
+
};
|
|
1610
|
+
var CAPABILITY_SLUG_COLLISIONS = ["app-builder"];
|
|
1611
|
+
|
|
1612
|
+
export {
|
|
1613
|
+
extractRuntimePageCapabilities,
|
|
1614
|
+
buildSkillGuidancePromptBlock,
|
|
1615
|
+
resolveSkillGraphFromRoots,
|
|
1616
|
+
listBuiltinSkills,
|
|
1617
|
+
resolveBuiltinSkillEntry,
|
|
1618
|
+
resolveBuiltinSkillByName,
|
|
1619
|
+
resolveBuiltinSkillSlug,
|
|
1620
|
+
resolveBuiltinSkillPage,
|
|
1621
|
+
listBuiltinCapabilities,
|
|
1622
|
+
resolveBuiltinCapability,
|
|
1623
|
+
CAPABILITY_SLUG_COLLISIONS
|
|
1624
|
+
};
|