sayren 0.10.0 → 0.12.0

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.
Files changed (2) hide show
  1. package/dist/index.mjs +85 -3
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -8038,6 +8038,60 @@ const cli_retired_token = ((inputs = {}, options = {}) => {
8038
8038
  return ko_cli_retired_token(inputs);
8039
8039
  });
8040
8040
 
8041
+ //#endregion
8042
+ //#region src/paraglide/messages/cli_skill_failed.js
8043
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
8044
+ /** @typedef {{ status: NonNullable<unknown> }} Cli_Skill_FailedInputs */
8045
+ const ko_cli_skill_failed = (i) => {
8046
+ return `스킬을 읽지 못했습니다(HTTP ${i?.status})`;
8047
+ };
8048
+ /**
8049
+
8050
+ * @param {Cli_Skill_FailedInputs} inputs
8051
+ * @param {{ locale?: "ko" }} options
8052
+ * @returns {LocalizedString}
8053
+ */
8054
+ const cli_skill_failed = ((inputs, options = {}) => {
8055
+ experimentalStaticLocale ?? options.locale ?? getLocale();
8056
+ return ko_cli_skill_failed(inputs);
8057
+ });
8058
+
8059
+ //#endregion
8060
+ //#region src/paraglide/messages/cli_skill_not_found.js
8061
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
8062
+ /** @typedef {{ name: NonNullable<unknown> }} Cli_Skill_Not_FoundInputs */
8063
+ const ko_cli_skill_not_found = (i) => {
8064
+ return `스킬 ${i?.name}이(가) 없습니다. npx sayren skill list로 목록을 확인하십시오`;
8065
+ };
8066
+ /**
8067
+
8068
+ * @param {Cli_Skill_Not_FoundInputs} inputs
8069
+ * @param {{ locale?: "ko" }} options
8070
+ * @returns {LocalizedString}
8071
+ */
8072
+ const cli_skill_not_found = ((inputs, options = {}) => {
8073
+ experimentalStaticLocale ?? options.locale ?? getLocale();
8074
+ return ko_cli_skill_not_found(inputs);
8075
+ });
8076
+
8077
+ //#endregion
8078
+ //#region src/paraglide/messages/cli_skill_usage.js
8079
+ /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
8080
+ /** @typedef {{}} Cli_Skill_UsageInputs */
8081
+ const ko_cli_skill_usage = () => {
8082
+ return `스킬을 지정하십시오: npx sayren skill list 또는 npx sayren skill <이름>`;
8083
+ };
8084
+ /**
8085
+
8086
+ * @param {Cli_Skill_UsageInputs} inputs
8087
+ * @param {{ locale?: "ko" }} options
8088
+ * @returns {LocalizedString}
8089
+ */
8090
+ const cli_skill_usage = ((inputs = {}, options = {}) => {
8091
+ experimentalStaticLocale ?? options.locale ?? getLocale();
8092
+ return ko_cli_skill_usage(inputs);
8093
+ });
8094
+
8041
8095
  //#endregion
8042
8096
  //#region src/paraglide/messages/cli_skipped_outside.js
8043
8097
  /** @typedef {import('../runtime.js').LocalizedString} LocalizedString */
