@optima-chat/dev-skills 0.9.1 → 0.9.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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: "logs"
3
- description: "当用户请求查看日志、查看服务日志、排查问题、看看日志、检查日志、商品服务日志、后端日志、API日志、正式环境日志、生产环境日志、CI环境日志、开发环境日志、阿里云日志、cn-prod 日志、SAE 日志时,使用此技能。支持 CI、Stage、Prod(AWS ECS/CloudWatch)以及 cn-prod(阿里云 SAE,经 buildbox)四个环境的 commerce-backend、user-auth、agentic-chat、gateway-core、optima-scout、optima-skills 等服务。"
3
+ description: "当用户请求查看日志、查看服务日志、排查问题、看看日志、检查日志、商品服务日志、后端日志、API日志、正式环境日志、生产环境日志、CI环境日志、开发环境日志、阿里云日志、cn-prod 日志、SAE 日志时,使用此技能。支持 CI、Stage、Prod(AWS ECS/CloudWatch)以及 cn-prod(阿里云 SAE/SLS)四个环境的 commerce-backend、user-auth、agentic-chat、gateway-core、optima-scout、optima-skills 等服务。"
4
4
  allowed-tools: ["Bash", "SlashCommand"]
5
5
  ---
6
6
 
@@ -183,10 +183,10 @@ INFO - Database query took 3200ms: SELECT * FROM products WHERE...
183
183
  ```
184
184
 
185
185
  **特点**:
186
- - 阿里云 **SAE**(cn-beijing),不是 AWS
187
- - buildbox(`root@47.94.105.163`)调 SAE `DescribeInstanceLog`
188
- - SAE 未配 SLS 只取实例**当前 stdout 缓冲**(非历史检索)
189
- - 技术细节 + serviceAppId 映射见 `/logs --help`(第 3 节)
186
+ - 阿里云 **SLS**(日志服务,cn-beijing),不是 AWS CloudWatch
187
+ - 用 `optima-logs <svc> --env cn-prod` **直连 SLS**(`aliyun sls GetLogs`,公网控制面 API)——免 buildbox 跳板,支持历史检索 + 时间窗(`--since`)+ 关键词(`--grep`)
188
+ - 前置:本机需装 `aliyun` CLI + `aliyun-optima` profile(cn-beijing)
189
+ - 旧的「buildboxSAE `DescribeInstanceLog` 取当前缓冲」已弃用(缓冲式、重启即丢、不能检索);技术细节见 `/logs --help`(第 3 节)
190
190
 
191
191
  ## 支持的服务列表
192
192
 
@@ -17,6 +17,9 @@ const USER_AUTH_URLS: Record<string, string> = {
17
17
  // #201: yzsgo.com 全量迁移 (2026-06-12), 旧 billing-cn.optima.chat 路由已下线
18
18
  const CN_PROD_BILLING_URL = 'https://billing-api.yzsgo.com';
19
19
  const CN_STAGE_BILLING_URL = 'https://billing-api.stage.optima.chat';
20
+ // cn skills (marketplace) registry — same hardcoded-cn-URL rationale as billing.
21
+ const CN_PROD_SKILLS_URL = 'https://skills.yzsgo.com';
22
+ const CN_STAGE_SKILLS_URL = 'https://skills.stage.optima.chat';
20
23
 
21
24
  /**
22
25
  * Validate the --env flag value at command entry, before any I/O.
@@ -36,11 +39,12 @@ export function validateEnv(env: string): 'stage' | 'prod' {
36
39
  }
37
40
 
38
41
  /**
39
- * Variant for commands that also support cn-prod currently grant-balance /
40
- * grant-subscription, which reach billing + user-auth over HTTPS only.
41
- * Other commands resolve users via the AWS RDS SSH tunnel, which does not
42
- * exist for cn-prod (Aliyun VPC-internal RDS) keep them on validateEnv so a
43
- * cn-prod typo fails fast instead of dying inside the tunnel setup.
42
+ * Variant for commands that support all four envs (stage/prod/cn-prod/cn-stage)
43
+ * because they reach billing / skills / user-auth over HTTPS only — e.g.
44
+ * grant-balance, grant-subscription, entitlement, account, and optima-plugin
45
+ * (set-paid/set-default/show). Commands that resolve users via the AWS RDS SSH
46
+ * tunnel (which does not exist for cn Aliyun VPC-internal RDS) stay on
47
+ * validateEnv so a cn typo fails fast instead of dying inside tunnel setup.
44
48
  */
45
49
  export function validateEnvCnProd(env: string): 'stage' | 'prod' | 'cn-prod' | 'cn-stage' {
46
50
  if (env !== 'stage' && env !== 'prod' && env !== 'cn-prod' && env !== 'cn-stage') {
@@ -95,6 +99,8 @@ function getBillingUrl(env: string): string {
95
99
  }
96
100
 
97
101
  function getSkillsUrl(env: string): string {
102
+ if (env === 'cn-prod') return CN_PROD_SKILLS_URL;
103
+ if (env === 'cn-stage') return CN_STAGE_SKILLS_URL;
98
104
  if (skillsUrlCache[env]) return skillsUrlCache[env];
99
105
  const url = fetchInfisicalSecret(env, '/shared-secrets/domain-urls', 'SKILLS_REGISTRY_URL');
100
106
  skillsUrlCache[env] = url;
@@ -1,4 +1,4 @@
1
- import { callSkills, validateEnv } from '../billing-http';
1
+ import { callSkills, validateEnvCnProd } from '../billing-http';
2
2
  import { confirmIfProd } from '../confirm-prompt';
3
3
 
4
4
  interface SetDefaultArgs {
@@ -18,7 +18,7 @@ Required:
18
18
 
19
19
  Optional:
20
20
  --yes Skip prod confirmation prompt (no-op on stage)
21
- --env stage|prod (default: stage)
21
+ --env <env> stage|prod|cn-prod|cn-stage (default: stage)
22
22
 
23
23
  Note: no skill-sync broadcast — changes what NEW user syncs receive; does not
24
24
  retroactively add/remove the plugin for existing users until their next sync.`);
