@bstage-sdk/cli 0.8.2 → 0.8.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/dist/MIGRATION.md CHANGED
@@ -51,6 +51,42 @@
51
51
 
52
52
  ---
53
53
 
54
+ ## → cli 0.8.3 · ai-toolkit 0.8.3
55
+
56
+ ### sandbox 포털 기본 주소가 공개 주소로 바뀌었다 — `자동`
57
+
58
+ **영향**
59
+
60
+ - sandbox 포털에 로그인·배포하는 모든 프로젝트. 할 일은 없다.
61
+ - 사외(파트너) 환경에서 `bstage login`이 `ENOTFOUND`로 실패하던 문제가 풀린다.
62
+
63
+ **변경 내용**
64
+
65
+ - sandbox 포털 기본 주소: 예전 사내망 전용 주소(사설 IP) → `bstage-portal.sandstage.in`(공개).
66
+ - 옛 주소로 저장된 `.bstage/project.json`·로그인 토큰·`BSTAGE_PORTAL_URL`·`--portal` 값은 새 주소로 바꿔 읽는다. 다시 `bstage link`·`bstage login` 하지 않아도 된다. 토큰 파일은 다음 로그인 때 새 주소 키로 합쳐진다.
67
+ - 스킴 없이 준 포털 주소(예: `BSTAGE_PORTAL_URL=bstage-portal.sandstage.in`)는 https로 본다. 예전에는 `Invalid URL`로 실패했다.
68
+
69
+ **적용**
70
+
71
+ 1. (자동) CLI를 올리면 된다. 옛 버전에서 사외 로그인이 필요하면 `npx bstage login --portal https://bstage-portal.sandstage.in` 또는 `BSTAGE_PORTAL_URL=https://bstage-portal.sandstage.in`(스킴 포함)을 쓴다.
72
+
73
+ ### 템플릿 `name`은 폴더명과 같을 필요가 없다(문서 정정) — `자동`
74
+
75
+ **영향**
76
+
77
+ - 코드·빌드 동작은 바뀌지 않는다. 문서만 바로잡았다.
78
+ - `AGENTS.md`와 `bstage-template` 스킬이 "`createTemplate`의 `name`은 폴더명과 동일해야 한다"고 안내했지만, 빌드는 그런 검사를 하지 않는다. 이 문구를 따라 페이지 폴더명을 `name`에 맞추느라 배포 경로가 의도와 달라질 수 있었다(예: `/todos`로 내보내려던 페이지가 `/garen-todos`로 나감).
79
+
80
+ **변경 내용**
81
+
82
+ - `name`은 Custom Element 태그명이다. 소문자로 시작하고 하이픈을 1개 이상 넣고 소문자·숫자·하이픈만 쓴다. 레포 안에서 템플릿마다 달라야 한다(`bstage build`가 검사).
83
+ - 배포 경로(페이지)와 슬롯 자리는 폴더 위치가 정한다(`src/pages/{경로}/`). 그래서 `name`은 폴더명과 같을 필요가 없다. 예: 폴더 `src/pages/todos` + `name: 'garen-todos'`.
84
+ - **AGENTS.md 관리 영역 v16**: 위 내용으로 템플릿 작성 절을 고쳤다. `bstage-template` 스킬도 같은 내용으로 고쳤다.
85
+
86
+ **적용**
87
+
88
+ 1. (자동) `npx @bstage-sdk/cli@latest ai update` — 스킬·`AGENTS.md` 관리 영역을 v16으로 갱신한다.
89
+
54
90
  ## → cli 0.7.0
55
91
 
56
92
  ### 페이지 배치를 CLI로 만든다 — `bstage placement create` — `자동` · `선택`
@@ -67,7 +67,10 @@ var TRANSLATION_CDN_BASE_KEY = "static/i18n";
67
67
  var TRANSLATION_CDN_BUCKET_PREFIX = "cdn.bstage.in/";
68
68
  var PORTAL_HOSTS = {
69
69
  real: "portal.bstage.in",
70
- sandbox: "bstage-portal.sandbox.bstage.systems"
70
+ sandbox: "bstage-portal.sandstage.in"
71
+ };
72
+ var LEGACY_PORTAL_HOSTS = {
73
+ "bstage-portal.sandbox.bstage.systems": "bstage-portal.sandstage.in"
71
74
  };
72
75
  var PORTAL_HOST_ENV_KEY = "VITE_BSTAGE_PORTAL_HOST";
