nolo-cli 0.16.0-alpha.2 → 0.16.0-alpha.20
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-QAUS6B7J.js → _executeModel-GRCQXT5R.js} +51 -45
- package/{action-GUOZYYGN.js → action-LT7BRFLK.js} +10 -9
- package/{addContentAction-QDGHGUBH.js → addContentAction-PL3KKBDH.js} +9 -8
- package/{addDialogAgentAction-Z4YCYZIV.js → addDialogAgentAction-FCMSKYAF.js} +8 -7
- package/{agentDeleteCommand-365DMKHW.js → agentDeleteCommand-WNL3CNQX.js} +32 -29
- package/{agentEmailCommands-TQMXL36I.js → agentEmailCommands-MPEUMRAS.js} +63 -57
- package/{agentListCommands-6B5X4RC6.js → agentListCommands-YO4AOQMS.js} +31 -28
- package/{agentMachineCommands-LOEARB6V.js → agentMachineCommands-WYM6YRYJ.js} +30 -27
- package/{agentPullCommand-6HWUT3SW.js → agentPullCommand-ZZGU5KOY.js} +4 -4
- package/agentRecordCommands-BVWSHMIY.js +105 -0
- package/{agentRunCommand-SGMH67WT.js → agentRunCommand-E3ZI6RSF.js} +64 -55
- package/{agentRunControl-6ADXVYMR.js → agentRunControl-Y5AFH5PQ.js} +24 -1
- package/{agentRuntimeLocal-YSYZ33ER.js → agentRuntimeLocal-P4VGX6H6.js} +26 -25
- package/{agentSlice-IVE735EV.js → agentSlice-D33GU3JL.js} +9 -8
- package/{appDeleteCommands-6QYOO3JB.js → appDeleteCommands-VA4R2SWX.js} +29 -26
- package/{appDeployCommands-WTCT6XO6.js → appDeployCommands-JWMWQNG6.js} +29 -26
- package/{appDeployStatusCommands-CGWGZJKB.js → appDeployStatusCommands-KYXGLZSQ.js} +29 -26
- package/{appGetCommands-O4OCAMRW.js → appGetCommands-ELOO3JG6.js} +29 -26
- package/{appListCommands-UENFP4XY.js → appListCommands-SJUW4RLW.js} +29 -26
- package/{authCommand-YFTR3347.js → authCommand-WJZPOLSS.js} +16 -9
- package/{authCommands-YXGOXNBZ.js → authCommands-XTBV7OFZ.js} +6 -5
- package/{chunk-RKM3K52F.js → chunk-34WPV75U.js} +23 -2
- package/{chunk-VPTJB4HM.js → chunk-3ND52WIL.js} +2 -5
- package/{chunk-SOTZ6RDN.js → chunk-3Q7WHGCB.js} +1 -1
- package/{chunk-KKY4B2Q2.js → chunk-4PWB7JRR.js} +4 -1
- package/{chunk-U7LEGLEB.js → chunk-4T5F7YZQ.js} +1 -1
- package/{chunk-OQMPU2ML.js → chunk-5PGGCJGV.js} +6 -6
- package/chunk-7BUYEZ6U.js +671 -0
- package/{chunk-AS3ZQ3O2.js → chunk-7OBMZCRD.js} +1 -1
- package/{chunk-WA6KZL5V.js → chunk-AAODAAUQ.js} +23 -20
- package/{chunk-GRTFNYLR.js → chunk-AKVLLMOU.js} +3 -3
- package/{chunk-QLUFR47U.js → chunk-AL2V7U3E.js} +1 -1
- package/{chunk-MTU75CZ2.js → chunk-B5TOXZAK.js} +1 -1
- package/{chunk-QZVGMD5F.js → chunk-BE2GNT5E.js} +2 -8
- package/{chunk-JKWWVF2I.js → chunk-D3HVJJIA.js} +1 -1
- package/{chunk-B4KT7RN2.js → chunk-DKZFOK24.js} +18 -89
- package/chunk-DL6EPNIK.js +50 -0
- package/{chunk-YYIRR6QC.js → chunk-E5KQTMMJ.js} +212 -250
- package/{chunk-4QQFLN5C.js → chunk-EGPCU42M.js} +58 -8
- package/{chunk-XVP3C2KY.js → chunk-ELT65PZW.js} +2 -2
- package/{chunk-EMXI3N3Z.js → chunk-ENP2ELIL.js} +5 -5
- package/{chunk-6565R2TI.js → chunk-EXAEHRLI.js} +112 -191
- package/chunk-FQZZLA3C.js +223 -0
- package/{chunk-WPN6RMDF.js → chunk-GMZZ5EKJ.js} +3 -3
- package/{chunk-RSYUDGGZ.js → chunk-HQNPCMWL.js} +3 -3
- package/{chunk-OGGHETUE.js → chunk-HQPG2PIV.js} +62 -19
- package/{chunk-4NLUNENX.js → chunk-IQZ6TGVW.js} +10 -3
- package/{chunk-VE6XMVKG.js → chunk-J67FKTTY.js} +330 -213
- package/{chunk-G2MKOQCB.js → chunk-JFE7XW4D.js} +1 -1
- package/{setDialogExtraReferencesAction-2VLGWQKG.js → chunk-JLA4FXYC.js} +2 -17
- package/{chunk-OOIN7HSO.js → chunk-JP7REMYP.js} +19 -1
- package/chunk-KFEVY3ST.js +255 -0
- package/{chunk-I66RU7P7.js → chunk-KKWJ5VPZ.js} +1 -1
- package/{chunk-WRN5EQT7.js → chunk-L2RRMXNJ.js} +13 -4
- package/{chunk-ISYE6GZB.js → chunk-L6NVTGI7.js} +1 -1
- package/{chunk-HRQCKQA5.js → chunk-MUCU6ATG.js} +8 -257
- package/{chunk-BFRVXJJJ.js → chunk-MUIT5AAM.js} +112 -27
- package/{chunk-WNLPAOIT.js → chunk-MVQ4TBSD.js} +1 -1
- package/{chunk-O53CP2QR.js → chunk-N2HYIBLH.js} +6 -6
- package/{chunk-524BDL33.js → chunk-O6W2O2DA.js} +1 -15
- package/{chunk-YC3DJILJ.js → chunk-PUSK7HXJ.js} +64 -22
- package/{chunk-OOSFSFMA.js → chunk-R5V5G73M.js} +2 -0
- package/{chunk-4IJYA27C.js → chunk-RG2U2MTJ.js} +1 -1
- package/{chunk-Z24FGIU2.js → chunk-RIDWN7AP.js} +34 -15
- package/{chunk-IKXL2HZ3.js → chunk-RK5NYQEL.js} +1 -1
- package/{chunk-QLFCNUVQ.js → chunk-RUTSBLDM.js} +1629 -261
- package/{chunk-TTGAVETO.js → chunk-RVOUXDFU.js} +5 -5
- package/{chunk-JTINRTBT.js → chunk-SKDNBYZK.js} +2 -2
- package/{chunk-KMQPSTMJ.js → chunk-TRT4I4UD.js} +2 -2
- package/{chunk-EHLHSX7R.js → chunk-UB4RYYNQ.js} +9 -2
- package/{chunk-N5424GSW.js → chunk-UGUW3FHG.js} +4 -4
- package/{chunk-YNHQIXX5.js → chunk-UIOYWBU7.js} +395 -326
- package/chunk-V5R4NZP2.js +78 -0
- package/{chunk-MYMMNKYL.js → chunk-VNAEBGDK.js} +156 -6
- package/{chunk-J55UHASN.js → chunk-VST53WEL.js} +1 -1
- package/{chunk-6MHDWKOT.js → chunk-VVKQFITN.js} +25 -12
- package/{chunk-W4NVOSFF.js → chunk-WFHXMLHZ.js} +1 -1
- package/{chunk-H33743XH.js → chunk-WJRJDX2W.js} +1 -1
- package/chunk-X4Q4UZEY.js +26 -0
- package/{chunk-E237VE6U.js → chunk-XFYDGBXL.js} +4 -4
- package/{chunk-JS33TCQ3.js → chunk-XHG22OEX.js} +4 -4
- package/{chunk-DVRHHFEA.js → chunk-XMLRJUU5.js} +1 -1
- package/{chunk-V2J635L5.js → chunk-XOIF2TNF.js} +2 -2
- package/{chunk-SFXYKGK2.js → chunk-XRZJGPFI.js} +7 -7
- package/chunk-ZHXJ6M7T.js +27 -0
- package/chunk-ZZ2MH7LE.js +84 -0
- package/{cliExecutor-K3F7DMRO.js → cliExecutor-DNE7TCC4.js} +2 -2
- package/codingSkills-36KN5NQT.js +48 -0
- package/{createAgentAutomationAction-TS6NNZ4X.js → createAgentAutomationAction-ONKZ46XE.js} +22 -21
- package/{createDialogAction-5HVQ33EX.js → createDialogAction-7QWJEBKU.js} +24 -23
- package/{createPageAction-4F3ZGQJD.js → createPageAction-PB3KXZIA.js} +28 -27
- package/{dbSlice-OP6UPXKA.js → dbSlice-CGSRFJN3.js} +8 -7
- package/{deleteFile-WPWVZE4B.js → deleteFile-WDZ3VM7B.js} +3 -3
- package/{dialogCommands-ZL6L24BS.js → dialogCommands-YZFU4Q26.js} +30 -27
- package/{dialogSlice-FAWUQDJW.js → dialogSlice-53B5ISGQ.js} +22 -21
- package/{docCreateCommands-LYROQTFH.js → docCreateCommands-LOUC5PFB.js} +28 -25
- package/{docDeleteCommands-6TWGTZNR.js → docDeleteCommands-HHPGT4BR.js} +29 -26
- package/{docReadCommands-PRULNF26.js → docReadCommands-YPSN4HEF.js} +28 -25
- package/{docStore-2UHVWLTV.js → docStore-LJXXRB5W.js} +23 -22
- package/{docUpdateCommands-NNYYWJBI.js → docUpdateCommands-CJCZO54M.js} +28 -25
- package/{fetchMessages-KTNM7QAR.js → fetchMessages-BMGVZVSE.js} +4 -3
- package/{getPricing-UGDJHI7M.js → getPricing-RYY6OBA4.js} +4 -4
- package/handleSendMessageAction-ICGX4QCM.js +402 -0
- package/index.js +68 -68
- package/{localDialogRead-2VRI24F4.js → localDialogRead-HQZPVIE3.js} +1 -1
- package/{localRuntimeDb-LGDF6FQP.js → localRuntimeDb-THJZGAOJ.js} +1 -1
- package/{machineCommands-JQPEQFSE.js → machineCommands-YLDZXK4D.js} +64 -58
- package/{machineWsRunDispatch-FFFNWVEW.js → machineWsRunDispatch-LTQL3DRE.js} +56 -50
- package/{models-LSCRJJ6P.js → models-5K5G2CZI.js} +2 -2
- package/package.json +1 -1
- package/queryRunOverlay-O4LOMMPO.js +161 -0
- package/{read-HXHAZBKH.js → read-3FMPZPER.js} +3 -3
- package/{readDocTool-VPBDTO4G.js → readDocTool-VSYHKK3V.js} +1 -1
- package/{readlineWorkspace-QSXHSBHA.js → readlineWorkspace-OSPVWNAT.js} +699 -168
- package/{removeDialogAgentAction-HUFVN35S.js → removeDialogAgentAction-OAGA2G3U.js} +11 -10
- package/{runAgentClientLoop-A75BUU6D.js → runAgentClientLoop-76SUKKPX.js} +46 -40
- package/runOverlayPresentation-ZO4VCWEU.js +11 -0
- package/{runtimeDoctorCommands-THIHX2SY.js → runtimeDoctorCommands-E2OUORHK.js} +6 -6
- package/setDialogExtraReferencesAction-JZEXA5SL.js +27 -0
- package/{setPrimaryDialogAgentAction-VB4UV2CC.js → setPrimaryDialogAgentAction-4ZUQQKDG.js} +27 -18
- package/{settingSlice-7JYPQNAC.js → settingSlice-7MNKHZ6R.js} +9 -8
- package/{skillDiscovery-6M2BZUFN.js → skillDiscovery-KJWT7JBU.js} +3 -3
- package/{spaceCommands-4LE45GB7.js → spaceCommands-GIF7MKVD.js} +31 -28
- package/{spaceSlice-444MFUP6.js → spaceSlice-M4PVN5PO.js} +22 -21
- package/{streamAgentChatTurn-DJAE7USZ.js → streamAgentChatTurn-GCKTFSHQ.js} +96 -55
- package/{tableCommands-3P7MJ3PF.js → tableCommands-BEQAGE4I.js} +1 -1
- package/{tools-YB6LXSVN.js → tools-RJVFXOLR.js} +35 -30
- package/{tuiSummaryLlmCaller-QQL3JA5I.js → tuiSummaryLlmCaller-VUNVBRX3.js} +7 -6
- package/types-ZSTJ7MPR.js +7 -0
- package/{updateDialogTitleAction-6HGFBM64.js → updateDialogTitleAction-PSR67DLV.js} +25 -24
- package/agentRecordCommands-DCH2WBL2.js +0 -99
- package/chunk-BYXBJQAS.js +0 -0
- package/handleSendMessageAction-LJPUYNOH.js +0 -215
- package/{chunk-O4BU24WZ.js → chunk-6Y7A3OQQ.js} +3 -3
- package/{chunk-CMKUBIGW.js → chunk-X7W4TNB4.js} +3 -3
- package/{localRuntimeAuthority-TEGCOWX4.js → localRuntimeAuthority-4IXJCHZ7.js} +3 -3
|
@@ -0,0 +1,671 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildSkillDocMarkdown,
|
|
3
|
+
resolvePageSkillMetadata
|
|
4
|
+
} from "./chunk-VC6OZXO5.js";
|
|
5
|
+
import {
|
|
6
|
+
canonicalizeToolNames
|
|
7
|
+
} from "./chunk-ZZ2MH7LE.js";
|
|
8
|
+
import {
|
|
9
|
+
asNonEmptyStringArray
|
|
10
|
+
} from "./chunk-I42VC5KR.js";
|
|
11
|
+
import {
|
|
12
|
+
asOptionalTrimmedString
|
|
13
|
+
} from "./chunk-G3SUCT4W.js";
|
|
14
|
+
|
|
15
|
+
// packages/ai/skills/referenceRuntime.ts
|
|
16
|
+
var joinUniqueStrings = (...groups) => Array.from(new Set(groups.flatMap((items) => asNonEmptyStringArray(items))));
|
|
17
|
+
var extractRuntimePageCapabilities = (content) => {
|
|
18
|
+
const meta = resolvePageSkillMetadata(content);
|
|
19
|
+
const directTools = asNonEmptyStringArray(content?.tools);
|
|
20
|
+
const skillConfig = meta?.skillConfig;
|
|
21
|
+
const skillTools = skillConfig?.toolNames ?? [];
|
|
22
|
+
const softSkillHints = asNonEmptyStringArray([
|
|
23
|
+
skillConfig?.name,
|
|
24
|
+
...meta?.recommendedSkills ?? []
|
|
25
|
+
]);
|
|
26
|
+
return {
|
|
27
|
+
directTools,
|
|
28
|
+
hardSkillKeys: meta?.requiredSkills ?? [],
|
|
29
|
+
softSkillKeys: meta?.recommendedSkills ?? [],
|
|
30
|
+
hardSkillTools: meta?.kind === "skill" ? skillTools : [],
|
|
31
|
+
softSkillHints,
|
|
32
|
+
promptPatches: skillConfig?.promptPatch ? [skillConfig.promptPatch] : [],
|
|
33
|
+
shouldUpgradeReference: directTools.length > 0 || meta?.kind === "skill" || !!skillConfig?.promptPatch
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
var buildSkillGuidancePromptBlock = (options) => {
|
|
37
|
+
const title = asOptionalTrimmedString(options.title) ?? "--- \u6280\u80FD\u63D0\u793A ---";
|
|
38
|
+
const recommendedSkillHints = joinUniqueStrings(options.recommendedSkillHints);
|
|
39
|
+
const skillPromptPatches = joinUniqueStrings(options.skillPromptPatches);
|
|
40
|
+
if (recommendedSkillHints.length === 0 && skillPromptPatches.length === 0) {
|
|
41
|
+
return "";
|
|
42
|
+
}
|
|
43
|
+
return [
|
|
44
|
+
title,
|
|
45
|
+
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")}` : "",
|
|
46
|
+
...skillPromptPatches
|
|
47
|
+
].filter(Boolean).join("\n");
|
|
48
|
+
};
|
|
49
|
+
var buildIdentifierCandidates = (identifier, contentByKey) => {
|
|
50
|
+
const trimmed = identifier.trim();
|
|
51
|
+
if (!trimmed || contentByKey.has(trimmed)) return trimmed;
|
|
52
|
+
const candidateToKey = /* @__PURE__ */ new Map();
|
|
53
|
+
for (const [key, page] of Array.from(contentByKey.entries())) {
|
|
54
|
+
const meta = resolvePageSkillMetadata(page);
|
|
55
|
+
for (const value of [key, page?.dbKey, page?.title, meta?.skillConfig?.id, meta?.skillConfig?.name]) {
|
|
56
|
+
const trimmedValue = asOptionalTrimmedString(value);
|
|
57
|
+
if (trimmedValue) {
|
|
58
|
+
candidateToKey.set(trimmedValue, key);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return candidateToKey.get(trimmed) ?? trimmed;
|
|
63
|
+
};
|
|
64
|
+
async function resolveSkillGraphFromRoots(options) {
|
|
65
|
+
const contentByKey = new Map(options.contentByKey ?? []);
|
|
66
|
+
const requiredTools = /* @__PURE__ */ new Set();
|
|
67
|
+
const recommendedTools = /* @__PURE__ */ new Set();
|
|
68
|
+
const recommendedSkillHints = /* @__PURE__ */ new Set();
|
|
69
|
+
const skillPromptPatches = /* @__PURE__ */ new Set();
|
|
70
|
+
const visits = [];
|
|
71
|
+
const visited = /* @__PURE__ */ new Set();
|
|
72
|
+
const loadPageCached = async (identifier) => {
|
|
73
|
+
const resolvedIdentifier = buildIdentifierCandidates(identifier, contentByKey);
|
|
74
|
+
if (!resolvedIdentifier) return null;
|
|
75
|
+
if (contentByKey.has(resolvedIdentifier)) {
|
|
76
|
+
return contentByKey.get(resolvedIdentifier) ?? null;
|
|
77
|
+
}
|
|
78
|
+
const page = await options.loadPage(resolvedIdentifier);
|
|
79
|
+
if (page) {
|
|
80
|
+
contentByKey.set(resolvedIdentifier, page);
|
|
81
|
+
if (page.dbKey) {
|
|
82
|
+
contentByKey.set(page.dbKey, page);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return page ?? null;
|
|
86
|
+
};
|
|
87
|
+
const visit = async (identifier, mode, sourceLabel) => {
|
|
88
|
+
const page = await loadPageCached(identifier);
|
|
89
|
+
if (!page?.dbKey) return;
|
|
90
|
+
const visitKey = `${mode}:${page.dbKey}`;
|
|
91
|
+
if (visited.has(visitKey)) return;
|
|
92
|
+
visited.add(visitKey);
|
|
93
|
+
const meta = resolvePageSkillMetadata(page);
|
|
94
|
+
const directTools = canonicalizeToolNames(page.tools ?? []);
|
|
95
|
+
const skillTools = canonicalizeToolNames(meta?.skillConfig?.toolNames ?? []);
|
|
96
|
+
const mergedTools = joinUniqueStrings(directTools, skillTools);
|
|
97
|
+
visits.push({
|
|
98
|
+
dbKey: page.dbKey,
|
|
99
|
+
title: page.title,
|
|
100
|
+
mode,
|
|
101
|
+
sourceLabel,
|
|
102
|
+
meta
|
|
103
|
+
});
|
|
104
|
+
if (mode === "required") {
|
|
105
|
+
mergedTools.forEach((toolName) => requiredTools.add(toolName));
|
|
106
|
+
if (meta?.skillConfig?.promptPatch) {
|
|
107
|
+
skillPromptPatches.add(meta.skillConfig.promptPatch);
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
mergedTools.forEach((toolName) => recommendedTools.add(toolName));
|
|
111
|
+
if (meta?.skillConfig?.name) {
|
|
112
|
+
recommendedSkillHints.add(meta.skillConfig.name);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const nextHard = meta?.requiredSkills ?? meta?.skillConfig?.requiredSkills ?? [];
|
|
116
|
+
const nextSoft = meta?.recommendedSkills ?? meta?.skillConfig?.recommendedSkills ?? [];
|
|
117
|
+
if (mode === "required") {
|
|
118
|
+
await Promise.all(nextHard.map((childKey) => visit(childKey, "required", page.dbKey)));
|
|
119
|
+
await Promise.all(nextSoft.map((childKey) => visit(childKey, "recommended", page.dbKey)));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
await Promise.all([...nextHard, ...nextSoft].map((childKey) => visit(childKey, "recommended", page.dbKey)));
|
|
123
|
+
};
|
|
124
|
+
await Promise.all(options.roots.map((root) => visit(root.identifier, root.mode, root.sourceLabel)));
|
|
125
|
+
return {
|
|
126
|
+
requiredTools: Array.from(requiredTools),
|
|
127
|
+
recommendedTools: Array.from(recommendedTools),
|
|
128
|
+
recommendedSkillHints: Array.from(recommendedSkillHints),
|
|
129
|
+
skillPromptPatches: Array.from(skillPromptPatches),
|
|
130
|
+
contentByKey,
|
|
131
|
+
visits
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// packages/ai/skills/codingSkills.ts
|
|
136
|
+
var CODING_SKILL_SLUGS = [
|
|
137
|
+
"coding",
|
|
138
|
+
"coding-review",
|
|
139
|
+
"coding-review-code-quality",
|
|
140
|
+
"coding-review-architecture",
|
|
141
|
+
"coding-review-security",
|
|
142
|
+
"coding-review-frontend-ux",
|
|
143
|
+
"coding-review-backend-data"
|
|
144
|
+
];
|
|
145
|
+
var CODING_ROOT_SKILL_SLUG = "coding";
|
|
146
|
+
function deterministicId(prefix, seed) {
|
|
147
|
+
let h = 2166136261;
|
|
148
|
+
for (let i = 0; i < seed.length; i++) {
|
|
149
|
+
h ^= seed.charCodeAt(i);
|
|
150
|
+
h = h * 16777619 >>> 0;
|
|
151
|
+
}
|
|
152
|
+
const suffix = h.toString(36).toUpperCase().padStart(14, "0");
|
|
153
|
+
return (prefix + suffix).slice(0, 26);
|
|
154
|
+
}
|
|
155
|
+
function normalizeSkillSeed(input) {
|
|
156
|
+
return input.trim().toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, "-").replace(/^-+|-+$/g, "");
|
|
157
|
+
}
|
|
158
|
+
function buildCodingSkillId(slug) {
|
|
159
|
+
return deterministicId("01SK", normalizeSkillSeed(slug) || slug);
|
|
160
|
+
}
|
|
161
|
+
function buildCodingSkillPageKey(userId, slug) {
|
|
162
|
+
return `page-${userId}-${buildCodingSkillId(slug)}`;
|
|
163
|
+
}
|
|
164
|
+
var CODING_ROOT_SKILL_ID = buildCodingSkillId(CODING_ROOT_SKILL_SLUG);
|
|
165
|
+
var CODING_SKILL_SEEDS = [
|
|
166
|
+
{
|
|
167
|
+
slug: "coding",
|
|
168
|
+
title: "coding",
|
|
169
|
+
description: "Root coding skill: methodology, code-modification discipline, and review discipline. Load this when the conversation turns to writing code.",
|
|
170
|
+
body: [
|
|
171
|
+
"# coding",
|
|
172
|
+
"",
|
|
173
|
+
"Root coding skill. Loaded by the agent when it decides to write code.",
|
|
174
|
+
"Children load via requiredSkills (review roles).",
|
|
175
|
+
"Until runtimes expand skill pages, Agent seed also carries a compiled snapshot."
|
|
176
|
+
].join("\n"),
|
|
177
|
+
triggerMode: "required",
|
|
178
|
+
requiredSkillSlugs: ["coding-review"],
|
|
179
|
+
toolNames: [
|
|
180
|
+
"readFile",
|
|
181
|
+
"writeFile",
|
|
182
|
+
"editFile",
|
|
183
|
+
"applyEdit",
|
|
184
|
+
"applyLineEdits",
|
|
185
|
+
"codeSearch",
|
|
186
|
+
"globFiles",
|
|
187
|
+
"searchFiles",
|
|
188
|
+
"listFiles",
|
|
189
|
+
"execShell",
|
|
190
|
+
"launchProcess",
|
|
191
|
+
"listProcesses",
|
|
192
|
+
"startAgentRun",
|
|
193
|
+
"controlAgentRun",
|
|
194
|
+
"listAgents"
|
|
195
|
+
],
|
|
196
|
+
promptPatch: [
|
|
197
|
+
"# \u5199\u4EE3\u7801\u7EAA\u5F8B",
|
|
198
|
+
"",
|
|
199
|
+
"## \u6548\u7387\u4F18\u5148\uFF08\u7701 token\uFF09",
|
|
200
|
+
"- \u4E0D\u590D\u8FF0\u9700\u6C42\uFF0C\u4E0D\u89E3\u91CA\u300C\u6253\u7B97\u600E\u4E48\u505A\u300D\uFF0C\u76F4\u63A5\u52A8\u624B\u3002\u6539\u5B8C\u53EA\u7528\u4E00\u4E24\u53E5\u8BDD\u8BF4\u6E05\u300C\u6539\u4E86\u4EC0\u4E48\u3001\u53BB\u54EA\u770B\u300D\u3002",
|
|
201
|
+
"- \u601D\u8003\u7B80\u77ED\uFF1A\u5B9A\u4F4D\u95EE\u9898\u5373\u53EF\uFF0C\u4E0D\u505A\u957F\u7BC7\u63A8\u6F14\u3002",
|
|
202
|
+
"- \u5C0F\u6539\u52A8\u8D70\u6700\u77ED\u8DEF\u5F84\uFF1AsearchFiles/globFiles \u5B9A\u4F4D \u2192 readFile \u786E\u8BA4 \u2192 editFile \u7CBE\u786E\u66FF\u6362\u3002\u80FD\u4E00\u6B21\u547D\u4E2D\u5C31\u4E0D\u8981\u53CD\u590D\u8BFB\u6587\u4EF6\u3002",
|
|
203
|
+
"- \u5DF2\u7ECF\u77E5\u9053\u6587\u4EF6\u548C\u4F4D\u7F6E\u65F6\uFF0C\u8DF3\u8FC7\u591A\u4F59\u7684 search/read\uFF0C\u76F4\u63A5 edit\u3002",
|
|
204
|
+
"- \u7981\u6B62\u4E3A\u4E00\u4E2A\u5C0F\u6539\u52A8\u6574\u9875\u91CD\u5199\u6216\u8FDE\u5E26\u6539\u52A8\u672A\u547D\u4E2D\u7684\u90E8\u5206\u3002",
|
|
205
|
+
"",
|
|
206
|
+
"## \u4EE3\u7801\u4FEE\u6539\u7EAA\u5F8B",
|
|
207
|
+
"- \u7F16\u8F91\u524D\u5148 readFile \u786E\u8BA4\u5F53\u524D\u5185\u5BB9\uFF0C\u907F\u514D stale hash \u9519\u8BEF\u3002",
|
|
208
|
+
"- \u53EA\u78B0\u4EFB\u52A1\u4E66\u5217\u51FA\u7684\u6587\u4EF6\uFF1B\u6539\u5B8C\u7528 `git status --short` \u81EA\u67E5\uFF0C\u82E5\u6539\u5230\u6E05\u5355\u5916\u6587\u4EF6\uFF0C\u5982\u5B9E\u62A5\u544A\u3002",
|
|
209
|
+
"- \u4E0D\u8981 `git add` / `git commit` / `git push` / `git stash` / `git reset` / `git checkout` / `git clean`\u2014\u2014\u6539\u52A8\u7559\u5728\u5DE5\u4F5C\u533A\uFF0C\u63D0\u4EA4\u7531\u8C03\u7528\u65B9\u9A8C\u6536\u540E\u5904\u7406\u3002",
|
|
210
|
+
"- \u53EA\u8DD1\u4EFB\u52A1\u91CC\u5217\u51FA\u7684\u6D4B\u8BD5\u6587\u4EF6\uFF0C\u4E0D\u8981\u8DD1 broader \u6D4B\u8BD5\u3002",
|
|
211
|
+
"",
|
|
212
|
+
"## Review \u7EAA\u5F8B\uFF08commit \u524D\u786C\u95E8\uFF09",
|
|
213
|
+
"- \u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\uFF08\u9519\u522B\u5B57/\u683C\u5F0F/CSS \u5FAE\u8C03\uFF09\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E**\u5176\u4ED6 agent**\uFF08\u4E0D\u540C\u6A21\u578B\u5BB6\u65CF\u4F18\u5148\uFF09review \u5DE5\u4F5C\u533A diff\uFF08`git diff`\uFF0C\u672A\u63D0\u4EA4\u7684\u6539\u52A8\uFF09\u3002reviewer \u4E0D\u53EF\u662F\u81EA\u5DF1\u3002\u65E0 review \u4E0D commit\u2014\u2014\u8FD9\u662F\u786C\u95E8\uFF0C\u4E0D\u662F\u5EFA\u8BAE\u3002",
|
|
214
|
+
"- \u6D3E\u53D1\u8D70 `startAgentRun(agentKey, task, { ephemeral: true })`\uFF08web/\u684C\u9762\u7AEF\u6CA1\u6709 nolo CLI\uFF0C\u6240\u6709 host \u90FD\u6709\u8FD9\u4E2A\u5DE5\u5177\uFF09\u3002ephemeral \u8BA9 review \u5B8C\u6210\u540E\u4E0D\u7559 dialog \u8BB0\u5F55\u3002",
|
|
215
|
+
"- task \u91CC\u5FC5\u987B\u5199\u660E\u5BA1\u67E5\u5BF9\u8C61\uFF08`git diff` \u770B\u5DE5\u4F5C\u533A\u6539\u52A8\uFF0C\u6216 `git diff alpha...HEAD` \u770B\u5DF2\u63D0\u4EA4\u6539\u52A8\uFF09\uFF0C\u5426\u5219 reviewer \u4E0D\u77E5\u9053\u5BA1\u4EC0\u4E48\u3002",
|
|
216
|
+
'- \u6309\u89D2\u8272\u52A0\u8F7D\u5BF9\u5E94 skill\uFF1Areviewer \u5148 `loadSkill("coding-review")` \u62FF\u901A\u7528\u6D41\u7A0B\uFF0C\u518D\u6309\u89D2\u8272 `loadSkill("coding-review-<role>")` \u62FF\u68C0\u67E5\u9879\u3002\u89D2\u8272\u6E05\u5355\uFF1Acode-quality\uFF08**\u5FC5\u8DD1**\uFF09/ architecture\uFF08**\u5355\u72EC\u6D3E\u53D1**\uFF0C\u4E2D\u7EA7\u4EE5\u4E0A\u95EE\u9898\uFF09/ security\uFF08\u6309\u9700 + \u5B89\u5168\u654F\u611F\u89E6\u53D1\u5FC5\u8DD1\uFF09/ frontend-ux\uFF08\u6D89\u53CA UI \u65F6\uFF09/ backend-data\uFF08\u6D89\u53CA server \u65F6\uFF09\u3002\u89D2\u8272\u5207\u5272\u7684\u76EE\u7684\u662F\u6CE8\u610F\u529B\u9694\u79BB\u2014\u2014\u6BCF\u4E2A\u89D2\u8272\u53EA\u76EF\u81EA\u5DF1\u7684\u68C0\u67E5\u9762\uFF0C\u6309\u9700\u542F\u7528\uFF0C\u907F\u514D\u4E00\u4E2A reviewer \u80CC\u6240\u6709\u89D2\u8272\u5BFC\u81F4\u6CE8\u610F\u529B\u7A00\u91CA\u3002',
|
|
217
|
+
"- Verdict \u6807\u51C6\uFF1AAPPROVE\uFF08\u65E0 CRITICAL \u6216 HIGH\uFF09\u2192 \u53EF commit\uFF1BWARNING\uFF08\u4EC5 HIGH\uFF09\u2192 \u62A5\u544A owner \u51B3\u5B9A\uFF1BBLOCK\uFF08\u6709 CRITICAL\uFF09\u2192 \u5FC5\u987B\u5148\u4FEE\u3002",
|
|
218
|
+
"- review \u53EF\u80FD\u591A\u8F6E\u6536\u655B\uFF08\u6709 finding\u2192\u4FEE\u2192\u518D\u5BA1\u2192\u76F4\u5230 APPROVE\uFF09\u3002\u6BCF\u8F6E review \u662F\u65E0\u4E0A\u4E0B\u6587\u7684\u2014\u2014reviewer \u53EA\u770B\u5F53\u524D\u5DE5\u4F5C\u533A diff\uFF0C\u4E0D\u5E26\u4E0A\u4E00\u8F6E finding \u8BB0\u5FC6\u3002",
|
|
219
|
+
"- \u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u3001\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\uFF0C\u5141\u8BB8\u5E26\u539F\u56E0\u8DF3\u8FC7\uFF08commit message \u6CE8\u660E [no-review: \u539F\u56E0]\uFF09\uFF0C\u4F46\u9ED8\u8BA4\u5FC5\u987B\u6D3E review\u3002"
|
|
220
|
+
].join("\n")
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
slug: "coding-review",
|
|
224
|
+
title: "coding-review",
|
|
225
|
+
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.",
|
|
226
|
+
body: [
|
|
227
|
+
"# coding-review",
|
|
228
|
+
"",
|
|
229
|
+
"Reviewer-side rule payload. Load this first, then load the matching role skill."
|
|
230
|
+
].join("\n"),
|
|
231
|
+
triggerMode: "required",
|
|
232
|
+
requiredSkillSlugs: [
|
|
233
|
+
"coding-review-code-quality",
|
|
234
|
+
"coding-review-architecture",
|
|
235
|
+
"coding-review-security",
|
|
236
|
+
"coding-review-frontend-ux",
|
|
237
|
+
"coding-review-backend-data"
|
|
238
|
+
],
|
|
239
|
+
promptPatch: [
|
|
240
|
+
"# Review \u901A\u7528\u6D41\u7A0B\uFF08\u5B8C\u6574\u7248\uFF09",
|
|
241
|
+
"",
|
|
242
|
+
"**\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",
|
|
243
|
+
"**\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",
|
|
244
|
+
"",
|
|
245
|
+
"## Review Dispatch Contract\uFF08\u89C4\u5212\u8005\u6D3E\u53D1\u524D\u8BFB\u53D6\uFF09",
|
|
246
|
+
"- 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",
|
|
247
|
+
"- \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",
|
|
248
|
+
"- \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",
|
|
249
|
+
"- \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",
|
|
250
|
+
"- \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",
|
|
251
|
+
"",
|
|
252
|
+
"## read-only \u884C\u4E3A\u7EA6\u675F",
|
|
253
|
+
"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",
|
|
254
|
+
"",
|
|
255
|
+
"## \u6D3E\u53D1\u4E0E\u5B8C\u6210\u6761\u4EF6",
|
|
256
|
+
"- \u4E00\u5F8B\u975E\u6301\u4E45\u5316\uFF08ephemeral\uFF09\u6D3E\u53D1\uFF0C\u5B8C\u6210\u540E\u4E0D\u7559 dialog \u8BB0\u5F55\uFF1A`startAgentRun(agentKey, task, { ephemeral: true })`\uFF1B\u5BBF\u4E3B\u5DE5\u5177\u4E0D\u53EF\u7528\u65F6\u7528 CLI \u5E26 `--ephemeral`\u3002",
|
|
257
|
+
"- \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",
|
|
258
|
+
"- \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",
|
|
259
|
+
"",
|
|
260
|
+
"## \u6D41\u7A0B",
|
|
261
|
+
"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",
|
|
262
|
+
"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",
|
|
263
|
+
"3. Context\uFF1A\u4E0D\u8981\u53EA\u770B hunk\uFF1B\u8BFB\u5468\u56F4\u5B9E\u73B0\u3001imports\u3001\u8C03\u7528\u65B9\u3002",
|
|
264
|
+
"4. Checklist\uFF1A\u6309\u89D2\u8272\u4ECE CRITICAL \u2192 LOW\uFF1B\u53EA\u62A5 >80% \u6709\u628A\u63E1\u7684\u771F\u5B9E\u95EE\u9898\u3002",
|
|
265
|
+
"5. Report\uFF1A\u4EA7\u51FA finding \u8868 + Verdict\uFF1B\u540C\u7C7B\u95EE\u9898\u5408\u5E76\u3002",
|
|
266
|
+
"",
|
|
267
|
+
"\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",
|
|
268
|
+
"",
|
|
269
|
+
"## Finding \u8D28\u91CF\u95E8\uFF08\u786C\u89C4\u5219\uFF0C\u6BCF\u6761 finding \u62A5\u51FA\u524D\u8FC7\u56DB\u95EE\uFF09",
|
|
270
|
+
"\u4EFB\u4E00\u7B54\u300C\u5426\u300D\u6216\u300C\u4E0D\u786E\u5B9A\u300D\u5219\u964D\u7EA7\u6216\u4E22\u5F03\uFF1A",
|
|
271
|
+
"1. \u80FD\u5F15\u7528\u786E\u5207\u884C\u53F7\uFF1F\uFF08\u6A21\u7CCA\u53D1\u73B0\u4E0D actionable\uFF09",
|
|
272
|
+
"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",
|
|
273
|
+
"3. \u80FD\u7ED9\u51FA\u5177\u4F53\u4FEE\u590D\u5EFA\u8BAE\uFF1F\uFF08\u4EE3\u7801\u7EA7\uFF0C\u4E0D\u662F\u9AD8\u5C42\u5EFA\u8BAE\uFF09",
|
|
274
|
+
"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",
|
|
275
|
+
"",
|
|
276
|
+
"## \u5047\u9633\u6027\u6E05\u5355\uFF08\u8FD9\u4E9B\u4E0D\u62A5\uFF09",
|
|
277
|
+
"- \u300C\u8003\u8651\u52A0\u9519\u8BEF\u5904\u7406\u300D\uFF1A\u5148\u67E5\u8C03\u7528\u65B9/\u6846\u67B6\u662F\u5426\u5DF2\u5904\u7406\u3002",
|
|
278
|
+
"- \u300C\u7F3A\u5C11\u8F93\u5165\u9A8C\u8BC1\u300D\uFF1A\u51FD\u6570\u662F\u5185\u90E8\u8C03\u7528\u4E14\u8C03\u7528\u65B9\u5DF2\u6821\u9A8C\u3002",
|
|
279
|
+
"- \u300C\u53EF\u80FD\u7A7A\u6307\u9488\u300D\uFF1A\u4E0A\u4E00\u884C\u5DF2\u7C7B\u578B\u6536\u7A84\u6216\u6709 if guard\u3002",
|
|
280
|
+
"- \u300C\u9B54\u6CD5\u6570\u5B57\u300D\uFF1AHTTP \u72B6\u6001\u7801\u30011000ms\u300160\u300124\u30011024 \u7B49\u5DF2\u77E5\u5E38\u91CF\u8DF3\u8FC7\u3002",
|
|
281
|
+
"- \u300CN+1 \u67E5\u8BE2\u300D\uFF1A\u56FA\u5B9A\u57FA\u6570\u5FAA\u73AF\u6216\u5DF2\u7528 DataLoader/batching \u4E0D\u7B97\u3002",
|
|
282
|
+
"- \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",
|
|
283
|
+
"- \u300C\u7F3A\u5C11 await\u300D\uFF1A\u6709\u610F fire-and-forget\uFF08\u65E5\u5FD7/\u6307\u6807/\u540E\u53F0\u961F\u5217\uFF09\u3002",
|
|
284
|
+
"- \u300C\u5E94\u8BE5\u7528 TypeScript\u300D\uFF1AJS-only \u6587\u4EF6\u4E0D\u62A5\u3002",
|
|
285
|
+
"- \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",
|
|
286
|
+
"- \u300C\u5B89\u5168\u620F\u300D\uFF1A\u975E\u5BC6\u7801\u5B66\u573A\u666F\u7684 `Math.random()` \u4E0D\u62A5\u3002",
|
|
287
|
+
"- \u300CPrefer const over let\u300D\uFF1A\u53D8\u91CF\u88AB\u91CD\u65B0\u8D4B\u503C\u65F6\u4E0D\u62A5\u3002",
|
|
288
|
+
"- \u300CMissing JSDoc\u300D\uFF1A\u5355\u7528\u9014\u5185\u90E8 helper \u4E14\u540D\u79F0+\u7B7E\u540D\u81EA\u89E3\u91CA\u7684\u4E0D\u62A5\u3002",
|
|
289
|
+
"- \u300C\u5E94\u52A0 useMemo/useCallback\u300D\uFF1AReact Compiler \u8DEF\u5F84\u9ED8\u8BA4\u4E0D\u62A5\u3002",
|
|
290
|
+
"",
|
|
291
|
+
"## AI \u751F\u6210\u4EE3\u7801 review \u5173\u6CE8\u70B9\uFF08\u6240\u6709\u89D2\u8272\u901A\u7528\uFF09",
|
|
292
|
+
"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",
|
|
293
|
+
"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",
|
|
294
|
+
"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**",
|
|
295
|
+
"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",
|
|
296
|
+
"> \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",
|
|
297
|
+
"",
|
|
298
|
+
"## \u8F93\u51FA\u683C\u5F0F",
|
|
299
|
+
"\u6309\u4E25\u91CD\u5EA6\u7EC4\u7EC7\uFF0C\u6BCF\u6761 finding\uFF1A",
|
|
300
|
+
"`[CRITICAL] \u6807\u9898` / `File: path/to/file.ts:42` / `Issue: \u5177\u4F53\u95EE\u9898` / `Fix: \u4EE3\u7801\u7EA7\u4FEE\u590D\u5EFA\u8BAE`",
|
|
301
|
+
"",
|
|
302
|
+
"### \u7ED3\u5C3E\u5FC5\u987B\u5E26 Summary",
|
|
303
|
+
"```",
|
|
304
|
+
"## Review Summary",
|
|
305
|
+
"| Severity | Count | Status |",
|
|
306
|
+
"|----------|-------|--------|",
|
|
307
|
+
"| CRITICAL | 0 | pass |",
|
|
308
|
+
"| HIGH | 2 | warn |",
|
|
309
|
+
"| MEDIUM | 3 | info |",
|
|
310
|
+
"| LOW | 1 | note |",
|
|
311
|
+
"",
|
|
312
|
+
"Verdict: APPROVE / WARNING / BLOCK",
|
|
313
|
+
"```",
|
|
314
|
+
"- APPROVE\uFF1A\u65E0 CRITICAL \u6216 HIGH\uFF0C\u542B\u96F6 finding \u5E72\u51C0 review\uFF1BWARNING\uFF1A\u4EC5 HIGH\uFF1BBLOCK\uFF1A\u6709 CRITICAL\u3002",
|
|
315
|
+
"\u4E0D\u8981\u4E3A\u4E86\u663E\u5F97\u4E25\u683C\u800C\u62D2\u7EDD\u6279\u51C6\u3002diff \u5E72\u51C0\u5C31 APPROVE\u3002"
|
|
316
|
+
].join("\n")
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
slug: "coding-review-code-quality",
|
|
320
|
+
title: "coding-review-code-quality",
|
|
321
|
+
description: "Code-quality review role: readability, maintainability, composability, duplication, deletability, missing tests, dead code, in-place mutation. **Mandatory role** \u2014 always dispatched, never skipped.",
|
|
322
|
+
body: [
|
|
323
|
+
"# coding-review-code-quality",
|
|
324
|
+
"",
|
|
325
|
+
"Code-quality review role. Mandatory \u2014 always dispatched."
|
|
326
|
+
].join("\n"),
|
|
327
|
+
triggerMode: "required",
|
|
328
|
+
promptPatch: [
|
|
329
|
+
"# \u4EE3\u7801\u8D28\u91CF\u68C0\u67E5\u9879\uFF08\u5FC5\u8DD1\uFF09",
|
|
330
|
+
"",
|
|
331
|
+
"### \u53EF\u8BFB\u6027",
|
|
332
|
+
"- \u4E4B\u540E\u7684 AI / \u65B0\u4EBA\u80FD\u5426\u770B\u61C2\u8FD9\u6BB5\u4EE3\u7801\uFF1F\u547D\u540D\u662F\u5426\u81EA\u89E3\u91CA\uFF1F",
|
|
333
|
+
"- \u662F\u5426\u5BB9\u6613\u641C\u7D22\uFF08\u51FD\u6570/\u53D8\u91CF\u540D\u662F\u5426\u7528\u8BCD\u51C6\u786E\u3001\u53EF grep \u5230\uFF09\uFF1F",
|
|
334
|
+
"- \u63A7\u5236\u6D41\u662F\u5426\u6E05\u6670\uFF0C\u6709\u6CA1\u6709\u7ED5\u5F2F\u7684\u5199\u6CD5\uFF1F",
|
|
335
|
+
"",
|
|
336
|
+
"### \u53EF\u7EF4\u62A4\u6027",
|
|
337
|
+
"- \u5047\u8BBE\u4E4B\u540E\u8981\u5220\u9664\u6216\u6539\u52A8\u8FD9\u4E2A\u529F\u80FD\uFF0C\u662F\u5426\u5BB9\u6613\u6539\uFF1F",
|
|
338
|
+
"- \u6539\u52A8\u662F\u5426\u88AB\u786C\u7F16\u7801/\u9B54\u6CD5\u503C/\u6563\u843D\u7684\u91CD\u590D\u903B\u8F91\u9501\u6B7B\uFF1F",
|
|
339
|
+
"- \u662F\u5426\u8FC7\u5EA6\u8026\u5408\uFF0C\u6539\u4E00\u5904\u8981\u8FDE\u5E26\u6539\u591A\u5904\uFF1F",
|
|
340
|
+
"",
|
|
341
|
+
"### \u53EF\u7EC4\u5408\u6027",
|
|
342
|
+
"- \u662F\u5426\u51FD\u6570\u5F0F\u3001\u7EAF\u51FD\u6570\u4F18\u5148\uFF1F\u526F\u4F5C\u7528\u662F\u5426\u9694\u79BB\uFF1F",
|
|
343
|
+
"- \u65B0\u529F\u80FD\u80FD\u5426\u590D\u7528\u5DF2\u6709\u51FD\u6570\uFF0C\u800C\u4E0D\u662F\u590D\u5236\u7C98\u8D34\u518D\u6539\uFF1F",
|
|
344
|
+
"- \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",
|
|
345
|
+
"",
|
|
346
|
+
"### \u91CD\u590D\u6027",
|
|
347
|
+
"- \u662F\u5426\u6709\u76F8\u540C\u4EE3\u7801\u5728\u5E72\u76F8\u540C\u4E8B\u60C5\uFF08DRY\uFF09\uFF1F",
|
|
348
|
+
"- \u80FD\u5426\u62BD\u53D6\u4E3A\u540C\u4E00\u4E2A\u51FD\u6570/\u5DE5\u5177\uFF0C\u800C\u4E0D\u662F\u591A\u5904\u5404\u5199\u4E00\u4EFD\uFF1F",
|
|
349
|
+
"- \u6CE8\u610F\uFF1A\u91CD\u590D\u7684**\u6D4B\u8BD5** fixture \u4E0D\u7B97\u3002",
|
|
350
|
+
"",
|
|
351
|
+
"### \u53EF\u5220\u9664\u6027",
|
|
352
|
+
"- \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",
|
|
353
|
+
"- \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",
|
|
354
|
+
"",
|
|
355
|
+
"### \u5176\u4ED6",
|
|
356
|
+
"- \u65B0\u4EE3\u7801\u8DEF\u5F84\u660E\u663E\u7F3A\u6D4B\u8BD5\uFF08\u6709\u53EF\u6D4B\u884C\u4E3A\u5374\u65E0\u5BF9\u5E94\u7528\u4F8B\uFF09",
|
|
357
|
+
"- \u539F\u5730 mutation\uFF08\u5E94 immutable \u66F4\u65B0\u65F6\uFF09"
|
|
358
|
+
].join("\n")
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
slug: "coding-review-architecture",
|
|
362
|
+
title: "coding-review-architecture",
|
|
363
|
+
description: "Architecture review role: design boundaries, circular deps, maintainability, second source of truth, API compatibility, file/function size. **Dispatch separately** for mid-level+ issues.",
|
|
364
|
+
body: [
|
|
365
|
+
"# coding-review-architecture",
|
|
366
|
+
"",
|
|
367
|
+
"Architecture review role. Dispatch separately for mid-level+ issues."
|
|
368
|
+
].join("\n"),
|
|
369
|
+
triggerMode: "required",
|
|
370
|
+
promptPatch: [
|
|
371
|
+
"# \u67B6\u6784\u5BA1\u8BA1\u5458\u68C0\u67E5\u9879",
|
|
372
|
+
"",
|
|
373
|
+
"- \u8BBE\u8BA1\u8FB9\u754C\uFF08\u65B0\u589E\u8026\u5408\u662F\u5426\u5408\u7406\uFF09",
|
|
374
|
+
"- \u5FAA\u73AF\u4F9D\u8D56",
|
|
375
|
+
"- \u53EF\u7EF4\u62A4\u6027\uFF08\u662F\u5426\u8FC7\u5EA6\u5DE5\u7A0B\u3001\u5355\u5B9E\u73B0\u62BD\u8C61\u3001\u65E0\u4EBA config\uFF09",
|
|
376
|
+
"- \u662F\u5426\u4E0E\u73B0\u6709\u62BD\u8C61\u91CD\u590D\uFF08**\u5236\u9020\u7B2C\u4E8C\u4EFD\u771F\u503C**\uFF09",
|
|
377
|
+
"- API \u517C\u5BB9\u6027\uFF08\u7B7E\u540D\u53D8\u66F4\u662F\u5426\u7834\u574F\u8C03\u7528\u65B9\uFF09",
|
|
378
|
+
"- \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"
|
|
379
|
+
].join("\n")
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
slug: "coding-review-security",
|
|
383
|
+
title: "coding-review-security",
|
|
384
|
+
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.",
|
|
385
|
+
body: [
|
|
386
|
+
"# coding-review-security",
|
|
387
|
+
"",
|
|
388
|
+
"Security review role. On-demand + mandatory on security-sensitive diffs."
|
|
389
|
+
].join("\n"),
|
|
390
|
+
triggerMode: "required",
|
|
391
|
+
promptPatch: [
|
|
392
|
+
"# \u5B89\u5168\u5BA1\u8BA1\u5458\u68C0\u67E5\u9879",
|
|
393
|
+
"",
|
|
394
|
+
"- \u786C\u7F16\u7801\u51ED\u8BC1\uFF08API key/password/token/connection string in source\uFF09",
|
|
395
|
+
"- SQL \u6CE8\u5165\uFF08\u5B57\u7B26\u4E32\u62FC\u63A5 vs \u53C2\u6570\u5316\u67E5\u8BE2\uFF09",
|
|
396
|
+
"- XSS\uFF08\u672A\u8F6C\u4E49\u7684\u7528\u6237\u8F93\u5165\u6E32\u67D3\u5230 HTML/JSX\uFF09",
|
|
397
|
+
"- \u8DEF\u5F84\u7A7F\u8D8A\uFF08\u7528\u6237\u63A7\u5236\u7684\u6587\u4EF6\u8DEF\u5F84\u672A\u6D88\u6BD2\uFF09",
|
|
398
|
+
"- CSRF\uFF08\u72B6\u6001\u53D8\u66F4\u7AEF\u70B9\u7F3A CSRF \u4FDD\u62A4\uFF09",
|
|
399
|
+
"- \u8BA4\u8BC1\u7ED5\u8FC7\uFF08\u53D7\u4FDD\u62A4\u8DEF\u7531\u7F3A auth \u68C0\u67E5\uFF09",
|
|
400
|
+
"- \u65E5\u5FD7\u6CC4\u9732\u654F\u611F\u6570\u636E\uFF08token/password/PII \u51FA\u73B0\u5728\u65E5\u5FD7\u91CC\uFF09",
|
|
401
|
+
"- \u5DF2\u77E5\u8106\u5F31\u4F9D\u8D56\uFF08\u82E5 diff \u5347\u7EA7\u4E86\u6709\u516C\u5F00 CVE \u7684\u5305\u4E14\u53EF\u8BC1\u5B9E\uFF09",
|
|
402
|
+
"- \u9519\u8BEF\u4FE1\u606F\u628A\u5185\u90E8\u5806\u6808/\u5BC6\u94A5\u7EC6\u8282\u8FD4\u56DE\u7ED9\u5BA2\u6237\u7AEF",
|
|
403
|
+
"",
|
|
404
|
+
"## \u5B89\u5168\u654F\u611F\u89E6\u53D1\uFF08\u5FC5\u8DD1\uFF09",
|
|
405
|
+
"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",
|
|
406
|
+
"- \u8BA4\u8BC1 / \u6388\u6743 / session / token",
|
|
407
|
+
"- \u7528\u6237\u8F93\u5165\u8FDB\u5165\u67E5\u8BE2\u3001HTML\u3001shell\u3001\u6587\u4EF6\u8DEF\u5F84",
|
|
408
|
+
"- \u652F\u4ED8 / \u8BA1\u8D39 / \u914D\u989D",
|
|
409
|
+
"- \u5BC6\u94A5\u3001\u51ED\u8BC1\u3001`.env`\u3001\u5BC6\u94A5\u5B58\u50A8",
|
|
410
|
+
"- \u6587\u4EF6\u7CFB\u7EDF\u8BFB\u5199\u3001\u4EFB\u610F URL fetch\uFF08SSRF \u9762\uFF09"
|
|
411
|
+
].join("\n")
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
slug: "coding-review-frontend-ux",
|
|
415
|
+
title: "coding-review-frontend-ux",
|
|
416
|
+
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.",
|
|
417
|
+
body: [
|
|
418
|
+
"# coding-review-frontend-ux",
|
|
419
|
+
"",
|
|
420
|
+
"Frontend/UX review role. On-demand when diff touches UI."
|
|
421
|
+
].join("\n"),
|
|
422
|
+
triggerMode: "required",
|
|
423
|
+
promptPatch: [
|
|
424
|
+
"# \u524D\u7AEF / UX \u68C0\u67E5\u9879\uFF08\u6D89\u53CA `packages/**` UI \u65F6\uFF09",
|
|
425
|
+
"",
|
|
426
|
+
"### \u524D\u7AEF / React",
|
|
427
|
+
"- \u53EF\u91CD\u6392\u5217\u8868\u7528 index \u5F53 key",
|
|
428
|
+
"- render \u671F\u95F4 setState",
|
|
429
|
+
"- \u7F3A loading/error/empty\uFF0C\u6613 stuck",
|
|
430
|
+
"- \u4E8B\u4EF6\u5904\u7406\u5668\u660E\u663E stale closure\uFF08\u6709\u8BC1\u636E\u518D\u62A5\uFF09",
|
|
431
|
+
"- \u786C\u7F16\u7801\u7528\u6237\u53EF\u89C1\u6587\u6848\uFF08\u5E94\u8D70 i18n\uFF09",
|
|
432
|
+
"",
|
|
433
|
+
"### \u7528\u6237\u4F53\u9A8C",
|
|
434
|
+
"- i18n\uFF08\u786C\u7F16\u7801\u7528\u6237\u53EF\u89C1\u5B57\u7B26\u4E32\uFF09",
|
|
435
|
+
"- stuck state\uFF08loading/error/empty \u72B6\u6001\u662F\u5426\u8986\u76D6\uFF09",
|
|
436
|
+
"- error handling\uFF08\u7528\u6237\u53EF\u89C1\u9519\u8BEF\u662F\u5426\u53CB\u597D\u4E14\u4E0D\u6CC4\u9732\u5185\u90E8\u7EC6\u8282\uFF09",
|
|
437
|
+
"- \u53EF\u8BBF\u95EE\u6027\uFF08ARIA\u3001\u952E\u76D8\u5BFC\u822A\u3001\u8BED\u4E49 HTML\uFF09"
|
|
438
|
+
].join("\n")
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
slug: "coding-review-backend-data",
|
|
442
|
+
title: "coding-review-backend-data",
|
|
443
|
+
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.",
|
|
444
|
+
body: [
|
|
445
|
+
"# coding-review-backend-data",
|
|
446
|
+
"",
|
|
447
|
+
"Backend/data-integrity review role. On-demand when diff touches server."
|
|
448
|
+
].join("\n"),
|
|
449
|
+
triggerMode: "required",
|
|
450
|
+
promptPatch: [
|
|
451
|
+
"# \u540E\u7AEF / \u6570\u636E\u5B8C\u6574\u6027\u68C0\u67E5\u9879\uFF08\u6D89\u53CA server/cli/handlers \u65F6\uFF09",
|
|
452
|
+
"",
|
|
453
|
+
"### \u540E\u7AEF / API",
|
|
454
|
+
"- \u8BF7\u6C42\u4F53/\u53C2\u6570\u672A\u6821\u9A8C\u5373\u4F7F\u7528",
|
|
455
|
+
"- \u9762\u5411\u7528\u6237\u7684\u67E5\u8BE2\u65E0 LIMIT / \u65E0\u754C\u626B\u63CF",
|
|
456
|
+
"- \u5916\u90E8 HTTP/DB \u8C03\u7528\u7F3A timeout",
|
|
457
|
+
"- \u516C\u5F00\u7AEF\u70B9\u7F3A\u5408\u7406\u9650\u6D41\uFF08\u82E5\u8BE5\u9762\u672C\u5E94\u6709\uFF09",
|
|
458
|
+
"- CORS / \u8DE8\u6E90\u7B56\u7565\u660E\u663E\u8FC7\u5BBD\u4E14\u5728\u672C\u6B21 diff \u5F15\u5165",
|
|
459
|
+
"",
|
|
460
|
+
"### \u6570\u636E\u5B8C\u6574\u6027",
|
|
461
|
+
"- \u5E42\u7B49\u6027\uFF08\u91CD\u590D\u8C03\u7528\u662F\u5426\u5B89\u5168\uFF09",
|
|
462
|
+
"- \u7ADE\u6001\u6761\u4EF6\uFF08TOCTOU\u3001\u5E76\u53D1\u5199\u3001\u7F3A\u9501\uFF09",
|
|
463
|
+
"- \u4E8B\u52A1\u539F\u5B50\u6027\uFF08\u90E8\u5206\u5931\u8D25\u662F\u5426\u56DE\u6EDA\uFF09",
|
|
464
|
+
"- \u6570\u636E\u4E22\u5931\u98CE\u9669\uFF08\u5220\u9664\u8DEF\u5F84\u3001\u8D26\u53F7\u5207\u6362\u3001\u8FC1\u79FB\uFF09",
|
|
465
|
+
"- \u8DE8\u8FB9\u754C\u6CC4\u6F0F\uFF08\u5185\u90E8 ID/\u72B6\u6001\u66B4\u9732\u5230\u5916\u90E8 API\uFF09",
|
|
466
|
+
"",
|
|
467
|
+
"### \u9759\u9ED8\u5931\u8D25",
|
|
468
|
+
"- \u7A7A catch \u5757\uFF08`catch {}` \u6216\u5FFD\u7565\u5F02\u5E38\uFF09",
|
|
469
|
+
"- \u5371\u9669\u964D\u7EA7\uFF08`.catch(() => [])`\u3001\u9ED8\u8BA4\u503C\u63A9\u76D6\u771F\u5B9E\u5931\u8D25\uFF09",
|
|
470
|
+
"- \u4E22\u5931\u5806\u6808\uFF08generic rethrow\u3001\u7F3A async \u5904\u7406\uFF09",
|
|
471
|
+
"- \u7F3A\u8D85\u65F6\uFF08\u5916\u90E8 HTTP/DB \u8C03\u7528\u65E0 timeout\uFF09",
|
|
472
|
+
"- \u7F3A\u56DE\u6EDA\uFF08\u4E8B\u52A1\u6027\u64CD\u4F5C\u5931\u8D25\u540E\u4E0D\u56DE\u6EDA\uFF09",
|
|
473
|
+
"- log-and-forget\uFF08\u8BB0\u4E86\u65E5\u5FD7\u4F46\u6CA1\u4F20\u64AD\u9519\u8BEF\uFF09",
|
|
474
|
+
"- \u5408\u5E76\u524D\u9057\u7559\u7684 `console.log` / \u8C03\u8BD5\u6B8B\u7559\uFF08\u6D4B\u8BD5/\u811A\u672C\u9664\u5916\uFF09"
|
|
475
|
+
].join("\n")
|
|
476
|
+
}
|
|
477
|
+
];
|
|
478
|
+
function seedBySlug(slug) {
|
|
479
|
+
const seed = CODING_SKILL_SEEDS.find((item) => item.slug === slug);
|
|
480
|
+
if (!seed) {
|
|
481
|
+
throw new Error(`Unknown Coding skill slug: ${slug}`);
|
|
482
|
+
}
|
|
483
|
+
return seed;
|
|
484
|
+
}
|
|
485
|
+
function collectCodingReachableSkillSlugs(rootSlug = CODING_ROOT_SKILL_SLUG) {
|
|
486
|
+
const ordered = [];
|
|
487
|
+
const seen = /* @__PURE__ */ new Set();
|
|
488
|
+
const visit = (slug) => {
|
|
489
|
+
if (seen.has(slug)) return;
|
|
490
|
+
seen.add(slug);
|
|
491
|
+
ordered.push(slug);
|
|
492
|
+
for (const child of seedBySlug(slug).requiredSkillSlugs ?? []) {
|
|
493
|
+
visit(child);
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
visit(rootSlug);
|
|
497
|
+
return ordered;
|
|
498
|
+
}
|
|
499
|
+
function compileCodingEffectiveTools() {
|
|
500
|
+
const tools = [];
|
|
501
|
+
const seen = /* @__PURE__ */ new Set();
|
|
502
|
+
for (const slug of collectCodingReachableSkillSlugs()) {
|
|
503
|
+
for (const toolName of seedBySlug(slug).toolNames ?? []) {
|
|
504
|
+
if (seen.has(toolName)) continue;
|
|
505
|
+
seen.add(toolName);
|
|
506
|
+
tools.push(toolName);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return tools;
|
|
510
|
+
}
|
|
511
|
+
function compileCodingEffectivePromptPatches() {
|
|
512
|
+
const patches = [];
|
|
513
|
+
for (const slug of collectCodingReachableSkillSlugs()) {
|
|
514
|
+
const patch = seedBySlug(slug).promptPatch;
|
|
515
|
+
if (patch) patches.push(patch);
|
|
516
|
+
}
|
|
517
|
+
return patches;
|
|
518
|
+
}
|
|
519
|
+
var CODING_COMPILED_EFFECTIVE_TOOLS = compileCodingEffectiveTools();
|
|
520
|
+
function buildCodingSkillConfig(slug, options) {
|
|
521
|
+
const seed = seedBySlug(slug);
|
|
522
|
+
const requiredSkills = options?.requiredSkills ?? seed.requiredSkillSlugs?.map((childSlug) => buildCodingSkillId(childSlug));
|
|
523
|
+
return {
|
|
524
|
+
version: "0.1",
|
|
525
|
+
kind: "skill",
|
|
526
|
+
id: buildCodingSkillId(slug),
|
|
527
|
+
name: seed.title,
|
|
528
|
+
description: seed.description,
|
|
529
|
+
...seed.triggerMode ? { triggerMode: seed.triggerMode } : {},
|
|
530
|
+
...seed.toolNames?.length ? { toolNames: [...seed.toolNames] } : {},
|
|
531
|
+
...requiredSkills?.length ? { requiredSkills: [...requiredSkills] } : {},
|
|
532
|
+
...seed.promptPatch ? { promptPatch: seed.promptPatch } : {}
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
function buildCodingSkillPageRecords(userId) {
|
|
536
|
+
const trimmedUserId = userId.trim();
|
|
537
|
+
if (!trimmedUserId) {
|
|
538
|
+
throw new Error("buildCodingSkillPageRecords requires userId");
|
|
539
|
+
}
|
|
540
|
+
return CODING_SKILL_SEEDS.map((seed) => {
|
|
541
|
+
const skillId = buildCodingSkillId(seed.slug);
|
|
542
|
+
const dbKey = buildCodingSkillPageKey(trimmedUserId, seed.slug);
|
|
543
|
+
const requiredSkills = seed.requiredSkillSlugs?.map(
|
|
544
|
+
(childSlug) => buildCodingSkillPageKey(trimmedUserId, childSlug)
|
|
545
|
+
);
|
|
546
|
+
const skillConfig = buildCodingSkillConfig(seed.slug, {
|
|
547
|
+
requiredSkills
|
|
548
|
+
});
|
|
549
|
+
return {
|
|
550
|
+
slug: seed.slug,
|
|
551
|
+
skillId,
|
|
552
|
+
dbKey,
|
|
553
|
+
title: seed.title,
|
|
554
|
+
content: buildSkillDocMarkdown({
|
|
555
|
+
body: seed.body,
|
|
556
|
+
skillConfig
|
|
557
|
+
}),
|
|
558
|
+
meta: {
|
|
559
|
+
kind: "skill",
|
|
560
|
+
skillConfig
|
|
561
|
+
},
|
|
562
|
+
...skillConfig.toolNames?.length ? { tools: [...skillConfig.toolNames] } : {}
|
|
563
|
+
};
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
function buildCodingRootSkillReference(userId) {
|
|
567
|
+
return {
|
|
568
|
+
dbKey: buildCodingSkillPageKey(userId, CODING_ROOT_SKILL_SLUG),
|
|
569
|
+
title: CODING_ROOT_SKILL_SLUG,
|
|
570
|
+
type: "instruction"
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
function buildCodingSkillContentBySlug(slug) {
|
|
574
|
+
const seed = seedBySlug(slug);
|
|
575
|
+
const skillConfig = buildCodingSkillConfig(slug);
|
|
576
|
+
return buildSkillDocMarkdown({
|
|
577
|
+
body: seed.body,
|
|
578
|
+
skillConfig
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
var CODING_ROOT_SKILL_REFERENCE = {
|
|
582
|
+
dbKey: CODING_ROOT_SKILL_ID,
|
|
583
|
+
title: CODING_ROOT_SKILL_SLUG,
|
|
584
|
+
type: "instruction"
|
|
585
|
+
};
|
|
586
|
+
function resolveCodingBuiltinSlug(requestedName) {
|
|
587
|
+
const found = CODING_SKILL_SLUGS.find((slug) => slug === requestedName);
|
|
588
|
+
return found ?? null;
|
|
589
|
+
}
|
|
590
|
+
function buildCodingSkillContentByKey(userId) {
|
|
591
|
+
const contentByKey = /* @__PURE__ */ new Map();
|
|
592
|
+
for (const page of buildCodingSkillPageRecords(userId)) {
|
|
593
|
+
const runtimePage = {
|
|
594
|
+
dbKey: page.dbKey,
|
|
595
|
+
title: page.title,
|
|
596
|
+
content: page.content,
|
|
597
|
+
meta: page.meta,
|
|
598
|
+
tools: page.tools
|
|
599
|
+
};
|
|
600
|
+
contentByKey.set(page.dbKey, runtimePage);
|
|
601
|
+
contentByKey.set(page.skillId, runtimePage);
|
|
602
|
+
contentByKey.set(page.slug, runtimePage);
|
|
603
|
+
}
|
|
604
|
+
return contentByKey;
|
|
605
|
+
}
|
|
606
|
+
async function resolveCodingEffectiveTools(userId) {
|
|
607
|
+
const contentByKey = buildCodingSkillContentByKey(userId);
|
|
608
|
+
const resolved = await resolveSkillGraphFromRoots({
|
|
609
|
+
roots: [{ identifier: CODING_ROOT_SKILL_ID, mode: "required" }],
|
|
610
|
+
contentByKey,
|
|
611
|
+
loadPage: async (identifier) => contentByKey.get(identifier) ?? null
|
|
612
|
+
});
|
|
613
|
+
return resolved.requiredTools;
|
|
614
|
+
}
|
|
615
|
+
function ensureCodingSkills(userId) {
|
|
616
|
+
return async (dispatch) => {
|
|
617
|
+
const { readAndWait, write } = await import("./dbSlice-CGSRFJN3.js");
|
|
618
|
+
const { DataType } = await import("./types-ZSTJ7MPR.js");
|
|
619
|
+
const now = Date.now();
|
|
620
|
+
const pages = buildCodingSkillPageRecords(userId);
|
|
621
|
+
for (const page of pages) {
|
|
622
|
+
try {
|
|
623
|
+
const existing = await dispatch(readAndWait(page.dbKey)).unwrap().catch(() => null);
|
|
624
|
+
if (!existing) {
|
|
625
|
+
await dispatch(
|
|
626
|
+
write({
|
|
627
|
+
data: {
|
|
628
|
+
id: page.skillId,
|
|
629
|
+
dbKey: page.dbKey,
|
|
630
|
+
type: DataType.DOC,
|
|
631
|
+
userId,
|
|
632
|
+
title: page.title,
|
|
633
|
+
content: page.content,
|
|
634
|
+
created: new Date(now).toISOString(),
|
|
635
|
+
createdAt: now,
|
|
636
|
+
updatedAt: String(now)
|
|
637
|
+
},
|
|
638
|
+
customKey: page.dbKey
|
|
639
|
+
})
|
|
640
|
+
).unwrap();
|
|
641
|
+
}
|
|
642
|
+
} catch {
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
export {
|
|
649
|
+
extractRuntimePageCapabilities,
|
|
650
|
+
buildSkillGuidancePromptBlock,
|
|
651
|
+
resolveSkillGraphFromRoots,
|
|
652
|
+
CODING_SKILL_SLUGS,
|
|
653
|
+
CODING_ROOT_SKILL_SLUG,
|
|
654
|
+
buildCodingSkillId,
|
|
655
|
+
buildCodingSkillPageKey,
|
|
656
|
+
CODING_ROOT_SKILL_ID,
|
|
657
|
+
CODING_SKILL_SEEDS,
|
|
658
|
+
collectCodingReachableSkillSlugs,
|
|
659
|
+
compileCodingEffectiveTools,
|
|
660
|
+
compileCodingEffectivePromptPatches,
|
|
661
|
+
CODING_COMPILED_EFFECTIVE_TOOLS,
|
|
662
|
+
buildCodingSkillConfig,
|
|
663
|
+
buildCodingSkillPageRecords,
|
|
664
|
+
buildCodingRootSkillReference,
|
|
665
|
+
buildCodingSkillContentBySlug,
|
|
666
|
+
CODING_ROOT_SKILL_REFERENCE,
|
|
667
|
+
resolveCodingBuiltinSlug,
|
|
668
|
+
buildCodingSkillContentByKey,
|
|
669
|
+
resolveCodingEffectiveTools,
|
|
670
|
+
ensureCodingSkills
|
|
671
|
+
};
|