@@ -45,7 +45,7 @@ retroactively add/remove the plugin for existing users until their next sync.`);
45
45
 
46
46
  export async function runSetDefault(argv: string[]): Promise<void> {
47
47
  const args = parseArgs(argv);
48
- validateEnv(args.env);
48
+ validateEnvCnProd(args.env);
49
49
 
50
50
  await confirmIfProd(
51
51
  args.env,
@@ -1,4 +1,4 @@
1
- import { callSkills, validateEnv } from '../billing-http';
1
+ import { callSkills, validateEnvCnProd } from '../billing-http';
2
2
  import { confirmIfProd } from '../confirm-prompt';
3
3
 
4
4
  interface SetPaidArgs {
@@ -18,7 +18,7 @@ Required:
18
18
 
19
19
  Optional:
20
20
  --yes Skip prod confirmation prompt (no-op on stage)
21
- --env stage|prod (default: stage)
21
+ --env <env> stage|prod|cn-prod|cn-stage (default: stage)
22
22
 
23
23
  Note: salesUrl is NOT settable here (skills PATCH is strict; salesUrl is
24
24
  publish-time-only via plugin.json metadata). When isPaid=true and salesUrl is
@@ -46,7 +46,7 @@ null, the 402 falls back to sales.optima.onl.`);
46
46
 