73
76
  function getAuthHost(mode, phase, tenantId) {
@@ -2129,6 +2132,7 @@ export {
2129
2132
  TRANSLATION_CDN_BASE_KEY,
2130
2133
  TRANSLATION_CDN_BUCKET_PREFIX,
2131
2134
  PORTAL_HOSTS,
2135
+ LEGACY_PORTAL_HOSTS,
2132
2136
  PORTAL_HOST_ENV_KEY,
2133
2137
  resolveProjectTarget,
2134
2138
  appKeyEnvDefine,
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import {
3
3
  APP_KEY_VAR,
4
4
  DEFAULT_TRANSLATION_TIER,
5
5
  LEGACY_APP_KEY_VAR,
6
+ LEGACY_PORTAL_HOSTS,
6
7
  LOGIN_PATH,
7
8
  PORTAL_HOSTS,
8
9
  PORTAL_HOST_ENV_KEY,
@@ -16,7 +17,7 @@ import {
16
17
  isPublicPhase,
17
18
  resolvePhase,
18
19
  resolveProjectTarget
19
- } from "./chunk-COUDGZIA.js";
20
+ } from "./chunk-MSXSJHUT.js";
20
21
 
21
22
  // src/index.ts
22
23
  import { readFileSync as readFileSync5 } from "fs";
@@ -2211,7 +2212,10 @@ import { dirname as dirname5, join as join7 } from "path";
2211
2212
  import { loadEnv as loadEnv2 } from "vite";
2212
2213
  var LOCAL_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "[::1]"]);
2213
2214
  function normalizePortalUrl(url) {
2214
- const u = new URL(url);
2215
+ const raw = url.trim();
2216
+ const u = new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(raw) ? raw : `https://${raw}`);
2217
+ const current = LEGACY_PORTAL_HOSTS[u.hostname];
2218
+ if (current) u.hostname = current;
2215
2219
  if (u.protocol !== "https:" && !(u.protocol === "http:" && LOCAL_HOSTS.has(u.hostname))) {
2216
2220
  fail(
2217
2221
  ExitCode.PRECONDITION,
@@ -2345,14 +2349,32 @@ function sanitize(tokens) {
2345
2349
  });
2346
2350
  return Object.fromEntries(buckets.filter(([, bucket]) => Object.keys(bucket).length > 0));
2347
2351
  }
2352
+ function canonicalPortalKey(portal) {
2353
+ try {
2354
+ return normalizePortalUrl(portal);
2355
+ } catch {
2356
+ return portal;
2357
+ }
2358
+ }
2359
+ function mergeByCanonicalPortal(tokens) {
2360
+ return Object.entries(tokens).reduce((acc, [portal, bucket]) => {
2361
+ const key = canonicalPortalKey(portal);
2362
+ const existing = acc[key] ?? {};
2363
+ const merged = key === portal ? { ...existing, ...bucket } : { ...bucket, ...existing };
2364
+ return { ...acc, [key]: merged };
2365
+ }, {});
2366
+ }
2348
2367
  function migrate(raw) {
2349
2368
  if (!raw || typeof raw !== "object") return { version: 2, tokens: {} };
2350
2369
  const obj = raw;
2351
2370
  if (obj.version === 2 && obj.tokens && typeof obj.tokens === "object") {
2352
- return { version: 2, tokens: sanitize(obj.tokens) };
2371
+ return {
2372
+ version: 2,
2373
+ tokens: mergeByCanonicalPortal(sanitize(obj.tokens))
2374
+ };
2353
2375
  }
2354
2376
  const tokens = Object.entries(obj).filter(([, v]) => isEntry(v)).map(([portal, v]) => [portal, { [UNKNOWN_ORG]: v }]);
2355
- return { version: 2, tokens: Object.fromEntries(tokens) };
2377
+ return { version: 2, tokens: mergeByCanonicalPortal(Object.fromEntries(tokens)) };
2356
2378
  }
2357
2379
  async function readCredentialFile(env2) {
2358
2380
  try {
@@ -3,7 +3,7 @@ import {
3
3
  appKeyEnvDefine,
4
4
  bstageDevPlugin,
5
5
  createViteConfig
6
- } from "../chunk-COUDGZIA.js";
6
+ } from "../chunk-MSXSJHUT.js";
7
7
  export {
8
8
  appKeyEnvAliasPlugin,
9
9
  appKeyEnvDefine,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bstage-sdk/cli",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "description": "bstage SDK CLI — build b.stage templates",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -32,14 +32,14 @@
32
32
  "liquidjs": "^10.24.0",
33
33
  "picocolors": "^1.1.1",
34
34
  "vite": "^7.0.0",
35
- "@bstage-sdk/ai-toolkit": "0.8.2",
36
- "@bstage-sdk/core": "0.8.2"
35
+ "@bstage-sdk/ai-toolkit": "0.8.3",
36
+ "@bstage-sdk/core": "0.8.3"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^25.5.0",
40
40
  "tsup": "^8.0.0",
41
41
  "typescript": "^5.5.0",
42
- "@bstage-sdk/design": "0.8.2"
42
+ "@bstage-sdk/design": "0.8.3"
43
43
  },
44
44
  "license": "MIT",
45
45
  "scripts": {