@optima-chat/dev-skills 0.16.2 → 0.16.3
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/.claude/commands/logs.md +60 -3
- package/.claude/commands/trace-user.md +18 -6
- package/.claude/skills/cn-deploy/SKILL.md +5 -3
- package/.claude/skills/logs/SKILL.md +10 -2
- package/.claude/skills/reset-onboarding/SKILL.md +116 -0
- package/.codex/skills/cn-deploy/SKILL.md +5 -3
- package/.codex/skills/reset-onboarding/SKILL.md +116 -0
- package/AGENTS.md +11 -6
- package/README.md +73 -61
- package/bin/helpers/cn-deploy.ts +44 -37
- package/bin/helpers/logs.ts +464 -31
- package/dist/bin/helpers/cn-deploy.js +43 -37
- package/dist/bin/helpers/logs.js +410 -31
- package/package.json +1 -1
|
@@ -22,11 +22,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
22
22
|
* optima-cn-deploy --list # 列出全部可发服务
|
|
23
23
|
* optima-cn-deploy billing --vtag cn-v1.2.3 # stage 按版本 tag 构建(发版前验证)
|
|
24
24
|
* optima-cn-deploy billing --env prod --vtag cn-v1.2.3
|
|
25
|
-
* # cn-prod vtag
|
|
25
|
+
* # cn-prod vtag 发版:构建→迁移→digest 钉死部署。🔴 **中间没有人工卡点**——
|
|
26
|
+
* # 触发即一路跑到 cn-prod 部署完,没有"到云效控制台再审批一次"这一步。
|
|
27
|
+
* # 实测 2026-08-09:gateway-core / billing / user-auth / commerce-backend /
|
|
28
|
+
* # optima-scout 五条 *-cn-prod 流水线 stages 均为 build→migrate→deploy,
|
|
29
|
+
* # 无任何审批任务(aliyun devops GetPipeline 查 pipelineConfig.flow 可复核)。
|
|
30
|
+
* # ⇒ 唯一的决策点是敲下这条命令之前。
|
|
26
31
|
*
|
|
27
32
|
* 前置: aliyun CLI(profile 默认 aliyun-optima,可用 OPTIMA_ALIYUN_PROFILE 覆盖)+ gh 已登录。
|
|
28
|
-
* 流水线定义的单一信源在 optima-terraform yunxiao/(gen-pipelines.py)
|
|
29
|
-
*
|
|
33
|
+
* 流水线定义的单一信源在 optima-terraform yunxiao/(gen-pipelines.py)。本表只快照
|
|
34
|
+
* repo / SAE appId;pipelineId 不在此表 —— stage/prod 均按流水线名 ${svc}-cn-${env}
|
|
35
|
+
* 从云效 ListPipelines 实时解析,不再手工同步(见 #84)。
|
|
30
36
|
*/
|
|
31
37
|
const node_child_process_1 = require("node:child_process");
|
|
32
38
|
const ORG = '6a17b6282bf8b1184fc0e0c6';
|
|
@@ -34,30 +40,30 @@ const ENDPOINT = 'devops.cn-hangzhou.aliyuncs.com';
|
|
|
34
40
|
const PROFILE = process.env.OPTIMA_ALIYUN_PROFILE || 'aliyun-optima';
|
|
35
41
|
const CODEUP_BASE = `https://codeup.aliyun.com/${ORG}`;
|
|
36
42
|
const SERVICES = {
|
|
37
|
-
'agent-portal': {
|
|
43
|
+
'agent-portal': { repo: 'optima-portals', saeAppId: 'fe757f78-d18d-4480-9402-fe59d4721055', prodSaeAppId: '9211db38-a255-4393-ae92-7a7bb41b583d' },
|
|
38
44
|
// build-only:非 SAE 常驻(gateway-core 按 session 拉起的镜像)。release 段=解析 ACR digest
|
|
39
45
|
// → 回写 Infisical /services/gateway-core/ALIYUN_AGENT_RUNTIME_IMAGE(#807)→ 滚动重启 gateway-core。
|
|
40
|
-
// 无自身 saeAppId
|
|
41
|
-
'agent-runtime': {
|
|
42
|
-
'agentic-chat': {
|
|
43
|
-
'billing': {
|
|
44
|
-
'browser-backend': {
|
|
45
|
-
'commerce-backend': {
|
|
46
|
-
'commerce-rq-scheduler': {
|
|
47
|
-
'commerce-rq-worker': {
|
|
48
|
-
'gateway-core': {
|
|
49
|
-
'gw-admin': {
|
|
50
|
-
'kb-backend': {
|
|
51
|
-
'ops-portal': {
|
|
52
|
-
'optima-generation': {
|
|
53
|
-
'optima-generation-worker': {
|
|
54
|
-
'optima-scout': {
|
|
55
|
-
'optima-sentinel': {
|
|
56
|
-
'optima-sentinel-worker': {
|
|
57
|
-
'optima-skills': {
|
|
58
|
-
'user-auth': {
|
|
59
|
-
'user-auth-admin': {
|
|
60
|
-
'yzsgo-api': {
|
|
46
|
+
// 无自身 saeAppId(build-only 不跑 SAE ImageUrl 校验)。
|
|
47
|
+
'agent-runtime': { repo: 'optima-gateway', buildOnly: true },
|
|
48
|
+
'agentic-chat': { repo: 'agentic-chat', saeAppId: '6aea1ce1-f813-4e1c-8e97-d1ecb5398e37', prodSaeAppId: '6e290c73-a646-43ef-9da5-ad0b2e7eff73' },
|
|
49
|
+
'billing': { repo: 'optima-billing', saeAppId: '09d8e292-dc64-4af8-bce5-0a56cb666921', prodSaeAppId: '6c31cf82-8802-4d45-b6a2-e9d7c83ccce9' },
|
|
50
|
+
'browser-backend': { repo: 'optima-browser-use', saeAppId: '1fced3f6-a80a-41a4-8f23-e4d5a467f8eb', prodSaeAppId: 'eb782ed9-c468-4e81-a0fe-87e5b4264192' },
|
|
51
|
+
'commerce-backend': { repo: 'commerce-backend', saeAppId: '49d09808-508c-471a-9560-553c49a67f72', prodSaeAppId: 'd40597b6-a98c-4063-9297-8b9fdfa8add4' },
|
|
52
|
+
'commerce-rq-scheduler': { repo: 'commerce-backend', saeAppId: '1d2810ef-889e-4675-b6e6-a299e4722e68', prodSaeAppId: '762dd7a5-7fe8-41ed-9332-cfd31b0e087e' },
|
|
53
|
+
'commerce-rq-worker': { repo: 'commerce-backend', saeAppId: 'd661da87-6d24-40b8-93ed-e1c967d8abe2', prodSaeAppId: '2c9ee19a-5062-4205-9f5b-6ae3f8062a23' },
|
|
54
|
+
'gateway-core': { repo: 'optima-gateway', saeAppId: '9326b7ff-da52-48d6-86db-9c4a884be108', prodSaeAppId: 'a08ce23f-3d3e-4d89-a2cf-53c8adba614e' },
|
|
55
|
+
'gw-admin': { repo: 'optima-gateway', saeAppId: '90e0daf7-7910-46b8-b5bf-a0b8bcc60859', prodSaeAppId: 'c6bc5a78-b27f-46e2-825a-eaa338c23645' },
|
|
56
|
+
'kb-backend': { repo: 'kb-skills', saeAppId: 'c7f65160-9d9e-416e-9e36-5439010d2b2d', prodSaeAppId: '732dfc8c-ed78-43f7-a722-c614359ff1a1' },
|
|
57
|
+
'ops-portal': { repo: 'optima-portals', saeAppId: '41d0ee66-8402-4e72-bfda-8eba75d1270c', prodSaeAppId: '69e513fd-29bf-4355-a275-5eba82b21136' },
|
|
58
|
+
'optima-generation': { repo: 'optima-gen', saeAppId: '327856d5-8b18-4e15-bfd8-b8bd3b807ffa', prodSaeAppId: '868d1a69-12c9-4bb7-868b-3e89c26784b5' },
|
|
59
|
+
'optima-generation-worker': { repo: 'optima-gen', saeAppId: 'ad75b3b0-9ff4-443d-b0ef-81886bc7aa60', prodSaeAppId: '2adc941e-374b-406a-9863-e53d40bc9500' },
|
|
60
|
+
'optima-scout': { repo: 'optima-scout', saeAppId: 'bac2c3a4-90ce-49a6-81d5-caa38cb5c807', prodSaeAppId: 'f5bb7e82-e57c-4bd4-83ae-2c25f8d38647' },
|
|
61
|
+
'optima-sentinel': { repo: 'optima-sentinel', saeAppId: '3759db7b-4640-4a04-8436-4f241f0ec9d9', prodSaeAppId: 'e120e70c-b2c1-49ef-a66c-9016fd2d807d' },
|
|
62
|
+
'optima-sentinel-worker': { repo: 'optima-sentinel', saeAppId: '7c975caf-ebfb-4bb3-91c4-2a8c83d1d2e5', prodSaeAppId: 'e0f9b92c-00af-4ade-9b07-15bba48c14cc' },
|
|
63
|
+
'optima-skills': { repo: 'optima-skills', saeAppId: '90457be3-5eb3-4efc-a362-1788dcc51921', prodSaeAppId: '55a63ee7-fb75-46e4-99f3-20854a699237' },
|
|
64
|
+
'user-auth': { repo: 'user-auth', saeAppId: '36efc3a6-5b42-49fa-8db2-0865aa0c25d2', prodSaeAppId: 'd6fbf9de-fed6-4165-978f-7b3a0a456acc' },
|
|
65
|
+
'user-auth-admin': { repo: 'user-auth', saeAppId: '7feb9cc3-4731-4ea8-964c-4870a9e63afb', prodSaeAppId: '54093f99-37bf-4354-abd7-f6e76abdbcb6' },
|
|
66
|
+
'yzsgo-api': { repo: 'yzsgo', saeAppId: 'd0af7f66-ef66-4587-9e93-250d01ee3cf6', prodSaeAppId: '5a820992-e11b-404a-9e58-8f607d8e0c5f' },
|
|
61
67
|
};
|
|
62
68
|
function sh(cmd, args) {
|
|
63
69
|
try {
|
|
@@ -110,7 +116,8 @@ async function main() {
|
|
|
110
116
|
process.exit(1);
|
|
111
117
|
}
|
|
112
118
|
if (envName === 'prod') {
|
|
113
|
-
// prod = vtag 制:先 stage 同 tag 验证,再发 prod
|
|
119
|
+
// prod = vtag 制:先 stage 同 tag 验证,再发 prod。🔴 流水线内**没有**人工卡点,
|
|
120
|
+
// 下面这道 vtag 校验就是最后一道闸(实测见文件头注)。
|
|
114
121
|
if (!vtag) {
|
|
115
122
|
console.error('✗ --env prod 必须带 --vtag cn-vX.Y.Z(先 stage 同 tag 验证)');
|
|
116
123
|
process.exit(1);
|
|
@@ -152,17 +159,15 @@ async function main() {
|
|
|
152
159
|
process.exit(1);
|
|
153
160
|
}
|
|
154
161
|
console.log(`✓ mirror 已追平 ${svc.repo}@${ref} = ${ghSha.slice(0, 10)}`);
|
|
155
|
-
// 2. 触发(凭证由云效变量组供给,无需注入)。prod 流水线 id
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
process.exit(1);
|
|
163
|
-
}
|
|
164
|
-
pipelineId = hit.pipelineId;
|
|
162
|
+
// 2. 触发(凭证由云效变量组供给,无需注入)。stage/prod 流水线 id 均按名 `${svc}-cn-${env}`
|
|
163
|
+
// 从云效实时解析、不硬编码,根除与 optima-terraform cn-run.py 手工 PIPELINES 表漂移(#84)。
|
|
164
|
+
const lp = devops('ListPipelines', { maxResults: '100' });
|
|
165
|
+
const hit = (lp.pipelines || []).find((p) => p.pipelineName === `${svcName}-cn-${envName}`);
|
|
166
|
+
if (!hit) {
|
|
167
|
+
console.error(`✗ 云效无 ${svcName}-cn-${envName} 流水线`);
|
|
168
|
+
process.exit(1);
|
|
165
169
|
}
|
|
170
|
+
const pipelineId = hit.pipelineId;
|
|
166
171
|
const kv = { pipelineId: String(pipelineId) };
|
|
167
172
|
if (vtag) {
|
|
168
173
|
kv.params = JSON.stringify({
|
|
@@ -182,7 +187,8 @@ async function main() {
|
|
|
182
187
|
console.log(`▶ ${svcName} run#${runId} 已启动 (ref=${ref}, env=${envName})`);
|
|
183
188
|
console.log(` https://flow.aliyun.com/pipelines/${pipelineId}/current`);
|
|
184
189
|
if (envName === 'prod') {
|
|
185
|
-
console.log('
|
|
190
|
+
console.log('🔴 cn-prod:流水线**没有**人工卡点 —— 构建→迁移→digest 部署会一路自动走完,');
|
|
191
|
+
console.log(' 不要去云效控制台等『发布审批』(那一步不存在)。要中止只能在上面的链接里手动取消 run。');
|
|
186
192
|
}
|
|
187
193
|
if (noWait)
|
|
188
194
|
return;
|