47
47
  export async function runSetPaid(argv: string[]): Promise<void> {
48
48
  const args = parseArgs(argv);
49
- validateEnv(args.env);
49
+ validateEnvCnProd(args.env);
50
50
 
51
51
  await confirmIfProd(
52
52
  args.env,
@@ -1,4 +1,4 @@
1
- import { callSkills, validateEnv } from '../billing-http';
1
+ import { callSkills, validateEnvCnProd } from '../billing-http';
2
2
 
3
3
  interface ShowArgs {
4
4
  slug: string;
@@ -13,7 +13,7 @@ Required:
13
13
  --slug <slug>
14
14
 
15
15
  Optional:
16
- --env stage|prod (default: stage)
16
+ --env <env> stage|prod|cn-prod|cn-stage (default: stage)
17
17
 
18
18
  Note: reads the public GET /api/plugins/:slug — shows isPaid, salesUrl, and
19
19
  descriptive fields, but NOT defaultForUser / status / trustLevel (public
@@ -36,7 +36,7 @@ endpoint omits them). Returns 404 for non-ACTIVE plugins.`);
36
36
 
37
37
  export async function runShow(argv: string[]): Promise<void> {
38
38
  const args = parseArgs(argv);
39
- validateEnv(args.env);
39
+ validateEnvCnProd(args.env);
40
40
  const res = await callSkills(args.env, 'GET', `/api/plugins/${encodeURIComponent(args.slug)}`);
41
41
  console.log(JSON.stringify(res.body, null, 2));
42
42
  }
@@ -27,6 +27,9 @@ const USER_AUTH_URLS = {
27
27
  // #201: yzsgo.com 全量迁移 (2026-06-12), 旧 billing-cn.optima.chat 路由已下线
28
28
  const CN_PROD_BILLING_URL = 'https://billing-api.yzsgo.com';
29
29
  const CN_STAGE_BILLING_URL = 'https://billing-api.stage.optima.chat';
30
+ // cn skills (marketplace) registry — same hardcoded-cn-URL rationale as billing.
31
+ const CN_PROD_SKILLS_URL = 'https://skills.yzsgo.com';
32
+ const CN_STAGE_SKILLS_URL = 'https://skills.stage.optima.chat';
30
33
  /**
31
34
  * Validate the --env flag value at command entry, before any I/O.
32
35
  *
@@ -44,11 +47,12 @@ function validateEnv(env) {
44
47
  return env;
45
48
  }
46
49
  /**
47
- * Variant for commands that also support cn-prod currently grant-balance /
48
- * grant-subscription, which reach billing + user-auth over HTTPS only.
49
- * Other commands resolve users via the AWS RDS SSH tunnel, which does not
50
- * exist for cn-prod (Aliyun VPC-internal RDS) keep them on validateEnv so a
51
- * cn-prod typo fails fast instead of dying inside the tunnel setup.
50
+ * Variant for commands that support all four envs (stage/prod/cn-prod/cn-stage)
51
+ * because they reach billing / skills / user-auth over HTTPS only — e.g.
52
+ * grant-balance, grant-subscription, entitlement, account, and optima-plugin
53
+ * (set-paid/set-default/show). Commands that resolve users via the AWS RDS SSH
54
+ * tunnel (which does not exist for cn Aliyun VPC-internal RDS) stay on
55
+ * validateEnv so a cn typo fails fast instead of dying inside tunnel setup.
52
56
  */
53
57
  function validateEnvCnProd(env) {
54
58
  if (env !== 'stage' && env !== 'prod' && env !== 'cn-prod' && env !== 'cn-stage') {
@@ -100,6 +104,10 @@ function getBillingUrl(env) {
100
104
  return url;
101
105
  }
102
106
  function getSkillsUrl(env) {
107
+ if (env === 'cn-prod')
108
+ return CN_PROD_SKILLS_URL;
109
+ if (env === 'cn-stage')
110
+ return CN_STAGE_SKILLS_URL;
103
111
  if (skillsUrlCache[env])
104
112
  return skillsUrlCache[env];
105
113
  const url = (0, infisical_secrets_1.fetchInfisicalSecret)(env, '/shared-secrets/domain-urls', 'SKILLS_REGISTRY_URL');
@@ -13,7 +13,7 @@ Required:
13
13
 
14
14
  Optional:
15
15
  --yes Skip prod confirmation prompt (no-op on stage)
16
- --env stage|prod (default: stage)
16
+ --env <env> stage|prod|cn-prod|cn-stage (default: stage)
17
17
 
18
18
  Note: no skill-sync broadcast — changes what NEW user syncs receive; does not
19
19
  retroactively add/remove the plugin for existing users until their next sync.`);
@@ -52,7 +52,7 @@ retroactively add/remove the plugin for existing users until their next sync.`);
52
52
  }
53
53
  async function runSetDefault(argv) {
54
54
  const args = parseArgs(argv);
55
- (0, billing_http_1.validateEnv)(args.env);
55
+ (0, billing_http_1.validateEnvCnProd)(args.env);
56
56
  await (0, confirm_prompt_1.confirmIfProd)(args.env, `Action: set defaultForUser=${args.default} on plugin '${args.slug}' (${args.env.toUpperCase()})`, args.yes);
57
57
  console.log(`\n🔧 Setting defaultForUser=${args.default} on ${args.slug} (${args.env.toUpperCase()})...`);
58
58
  const res = await (0, billing_http_1.callSkills)(args.env, 'PATCH', `/api/admin/plugins/${encodeURIComponent(args.slug)}`, { defaultForUser: args.default });
@@ -13,7 +13,7 @@ Required:
13
13
 
14
14
  Optional:
15
15
  --yes Skip prod confirmation prompt (no-op on stage)
16
- --env stage|prod (default: stage)
16
+ --env <env> stage|prod|cn-prod|cn-stage (default: stage)
17
17
 
18
18
  Note: salesUrl is NOT settable here (skills PATCH is strict; salesUrl is
19
19
  publish-time-only via plugin.json metadata). When isPaid=true and salesUrl is
@@ -53,7 +53,7 @@ null, the 402 falls back to sales.optima.onl.`);
53
53
  }
