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