siluzan-website-cli 1.0.1-beta.5 → 1.0.1-beta.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/README.md +17 -2
- package/dist/index.js +521 -13
- package/dist/skill/SKILL.md +26 -18
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/provision.md +50 -0
- package/dist/skill/references/sites.md +8 -3
- package/dist/skill/scripts/install.ps1 +1 -1
- package/dist/skill/scripts/install.sh +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# siluzan-website-cli
|
|
2
2
|
|
|
3
|
-
Siluzan **WordPress
|
|
3
|
+
Siluzan **WordPress 站点开通与管理** Skill CLI。安装后由 AI Agent 选套餐/模板开通站点,以及列出站点、新增/编辑页面、安装 / 升级 / 卸载插件。
|
|
4
4
|
|
|
5
5
|
## 安装
|
|
6
6
|
|
|
@@ -12,7 +12,22 @@ siluzan-website login
|
|
|
12
12
|
|
|
13
13
|
或使用 Skill 文档里的一键安装脚本。凭据与 `siluzan-cso` / `siluzan-tso` 共用 `~/.siluzan/config.json` 的 **API Key**(Skill 不使用 JWT)。
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## 开通建站
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
siluzan-website packages list
|
|
19
|
+
siluzan-website templates list --package <packageId>
|
|
20
|
+
siluzan-website trial status
|
|
21
|
+
siluzan-website bills create --package <packageId> --channel Monthly
|
|
22
|
+
siluzan-website bills get --id <billId>
|
|
23
|
+
siluzan-website sites create --name "Acme" --region US --package <id> --template <id> --site-lang en_US --admin-lang en_US [--bill <billId>] [--wait]
|
|
24
|
+
siluzan-website sites status --site <guid> --region US
|
|
25
|
+
siluzan-website sites bind --site <guid> --region US --name "Acme"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
开通走主站 `/website-provision/*`(API Key)。对话 SOP 见 Skill `references/provision.md`。
|
|
29
|
+
|
|
30
|
+
## 常用运维命令
|
|
16
31
|
|
|
17
32
|
```bash
|
|
18
33
|
siluzan-website sites list
|
package/dist/index.js
CHANGED
|
@@ -3905,10 +3905,514 @@ async function runSitesList(options) {
|
|
|
3905
3905
|
console.log("\n\u540E\u7EED\uFF1Asiluzan-website pages list --site <guid>\n");
|
|
3906
3906
|
}
|
|
3907
3907
|
function register5(program2) {
|
|
3908
|
-
const sites = program2.command("sites").description("WordPress \u7AD9\u70B9\u67E5\u8BE2");
|
|
3908
|
+
const sites = program2.command("sites").description("WordPress \u7AD9\u70B9\u67E5\u8BE2\u4E0E\u5F00\u901A");
|
|
3909
3909
|
sites.command("list").description("\u5217\u51FA\u5F53\u524D\u8D26\u53F7\u4E0B\u7684 WordPress \u7AD9\u70B9").option("-q, --query <keyword>", "\u6309\u540D\u79F0\u641C\u7D22").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
3910
3910
|
await runSitesList(opts);
|
|
3911
3911
|
});
|
|
3912
|
+
sites.command("create").description("\u805A\u5408\u521B\u5EFA\u7AD9\u70B9\uFF08website-provision\uFF0C\u5199\u64CD\u4F5C\uFF0CAgent \u987B\u5148\u83B7\u7528\u6237\u786E\u8BA4\uFF09").option("--name <advertiserName>", "\u7AD9\u70B9\u540D\u79F0").option("--region <US|CN>", "\u533A\u57DF", "US").option("--package <packageId>", "\u5957\u9910 ID").option("--template <siteTemplateId>", "\u6A21\u677F ID").option("--site-lang <lang>", "\u524D\u53F0\u8BED\u8A00\uFF0C\u5982 en_US / zh_CN").option("--admin-lang <lang>", "\u540E\u53F0\u8BED\u8A00").option("--bill <packageBillId>", "\u5DF2\u4ED8\u8D26\u5355\u53F7\uFF08\u4ED8\u8D39\u8DEF\u5F84\uFF1B\u8BD5\u7528\u53EF\u4E0D\u4F20\uFF09").option("--wait", "\u521B\u5EFA\u540E\u8F6E\u8BE2\u81F3 Online", false).option("--timeout <seconds>", "wait \u8D85\u65F6\u79D2\u6570", "600").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
3913
|
+
await runSitesCreate(opts);
|
|
3914
|
+
});
|
|
3915
|
+
sites.command("status").description("\u67E5\u8BE2\u5EFA\u7AD9\u72B6\u6001\uFF08website-provision\uFF09").option("--site <siteGuid>", "\u7AD9\u70B9 guid").option("--region <US|CN>", "\u533A\u57DF", "US").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
3916
|
+
await runSitesStatus(opts);
|
|
3917
|
+
});
|
|
3918
|
+
sites.command("bind").description("\u8D26\u53F7\u6302\u63A5\u8865\u507F\uFF08SiteMan \u5DF2\u6210\u529F\u4F46 list \u4E0D\u53EF\u89C1\u65F6\uFF09").option("--site <siteGuid>", "\u7AD9\u70B9 guid").option("--region <US|CN>", "\u533A\u57DF", "US").option("--name <advertiserName>", "\u7AD9\u70B9\u540D\u79F0\uFF08\u7528\u4E8E\u67E5\u627E/\u521B\u5EFA Mag\uFF09").option("--mag <magKey>", "\u5DF2\u6709 Mag Key\uFF08\u53EF\u9009\uFF09").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
3919
|
+
await runSitesBind(opts);
|
|
3920
|
+
});
|
|
3921
|
+
}
|
|
3922
|
+
function asRecordLocal(value) {
|
|
3923
|
+
return value && typeof value === "object" ? value : null;
|
|
3924
|
+
}
|
|
3925
|
+
function readStr2(obj, key) {
|
|
3926
|
+
if (!obj) return "";
|
|
3927
|
+
const v = obj[key];
|
|
3928
|
+
return typeof v === "string" ? v : v == null ? "" : String(v);
|
|
3929
|
+
}
|
|
3930
|
+
async function runSitesCreate(opts) {
|
|
3931
|
+
const name = opts.name?.trim();
|
|
3932
|
+
const packageId = opts.package?.trim();
|
|
3933
|
+
const templateId = opts.template?.trim();
|
|
3934
|
+
const region = (opts.region || "US").trim();
|
|
3935
|
+
const siteLang = opts.siteLang?.trim() || (region.toUpperCase() === "CN" ? "zh_CN" : "en_US");
|
|
3936
|
+
const adminLang = opts.adminLang?.trim() || siteLang;
|
|
3937
|
+
if (!name || !packageId || !templateId) {
|
|
3938
|
+
console.error("\n\u274C \u8BF7\u63D0\u4F9B --name --package --template\uFF08\u4EE5\u53CA\u53EF\u9009 --bill / --region / --site-lang / --admin-lang\uFF09\n");
|
|
3939
|
+
process.exit(1);
|
|
3940
|
+
}
|
|
3941
|
+
console.log("\n\u5373\u5C06\u521B\u5EFA WordPress \u7AD9\u70B9\uFF08\u4E3B\u7AD9 website-provision\uFF0C\u4E0D\u53EF\u76F2\u76EE\u91CD\u8BD5\uFF09\uFF1A");
|
|
3942
|
+
console.log(` name : ${name}`);
|
|
3943
|
+
console.log(` region : ${region}`);
|
|
3944
|
+
console.log(` packageId : ${packageId}`);
|
|
3945
|
+
console.log(` templateId : ${templateId}`);
|
|
3946
|
+
console.log(` siteLang : ${siteLang}`);
|
|
3947
|
+
console.log(` adminLang : ${adminLang}`);
|
|
3948
|
+
console.log(` billId : ${opts.bill?.trim() || "(\u8BD5\u7528)"}`);
|
|
3949
|
+
const config = loadConfig();
|
|
3950
|
+
const body = {
|
|
3951
|
+
advertiserName: name,
|
|
3952
|
+
region,
|
|
3953
|
+
packageId,
|
|
3954
|
+
siteTemplateId: templateId,
|
|
3955
|
+
siteLang,
|
|
3956
|
+
adminLang,
|
|
3957
|
+
packageBillId: opts.bill?.trim() || void 0
|
|
3958
|
+
};
|
|
3959
|
+
const url = `${config.apiBaseUrl}/website-provision/sites`;
|
|
3960
|
+
let raw;
|
|
3961
|
+
try {
|
|
3962
|
+
raw = await apiFetch2(
|
|
3963
|
+
url,
|
|
3964
|
+
config,
|
|
3965
|
+
{ method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) },
|
|
3966
|
+
opts.verbose
|
|
3967
|
+
);
|
|
3968
|
+
} catch (e) {
|
|
3969
|
+
console.error(`
|
|
3970
|
+
\u274C \u521B\u5EFA\u7AD9\u70B9\u5931\u8D25\uFF1A${e.message}`);
|
|
3971
|
+
process.exit(1);
|
|
3972
|
+
return;
|
|
3973
|
+
}
|
|
3974
|
+
const obj = asRecordLocal(raw);
|
|
3975
|
+
const siteGuid = readStr2(obj, "siteGuid") || readStr2(obj, "SiteGuid");
|
|
3976
|
+
const bound = obj?.bound === true || obj?.Bound === true;
|
|
3977
|
+
const code = readStr2(obj, "code") || readStr2(obj, "Code") || "ok";
|
|
3978
|
+
if (opts.json) {
|
|
3979
|
+
console.log(JSON.stringify(raw, null, 2));
|
|
3980
|
+
} else {
|
|
3981
|
+
console.log(code === "site_created_unbound" ? "\n\u26A0\uFE0F \u7AD9\u70B9\u5DF2\u521B\u5EFA\u4F46\u8D26\u53F7\u6302\u63A5\u672A\u5B8C\u6210\n" : "\n\u2705 \u7AD9\u70B9\u521B\u5EFA\u8BF7\u6C42\u5DF2\u53D7\u7406\n");
|
|
3982
|
+
console.log(` siteGuid : ${siteGuid}`);
|
|
3983
|
+
console.log(` region : ${readStr2(obj, "region") || region}`);
|
|
3984
|
+
console.log(` state : ${readStr2(obj, "state") || readStr2(obj, "State") || "-"}`);
|
|
3985
|
+
console.log(` platformUrl : ${readStr2(obj, "platformUrl") || readStr2(obj, "PlatformUrl") || "-"}`);
|
|
3986
|
+
console.log(` bound : ${bound}`);
|
|
3987
|
+
console.log(` magKey : ${readStr2(obj, "magKey") || readStr2(obj, "MagKey") || "-"}`);
|
|
3988
|
+
console.log(` code : ${code}`);
|
|
3989
|
+
if (code === "site_created_unbound") {
|
|
3990
|
+
console.log(`
|
|
3991
|
+
\u8865\u507F\uFF1Asiluzan-website sites bind --site ${siteGuid} --region ${region} --name "${name}"
|
|
3992
|
+
`);
|
|
3993
|
+
}
|
|
3994
|
+
}
|
|
3995
|
+
if (opts.wait && siteGuid) {
|
|
3996
|
+
await pollUntilOnline(config, siteGuid, region, Number(opts.timeout) || 600, opts.verbose);
|
|
3997
|
+
} else if (siteGuid && !opts.json) {
|
|
3998
|
+
console.log(`
|
|
3999
|
+
\u8F6E\u8BE2\u72B6\u6001\uFF1Asiluzan-website sites status --site ${siteGuid} --region ${region}`);
|
|
4000
|
+
console.log(`\u5217\u8868\u6838\u5BF9\uFF1Asiluzan-website sites list -q ${siteGuid}
|
|
4001
|
+
`);
|
|
4002
|
+
}
|
|
4003
|
+
}
|
|
4004
|
+
async function runSitesStatus(opts) {
|
|
4005
|
+
const siteGuid = opts.site?.trim();
|
|
4006
|
+
const region = (opts.region || "US").trim();
|
|
4007
|
+
if (!siteGuid) {
|
|
4008
|
+
console.error("\n\u274C \u8BF7\u63D0\u4F9B --site <siteGuid>\n");
|
|
4009
|
+
process.exit(1);
|
|
4010
|
+
}
|
|
4011
|
+
const config = loadConfig();
|
|
4012
|
+
const url = `${config.apiBaseUrl}/website-provision/sites/${encodeURIComponent(region)}/${encodeURIComponent(siteGuid)}/status`;
|
|
4013
|
+
let raw;
|
|
4014
|
+
try {
|
|
4015
|
+
raw = await apiFetch2(url, config, {}, opts.verbose);
|
|
4016
|
+
} catch (e) {
|
|
4017
|
+
console.error(`
|
|
4018
|
+
\u274C \u67E5\u8BE2\u72B6\u6001\u5931\u8D25\uFF1A${e.message}`);
|
|
4019
|
+
process.exit(1);
|
|
4020
|
+
return;
|
|
4021
|
+
}
|
|
4022
|
+
if (opts.json) {
|
|
4023
|
+
console.log(JSON.stringify(raw, null, 2));
|
|
4024
|
+
return;
|
|
4025
|
+
}
|
|
4026
|
+
const obj = asRecordLocal(raw);
|
|
4027
|
+
console.log("\n\u5EFA\u7AD9\u72B6\u6001\n");
|
|
4028
|
+
console.log(` siteGuid : ${readStr2(obj, "siteGuid") || siteGuid}`);
|
|
4029
|
+
console.log(` region : ${readStr2(obj, "region") || region}`);
|
|
4030
|
+
console.log(` statusCode : ${String(obj?.statusCode ?? obj?.StatusCode ?? "-")}`);
|
|
4031
|
+
console.log(` online : ${String(obj?.online ?? obj?.Online ?? "-")}`);
|
|
4032
|
+
console.log(` url : ${readStr2(obj, "url") || readStr2(obj, "Url") || "-"}`);
|
|
4033
|
+
console.log();
|
|
4034
|
+
}
|
|
4035
|
+
async function runSitesBind(opts) {
|
|
4036
|
+
const siteGuid = opts.site?.trim();
|
|
4037
|
+
if (!siteGuid) {
|
|
4038
|
+
console.error("\n\u274C \u8BF7\u63D0\u4F9B --site <siteGuid>\n");
|
|
4039
|
+
process.exit(1);
|
|
4040
|
+
}
|
|
4041
|
+
if (!opts.name?.trim() && !opts.mag?.trim()) {
|
|
4042
|
+
console.error("\n\u274C \u8BF7\u63D0\u4F9B --name <advertiserName> \u6216 --mag <magKey>\n");
|
|
4043
|
+
process.exit(1);
|
|
4044
|
+
}
|
|
4045
|
+
const config = loadConfig();
|
|
4046
|
+
const body = {
|
|
4047
|
+
region: opts.region || "US",
|
|
4048
|
+
advertiserName: opts.name?.trim(),
|
|
4049
|
+
magKey: opts.mag?.trim()
|
|
4050
|
+
};
|
|
4051
|
+
const url = `${config.apiBaseUrl}/website-provision/sites/${encodeURIComponent(siteGuid)}/bind`;
|
|
4052
|
+
let raw;
|
|
4053
|
+
try {
|
|
4054
|
+
raw = await apiFetch2(
|
|
4055
|
+
url,
|
|
4056
|
+
config,
|
|
4057
|
+
{ method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) },
|
|
4058
|
+
opts.verbose
|
|
4059
|
+
);
|
|
4060
|
+
} catch (e) {
|
|
4061
|
+
console.error(`
|
|
4062
|
+
\u274C \u6302\u63A5\u5931\u8D25\uFF1A${e.message}`);
|
|
4063
|
+
process.exit(1);
|
|
4064
|
+
return;
|
|
4065
|
+
}
|
|
4066
|
+
if (opts.json) {
|
|
4067
|
+
console.log(JSON.stringify(raw, null, 2));
|
|
4068
|
+
return;
|
|
4069
|
+
}
|
|
4070
|
+
const obj = asRecordLocal(raw);
|
|
4071
|
+
console.log("\n\u2705 \u6302\u63A5\u5B8C\u6210\n");
|
|
4072
|
+
console.log(` siteGuid : ${readStr2(obj, "siteGuid") || siteGuid}`);
|
|
4073
|
+
console.log(` bound : ${String(obj?.bound ?? true)}`);
|
|
4074
|
+
console.log(` magKey : ${readStr2(obj, "magKey") || "-"}`);
|
|
4075
|
+
console.log("\n\u8BF7\u518D\u8DD1 siluzan-website sites list \u6838\u5BF9\u3002\n");
|
|
4076
|
+
}
|
|
4077
|
+
async function pollUntilOnline(config, siteGuid, region, timeoutSec, verbose) {
|
|
4078
|
+
const deadline = Date.now() + timeoutSec * 1e3;
|
|
4079
|
+
console.log(`
|
|
4080
|
+
\u7B49\u5F85\u7AD9\u70B9 Online\uFF08\u6700\u957F ${timeoutSec}s\uFF09\u2026`);
|
|
4081
|
+
while (Date.now() < deadline) {
|
|
4082
|
+
try {
|
|
4083
|
+
const url = `${config.apiBaseUrl}/website-provision/sites/${encodeURIComponent(region)}/${encodeURIComponent(siteGuid)}/status`;
|
|
4084
|
+
const raw = await apiFetch2(url, config, {}, verbose);
|
|
4085
|
+
const obj = asRecordLocal(raw);
|
|
4086
|
+
const online = Boolean(obj?.online ?? obj?.Online);
|
|
4087
|
+
const code = obj?.statusCode ?? obj?.StatusCode;
|
|
4088
|
+
process.stdout.write(` statusCode=${code} online=${online}
|
|
4089
|
+
`);
|
|
4090
|
+
if (online) {
|
|
4091
|
+
console.log("\n\u2705 \u7AD9\u70B9\u5DF2\u53EF\u8BBF\u95EE\uFF08Online\uFF09\n");
|
|
4092
|
+
return;
|
|
4093
|
+
}
|
|
4094
|
+
} catch (e) {
|
|
4095
|
+
process.stdout.write(` \u8F6E\u8BE2\u5F02\u5E38\uFF1A${e.message}
|
|
4096
|
+
`);
|
|
4097
|
+
}
|
|
4098
|
+
await new Promise((r) => setTimeout(r, 1e4));
|
|
4099
|
+
}
|
|
4100
|
+
console.error("\n\u26A0\uFE0F \u7B49\u5F85\u8D85\u65F6\uFF0C\u7AD9\u70B9\u53EF\u80FD\u4ECD\u5728\u521B\u5EFA\u4E2D\u3002\u8BF7\u7A0D\u540E siluzan-website sites status \u518D\u67E5\u3002\n");
|
|
4101
|
+
}
|
|
4102
|
+
|
|
4103
|
+
// src/commands/packages.ts
|
|
4104
|
+
function asRecord2(value) {
|
|
4105
|
+
return value && typeof value === "object" ? value : null;
|
|
4106
|
+
}
|
|
4107
|
+
function readString2(obj, key) {
|
|
4108
|
+
if (!obj) return "";
|
|
4109
|
+
const v = obj[key];
|
|
4110
|
+
return typeof v === "string" ? v : v == null ? "" : String(v);
|
|
4111
|
+
}
|
|
4112
|
+
function unwrapList(raw) {
|
|
4113
|
+
if (Array.isArray(raw)) {
|
|
4114
|
+
return raw.map(asRecord2).filter((x) => Boolean(x));
|
|
4115
|
+
}
|
|
4116
|
+
const obj = asRecord2(raw);
|
|
4117
|
+
if (!obj) return [];
|
|
4118
|
+
if (Array.isArray(obj.data)) {
|
|
4119
|
+
return obj.data.map(asRecord2).filter((x) => Boolean(x));
|
|
4120
|
+
}
|
|
4121
|
+
return [];
|
|
4122
|
+
}
|
|
4123
|
+
async function runPackagesList(opts) {
|
|
4124
|
+
const config = loadConfig();
|
|
4125
|
+
const url = `${config.apiBaseUrl}/website-provision/packages`;
|
|
4126
|
+
let raw;
|
|
4127
|
+
try {
|
|
4128
|
+
raw = await apiFetch2(url, config, {}, opts.verbose);
|
|
4129
|
+
} catch (e) {
|
|
4130
|
+
console.error(`
|
|
4131
|
+
\u274C \u83B7\u53D6\u5957\u9910\u5217\u8868\u5931\u8D25\uFF1A${e.message}`);
|
|
4132
|
+
if (!opts.verbose) console.error(" \u52A0 --verbose \u53EF\u67E5\u770B\u8BE6\u7EC6\u9519\u8BEF");
|
|
4133
|
+
process.exit(1);
|
|
4134
|
+
return;
|
|
4135
|
+
}
|
|
4136
|
+
const list = unwrapList(raw);
|
|
4137
|
+
if (opts.json) {
|
|
4138
|
+
console.log(JSON.stringify({ total: list.length, packages: list }, null, 2));
|
|
4139
|
+
return;
|
|
4140
|
+
}
|
|
4141
|
+
if (list.length === 0) {
|
|
4142
|
+
console.log("\n\u6682\u65E0\u53EF\u7528\u5957\u9910\u3002\n");
|
|
4143
|
+
return;
|
|
4144
|
+
}
|
|
4145
|
+
const columns = [
|
|
4146
|
+
{ key: "packageId", header: "packageId" },
|
|
4147
|
+
{ key: "packageName", header: "\u540D\u79F0" },
|
|
4148
|
+
{ key: "monthUsd", header: "\u6708\u4ED8(USD)" },
|
|
4149
|
+
{ key: "yearUsd", header: "\u5E74\u4ED8\u6708\u4EF7(USD)" },
|
|
4150
|
+
{ key: "enabled", header: "\u542F\u7528" },
|
|
4151
|
+
{ key: "sunset", header: "\u4E0B\u67B6" }
|
|
4152
|
+
];
|
|
4153
|
+
const rows = list.map((p) => ({
|
|
4154
|
+
packageId: readString2(p, "packageId") || readString2(p, "PackageId"),
|
|
4155
|
+
packageName: readString2(p, "packageName") || readString2(p, "PackageName"),
|
|
4156
|
+
monthUsd: readString2(p, "monthPriceUSD") || readString2(p, "MonthPriceUSD") || "-",
|
|
4157
|
+
yearUsd: readString2(p, "yearlyPriceUSD") || readString2(p, "YearlyPriceUSD") || "-",
|
|
4158
|
+
enabled: String(p.enabled ?? p.Enabled ?? "-"),
|
|
4159
|
+
sunset: String(p.sunset ?? p.Sunset ?? "-")
|
|
4160
|
+
}));
|
|
4161
|
+
console.log(`
|
|
4162
|
+
\u5957\u9910\u5217\u8868\uFF08\u5171 ${list.length} \u4E2A\uFF09
|
|
4163
|
+
`);
|
|
4164
|
+
printCliTable(rows, columns);
|
|
4165
|
+
console.log("\n\u4E0B\u4E00\u6B65\uFF1Asiluzan-website templates list --package <packageId>\n");
|
|
4166
|
+
}
|
|
4167
|
+
function register6(program2) {
|
|
4168
|
+
const packages = program2.command("packages").description("\u5EFA\u7AD9\u5957\u9910\uFF08website-provision\uFF09");
|
|
4169
|
+
packages.command("list").description("\u5217\u51FA\u53EF\u552E\u5957\u9910").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
4170
|
+
await runPackagesList(opts);
|
|
4171
|
+
});
|
|
4172
|
+
}
|
|
4173
|
+
|
|
4174
|
+
// src/commands/templates.ts
|
|
4175
|
+
function asRecord3(value) {
|
|
4176
|
+
return value && typeof value === "object" ? value : null;
|
|
4177
|
+
}
|
|
4178
|
+
function readString3(obj, key) {
|
|
4179
|
+
if (!obj) return "";
|
|
4180
|
+
const v = obj[key];
|
|
4181
|
+
return typeof v === "string" ? v : v == null ? "" : String(v);
|
|
4182
|
+
}
|
|
4183
|
+
function unwrapList2(raw) {
|
|
4184
|
+
if (Array.isArray(raw)) {
|
|
4185
|
+
return raw.map(asRecord3).filter((x) => Boolean(x));
|
|
4186
|
+
}
|
|
4187
|
+
const obj = asRecord3(raw);
|
|
4188
|
+
if (!obj) return [];
|
|
4189
|
+
if (Array.isArray(obj.data)) {
|
|
4190
|
+
return obj.data.map(asRecord3).filter((x) => Boolean(x));
|
|
4191
|
+
}
|
|
4192
|
+
return [];
|
|
4193
|
+
}
|
|
4194
|
+
async function runTemplatesList(opts) {
|
|
4195
|
+
const config = loadConfig();
|
|
4196
|
+
const params = new URLSearchParams({ pageSize: "100", pageIndex: "1" });
|
|
4197
|
+
if (opts.package) params.set("package", opts.package);
|
|
4198
|
+
if (opts.industry) params.set("industry", opts.industry);
|
|
4199
|
+
if (opts.keyword) params.set("keyword", opts.keyword);
|
|
4200
|
+
const url = `${config.apiBaseUrl}/website-provision/templates?${params.toString()}`;
|
|
4201
|
+
let raw;
|
|
4202
|
+
try {
|
|
4203
|
+
raw = await apiFetch2(url, config, {}, opts.verbose);
|
|
4204
|
+
} catch (e) {
|
|
4205
|
+
console.error(`
|
|
4206
|
+
\u274C \u83B7\u53D6\u6A21\u677F\u5217\u8868\u5931\u8D25\uFF1A${e.message}`);
|
|
4207
|
+
if (!opts.verbose) console.error(" \u52A0 --verbose \u53EF\u67E5\u770B\u8BE6\u7EC6\u9519\u8BEF");
|
|
4208
|
+
process.exit(1);
|
|
4209
|
+
return;
|
|
4210
|
+
}
|
|
4211
|
+
const list = unwrapList2(raw);
|
|
4212
|
+
if (opts.json) {
|
|
4213
|
+
console.log(JSON.stringify({ total: list.length, templates: list }, null, 2));
|
|
4214
|
+
return;
|
|
4215
|
+
}
|
|
4216
|
+
if (list.length === 0) {
|
|
4217
|
+
console.log("\n\u6682\u65E0\u5339\u914D\u6A21\u677F\u3002\u8BF7\u68C0\u67E5 --package \u662F\u5426\u6B63\u786E\u3002\n");
|
|
4218
|
+
return;
|
|
4219
|
+
}
|
|
4220
|
+
const columns = [
|
|
4221
|
+
{ key: "id", header: "siteTemplateId" },
|
|
4222
|
+
{ key: "name", header: "\u540D\u79F0" },
|
|
4223
|
+
{ key: "industry", header: "\u884C\u4E1A" },
|
|
4224
|
+
{ key: "version", header: "\u7248\u672C" },
|
|
4225
|
+
{ key: "hot", header: "\u70ED\u95E8" },
|
|
4226
|
+
{ key: "neu", header: "\u65B0\u54C1" }
|
|
4227
|
+
];
|
|
4228
|
+
const rows = list.map((t) => ({
|
|
4229
|
+
id: readString3(t, "siteTemplateId") || readString3(t, "SiteTemplateId"),
|
|
4230
|
+
name: readString3(t, "name") || readString3(t, "Name"),
|
|
4231
|
+
industry: readString3(t, "industrys") || readString3(t, "Industrys") || "-",
|
|
4232
|
+
version: readString3(t, "version") || readString3(t, "Version") || "-",
|
|
4233
|
+
hot: String(t.hotTag ?? t.HotTag ?? "-"),
|
|
4234
|
+
neu: String(t.newTag ?? t.NewTag ?? "-")
|
|
4235
|
+
}));
|
|
4236
|
+
console.log(`
|
|
4237
|
+
\u6A21\u677F\u5217\u8868\uFF08\u5171 ${list.length} \u4E2A\uFF09
|
|
4238
|
+
`);
|
|
4239
|
+
printCliTable(rows, columns);
|
|
4240
|
+
console.log("\n\u8BE6\u60C5\uFF1Asiluzan-website templates get --id <siteTemplateId>\n");
|
|
4241
|
+
}
|
|
4242
|
+
async function runTemplatesGet(opts) {
|
|
4243
|
+
const id = opts.id?.trim();
|
|
4244
|
+
if (!id) {
|
|
4245
|
+
console.error("\n\u274C \u8BF7\u63D0\u4F9B --id <siteTemplateId>\n");
|
|
4246
|
+
process.exit(1);
|
|
4247
|
+
}
|
|
4248
|
+
const config = loadConfig();
|
|
4249
|
+
const url = `${config.apiBaseUrl}/website-provision/templates/${encodeURIComponent(id)}`;
|
|
4250
|
+
let raw;
|
|
4251
|
+
try {
|
|
4252
|
+
raw = await apiFetch2(url, config, {}, opts.verbose);
|
|
4253
|
+
} catch (e) {
|
|
4254
|
+
console.error(`
|
|
4255
|
+
\u274C \u83B7\u53D6\u6A21\u677F\u8BE6\u60C5\u5931\u8D25\uFF1A${e.message}`);
|
|
4256
|
+
process.exit(1);
|
|
4257
|
+
return;
|
|
4258
|
+
}
|
|
4259
|
+
if (opts.json) {
|
|
4260
|
+
console.log(JSON.stringify(raw, null, 2));
|
|
4261
|
+
return;
|
|
4262
|
+
}
|
|
4263
|
+
const t = asRecord3(raw);
|
|
4264
|
+
console.log("\n\u6A21\u677F\u8BE6\u60C5\n");
|
|
4265
|
+
console.log(` siteTemplateId : ${readString3(t, "siteTemplateId") || readString3(t, "SiteTemplateId") || id}`);
|
|
4266
|
+
console.log(` name : ${readString3(t, "name") || readString3(t, "Name")}`);
|
|
4267
|
+
console.log(` description : ${readString3(t, "description") || readString3(t, "Description") || "-"}`);
|
|
4268
|
+
console.log(` industrys : ${readString3(t, "industrys") || readString3(t, "Industrys") || "-"}`);
|
|
4269
|
+
console.log(` version : ${readString3(t, "version") || readString3(t, "Version") || "-"}`);
|
|
4270
|
+
console.log(` hasTheme : ${String(t?.hasTheme ?? "-")}`);
|
|
4271
|
+
console.log("\n\uFF08\u5B89\u88C5\u5305\u5730\u5740\u5DF2\u8131\u654F\uFF0C\u4E0D\u4F1A\u8F93\u51FA\uFF09\n");
|
|
4272
|
+
}
|
|
4273
|
+
function register7(program2) {
|
|
4274
|
+
const templates = program2.command("templates").description("\u5EFA\u7AD9\u6A21\u677F\uFF08website-provision\uFF09");
|
|
4275
|
+
templates.command("list").description("\u6309\u5957\u9910\u7B49\u6761\u4EF6\u5217\u51FA\u6A21\u677F").option("--package <packageId>", "\u5957\u9910 ID \u8FC7\u6EE4").option("--industry <industry>", "\u884C\u4E1A\u8FC7\u6EE4").option("--keyword <keyword>", "\u5173\u952E\u8BCD").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
4276
|
+
await runTemplatesList(opts);
|
|
4277
|
+
});
|
|
4278
|
+
templates.command("get").description("\u6A21\u677F\u8BE6\u60C5\uFF08\u4E0D\u542B\u5B89\u88C5\u5305 URI\uFF09").option("--id <siteTemplateId>", "\u6A21\u677F ID").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
4279
|
+
await runTemplatesGet(opts);
|
|
4280
|
+
});
|
|
4281
|
+
}
|
|
4282
|
+
|
|
4283
|
+
// src/commands/trial.ts
|
|
4284
|
+
function asRecord4(value) {
|
|
4285
|
+
return value && typeof value === "object" ? value : null;
|
|
4286
|
+
}
|
|
4287
|
+
async function runTrialStatus(opts) {
|
|
4288
|
+
const config = loadConfig();
|
|
4289
|
+
const url = `${config.apiBaseUrl}/website-provision/trial-count`;
|
|
4290
|
+
let raw;
|
|
4291
|
+
try {
|
|
4292
|
+
raw = await apiFetch2(url, config, {}, opts.verbose);
|
|
4293
|
+
} catch (e) {
|
|
4294
|
+
console.error(`
|
|
4295
|
+
\u274C \u83B7\u53D6\u8BD5\u7528\u6B21\u6570\u5931\u8D25\uFF1A${e.message}`);
|
|
4296
|
+
process.exit(1);
|
|
4297
|
+
return;
|
|
4298
|
+
}
|
|
4299
|
+
if (opts.json) {
|
|
4300
|
+
console.log(JSON.stringify(raw, null, 2));
|
|
4301
|
+
return;
|
|
4302
|
+
}
|
|
4303
|
+
const obj = asRecord4(raw);
|
|
4304
|
+
const used = Number(obj?.used ?? obj?.Used ?? 0);
|
|
4305
|
+
const limit = Number(obj?.limit ?? obj?.Limit ?? 3);
|
|
4306
|
+
const remaining = Number(obj?.remaining ?? obj?.Remaining ?? Math.max(0, limit - used));
|
|
4307
|
+
console.log("\n\u8BD5\u7528\u5EFA\u7AD9\u989D\u5EA6\n");
|
|
4308
|
+
console.log(` \u5DF2\u7528 : ${used}`);
|
|
4309
|
+
console.log(` \u4E0A\u9650 : ${limit}`);
|
|
4310
|
+
console.log(` \u5269\u4F59 : ${remaining}`);
|
|
4311
|
+
console.log();
|
|
4312
|
+
}
|
|
4313
|
+
function register8(program2) {
|
|
4314
|
+
const trial = program2.command("trial").description("\u8BD5\u7528\u5EFA\u7AD9\u989D\u5EA6\uFF08website-provision\uFF09");
|
|
4315
|
+
trial.command("status").description("\u67E5\u770B\u5F53\u524D\u8D26\u53F7\u8BD5\u7528\u5DF2\u7528\u6B21\u6570\u4E0E\u4E0A\u9650").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
4316
|
+
await runTrialStatus(opts);
|
|
4317
|
+
});
|
|
4318
|
+
}
|
|
4319
|
+
|
|
4320
|
+
// src/commands/bills.ts
|
|
4321
|
+
function asRecord5(value) {
|
|
4322
|
+
return value && typeof value === "object" ? value : null;
|
|
4323
|
+
}
|
|
4324
|
+
function readString4(obj, key) {
|
|
4325
|
+
if (!obj) return "";
|
|
4326
|
+
const v = obj[key];
|
|
4327
|
+
return typeof v === "string" ? v : v == null ? "" : String(v);
|
|
4328
|
+
}
|
|
4329
|
+
async function runBillsCreate(opts) {
|
|
4330
|
+
const packageId = opts.package?.trim();
|
|
4331
|
+
if (!packageId) {
|
|
4332
|
+
console.error("\n\u274C \u8BF7\u63D0\u4F9B --package <packageId>\n");
|
|
4333
|
+
process.exit(1);
|
|
4334
|
+
}
|
|
4335
|
+
const config = loadConfig();
|
|
4336
|
+
const body = {
|
|
4337
|
+
packageId,
|
|
4338
|
+
payChannel: opts.channel || "Monthly",
|
|
4339
|
+
currency: opts.currency || "USD",
|
|
4340
|
+
successUrl: opts.successUrl || "",
|
|
4341
|
+
cancelUrl: opts.cancelUrl || ""
|
|
4342
|
+
};
|
|
4343
|
+
console.log("\n\u5373\u5C06\u521B\u5EFA\u5957\u9910\u8D26\u5355\uFF08\u4E0D\u4F1A\u81EA\u52A8\u6263\u6B3E\uFF0C\u7528\u6237\u9700\u6253\u5F00\u6536\u94F6\u53F0\u5B8C\u6210\u652F\u4ED8\uFF09\uFF1A");
|
|
4344
|
+
console.log(` packageId : ${body.packageId}`);
|
|
4345
|
+
console.log(` payChannel : ${body.payChannel}`);
|
|
4346
|
+
console.log(` currency : ${body.currency}`);
|
|
4347
|
+
const url = `${config.apiBaseUrl}/website-provision/bills`;
|
|
4348
|
+
let raw;
|
|
4349
|
+
try {
|
|
4350
|
+
raw = await apiFetch2(
|
|
4351
|
+
url,
|
|
4352
|
+
config,
|
|
4353
|
+
{ method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) },
|
|
4354
|
+
opts.verbose
|
|
4355
|
+
);
|
|
4356
|
+
} catch (e) {
|
|
4357
|
+
console.error(`
|
|
4358
|
+
\u274C \u521B\u5EFA\u8D26\u5355\u5931\u8D25\uFF1A${e.message}`);
|
|
4359
|
+
process.exit(1);
|
|
4360
|
+
return;
|
|
4361
|
+
}
|
|
4362
|
+
if (opts.json) {
|
|
4363
|
+
console.log(JSON.stringify(raw, null, 2));
|
|
4364
|
+
return;
|
|
4365
|
+
}
|
|
4366
|
+
const obj = asRecord5(raw);
|
|
4367
|
+
const billId = readString4(obj, "billId") || readString4(obj, "BillId");
|
|
4368
|
+
const checkoutUrl = readString4(obj, "checkoutUrl") || readString4(obj, "CheckoutUrl");
|
|
4369
|
+
console.log("\n\u2705 \u8D26\u5355\u5DF2\u521B\u5EFA\n");
|
|
4370
|
+
console.log(` billId : ${billId}`);
|
|
4371
|
+
console.log(` state : ${readString4(obj, "state") || readString4(obj, "State") || "-"}`);
|
|
4372
|
+
console.log(` checkoutUrl : ${checkoutUrl || "(\u65E0\uFF0C\u8BF7\u68C0\u67E5 Stripe \u914D\u7F6E)"}`);
|
|
4373
|
+
console.log("\n\u8BF7\u5C06\u6536\u94F6\u53F0\u94FE\u63A5\u53D1\u7ED9\u7528\u6237\u5B8C\u6210\u652F\u4ED8\uFF0C\u7136\u540E\uFF1A");
|
|
4374
|
+
console.log(` siluzan-website bills get --id ${billId}`);
|
|
4375
|
+
console.log(` \u652F\u4ED8\u6210\u529F\u540E\u521B\u5EFA\u7AD9\u70B9\u65F6\u5E26 --bill ${billId}
|
|
4376
|
+
`);
|
|
4377
|
+
}
|
|
4378
|
+
async function runBillsGet(opts) {
|
|
4379
|
+
const id = opts.id?.trim();
|
|
4380
|
+
if (!id) {
|
|
4381
|
+
console.error("\n\u274C \u8BF7\u63D0\u4F9B --id <billId>\n");
|
|
4382
|
+
process.exit(1);
|
|
4383
|
+
}
|
|
4384
|
+
const config = loadConfig();
|
|
4385
|
+
const url = `${config.apiBaseUrl}/website-provision/bills/${encodeURIComponent(id)}`;
|
|
4386
|
+
let raw;
|
|
4387
|
+
try {
|
|
4388
|
+
raw = await apiFetch2(url, config, {}, opts.verbose);
|
|
4389
|
+
} catch (e) {
|
|
4390
|
+
console.error(`
|
|
4391
|
+
\u274C \u67E5\u8BE2\u8D26\u5355\u5931\u8D25\uFF1A${e.message}`);
|
|
4392
|
+
process.exit(1);
|
|
4393
|
+
return;
|
|
4394
|
+
}
|
|
4395
|
+
if (opts.json) {
|
|
4396
|
+
console.log(JSON.stringify(raw, null, 2));
|
|
4397
|
+
return;
|
|
4398
|
+
}
|
|
4399
|
+
const obj = asRecord5(raw);
|
|
4400
|
+
console.log("\n\u8D26\u5355\u72B6\u6001\n");
|
|
4401
|
+
console.log(` billId : ${readString4(obj, "billId") || id}`);
|
|
4402
|
+
console.log(` state : ${readString4(obj, "state") || readString4(obj, "State")}`);
|
|
4403
|
+
console.log(` paid : ${String(obj?.paid ?? obj?.Paid ?? "-")}`);
|
|
4404
|
+
console.log(` packageId : ${readString4(obj, "packageId") || readString4(obj, "PackageId") || "-"}`);
|
|
4405
|
+
console.log(` siteId : ${readString4(obj, "siteId") || readString4(obj, "SiteId") || "(\u672A\u7ED1\u5B9A)"}`);
|
|
4406
|
+
console.log();
|
|
4407
|
+
}
|
|
4408
|
+
function register9(program2) {
|
|
4409
|
+
const bills = program2.command("bills").description("\u5EFA\u7AD9\u5957\u9910\u8D26\u5355 / \u652F\u4ED8\uFF08website-provision\uFF09");
|
|
4410
|
+
bills.command("create").description("\u521B\u5EFA\u5957\u9910\u8D26\u5355\u5E76\u8FD4\u56DE\u6536\u94F6\u53F0 URL\uFF08\u5199\u64CD\u4F5C\uFF0CAgent \u987B\u5148\u83B7\u7528\u6237\u786E\u8BA4\uFF09").option("--package <packageId>", "\u5957\u9910 ID").option("--channel <Monthly|Yearly>", "\u4ED8\u8D39\u5468\u671F", "Monthly").option("--currency <code>", "\u5E01\u79CD", "USD").option("--success-url <url>", "\u652F\u4ED8\u6210\u529F\u56DE\u8DF3 URL").option("--cancel-url <url>", "\u652F\u4ED8\u53D6\u6D88\u56DE\u8DF3 URL").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
4411
|
+
await runBillsCreate(opts);
|
|
4412
|
+
});
|
|
4413
|
+
bills.command("get").description("\u67E5\u8BE2\u8D26\u5355\u652F\u4ED8\u4E0E\u7ED1\u5B9A\u72B6\u6001").option("--id <billId>", "\u8D26\u5355\u53F7").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
4414
|
+
await runBillsGet(opts);
|
|
4415
|
+
});
|
|
3912
4416
|
}
|
|
3913
4417
|
|
|
3914
4418
|
// src/commands/pages.ts
|
|
@@ -4202,7 +4706,7 @@ async function runPagesTrash(opts) {
|
|
|
4202
4706
|
`
|
|
4203
4707
|
);
|
|
4204
4708
|
}
|
|
4205
|
-
function
|
|
4709
|
+
function register10(program2) {
|
|
4206
4710
|
const pages = program2.command("pages").description("WordPress \u9875\u9762\uFF08zionbuilder visual-edit\uFF09");
|
|
4207
4711
|
pages.command("list").description("\u5217\u51FA\u7AD9\u70B9\u9875\u9762").option("-s, --site <guidOrName>", "\u7AD9\u70B9 guid \u6216\u540D\u79F0").option("--url <url>", "\u76F4\u63A5\u6307\u5B9A\u7AD9\u70B9\u5730\u5740\uFF08\u8DF3\u8FC7 all-sites\uFF09").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
4208
4712
|
await runPagesList(opts);
|
|
@@ -4735,7 +5239,7 @@ function hintZaspIfNeeded(pluginOrSlug) {
|
|
|
4735
5239
|
if (!pluginOrSlug.toLowerCase().includes("zasp-smart-recommender")) return;
|
|
4736
5240
|
console.log(" \u63A5\u4E0B\u6765\u7528 `siluzan-website zasp settings / set / sync` \u914D\u7F6E AI \u63A8\u8350\uFF08\u89C1 references/zasp-recommender.md\uFF09\n");
|
|
4737
5241
|
}
|
|
4738
|
-
function
|
|
5242
|
+
function register11(program2) {
|
|
4739
5243
|
const zasp = program2.command("zasp").description("zasp-smart-recommender\uFF08AI \u63A8\u8350\uFF09\u914D\u7F6E\u4E0E\u9A8C\u6536\uFF0C\u8D70\u7AD9\u70B9 /wp-json/zasp-b2b/v2");
|
|
4740
5244
|
zasp.command("settings").description("\u67E5\u770B\u5F53\u524D AI \u63A8\u8350\u914D\u7F6E\uFF08GET /settings\uFF09").option("-s, --site <guidOrName>", "\u7AD9\u70B9 guid \u6216\u540D\u79F0").option("--url <url>", "\u76F4\u63A5\u6307\u5B9A\u7AD9\u70B9\u5730\u5740").option("--json", "\u8F93\u51FA\u5B8C\u6574 JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
4741
5245
|
await runZaspSettings(opts);
|
|
@@ -5247,7 +5751,7 @@ async function runPluginsUninstall(opts) {
|
|
|
5247
5751
|
exitOnError: false
|
|
5248
5752
|
});
|
|
5249
5753
|
}
|
|
5250
|
-
function
|
|
5754
|
+
function register12(program2) {
|
|
5251
5755
|
const plugins = program2.command("plugins").description("WordPress \u63D2\u4EF6\uFF1A\u5217\u51FA\u3001\u76EE\u5F55\u3001\u5B89\u88C5\u3001\u5347\u7EA7\u3001\u5378\u8F7D");
|
|
5252
5756
|
plugins.command("list").description("\u5217\u51FA\u7AD9\u70B9\u5DF2\u5B89\u88C5\u7684\u5168\u90E8\u63D2\u4EF6").option("-s, --site <guidOrName>", "\u7AD9\u70B9 guid \u6216\u540D\u79F0").option("--url <url>", "\u76F4\u63A5\u6307\u5B9A\u7AD9\u70B9\u5730\u5740").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
5253
5757
|
await runPluginsList(opts);
|
|
@@ -5534,7 +6038,7 @@ async function runContentTrash(opts) {
|
|
|
5534
6038
|
\u2705 \u5DF2\u79FB\u5165\u56DE\u6536\u7AD9 ${restBase} #${id}\uFF08status=${item.status || "trash"}\uFF09
|
|
5535
6039
|
`);
|
|
5536
6040
|
}
|
|
5537
|
-
function
|
|
6041
|
+
function register13(program2) {
|
|
5538
6042
|
const content = program2.command("content").description("\u901A\u7528\u5185\u5BB9\uFF1A\u6587\u7AE0/\u4EA7\u54C1\u7B49 REST \u7C7B\u578B\uFF08\u9875\u9762\u6B63\u6587\u8BF7\u7528 pages\uFF09");
|
|
5539
6043
|
content.command("types").description("\u5217\u51FA\u7AD9\u70B9\u53EF REST \u7BA1\u7406\u7684\u5185\u5BB9\u7C7B\u578B").option("-s, --site <guidOrName>", "\u7AD9\u70B9 guid \u6216\u540D\u79F0").option("--url <url>", "\u76F4\u63A5\u6307\u5B9A\u7AD9\u70B9\u5730\u5740").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
5540
6044
|
await runContentTypes(opts);
|
|
@@ -5724,7 +6228,7 @@ async function runMediaUpload(opts) {
|
|
|
5724
6228
|
console.log(` \u6807\u9898 : ${wpRenderedText(item.title) || filename}`);
|
|
5725
6229
|
console.log();
|
|
5726
6230
|
}
|
|
5727
|
-
function
|
|
6231
|
+
function register14(program2) {
|
|
5728
6232
|
const media = program2.command("media").description("\u5A92\u4F53\u5E93\uFF1A\u5217\u51FA\u3001\u67E5\u770B\u3001\u4E0A\u4F20");
|
|
5729
6233
|
media.command("list").description("\u5217\u51FA\u5A92\u4F53\u5E93\uFF08\u6700\u8FD1 50 \u6761\uFF09").option("-s, --site <guidOrName>", "\u7AD9\u70B9 guid \u6216\u540D\u79F0").option("--url <url>", "\u76F4\u63A5\u6307\u5B9A\u7AD9\u70B9\u5730\u5740").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
5730
6234
|
await runMediaList(opts);
|
|
@@ -5905,7 +6409,7 @@ async function runTermsDelete(opts) {
|
|
|
5905
6409
|
\u2705 \u5DF2\u5220\u9664 ${restBase} #${id}
|
|
5906
6410
|
`);
|
|
5907
6411
|
}
|
|
5908
|
-
function
|
|
6412
|
+
function register15(program2) {
|
|
5909
6413
|
const terms = program2.command("terms").description("\u5206\u7C7B / \u6807\u7B7E / \u81EA\u5B9A\u4E49\u5206\u7C7B\u6CD5");
|
|
5910
6414
|
terms.command("taxonomies").description("\u5217\u51FA\u5206\u7C7B\u6CD5").option("-s, --site <guidOrName>", "\u7AD9\u70B9 guid \u6216\u540D\u79F0").option("--url <url>", "\u76F4\u63A5\u6307\u5B9A\u7AD9\u70B9\u5730\u5740").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
5911
6415
|
await runTermsTaxonomies(opts);
|
|
@@ -5985,7 +6489,7 @@ ${target.site.name} \u641C\u7D22\u300C${q}\u300D\uFF08${hits.length}\uFF09
|
|
|
5985
6489
|
);
|
|
5986
6490
|
console.log();
|
|
5987
6491
|
}
|
|
5988
|
-
function
|
|
6492
|
+
function register16(program2) {
|
|
5989
6493
|
program2.command("search").description("\u5168\u7AD9\u641C\u7D22\uFF08\u9875\u9762/\u6587\u7AE0/\u5A92\u4F53\u7B49\uFF09").option("-s, --site <guidOrName>", "\u7AD9\u70B9 guid \u6216\u540D\u79F0").option("--url <url>", "\u76F4\u63A5\u6307\u5B9A\u7AD9\u70B9\u5730\u5740").requiredOption("-q, --q <keyword>", "\u5173\u952E\u8BCD").option("--type <subtype>", "\u9650\u5B9A rest \u5B50\u7C7B\u578B\uFF0C\u5982 page / post").option("--json", "\u8F93\u51FA JSON", false).option("--verbose", "\u8F93\u51FA\u8BF7\u6C42\u8BE6\u60C5", false).action(async (opts) => {
|
|
5990
6494
|
await runSearch(opts);
|
|
5991
6495
|
});
|
|
@@ -5994,20 +6498,24 @@ function register12(program2) {
|
|
|
5994
6498
|
// src/index.ts
|
|
5995
6499
|
installProcessHandlers();
|
|
5996
6500
|
var program = new Command();
|
|
5997
|
-
program.name("siluzan-website").description("Siluzan WordPress
|
|
6501
|
+
program.name("siluzan-website").description("Siluzan WordPress\uFF1A\u5F00\u901A\u5EFA\u7AD9\u3001\u7AD9\u70B9\u3001\u9875\u9762\u3001\u6587\u7AE0\u3001\u5A92\u4F53\u3001\u5206\u7C7B\u3001\u63D2\u4EF6\u3001AI \u63A8\u8350").version(getCurrentVersion2());
|
|
5998
6502
|
var REGISTRARS = [
|
|
5999
6503
|
register,
|
|
6000
6504
|
register2,
|
|
6001
6505
|
register3,
|
|
6002
6506
|
register4,
|
|
6003
|
-
register5,
|
|
6004
6507
|
register6,
|
|
6508
|
+
register7,
|
|
6509
|
+
register8,
|
|
6005
6510
|
register9,
|
|
6511
|
+
register5,
|
|
6006
6512
|
register10,
|
|
6007
|
-
|
|
6513
|
+
register13,
|
|
6514
|
+
register14,
|
|
6515
|
+
register15,
|
|
6516
|
+
register16,
|
|
6008
6517
|
register12,
|
|
6009
|
-
|
|
6010
|
-
register7
|
|
6518
|
+
register11
|
|
6011
6519
|
];
|
|
6012
6520
|
for (const reg of REGISTRARS) reg(program);
|
|
6013
6521
|
program.parse();
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: siluzan-website
|
|
3
3
|
description: >-
|
|
4
|
-
管理丝路赞 WordPress 站点(wp-k8s
|
|
5
|
-
当用户提到 WordPress
|
|
4
|
+
管理丝路赞 WordPress 站点(wp-k8s 托管):选套餐/模板开通新站、列出站点、页面/文章/产品、媒体、分类、插件。
|
|
5
|
+
当用户提到 WordPress、建站、选套餐、选模板、试用站、创建网站、建站后台、新增页面、发文章、上传图片、改官网、装插件、
|
|
6
6
|
AI 推荐、相关推荐、zasp、zasp-smart-recommender、B2B Site AI、
|
|
7
|
-
站点 guid、siluzan-website、zionbuilder、visual-edit 时使用。不是 LPS / AI Sites,也不是 SEO JSON 生成。
|
|
7
|
+
站点 guid、siluzan-website、zionbuilder、visual-edit、website-provision 时使用。不是 LPS / AI Sites,也不是 SEO JSON 生成。
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# siluzan-website
|
|
11
11
|
|
|
12
|
-
管理用户账号下的 **WordPress 站点**(TSO 建站 / wp-k8s)。通过 CLI
|
|
12
|
+
管理用户账号下的 **WordPress 站点**(TSO 建站 / wp-k8s)。通过 CLI 调主站 `website-provision` / `all-sites` 与站点 WP REST,不要手写 curl,不要猜 guid / 页面 ID,**不要直连 SiteMan**。
|
|
13
13
|
|
|
14
|
-
**不是** `landing-page-system` 的 LPS Agent,也不是 `siluzan-seo` 的 schema
|
|
14
|
+
**不是** `landing-page-system` 的 LPS Agent,也不是 `siluzan-seo` 的 schema 生成。用户要「开通新站 / 我的官网加一页 / 发资讯 / 装插件」才用本 Skill。
|
|
15
15
|
|
|
16
16
|
## 一键安装
|
|
17
17
|
|
|
@@ -39,7 +39,12 @@ Windows 注意:部分 Agent 通过 PowerShell / cmd 代执行时可能失败
|
|
|
39
39
|
| `siluzan-website login` / `send-login-code` | 登录并保存 API Key | [references/setup.md](references/setup.md) |
|
|
40
40
|
| `siluzan-website config show/set/clear` | 查看 / 写入凭据 | [references/setup.md](references/setup.md) |
|
|
41
41
|
| `siluzan-website init` / `update` | 写入 / 刷新 Skill 文件 | [references/setup.md](references/setup.md) |
|
|
42
|
+
| `siluzan-website packages list` | 可售套餐 | [references/provision.md](references/provision.md) |
|
|
43
|
+
| `siluzan-website templates list/get` | 建站模板 | [references/provision.md](references/provision.md) |
|
|
44
|
+
| `siluzan-website trial status` | 试用额度 | [references/provision.md](references/provision.md) |
|
|
45
|
+
| `siluzan-website bills create/get` | 套餐账单与支付状态 | [references/provision.md](references/provision.md) |
|
|
42
46
|
| `siluzan-website sites list` | 列出我的 WordPress 站点 | [references/sites.md](references/sites.md) |
|
|
47
|
+
| `siluzan-website sites create/status/bind` | 开通 / 状态 / 挂接补偿 | [references/provision.md](references/provision.md) |
|
|
43
48
|
| `siluzan-website pages list/get/add/update/meta/trash` | Zion 页面 + 元数据 / 回收站 | [references/pages.md](references/pages.md) |
|
|
44
49
|
| `siluzan-website content types/list/get/add/update/trash` | 文章/产品等 REST 类型 | [references/content.md](references/content.md) |
|
|
45
50
|
| `siluzan-website media list/get/upload` | 媒体库 | [references/media.md](references/media.md) |
|
|
@@ -56,6 +61,7 @@ Windows 注意:部分 Agent 通过 PowerShell / cmd 代执行时可能失败
|
|
|
56
61
|
| 用户在做什么 | 先读 | 再执行 |
|
|
57
62
|
|--------------|------|--------|
|
|
58
63
|
| 首次安装 / 登录 | `references/setup.md` | `login` 或复用已有 CSO/TSO 凭据 |
|
|
64
|
+
| **选套餐 / 选模板 / 试用或付费开站** | `references/provision.md` | packages → templates → trial/bills → 确认 → sites create |
|
|
59
65
|
| 我有哪些网站 | `references/sites.md` | `sites list`,不要猜 guid |
|
|
60
66
|
| 加一页 / 改一页正文 | `references/pages.md` | 先 `sites list` 再 `pages add/update` |
|
|
61
67
|
| 改页面 slug / 状态 / 回收站 | `references/pages.md` | `pages meta` / `pages trash` |
|
|
@@ -64,30 +70,32 @@ Windows 注意:部分 Agent 通过 PowerShell / cmd 代执行时可能失败
|
|
|
64
70
|
| 分类标签 | `references/terms.md` | `terms list` 再 add/update |
|
|
65
71
|
| 按关键词找内容 | `references/search.md` | `search --q` |
|
|
66
72
|
| 这个站装了哪些插件 | `references/plugins.md` | `plugins list`(全部已装,不只是目录) |
|
|
67
|
-
| 安装 / 启用目录插件 | `references/plugins.md` | `plugins catalog
|
|
73
|
+
| 安装 / 启用目录插件 | `references/plugins.md` | `plugins catalog` → 确认 → `install --slug` |
|
|
68
74
|
| 安装外部插件 | `references/plugins.md` | 确认 → `install --zip` |
|
|
69
|
-
| 升级已装插件 | `references/plugins.md` | `list`
|
|
70
|
-
| 卸载插件 | `references/plugins.md` | `list`
|
|
71
|
-
| 配置 / 验收 AI 推荐(zasp) | `references/zasp-recommender.md` |
|
|
75
|
+
| 升级已装插件 | `references/plugins.md` | `list` → 确认 → `update --plugin` |
|
|
76
|
+
| 卸载插件 | `references/plugins.md` | `list` → 确认 → `uninstall --plugin` |
|
|
77
|
+
| 配置 / 验收 AI 推荐(zasp) | `references/zasp-recommender.md` | 确认已装 → `zasp settings` → `set` / `sync` |
|
|
72
78
|
|
|
73
79
|
---
|
|
74
80
|
|
|
75
81
|
## AI 行为规范
|
|
76
82
|
|
|
77
83
|
1. **计划 → 确认 → 执行 → 验证**
|
|
78
|
-
- 写操作(`pages add/update/meta/trash`、`content add/update/trash`、`media upload`、`terms add/update/delete`、`plugins install/update/uninstall/update-helper`、`zasp set/sync
|
|
79
|
-
- 只读(`sites list`、`pages list/get`、`content types/list/get`、`media list/get`、`terms taxonomies/list`、`search`、`plugins list/catalog/helper-status`、`zasp settings/schema/status/diagnostics`、`config show`)可直接跑。
|
|
80
|
-
2. **不猜 ID**:站点用 `sites list` 的 `guid`;页面用 `pages list` 的 `id
|
|
81
|
-
3. **先查再写**:改页面前先 `pages list`
|
|
82
|
-
4. **只认 API Key**:所有命令走 `x-api-key
|
|
83
|
-
5.
|
|
84
|
-
6. **失败先自救**:401 →
|
|
85
|
-
7. **不传任意下载 URL**:外部插件只接受本地 `--zip`。
|
|
84
|
+
- 写操作(`bills create`、`sites create/bind`、`pages add/update/meta/trash`、`content add/update/trash`、`media upload`、`terms add/update/delete`、`plugins install/update/uninstall/update-helper`、`zasp set/sync`)会立刻生效,执行前必须复述目标与内容,获得用户确认。
|
|
85
|
+
- 只读(`packages/templates/trial`、`bills get`、`sites list/status`、`pages list/get`、`content types/list/get`、`media list/get`、`terms taxonomies/list`、`search`、`plugins list/catalog/helper-status`、`zasp settings/schema/status/diagnostics`、`config show`)可直接跑。
|
|
86
|
+
2. **不猜 ID**:站点用 `sites list` 的 `guid`;页面用 `pages list` 的 `id`;套餐/模板用 list 返回的 id。
|
|
87
|
+
3. **先查再写**:改页面前先 `pages list`;开站前先 `trial status` 或 `bills get`。
|
|
88
|
+
4. **只认 API Key**:所有命令走 `x-api-key`。Agent 沙箱只注入 Key,不要向用户要 JWT,也不要设 `SILUZAN_AUTH_TOKEN`,不要直连 ussiteman。
|
|
89
|
+
5. **命令透明**:用一句话说明意图;用户要细节时再给完整命令。
|
|
90
|
+
6. **失败先自救**:401 → 重新 `login`;开站失败勿盲目重试 POST;`site_created_unbound` → `sites bind`;helper 404 → 自动升 helper。不要编造成功。
|
|
91
|
+
7. **不传任意下载 URL**:外部插件只接受本地 `--zip`。
|
|
86
92
|
|
|
87
93
|
### 本版明确不做
|
|
88
94
|
|
|
89
|
-
-
|
|
95
|
+
- CLI / Agent 直连 SiteMan(ussiteman)
|
|
96
|
+
- 删除 / 重启站点
|
|
90
97
|
- 绑定域名 / CDN / SSL
|
|
91
98
|
- 单独停用插件但留在磁盘(停用只作为卸载的一步)
|
|
92
99
|
- 用 API 写入 `ZASP_PROXY_KEY`(K8s 环境变量)
|
|
93
100
|
- LPS / AI Sites / SEO JSON 灌入
|
|
101
|
+
- Agent 静默代扣 / 伪造已支付账单
|
package/dist/skill/_meta.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "siluzan-website",
|
|
3
|
-
"version": "1.0.1-beta.
|
|
4
|
-
"publishedAt":
|
|
3
|
+
"version": "1.0.1-beta.6",
|
|
4
|
+
"publishedAt": 1790567480723,
|
|
5
5
|
"homepage": "https://www.siluzan.com",
|
|
6
6
|
"source": "https://dev.azure.com/jack4it/Sammamish/_git/siluzan-skill",
|
|
7
7
|
"requiredBinaries": [
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# 对话开通站点(provision)
|
|
2
|
+
|
|
3
|
+
通过主站 `website-provision` API 完成选套餐 → 支付/试用 → 选模板 → 创建站。
|
|
4
|
+
**禁止**直连 ussiteman,**禁止**向用户要 JWT。只使用 API Key + 本 Skill CLI。
|
|
5
|
+
|
|
6
|
+
## 对话 SOP
|
|
7
|
+
|
|
8
|
+
1. `packages list` — 列套餐并与用户选定(或确认走试用)
|
|
9
|
+
2. 付费:`bills create --package <id>` → 把 `checkoutUrl` 给用户 → 用户付完后 `bills get --id <billId>` 确认 Paid
|
|
10
|
+
3. `templates list --package <id>` — 选定模板;需要时 `templates get --id`
|
|
11
|
+
4. `trial status` — 试用路径先看剩余次数(上限 3)
|
|
12
|
+
5. **复述计划并获用户确认**(站名、区域 US/CN、语种、套餐、模板、试用或账单号)
|
|
13
|
+
6. `sites create --name … --region … --package … --template … --site-lang … --admin-lang … [--bill …] [--wait]`
|
|
14
|
+
7. 若返回 `site_created_unbound`:`sites bind --site <guid> --name <同名> --region …`
|
|
15
|
+
8. `sites status` / `sites list` 核对 Online 后,再交给 pages / plugins 等运维命令
|
|
16
|
+
|
|
17
|
+
## 写操作确认
|
|
18
|
+
|
|
19
|
+
`bills create`、`sites create`、`sites bind` 执行前必须复述参数并获得用户明确同意。
|
|
20
|
+
创建站**不可盲目重试**;失败后先 `sites list` / `trial status` / `bills get` 排查。
|
|
21
|
+
|
|
22
|
+
## 命令速查
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
siluzan-website packages list
|
|
26
|
+
siluzan-website templates list --package <packageId>
|
|
27
|
+
siluzan-website templates get --id <siteTemplateId>
|
|
28
|
+
siluzan-website trial status
|
|
29
|
+
siluzan-website bills create --package <packageId> --channel Monthly
|
|
30
|
+
siluzan-website bills get --id <billId>
|
|
31
|
+
siluzan-website sites create --name "Acme" --region US --package <id> --template <id> --site-lang en_US --admin-lang en_US
|
|
32
|
+
siluzan-website sites create ... --bill <billId> --wait
|
|
33
|
+
siluzan-website sites status --site <guid> --region US
|
|
34
|
+
siluzan-website sites bind --site <guid> --region US --name "Acme"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 常见错误
|
|
38
|
+
|
|
39
|
+
| 现象 | 处理 |
|
|
40
|
+
|------|------|
|
|
41
|
+
| trial_exhausted / trials | 试用已满 3 次,引导付费账单路径 |
|
|
42
|
+
| bill_unpaid / bill_owner_mismatch | 查 `bills get`;勿用他人账单号 |
|
|
43
|
+
| site_created_unbound | 跑 `sites bind`,再 `sites list` |
|
|
44
|
+
| 503 disabled | 主站 WebsiteProvision 功能开关关闭 |
|
|
45
|
+
|
|
46
|
+
## 明确不做
|
|
47
|
+
|
|
48
|
+
- CLI 直连 SiteMan / 注入 `SILUZAN_AUTH_TOKEN` 开通
|
|
49
|
+
- 删除站、重启、绑域名、CDN、SSL
|
|
50
|
+
- AI Sites / LPS 静态建站
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 站点列表与开通
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 列表
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
siluzan-website sites list
|
|
@@ -10,7 +10,11 @@ siluzan-website sites list --json
|
|
|
10
10
|
|
|
11
11
|
走主站 `GET /query/profile/steward-individual/all-sites`(与 TSO 建站后台同一接口)。
|
|
12
12
|
|
|
13
|
-
##
|
|
13
|
+
## 开通 / 状态 / 挂接
|
|
14
|
+
|
|
15
|
+
见 [provision.md](provision.md)。创建走 `POST /website-provision/sites`,**不**直连 SiteMan。
|
|
16
|
+
|
|
17
|
+
## 返回字段(list)
|
|
14
18
|
|
|
15
19
|
| 字段 | 含义 |
|
|
16
20
|
|------|------|
|
|
@@ -33,3 +37,4 @@ siluzan-website sites list --json
|
|
|
33
37
|
2. 多个站点时让用户选,不要猜。
|
|
34
38
|
3. 后续页面 / 插件命令传 `--site <guid>`。名称唯一时 `--site 名称` 也可以。
|
|
35
39
|
4. 需要对返回结果做筛选时加 `--json`,再在本地处理;不要编造 guid。
|
|
40
|
+
5. 用户要「新建站」时走 [provision.md](provision.md),不要只用 list。
|
|
@@ -9,7 +9,7 @@ $ErrorActionPreference = 'Stop'
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
$PKG_NAME = 'siluzan-website-cli'
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
$PKG_VERSION = '1.0.1-beta.
|
|
12
|
+
$PKG_VERSION = '1.0.1-beta.6'
|
|
13
13
|
$CLI_BIN = 'siluzan-website'
|
|
14
14
|
$SKILL_LABEL = 'Siluzan Website'
|
|
15
15
|
$INSTALL_CMD = 'npm install -g siluzan-website-cli@beta'
|
|
@@ -9,7 +9,7 @@ set -euo pipefail
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
readonly PKG_NAME="siluzan-website-cli"
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
readonly PKG_VERSION="1.0.1-beta.
|
|
12
|
+
readonly PKG_VERSION="1.0.1-beta.6"
|
|
13
13
|
readonly CLI_BIN="siluzan-website"
|
|
14
14
|
readonly SKILL_LABEL="Siluzan Website"
|
|
15
15
|
readonly INSTALL_CMD="npm install -g siluzan-website-cli@beta"
|