54
54
  async function runSetPaid(argv) {
55
55
  const args = parseArgs(argv);
56
- (0, billing_http_1.validateEnv)(args.env);
56
+ (0, billing_http_1.validateEnvCnProd)(args.env);
57
57
  await (0, confirm_prompt_1.confirmIfProd)(args.env, `Action: set isPaid=${args.paid} on plugin '${args.slug}' (${args.env.toUpperCase()})`, args.yes);
58
58
  console.log(`\n💰 Setting isPaid=${args.paid} on ${args.slug} (${args.env.toUpperCase()})...`);
59
59
  const res = await (0, billing_http_1.callSkills)(args.env, 'PATCH', `/api/admin/plugins/${encodeURIComponent(args.slug)}`, { isPaid: args.paid });
@@ -10,7 +10,7 @@ Required:
10
10
  --slug <slug>
11
11
 
12
12
  Optional:
13
- --env stage|prod (default: stage)
13
+ --env <env> stage|prod|cn-prod|cn-stage (default: stage)
14
14
 
15
15
  Note: reads the public GET /api/plugins/:slug — shows isPaid, salesUrl, and
16
16
  descriptive fields, but NOT defaultForUser / status / trustLevel (public
@@ -39,7 +39,7 @@ endpoint omits them). Returns 404 for non-ACTIVE plugins.`);
39
39
  }
40
40
  async function runShow(argv) {
41
41
  const args = parseArgs(argv);
42
- (0, billing_http_1.validateEnv)(args.env);
42
+ (0, billing_http_1.validateEnvCnProd)(args.env);
43
43
  const res = await (0, billing_http_1.callSkills)(args.env, 'GET', `/api/plugins/${encodeURIComponent(args.slug)}`);
44
44
  console.log(JSON.stringify(res.body, null, 2));
45
45
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/dev-skills",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
4
4
  "description": "Claude Code Skills for Optima development team - cross-environment collaboration tools",
5
5
  "main": "index.js",
6
6
  "bin": {