@vobs/cli 1.8.5 → 1.8.6
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/dist/cli.cjs +219 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +219 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent-doc.cjs +240 -0
- package/dist/commands/agent-doc.cjs.map +1 -0
- package/dist/commands/agent-doc.d.cts +13 -0
- package/dist/commands/agent-doc.d.ts +13 -0
- package/dist/commands/agent-doc.js +216 -0
- package/dist/commands/agent-doc.js.map +1 -0
- package/dist/index.cjs +219 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +219 -0
- package/dist/index.js.map +1 -1
- package/dist/start.cjs +219 -0
- package/dist/start.cjs.map +1 -1
- package/dist/start.js +219 -0
- package/dist/start.js.map +1 -1
- package/dist/templates/agent-contract.cjs +139 -0
- package/dist/templates/agent-contract.cjs.map +1 -0
- package/dist/templates/agent-contract.d.cts +14 -0
- package/dist/templates/agent-contract.d.ts +14 -0
- package/dist/templates/agent-contract.js +113 -0
- package/dist/templates/agent-contract.js.map +1 -0
- package/dist/templates/agent-contract.md +107 -0
- package/package.json +1 -1
- package/src/cli.ts +17 -1
- package/src/commands/agent-doc.test.ts +151 -0
- package/src/commands/agent-doc.ts +142 -0
- package/src/templates/agent-contract.md +107 -0
- package/src/templates/agent-contract.ts +119 -0
package/dist/start.js
CHANGED
|
@@ -1171,6 +1171,216 @@ async function checkCommand(options = {}) {
|
|
|
1171
1171
|
}
|
|
1172
1172
|
__name(checkCommand, "checkCommand");
|
|
1173
1173
|
|
|
1174
|
+
// packages/cli/src/commands/agent-doc.ts
|
|
1175
|
+
import { existsSync as existsSync4, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "fs";
|
|
1176
|
+
import { resolve as resolve6 } from "path";
|
|
1177
|
+
|
|
1178
|
+
// packages/cli/src/templates/agent-contract.ts
|
|
1179
|
+
var AGENT_CONTRACT = `# vobs \u6846\u67B6\u5951\u7EA6\uFF08\u5199\u4EE3\u7801\u524D\u5FC5\u8BFB\uFF09
|
|
1180
|
+
|
|
1181
|
+
vobs \u662F**\u7F16\u8BD1\u578B / \u7EC6\u7C92\u5EA6 / \u54CD\u5E94\u5F0F**\u6846\u67B6\uFF0C\u4E0E React \u7684\u5FC3\u667A\u6A21\u578B\u6709\u51E0\u5904**\u6839\u672C\u4E0D\u540C**\u3002
|
|
1182
|
+
\u4E0B\u9762\u7684\u6BCF\u4E00\u6761\u90FD\u6765\u81EA\u771F\u5B9E\u4E8B\u6545\uFF0C**\u8FDD\u53CD\u65F6\u901A\u5E38\u7F16\u8BD1\u901A\u8FC7\u3001\u8FD0\u884C\u671F\u624D\u9519**\u3002
|
|
1183
|
+
|
|
1184
|
+
> \u672C\u6587\u6863\u7531 \`vobs agent-doc\` \u4ECE\u6846\u67B6\u7248\u672C\u751F\u6210 \u2014\u2014 \u4E0D\u8981\u624B\u6539\u751F\u6210\u7684\u5757\u3002
|
|
1185
|
+
> \u6BCF\u6761\u540E\u9762\u62EC\u53F7\u91CC\u662F**\u8FDD\u53CD\u65F6\u6846\u67B6\u4F1A\u62A5\u7684\u8BCA\u65AD\u7801**\u3002
|
|
1186
|
+
|
|
1187
|
+
## \u4E00\u3001\u7EC4\u4EF6\u4F53\u53EA\u6267\u884C\u4E00\u6B21\uFF08run-once\uFF09
|
|
1188
|
+
|
|
1189
|
+
**\u7EC4\u4EF6\u51FD\u6570\u4F53\u53EA\u5728\u521B\u5EFA\u65F6\u8DD1\u4E00\u6B21**\uFF0C\u4E4B\u540E\u53EA\u6709 JSX \u91CC\u8BA2\u9605\u7684\u4F4D\u7F6E\u66F4\u65B0\u3002
|
|
1190
|
+
|
|
1191
|
+
- \u274C \`const filtered = list.value.filter(...)\` \u2014\u2014 \u4E00\u6B21\u5FEB\u7167\uFF0C\u4E4B\u540E\u6C38\u4E0D\u66F4\u65B0
|
|
1192
|
+
- \u2705 \u6D3E\u751F\u653E\u8FDB JSX\uFF1A\`<div>{list.value.filter(...).map(render)}</div>\`
|
|
1193
|
+
- \u274C \u7EC4\u4EF6\u4F53\u91CC\u53D6\u5FEB\u7167\u7ED9\u56DE\u8C03\u7528\uFF1A\`const v = name.value; onClick={() => save(v)}\`
|
|
1194
|
+
- \u2705 \u56DE\u8C03\u5185\u91CD\u8BFB\uFF1A\`onClick={() => save(name.value)}\`
|
|
1195
|
+
- \u52A8\u6001 props \u7528 getter \u5F62\u6001\uFF0C\u4E0D\u8981\u4F20\u6C42\u503C\u540E\u7684\u503C
|
|
1196
|
+
|
|
1197
|
+
## \u4E8C\u3001\u6761\u4EF6\u6E32\u67D3\uFF1A**\u4E0D\u8981\u5728\u7EC4\u4EF6\u4F53\u91CC \`return\` \u5206\u652F**\uFF08\`VOBS_C107\` / \`VOBS_C104\`\uFF09
|
|
1198
|
+
|
|
1199
|
+
\u7EC4\u4EF6\u4F53\u91CC\u8BFB\u4FE1\u53F7\u7684 \`return\` \u5728\u6302\u8F7D\u65F6\u56FA\u5316\uFF0C**\u4E09\u79CD\u5199\u6CD5\u574F\u5F97\u4E00\u6A21\u4E00\u6837**\uFF1A
|
|
1200
|
+
|
|
1201
|
+
\`\`\`tsx
|
|
1202
|
+
return cond.value ? <A/> : <B/> // \u274C \u51BB\u7ED3
|
|
1203
|
+
if (cond.value) return <A/> // \u274C \u51BB\u7ED3
|
|
1204
|
+
return cond.value ? <A/> : null // \u274C \u51BB\u7ED3
|
|
1205
|
+
\`\`\`
|
|
1206
|
+
|
|
1207
|
+
\u9876\u5C42 \`return\` \u5904**\u6CA1\u6709 parent/anchor**\uFF0C\u6240\u4EE5\u4E24\u652F\u90FD\u662F JSX \u4E5F\u4E00\u6837\u4E0D\u4F1A\u91CD\u5206\u652F\u3002
|
|
1208
|
+
|
|
1209
|
+
| \u573A\u666F | \u7528\u4EC0\u4E48 |
|
|
1210
|
+
|---|---|
|
|
1211
|
+
| **\u8DEF\u7531\u5206\u652F** | **\`<RouterView/>\`**\uFF08\u58F0\u660E\u5F0F\uFF0C\u5185\u90E8 \`insertDynamic\` + \`resetKey\`\uFF09 |
|
|
1212
|
+
| \u4FDD\u7559\u6302\u8F7D\u3001\u53EA\u5207\u663E\u9690 | **\`<Show when={cond}>\`**\uFF08\u5207 \`hidden\` + \`inert\`\uFF0C\u7126\u70B9/\u6EDA\u52A8/\u5185\u90E8\u72B6\u6001\u4E0D\u4E22\uFF09 |
|
|
1213
|
+
| \u53EA\u5207\u7C7B\u540D | \`class="base" classList={{ 'is-on': cond.value }}\` |
|
|
1214
|
+
| \u666E\u901A\u6761\u4EF6\u6E32\u67D3 | \u653E\u8FDB **JSX \u5B50\u8282\u70B9\u4F4D\u7F6E**\uFF1A\`<div>{cond.value ? <A/> : <B/>}</div>\` |
|
|
1215
|
+
|
|
1216
|
+
## \u4E09\u3001effect \u91CC\u4E0D\u8981\u5199\u81EA\u5DF1\u8BFB\u8FC7\u7684\u4FE1\u53F7\uFF08\`VOBS_C210\` / \`VOBS_C211\`\uFF09
|
|
1217
|
+
|
|
1218
|
+
**\u4F9D\u8D56\u662F\u81EA\u52A8\u6536\u96C6\u7684**\uFF1Aeffect \u8FD0\u884C\u671F\u95F4\u8BFB\u5230\u7684**\u4EFB\u4F55**\u4FE1\u53F7\u90FD\u4F1A\u53D8\u6210\u4F9D\u8D56\u3002
|
|
1219
|
+
|
|
1220
|
+
- \u274C \`effect(() => { count.value++ })\` \u2014\u2014 \u8BFB+\u5199\u540C\u4E00\u4E2A\u4FE1\u53F7 = \u81EA\u8BA2\u9605\u5FAA\u73AF
|
|
1221
|
+
- \u274C \`effect(() => { if (session.value) void sync() })\` \u2014\u2014 **\u300C\u53EA\u8C03\u4E86\u4E2A\u51FD\u6570\u300D\u4E0D\u7B49\u4E8E\u6CA1\u4F9D\u8D56**\uFF1A
|
|
1222
|
+
\u88AB\u8C03\u51FD\u6570\u5728**\u9996\u4E2A \`await\` \u4E4B\u524D**\u7684\u4EE3\u7801\u662F**\u540C\u6B65\u6267\u884C**\u7684\uFF0C\u5B83\u8BFB\u7684\u4FE1\u53F7\u7B97\u5728 effect \u5934\u4E0A
|
|
1223
|
+
- \u2705 \u53EA\u60F3\u58F0\u660E\u4F9D\u8D56\uFF1A**\`effect(on(deps, () => { \u2026 }))\`** \u2014\u2014 \u56DE\u8C03\u5728 untrack \u4F5C\u7528\u57DF\u91CC\u8DD1\uFF0C
|
|
1224
|
+
\u5B83\u8C03\u7528\u7684\u51FD\u6570\u78B0\u4EC0\u4E48\u4FE1\u53F7\u90FD\u4E0D\u4F1A\u53CD\u5411\u8BA2\u9605
|
|
1225
|
+
- \u2705 \u6D3E\u751F\u503C\u7528 \`memo\`\uFF0C\u4E0D\u8981"\u8BFB A \u5199 B"
|
|
1226
|
+
- \u515C\u5E95\u624D\u662F \`untrack(() => { X.value = next })\`
|
|
1227
|
+
|
|
1228
|
+
**\u522B\u5728 effect \u91CC\u8C03 async \u51FD\u6570**\uFF08\`VOBS_C106\`\uFF09\uFF1A\`effect\` \u4E0D\u7B49\u5B83\uFF0C
|
|
1229
|
+
\u4E14\u9996\u4E2A \`await\` \u4E4B\u524D\u7684\u90E8\u5206\u662F\u540C\u6B65\u7684\u3002\u5F02\u6B65\u53D6\u6570\u7528 **\`@vobs/resource\`**\u3002
|
|
1230
|
+
|
|
1231
|
+
## \u56DB\u3001\u5BA2\u6237\u7AEF\u526F\u4F5C\u7528\u4E0E SSR
|
|
1232
|
+
|
|
1233
|
+
- \u5B9A\u65F6\u5668 / \u76D1\u542C / \`matchMedia\` / \`localStorage\` \u2192 **\`onMount\` \u542F\u52A8\u3001\`onDestroy\` \u6E05\u7406**
|
|
1234
|
+
\uFF08**\u4E0D\u8981\u624B\u5199 \`typeof window\` \u5B88\u536B**\uFF09
|
|
1235
|
+
- **\u6E32\u67D3\u8F93\u51FA\u672C\u8EAB**\u4F9D\u8D56\u6D4F\u89C8\u5668\uFF08\u7A97\u53E3\u5C3A\u5BF8 / \`localStorage\` \u56DE\u586B / \`Date.now\` / \u968F\u673A\u503C\uFF09
|
|
1236
|
+
\u2192 **\`<ClientOnly fallback={\u2026}>\`**\uFF08\u9996\u8F6E\u4E24\u4FA7\u90FD\u6E32\u67D3 fallback\uFF0C\u6C34\u5408\u5BF9\u5F97\u4E0A\uFF09
|
|
1237
|
+
- \u6A21\u5757\u9876\u5C42**\u7981\u6B62** JSX\uFF08\`VOBS_C105\`\uFF09\uFF1Aimport \u6C42\u503C\u65E9\u4E8E\u6E32\u67D3\u5668\u5B89\u88C5
|
|
1238
|
+
|
|
1239
|
+
## \u4E94\u3001\u5217\u8868\u4E0E\u6570\u636E
|
|
1240
|
+
|
|
1241
|
+
- **\u6570\u7EC4\u66F4\u65B0\u5FC5\u987B\u6362\u5F15\u7528**\uFF1A\`list.value = [...list.value, item]\`\uFF1B
|
|
1242
|
+
\u539F\u5730 \`push\` / \u6539\u5B57\u6BB5**\u4E0D\u89E6\u53D1\u66F4\u65B0**
|
|
1243
|
+
- JSX **\u5B50\u8282\u70B9\u4F4D\u7F6E**\u53EA\u653E\u56DB\u79CD\u5F62\u6001\uFF1A\u7EC4\u4EF6\u6807\u7B7E / \u5143\u7D20 / \u4E24\u5206\u652F\u4E09\u5143 / \`.map()\`
|
|
1244
|
+
- \u6570\u636E\u7ED3\u6784\u91CC**\u53EA\u5B58\u7EAF\u63CF\u8FF0**\uFF08\u5B57\u7B26\u4E32/\u6837\u5F0F/\u7ED3\u6784\u5B57\u6BB5\uFF09\uFF0C**\u8282\u70B9\u5BF9\u8C61\u522B\u8FDB\u6570\u636E\u5E38\u91CF**
|
|
1245
|
+
\uFF08SSG \u5E8F\u5217\u5316\u4F1A\u70B8\uFF0C\u4EA7\u7269\u51FA\u73B0 \`[object Xxx]\` \u65F6\u6846\u67B6\u4F1A\u76F4\u63A5\u62A5\u9519\uFF09
|
|
1246
|
+
|
|
1247
|
+
## \u516D\u3001\u8F93\u5165
|
|
1248
|
+
|
|
1249
|
+
- **\u6570\u5B57\u8F93\u5165\u8D70 \`parseNumber\`**\uFF08\`<Field type="number">\` \u5DF2\u5185\u7F6E\uFF09\uFF1A
|
|
1250
|
+
\u7A7A\u4E32 / \u975E\u6CD5 / \u8D85\u754C**\u4E0D\u63D0\u4EA4**\uFF0C\u4FDD\u6301\u539F\u503C
|
|
1251
|
+
\u2014\u2014 \`Number('') === 0\` \u4F1A\u628A\u8F93\u5165\u6E05\u6210 0 \u5E76\u6CBF\u8054\u52A8\u94FE\u8DEF\u6E05\u96F6\u5144\u5F1F\u7EF4\u5EA6
|
|
1252
|
+
- \`<select>\` \u7684 value \u76F4\u63A5\u7ED1\uFF0C**\u4E0D\u8981\u5199 ref \u515C\u5E95**\uFF081.5.1+ \u5DF2\u4FEE\u65F6\u5E8F\uFF09
|
|
1253
|
+
|
|
1254
|
+
## \u4E03\u3001\u56FE\u6807\u4E0E SVG
|
|
1255
|
+
|
|
1256
|
+
- **SVG \u76F4\u63A5\u5199 JSX**\uFF08\`<svg><path/></svg>\`\uFF0C1.7.4+ \u6309 namespace \u521B\u5EFA\u4E0E\u6C34\u5408\uFF09
|
|
1257
|
+
- \u56FE\u6807\u8981**\u767B\u8BB0\u8FDB\u767D\u540D\u5355**\uFF1B\u67E5\u8868 miss \u65F6 \`@vobs/icon-core\` \u4F1A\u8B66\u544A\u70B9\u540D\uFF08\u4F46\u4ECD\u5E94\u767B\u8BB0\uFF09
|
|
1258
|
+
|
|
1259
|
+
## \u516B\u3001\u63D0\u4EA4\u524D\u81EA\u6D4B
|
|
1260
|
+
|
|
1261
|
+
\`\`\`bash
|
|
1262
|
+
pnpm run check:source # = vobs check\uFF0C\u5168\u4ED3\u4E00\u6B21\u5217\u51FA\u5168\u90E8\u8BCA\u65AD
|
|
1263
|
+
pnpm run check:runtime # \u771F\u5B9E\u6D4F\u89C8\u5668\u9010\u8DEF\u7531\u8DD1\u62A4\u680F\uFF08\u9700 Chrome\uFF09
|
|
1264
|
+
pnpm run check:runtime:interact # \u518D\u70B9\u6240\u6709\u6309\u94AE\u3001\u89E6\u53D1\u6240\u6709\u8F93\u5165
|
|
1265
|
+
\`\`\`
|
|
1266
|
+
|
|
1267
|
+
\`vite build\` **\u4F1A**\u6253\u5370\u7F16\u8BD1\u671F\u8B66\u544A\uFF08\`C104\`/\`C105\`/\`C106\`/\`C107\`\uFF09\uFF0C\u4F46\u53EA\u8986\u76D6\u5B83\u7F16\u8BD1\u5230\u7684\u6587\u4EF6\uFF1B
|
|
1268
|
+
\`check:source\` \u624D\u662F\u5168\u4ED3\u5165\u53E3\u3002
|
|
1269
|
+
|
|
1270
|
+
---
|
|
1271
|
+
|
|
1272
|
+
## \u4E00\u53E5\u8BDD\u901F\u8BB0
|
|
1273
|
+
|
|
1274
|
+
| \u4E3B\u9898 | \u4E00\u53E5\u8BDD |
|
|
1275
|
+
|---|---|
|
|
1276
|
+
| \u7EC4\u4EF6\u4F53 | \u53EA\u8DD1\u4E00\u6B21\uFF0C\u6D3E\u751F\u8FDB JSX |
|
|
1277
|
+
| \u56DE\u8C03 | \u89E6\u53D1\u65F6\u91CD\u8BFB \`.value\` |
|
|
1278
|
+
| \u6761\u4EF6\u6E32\u67D3 | \u8DEF\u7531\u7528 \`RouterView\`\uFF0C\u663E\u9690\u7528 \`Show\`\uFF0C\u522B\u5728\u7EC4\u4EF6\u4F53 return \u5206\u652F |
|
|
1279
|
+
| effect | \u522B\u5199\u81EA\u5DF1\u8BFB\u7684\u4FE1\u53F7\uFF0C\u7528 \`on(deps, fn)\` |
|
|
1280
|
+
| async | \u522B\u585E\u8FDB effect\uFF0C\u7528 \`@vobs/resource\` |
|
|
1281
|
+
| \u5BA2\u6237\u7AEF | \`onMount\`/\`onDestroy\`/\`ClientOnly\`\uFF0C\u522B\u624B\u5199 \`typeof window\` |
|
|
1282
|
+
| \u5217\u8868 | \u6362\u5F15\u7528 |
|
|
1283
|
+
| \u6570\u5B57 | \`parseNumber\` |
|
|
1284
|
+
| SVG | \u76F4\u63A5\u5199 |
|
|
1285
|
+
| \u81EA\u6D4B | \`check:source\` + \`check:runtime\` |
|
|
1286
|
+
`;
|
|
1287
|
+
|
|
1288
|
+
// packages/cli/src/commands/agent-doc.ts
|
|
1289
|
+
var BEGIN = "<!-- vobs:begin \u7531 `vobs agent-doc --write` \u751F\u6210\uFF0C\u8BF7\u52FF\u624B\u6539 -->";
|
|
1290
|
+
var END = "<!-- vobs:end -->";
|
|
1291
|
+
function readContract() {
|
|
1292
|
+
return AGENT_CONTRACT.trim();
|
|
1293
|
+
}
|
|
1294
|
+
__name(readContract, "readContract");
|
|
1295
|
+
function buildAgentsDoc(contract) {
|
|
1296
|
+
return [
|
|
1297
|
+
BEGIN,
|
|
1298
|
+
"",
|
|
1299
|
+
contract,
|
|
1300
|
+
"",
|
|
1301
|
+
END,
|
|
1302
|
+
"",
|
|
1303
|
+
"<!-- \u4EE5\u4E0B\u662F\u672C\u9879\u76EE\u7684\u81EA\u6709\u7EA6\u5B9A\uFF0C`vobs agent-doc --write` \u4E0D\u4F1A\u8986\u76D6\u3002 -->",
|
|
1304
|
+
"",
|
|
1305
|
+
"## \u672C\u9879\u76EE\u7EA6\u5B9A",
|
|
1306
|
+
"",
|
|
1307
|
+
"\uFF08\u5728\u8FD9\u91CC\u5199\u4F60\u81EA\u5DF1\u7684\u76EE\u5F55\u7ED3\u6784\u3001\u547D\u540D\u3001\u4E1A\u52A1\u6D41\u7A0B\u7B49\u89C4\u5219\u3002\uFF09",
|
|
1308
|
+
""
|
|
1309
|
+
].join("\n");
|
|
1310
|
+
}
|
|
1311
|
+
__name(buildAgentsDoc, "buildAgentsDoc");
|
|
1312
|
+
function extractBlock(text5) {
|
|
1313
|
+
const start2 = text5.indexOf(BEGIN);
|
|
1314
|
+
const end = text5.indexOf(END);
|
|
1315
|
+
if (start2 < 0 || end < 0 || end < start2) return null;
|
|
1316
|
+
return text5.slice(start2, end + END.length);
|
|
1317
|
+
}
|
|
1318
|
+
__name(extractBlock, "extractBlock");
|
|
1319
|
+
function mergeAgentsDoc(existing, generated) {
|
|
1320
|
+
if (existing === null) return generated;
|
|
1321
|
+
const block = extractBlock(generated);
|
|
1322
|
+
if (block === null) return generated;
|
|
1323
|
+
if (extractBlock(existing) === null) return `${existing.trimEnd()}
|
|
1324
|
+
|
|
1325
|
+
${block}
|
|
1326
|
+
`;
|
|
1327
|
+
return existing.replace(extractBlock(existing), block);
|
|
1328
|
+
}
|
|
1329
|
+
__name(mergeAgentsDoc, "mergeAgentsDoc");
|
|
1330
|
+
async function agentDocCommand(options = {}) {
|
|
1331
|
+
const root = resolve6(options.dir ?? process.cwd());
|
|
1332
|
+
const contract = readContract();
|
|
1333
|
+
if (options.body === true) {
|
|
1334
|
+
process.stdout.write(`${contract}
|
|
1335
|
+
`);
|
|
1336
|
+
return;
|
|
1337
|
+
}
|
|
1338
|
+
const generated = buildAgentsDoc(contract);
|
|
1339
|
+
const agentsPath = resolve6(root, "AGENTS.md");
|
|
1340
|
+
const claudePath = resolve6(root, "CLAUDE.md");
|
|
1341
|
+
const claudeDoc = "@AGENTS.md\n";
|
|
1342
|
+
if (options.check === true) {
|
|
1343
|
+
const problems = [];
|
|
1344
|
+
if (!existsSync4(agentsPath)) {
|
|
1345
|
+
problems.push("AGENTS.md \u4E0D\u5B58\u5728 \u2014\u2014 \u8DD1 `vobs agent-doc --write` \u751F\u6210");
|
|
1346
|
+
} else {
|
|
1347
|
+
const existing = readFileSync4(agentsPath, "utf8");
|
|
1348
|
+
const block = extractBlock(existing);
|
|
1349
|
+
if (block === null) {
|
|
1350
|
+
problems.push("AGENTS.md \u91CC\u627E\u4E0D\u5230 vobs \u6807\u8BB0\u5757 \u2014\u2014 \u8DD1 `vobs agent-doc --write` \u8865\u4E0A");
|
|
1351
|
+
} else if (block !== extractBlock(generated)) {
|
|
1352
|
+
problems.push("AGENTS.md \u7684 vobs \u5951\u7EA6\u5757\u4E0E\u5F53\u524D\u6846\u67B6\u7248\u672C\u4E0D\u4E00\u81F4 \u2014\u2014 \u8DD1 `vobs agent-doc --write` \u540C\u6B65");
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
if (!existsSync4(claudePath)) {
|
|
1356
|
+
problems.push("CLAUDE.md \u4E0D\u5B58\u5728 \u2014\u2014 \u8DD1 `vobs agent-doc --write` \u751F\u6210\uFF08\u5185\u5BB9\u53EA\u9700\u4E00\u884C `@AGENTS.md`\uFF09");
|
|
1357
|
+
} else if (!readFileSync4(claudePath, "utf8").includes("@AGENTS.md")) {
|
|
1358
|
+
problems.push("CLAUDE.md \u6CA1\u6709\u6307\u5411 @AGENTS.md");
|
|
1359
|
+
}
|
|
1360
|
+
if (problems.length > 0) {
|
|
1361
|
+
console.error("[agent-doc] \u5951\u7EA6\u4E0E\u6846\u67B6\u7248\u672C\u4E0D\u540C\u6B65\uFF1A");
|
|
1362
|
+
for (const problem of problems) console.error(` - ${problem}`);
|
|
1363
|
+
process.exitCode = 1;
|
|
1364
|
+
return;
|
|
1365
|
+
}
|
|
1366
|
+
console.log("[agent-doc] \u5951\u7EA6\u4E0E\u5F53\u524D\u6846\u67B6\u7248\u672C\u4E00\u81F4 \u2713");
|
|
1367
|
+
return;
|
|
1368
|
+
}
|
|
1369
|
+
if (options.write !== true) {
|
|
1370
|
+
process.stdout.write(generated);
|
|
1371
|
+
return;
|
|
1372
|
+
}
|
|
1373
|
+
const existingAgents = existsSync4(agentsPath) ? readFileSync4(agentsPath, "utf8") : null;
|
|
1374
|
+
writeFileSync3(agentsPath, mergeAgentsDoc(existingAgents, generated), "utf8");
|
|
1375
|
+
writeFileSync3(claudePath, claudeDoc, "utf8");
|
|
1376
|
+
console.log(`[agent-doc] \u5DF2\u5199\u5165 ${agentsPath}`);
|
|
1377
|
+
console.log(`[agent-doc] \u5DF2\u5199\u5165 ${claudePath}\uFF08\u5185\u5BB9\u4E3A @AGENTS.md\uFF09`);
|
|
1378
|
+
if (existingAgents !== null && extractBlock(existingAgents) === null) {
|
|
1379
|
+
console.log("[agent-doc] \u4F60\u539F\u6709\u7684 AGENTS.md \u5185\u5BB9\u5DF2\u4FDD\u7559\uFF0Cvobs \u5951\u7EA6\u5757\u8FFD\u52A0\u5728\u540E\u3002");
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
__name(agentDocCommand, "agentDocCommand");
|
|
1383
|
+
|
|
1174
1384
|
// packages/cli/src/banner.ts
|
|
1175
1385
|
var BANNER_LINE1 = "\u{1D5E9}\u{1D5E2}\u{1D5D5}\u{1D5E6} \u{1D5D6}\u{1D5DF}\u{1D5DC}";
|
|
1176
1386
|
var BANNER_TAGLINE = "Signals First \xB7 Zero Re-renders \xB7 Ultra Lightweight";
|
|
@@ -1255,6 +1465,14 @@ function createCLI() {
|
|
|
1255
1465
|
includeTests: options.includeTests === true
|
|
1256
1466
|
});
|
|
1257
1467
|
});
|
|
1468
|
+
cli.command("agent-doc", "\u751F\u6210/\u6821\u9A8C\u7ED9 LLM \u8BFB\u7684\u6846\u67B6\u5951\u7EA6\uFF08AGENTS.md + CLAUDE.md\uFF09").option("--dir <dir>", "\u76EE\u6807\u76EE\u5F55", { default: process.cwd() }).option("--write", "\u5199\u5165\u6587\u4EF6\uFF08\u9ED8\u8BA4\u6253\u5230 stdout\uFF09").option("--check", "\u6821\u9A8C\u9879\u76EE\u91CC\u90A3\u4EFD\u662F\u5426\u4E0E\u5F53\u524D\u6846\u67B6\u7248\u672C\u4E00\u81F4\uFF08\u53EF\u8FDB CI\uFF09").option("--body", "\u53EA\u8F93\u51FA\u5951\u7EA6\u6B63\u6587\uFF08\u4E0D\u542B\u6807\u8BB0\u5757\u5916\u8BF4\u660E\uFF09").action(async (options) => {
|
|
1469
|
+
await agentDocCommand({
|
|
1470
|
+
dir: options.dir,
|
|
1471
|
+
write: options.write === true,
|
|
1472
|
+
check: options.check === true,
|
|
1473
|
+
body: options.body === true
|
|
1474
|
+
});
|
|
1475
|
+
});
|
|
1258
1476
|
cli.command("dsh [action] [target]", "DSH \u63D2\u4EF6\u5DE5\u5177\u94FE\uFF08init / dev / build / check / install\uFF09").option("--dir <dir>", "init\uFF1A\u76EE\u6807\u76EE\u5F55").option("--pm <pm>", "init\uFF1A\u5305\u7BA1\u7406\u5668\uFF08pnpm/npm\uFF09").option("--port <port>", "dev\uFF1A\u9884\u89C8\u7AEF\u53E3", { default: 5199 }).option("--profile <name>", "install\uFF1ADSH profile \u540D", { default: "desktop" }).option("--spec <spec>", "install\uFF1A\u5B8C\u6574\u5B89\u88C5 spec").option("--repo <owner/name>", "install\uFF1AGitHub owner/name").option("--tag <ref>", "install\uFF1AGit tag / \u5206\u652F / commit").option("--subpath <path>", "install\uFF1A\u4ED3\u5E93\u5185\u5B50\u76EE\u5F55").option("--from <path>", "install\uFF1A\u4ECE\u672C\u5730\u76EE\u5F55\u5B89\u88C5").option("--dry", "install\uFF1A\u53EA\u6253\u5370\u547D\u4EE4\uFF0C\u4E0D\u6267\u884C").action(async (action, target, options) => {
|
|
1259
1477
|
await dshCommand(action, target, {
|
|
1260
1478
|
dir: options.dir,
|
|
@@ -1290,6 +1508,7 @@ var KNOWN_SUBCOMMANDS = [
|
|
|
1290
1508
|
"add",
|
|
1291
1509
|
"check",
|
|
1292
1510
|
"dsh",
|
|
1511
|
+
"agent-doc",
|
|
1293
1512
|
"logo"
|
|
1294
1513
|
];
|
|
1295
1514
|
|