@vobs/cli 1.8.4 → 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.cjs
CHANGED
|
@@ -1206,6 +1206,216 @@ async function checkCommand(options = {}) {
|
|
|
1206
1206
|
}
|
|
1207
1207
|
__name(checkCommand, "checkCommand");
|
|
1208
1208
|
|
|
1209
|
+
// packages/cli/src/commands/agent-doc.ts
|
|
1210
|
+
var import_node_fs5 = require("fs");
|
|
1211
|
+
var import_node_path7 = require("path");
|
|
1212
|
+
|
|
1213
|
+
// packages/cli/src/templates/agent-contract.ts
|
|
1214
|
+
var AGENT_CONTRACT = `# vobs \u6846\u67B6\u5951\u7EA6\uFF08\u5199\u4EE3\u7801\u524D\u5FC5\u8BFB\uFF09
|
|
1215
|
+
|
|
1216
|
+
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
|
|
1217
|
+
\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
|
|
1218
|
+
|
|
1219
|
+
> \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
|
|
1220
|
+
> \u6BCF\u6761\u540E\u9762\u62EC\u53F7\u91CC\u662F**\u8FDD\u53CD\u65F6\u6846\u67B6\u4F1A\u62A5\u7684\u8BCA\u65AD\u7801**\u3002
|
|
1221
|
+
|
|
1222
|
+
## \u4E00\u3001\u7EC4\u4EF6\u4F53\u53EA\u6267\u884C\u4E00\u6B21\uFF08run-once\uFF09
|
|
1223
|
+
|
|
1224
|
+
**\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
|
|
1225
|
+
|
|
1226
|
+
- \u274C \`const filtered = list.value.filter(...)\` \u2014\u2014 \u4E00\u6B21\u5FEB\u7167\uFF0C\u4E4B\u540E\u6C38\u4E0D\u66F4\u65B0
|
|
1227
|
+
- \u2705 \u6D3E\u751F\u653E\u8FDB JSX\uFF1A\`<div>{list.value.filter(...).map(render)}</div>\`
|
|
1228
|
+
- \u274C \u7EC4\u4EF6\u4F53\u91CC\u53D6\u5FEB\u7167\u7ED9\u56DE\u8C03\u7528\uFF1A\`const v = name.value; onClick={() => save(v)}\`
|
|
1229
|
+
- \u2705 \u56DE\u8C03\u5185\u91CD\u8BFB\uFF1A\`onClick={() => save(name.value)}\`
|
|
1230
|
+
- \u52A8\u6001 props \u7528 getter \u5F62\u6001\uFF0C\u4E0D\u8981\u4F20\u6C42\u503C\u540E\u7684\u503C
|
|
1231
|
+
|
|
1232
|
+
## \u4E8C\u3001\u6761\u4EF6\u6E32\u67D3\uFF1A**\u4E0D\u8981\u5728\u7EC4\u4EF6\u4F53\u91CC \`return\` \u5206\u652F**\uFF08\`VOBS_C107\` / \`VOBS_C104\`\uFF09
|
|
1233
|
+
|
|
1234
|
+
\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
|
|
1235
|
+
|
|
1236
|
+
\`\`\`tsx
|
|
1237
|
+
return cond.value ? <A/> : <B/> // \u274C \u51BB\u7ED3
|
|
1238
|
+
if (cond.value) return <A/> // \u274C \u51BB\u7ED3
|
|
1239
|
+
return cond.value ? <A/> : null // \u274C \u51BB\u7ED3
|
|
1240
|
+
\`\`\`
|
|
1241
|
+
|
|
1242
|
+
\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
|
|
1243
|
+
|
|
1244
|
+
| \u573A\u666F | \u7528\u4EC0\u4E48 |
|
|
1245
|
+
|---|---|
|
|
1246
|
+
| **\u8DEF\u7531\u5206\u652F** | **\`<RouterView/>\`**\uFF08\u58F0\u660E\u5F0F\uFF0C\u5185\u90E8 \`insertDynamic\` + \`resetKey\`\uFF09 |
|
|
1247
|
+
| \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 |
|
|
1248
|
+
| \u53EA\u5207\u7C7B\u540D | \`class="base" classList={{ 'is-on': cond.value }}\` |
|
|
1249
|
+
| \u666E\u901A\u6761\u4EF6\u6E32\u67D3 | \u653E\u8FDB **JSX \u5B50\u8282\u70B9\u4F4D\u7F6E**\uFF1A\`<div>{cond.value ? <A/> : <B/>}</div>\` |
|
|
1250
|
+
|
|
1251
|
+
## \u4E09\u3001effect \u91CC\u4E0D\u8981\u5199\u81EA\u5DF1\u8BFB\u8FC7\u7684\u4FE1\u53F7\uFF08\`VOBS_C210\` / \`VOBS_C211\`\uFF09
|
|
1252
|
+
|
|
1253
|
+
**\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
|
|
1254
|
+
|
|
1255
|
+
- \u274C \`effect(() => { count.value++ })\` \u2014\u2014 \u8BFB+\u5199\u540C\u4E00\u4E2A\u4FE1\u53F7 = \u81EA\u8BA2\u9605\u5FAA\u73AF
|
|
1256
|
+
- \u274C \`effect(() => { if (session.value) void sync() })\` \u2014\u2014 **\u300C\u53EA\u8C03\u4E86\u4E2A\u51FD\u6570\u300D\u4E0D\u7B49\u4E8E\u6CA1\u4F9D\u8D56**\uFF1A
|
|
1257
|
+
\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
|
|
1258
|
+
- \u2705 \u53EA\u60F3\u58F0\u660E\u4F9D\u8D56\uFF1A**\`effect(on(deps, () => { \u2026 }))\`** \u2014\u2014 \u56DE\u8C03\u5728 untrack \u4F5C\u7528\u57DF\u91CC\u8DD1\uFF0C
|
|
1259
|
+
\u5B83\u8C03\u7528\u7684\u51FD\u6570\u78B0\u4EC0\u4E48\u4FE1\u53F7\u90FD\u4E0D\u4F1A\u53CD\u5411\u8BA2\u9605
|
|
1260
|
+
- \u2705 \u6D3E\u751F\u503C\u7528 \`memo\`\uFF0C\u4E0D\u8981"\u8BFB A \u5199 B"
|
|
1261
|
+
- \u515C\u5E95\u624D\u662F \`untrack(() => { X.value = next })\`
|
|
1262
|
+
|
|
1263
|
+
**\u522B\u5728 effect \u91CC\u8C03 async \u51FD\u6570**\uFF08\`VOBS_C106\`\uFF09\uFF1A\`effect\` \u4E0D\u7B49\u5B83\uFF0C
|
|
1264
|
+
\u4E14\u9996\u4E2A \`await\` \u4E4B\u524D\u7684\u90E8\u5206\u662F\u540C\u6B65\u7684\u3002\u5F02\u6B65\u53D6\u6570\u7528 **\`@vobs/resource\`**\u3002
|
|
1265
|
+
|
|
1266
|
+
## \u56DB\u3001\u5BA2\u6237\u7AEF\u526F\u4F5C\u7528\u4E0E SSR
|
|
1267
|
+
|
|
1268
|
+
- \u5B9A\u65F6\u5668 / \u76D1\u542C / \`matchMedia\` / \`localStorage\` \u2192 **\`onMount\` \u542F\u52A8\u3001\`onDestroy\` \u6E05\u7406**
|
|
1269
|
+
\uFF08**\u4E0D\u8981\u624B\u5199 \`typeof window\` \u5B88\u536B**\uFF09
|
|
1270
|
+
- **\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
|
|
1271
|
+
\u2192 **\`<ClientOnly fallback={\u2026}>\`**\uFF08\u9996\u8F6E\u4E24\u4FA7\u90FD\u6E32\u67D3 fallback\uFF0C\u6C34\u5408\u5BF9\u5F97\u4E0A\uFF09
|
|
1272
|
+
- \u6A21\u5757\u9876\u5C42**\u7981\u6B62** JSX\uFF08\`VOBS_C105\`\uFF09\uFF1Aimport \u6C42\u503C\u65E9\u4E8E\u6E32\u67D3\u5668\u5B89\u88C5
|
|
1273
|
+
|
|
1274
|
+
## \u4E94\u3001\u5217\u8868\u4E0E\u6570\u636E
|
|
1275
|
+
|
|
1276
|
+
- **\u6570\u7EC4\u66F4\u65B0\u5FC5\u987B\u6362\u5F15\u7528**\uFF1A\`list.value = [...list.value, item]\`\uFF1B
|
|
1277
|
+
\u539F\u5730 \`push\` / \u6539\u5B57\u6BB5**\u4E0D\u89E6\u53D1\u66F4\u65B0**
|
|
1278
|
+
- 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()\`
|
|
1279
|
+
- \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**
|
|
1280
|
+
\uFF08SSG \u5E8F\u5217\u5316\u4F1A\u70B8\uFF0C\u4EA7\u7269\u51FA\u73B0 \`[object Xxx]\` \u65F6\u6846\u67B6\u4F1A\u76F4\u63A5\u62A5\u9519\uFF09
|
|
1281
|
+
|
|
1282
|
+
## \u516D\u3001\u8F93\u5165
|
|
1283
|
+
|
|
1284
|
+
- **\u6570\u5B57\u8F93\u5165\u8D70 \`parseNumber\`**\uFF08\`<Field type="number">\` \u5DF2\u5185\u7F6E\uFF09\uFF1A
|
|
1285
|
+
\u7A7A\u4E32 / \u975E\u6CD5 / \u8D85\u754C**\u4E0D\u63D0\u4EA4**\uFF0C\u4FDD\u6301\u539F\u503C
|
|
1286
|
+
\u2014\u2014 \`Number('') === 0\` \u4F1A\u628A\u8F93\u5165\u6E05\u6210 0 \u5E76\u6CBF\u8054\u52A8\u94FE\u8DEF\u6E05\u96F6\u5144\u5F1F\u7EF4\u5EA6
|
|
1287
|
+
- \`<select>\` \u7684 value \u76F4\u63A5\u7ED1\uFF0C**\u4E0D\u8981\u5199 ref \u515C\u5E95**\uFF081.5.1+ \u5DF2\u4FEE\u65F6\u5E8F\uFF09
|
|
1288
|
+
|
|
1289
|
+
## \u4E03\u3001\u56FE\u6807\u4E0E SVG
|
|
1290
|
+
|
|
1291
|
+
- **SVG \u76F4\u63A5\u5199 JSX**\uFF08\`<svg><path/></svg>\`\uFF0C1.7.4+ \u6309 namespace \u521B\u5EFA\u4E0E\u6C34\u5408\uFF09
|
|
1292
|
+
- \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
|
|
1293
|
+
|
|
1294
|
+
## \u516B\u3001\u63D0\u4EA4\u524D\u81EA\u6D4B
|
|
1295
|
+
|
|
1296
|
+
\`\`\`bash
|
|
1297
|
+
pnpm run check:source # = vobs check\uFF0C\u5168\u4ED3\u4E00\u6B21\u5217\u51FA\u5168\u90E8\u8BCA\u65AD
|
|
1298
|
+
pnpm run check:runtime # \u771F\u5B9E\u6D4F\u89C8\u5668\u9010\u8DEF\u7531\u8DD1\u62A4\u680F\uFF08\u9700 Chrome\uFF09
|
|
1299
|
+
pnpm run check:runtime:interact # \u518D\u70B9\u6240\u6709\u6309\u94AE\u3001\u89E6\u53D1\u6240\u6709\u8F93\u5165
|
|
1300
|
+
\`\`\`
|
|
1301
|
+
|
|
1302
|
+
\`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
|
|
1303
|
+
\`check:source\` \u624D\u662F\u5168\u4ED3\u5165\u53E3\u3002
|
|
1304
|
+
|
|
1305
|
+
---
|
|
1306
|
+
|
|
1307
|
+
## \u4E00\u53E5\u8BDD\u901F\u8BB0
|
|
1308
|
+
|
|
1309
|
+
| \u4E3B\u9898 | \u4E00\u53E5\u8BDD |
|
|
1310
|
+
|---|---|
|
|
1311
|
+
| \u7EC4\u4EF6\u4F53 | \u53EA\u8DD1\u4E00\u6B21\uFF0C\u6D3E\u751F\u8FDB JSX |
|
|
1312
|
+
| \u56DE\u8C03 | \u89E6\u53D1\u65F6\u91CD\u8BFB \`.value\` |
|
|
1313
|
+
| \u6761\u4EF6\u6E32\u67D3 | \u8DEF\u7531\u7528 \`RouterView\`\uFF0C\u663E\u9690\u7528 \`Show\`\uFF0C\u522B\u5728\u7EC4\u4EF6\u4F53 return \u5206\u652F |
|
|
1314
|
+
| effect | \u522B\u5199\u81EA\u5DF1\u8BFB\u7684\u4FE1\u53F7\uFF0C\u7528 \`on(deps, fn)\` |
|
|
1315
|
+
| async | \u522B\u585E\u8FDB effect\uFF0C\u7528 \`@vobs/resource\` |
|
|
1316
|
+
| \u5BA2\u6237\u7AEF | \`onMount\`/\`onDestroy\`/\`ClientOnly\`\uFF0C\u522B\u624B\u5199 \`typeof window\` |
|
|
1317
|
+
| \u5217\u8868 | \u6362\u5F15\u7528 |
|
|
1318
|
+
| \u6570\u5B57 | \`parseNumber\` |
|
|
1319
|
+
| SVG | \u76F4\u63A5\u5199 |
|
|
1320
|
+
| \u81EA\u6D4B | \`check:source\` + \`check:runtime\` |
|
|
1321
|
+
`;
|
|
1322
|
+
|
|
1323
|
+
// packages/cli/src/commands/agent-doc.ts
|
|
1324
|
+
var BEGIN = "<!-- vobs:begin \u7531 `vobs agent-doc --write` \u751F\u6210\uFF0C\u8BF7\u52FF\u624B\u6539 -->";
|
|
1325
|
+
var END = "<!-- vobs:end -->";
|
|
1326
|
+
function readContract() {
|
|
1327
|
+
return AGENT_CONTRACT.trim();
|
|
1328
|
+
}
|
|
1329
|
+
__name(readContract, "readContract");
|
|
1330
|
+
function buildAgentsDoc(contract) {
|
|
1331
|
+
return [
|
|
1332
|
+
BEGIN,
|
|
1333
|
+
"",
|
|
1334
|
+
contract,
|
|
1335
|
+
"",
|
|
1336
|
+
END,
|
|
1337
|
+
"",
|
|
1338
|
+
"<!-- \u4EE5\u4E0B\u662F\u672C\u9879\u76EE\u7684\u81EA\u6709\u7EA6\u5B9A\uFF0C`vobs agent-doc --write` \u4E0D\u4F1A\u8986\u76D6\u3002 -->",
|
|
1339
|
+
"",
|
|
1340
|
+
"## \u672C\u9879\u76EE\u7EA6\u5B9A",
|
|
1341
|
+
"",
|
|
1342
|
+
"\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",
|
|
1343
|
+
""
|
|
1344
|
+
].join("\n");
|
|
1345
|
+
}
|
|
1346
|
+
__name(buildAgentsDoc, "buildAgentsDoc");
|
|
1347
|
+
function extractBlock(text5) {
|
|
1348
|
+
const start2 = text5.indexOf(BEGIN);
|
|
1349
|
+
const end = text5.indexOf(END);
|
|
1350
|
+
if (start2 < 0 || end < 0 || end < start2) return null;
|
|
1351
|
+
return text5.slice(start2, end + END.length);
|
|
1352
|
+
}
|
|
1353
|
+
__name(extractBlock, "extractBlock");
|
|
1354
|
+
function mergeAgentsDoc(existing, generated) {
|
|
1355
|
+
if (existing === null) return generated;
|
|
1356
|
+
const block = extractBlock(generated);
|
|
1357
|
+
if (block === null) return generated;
|
|
1358
|
+
if (extractBlock(existing) === null) return `${existing.trimEnd()}
|
|
1359
|
+
|
|
1360
|
+
${block}
|
|
1361
|
+
`;
|
|
1362
|
+
return existing.replace(extractBlock(existing), block);
|
|
1363
|
+
}
|
|
1364
|
+
__name(mergeAgentsDoc, "mergeAgentsDoc");
|
|
1365
|
+
async function agentDocCommand(options = {}) {
|
|
1366
|
+
const root = (0, import_node_path7.resolve)(options.dir ?? process.cwd());
|
|
1367
|
+
const contract = readContract();
|
|
1368
|
+
if (options.body === true) {
|
|
1369
|
+
process.stdout.write(`${contract}
|
|
1370
|
+
`);
|
|
1371
|
+
return;
|
|
1372
|
+
}
|
|
1373
|
+
const generated = buildAgentsDoc(contract);
|
|
1374
|
+
const agentsPath = (0, import_node_path7.resolve)(root, "AGENTS.md");
|
|
1375
|
+
const claudePath = (0, import_node_path7.resolve)(root, "CLAUDE.md");
|
|
1376
|
+
const claudeDoc = "@AGENTS.md\n";
|
|
1377
|
+
if (options.check === true) {
|
|
1378
|
+
const problems = [];
|
|
1379
|
+
if (!(0, import_node_fs5.existsSync)(agentsPath)) {
|
|
1380
|
+
problems.push("AGENTS.md \u4E0D\u5B58\u5728 \u2014\u2014 \u8DD1 `vobs agent-doc --write` \u751F\u6210");
|
|
1381
|
+
} else {
|
|
1382
|
+
const existing = (0, import_node_fs5.readFileSync)(agentsPath, "utf8");
|
|
1383
|
+
const block = extractBlock(existing);
|
|
1384
|
+
if (block === null) {
|
|
1385
|
+
problems.push("AGENTS.md \u91CC\u627E\u4E0D\u5230 vobs \u6807\u8BB0\u5757 \u2014\u2014 \u8DD1 `vobs agent-doc --write` \u8865\u4E0A");
|
|
1386
|
+
} else if (block !== extractBlock(generated)) {
|
|
1387
|
+
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");
|
|
1388
|
+
}
|
|
1389
|
+
}
|
|
1390
|
+
if (!(0, import_node_fs5.existsSync)(claudePath)) {
|
|
1391
|
+
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");
|
|
1392
|
+
} else if (!(0, import_node_fs5.readFileSync)(claudePath, "utf8").includes("@AGENTS.md")) {
|
|
1393
|
+
problems.push("CLAUDE.md \u6CA1\u6709\u6307\u5411 @AGENTS.md");
|
|
1394
|
+
}
|
|
1395
|
+
if (problems.length > 0) {
|
|
1396
|
+
console.error("[agent-doc] \u5951\u7EA6\u4E0E\u6846\u67B6\u7248\u672C\u4E0D\u540C\u6B65\uFF1A");
|
|
1397
|
+
for (const problem of problems) console.error(` - ${problem}`);
|
|
1398
|
+
process.exitCode = 1;
|
|
1399
|
+
return;
|
|
1400
|
+
}
|
|
1401
|
+
console.log("[agent-doc] \u5951\u7EA6\u4E0E\u5F53\u524D\u6846\u67B6\u7248\u672C\u4E00\u81F4 \u2713");
|
|
1402
|
+
return;
|
|
1403
|
+
}
|
|
1404
|
+
if (options.write !== true) {
|
|
1405
|
+
process.stdout.write(generated);
|
|
1406
|
+
return;
|
|
1407
|
+
}
|
|
1408
|
+
const existingAgents = (0, import_node_fs5.existsSync)(agentsPath) ? (0, import_node_fs5.readFileSync)(agentsPath, "utf8") : null;
|
|
1409
|
+
(0, import_node_fs5.writeFileSync)(agentsPath, mergeAgentsDoc(existingAgents, generated), "utf8");
|
|
1410
|
+
(0, import_node_fs5.writeFileSync)(claudePath, claudeDoc, "utf8");
|
|
1411
|
+
console.log(`[agent-doc] \u5DF2\u5199\u5165 ${agentsPath}`);
|
|
1412
|
+
console.log(`[agent-doc] \u5DF2\u5199\u5165 ${claudePath}\uFF08\u5185\u5BB9\u4E3A @AGENTS.md\uFF09`);
|
|
1413
|
+
if (existingAgents !== null && extractBlock(existingAgents) === null) {
|
|
1414
|
+
console.log("[agent-doc] \u4F60\u539F\u6709\u7684 AGENTS.md \u5185\u5BB9\u5DF2\u4FDD\u7559\uFF0Cvobs \u5951\u7EA6\u5757\u8FFD\u52A0\u5728\u540E\u3002");
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1417
|
+
__name(agentDocCommand, "agentDocCommand");
|
|
1418
|
+
|
|
1209
1419
|
// packages/cli/src/banner.ts
|
|
1210
1420
|
var BANNER_LINE1 = "\u{1D5E9}\u{1D5E2}\u{1D5D5}\u{1D5E6} \u{1D5D6}\u{1D5DF}\u{1D5DC}";
|
|
1211
1421
|
var BANNER_TAGLINE = "Signals First \xB7 Zero Re-renders \xB7 Ultra Lightweight";
|
|
@@ -1290,6 +1500,14 @@ function createCLI() {
|
|
|
1290
1500
|
includeTests: options.includeTests === true
|
|
1291
1501
|
});
|
|
1292
1502
|
});
|
|
1503
|
+
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) => {
|
|
1504
|
+
await agentDocCommand({
|
|
1505
|
+
dir: options.dir,
|
|
1506
|
+
write: options.write === true,
|
|
1507
|
+
check: options.check === true,
|
|
1508
|
+
body: options.body === true
|
|
1509
|
+
});
|
|
1510
|
+
});
|
|
1293
1511
|
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) => {
|
|
1294
1512
|
await dshCommand(action, target, {
|
|
1295
1513
|
dir: options.dir,
|
|
@@ -1325,6 +1543,7 @@ var KNOWN_SUBCOMMANDS = [
|
|
|
1325
1543
|
"add",
|
|
1326
1544
|
"check",
|
|
1327
1545
|
"dsh",
|
|
1546
|
+
"agent-doc",
|
|
1328
1547
|
"logo"
|
|
1329
1548
|
];
|
|
1330
1549
|
|