@@ -8746,6 +8800,7 @@ const ko_cli_usage = (i) => {
8746
8800
  npx sayren deploy [--no-publish] [--skip-build] [--message <메모>] [--force [--yes]]
8747
8801
  npx sayren status
8748
8802
  npx sayren verify
8803
+ npx sayren skill list | <이름> # sayren 스킬 목록·본문(에이전트용, 로그인 없음)
8749
8804
  npx sayren app <명령> # 서드파티 앱(init·dev·trigger·verify·deploy·release·status·logs·secret·dev-store)
8750
8805
 
8751
8806
  명령:
@@ -8757,6 +8812,7 @@ const ko_cli_usage = (i) => {
8757
8812
  deploy 로컬 검사 → 로컬 빌드 → 작업 트리 올리기 → 빌드 → 발행. 원격이 pull 이후 바뀌었으면 덮어쓰지 않습니다
8758
8813
  status 사이트·발행 버전·최근 빌드·편집 환경
8759
8814
  verify 로컬 규칙·경로·크기 검사(서버 빌드와 같은 규칙)
8815
+ skill sayren 스킬 목록(list)과 본문(<이름>)을 출력합니다. 스킬은 중앙에서 고치므로 늘 최신입니다
8760
8816
  app 서드파티 앱 — init <handle>로 만들고 dev로 로컬 실행, deploy로 버전을 올리고 release로 적용합니다. 자세히: https://docs.sayren.io/guides/apps-getting-started
8761
8817
 
8762
8818
  토큰은 Sayren 계정 토큰만 받고 --token → SAYREN_TOKEN 환경 변수 → 로그인(credentials.json) 순서로 읽습니다.
@@ -9688,7 +9744,7 @@ async function selectStore(auth, client, io, candidates, folderStore = null) {
9688
9744
 
9689
9745
  //#endregion
9690
9746
  //#region package.json
9691
- var version = "0.10.0";
9747
+ var version = "0.12.0";
9692
9748
 
9693
9749
  //#endregion
9694
9750
  //#region src/client.ts
@@ -11779,11 +11835,11 @@ function lockImporterSpecifiers(lock) {
11779
11835
  //#endregion
11780
11836
  //#region src/guide-skill.ts
11781
11837
  /**
11782
- * 받은 폴더의 에이전트 안내 스킬(2026-10-16 사용자 결정) — 셀러의 Claude Code가 sayren 중앙 스킬을 HTTP로 읽게 한다.
11838
+ * 받은 폴더의 에이전트 안내 스킬(2026-10-16 사용자 결정) — 셀러의 Claude Code가 기능·화면을 고치기 전에 sayren 중앙 스킬을 `npx sayren skill`로 읽게 한다(스킬은 이 하나만 설치한다).
11783
11839
  * 빈 템플릿이 싣는 `templates/storefront-blank/.claude/skills/sayren/SKILL.md`와 같은 내용이다(`guide-skill.test.ts`가 고정한다).
11784
11840
  */
11785
11841
  const GUIDE_SKILL_PATH = ".claude/skills/sayren/SKILL.md";
11786
- const GUIDE_SKILL = "---\nname: sayren\ndescription: Use for any work on this sayren storefront — pages, product display, cart, checkout, payments, buyer login, account pages, analytics, design and code quality. Loads the current sayren skills over HTTP.\n---\n\n# sayren skills (central)\n\nThe sayren skills are maintained centrally and change without updating this project. Read them over HTTP at the start of a task instead of relying on memory.\n\n1. List the skills: `GET https://api.sayren.io/v1/public/agent-skills`\n The response is `{ \"data\": [{ \"name\", \"description\", \"version\", \"updatedAt\" }] }`.\n2. Read the skills that match the task: `GET https://api.sayren.io/v1/public/agent-skills/{name}`\n The response is `{ \"data\": { \"name\", \"description\", \"body\", \"version\", \"updatedAt\" } }`; `body` is the guide (markdown).\n\nStart points:\n- Any code change: `code-quality`, `sayren-storefront-rules`, `sdk-client`, `template-stack`\n- Product pages: `sayren-product-display`, `sdk-catalog`\n- Cart, checkout, payment: `sdk-cart`, `sdk-checkout`, `sdk-payments`\n- Buyer login and account pages: `sdk-buyer-auth`, `sdk-account`\n- Visual design: `design-quality`\n\nFollow the project's `CLAUDE.md` first; the skills add the sayren-specific details.\n";
11842
+ const GUIDE_SKILL = "---\nname: sayren\ndescription: Load before adding, implementing or changing any feature or page of this sayren storefront. Lists the current sayren skills and loads the ones the task needs.\n---\n\n# sayren skills\n\nThe sayren skills are maintained centrally and change without updating this project.\nDo not rely on memory or earlier copies. Load them at the start of each task.\n\n1. List the skills (name and when to use each):\n `npx -y sayren@latest skill list`\n2. Read every skill that matches the task, in full, and follow it:\n `npx -y sayren@latest skill <name>`\n\nIf the sayren MCP server is connected, the tools `list_skills` and `get_skill` return the same content.\n\nFollow the project's `CLAUDE.md` first. The skills add the sayren-specific details.\n";
11787
11843
  /**
11788
11844
  * 받은 트리에 안내 스킬이 없으면 넣는다 — 템플릿이 싣거나 셀러가 올린 내용이 우선이다. 트리에 넣으므로 다시 받을 때 지울 파일로 잡히지 않고
11789
11845
  * `deploy`가 원격 작업 트리에도 올린다(AI 상점 도우미가 같은 안내를 읽는다). 넣었으면 true
@@ -12586,6 +12642,31 @@ function relativeOf(io, path) {
12586
12642
  return relative(io.cwd, path) || ".";
12587
12643
  }
12588
12644
 
12645
+ //#endregion
12646
+ //#region src/skill-commands.ts
12647
+ /**
12648
+ * `sayren skill list`·`sayren skill <name>`(2026-10-16 사용자 결정) — 안내 스킬 `sayren`이 에이전트에게 부르게 하는 중앙 스킬 읽기.
12649
+ * 공개 스킬 API(`/v1/public/agent-skills`, 인증 없음)를 읽어 원문을 출력한다. 셸·OS와 무관하게 같은 명령이고 요약되지 않는다
12650
+ */
12651
+ async function skill(args, flags, io) {
12652
+ const [target] = args;
12653
+ if (!target) throw new CliError(cli_skill_usage());
12654
+ const { apiOrigin } = resolveApiOrigin(flags, io.cwd, null, io.env);
12655
+ const path = target === "list" ? "" : `/${encodeURIComponent(target)}`;
12656
+ const res = await io.fetch(`${apiOrigin}/v1/public/agent-skills${path}`, { headers: { "User-Agent": CLI_USER_AGENT } });
12657
+ if (res.status === 404) throw new CliError(cli_skill_not_found({ name: target }));
12658
+ if (!res.ok) throw new CliError(cli_skill_failed({ status: res.status }));
12659
+ const { data } = await res.json();
12660
+ if (target === "list") {
12661
+ const skills = data;
12662
+ const width = Math.max(...skills.map((s) => s.name.length));
12663
+ for (const s of skills) io.out(`${s.name.padEnd(width)} ${s.description}`);
12664
+ return 0;
12665
+ }
12666
+ io.out(data.body);
12667
+ return 0;
12668
+ }
12669
+
12589
12670
  //#endregion
12590
12671
  //#region src/index.ts
12591
12672
  /** 도움말 — 쓰는 자리에서 만든다(로케일이 정해진 뒤) */
@@ -12725,6 +12806,7 @@ async function main(argv, io) {
12725
12806
  case "login": return login(loginFlags, io, () => ask(cli_prompt_access_token()));
12726
12807
  case "logout": return logout(loginFlags, io);
12727
12808
  case "whoami": return whoami(common, io);
12809
+ case "skill": return skill(parsed.positional, { apiOrigin: common.apiOrigin }, io);
12728
12810
  default: throw new CliError(cli_unknown_command({
12729
12811
  command: parsed.command,
12730
12812
  usage: usage()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sayren",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "type": "module",
5
5
  "imports": {
6
6
  "#paraglide/*": "./src/paraglide/*"