lism-cli 0.6.0 → 0.8.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # lism-cli
2
2
 
3
- [Lism CSS](https://lism-css.com) / [Lism UI](https://lism-css.com/ui) のための CLI ツール。`lism` コマンドで新規プロジェクト生成・UI コンポーネント追加・AI スキル配置を行います。
3
+ [Lism CSS](https://lism-css.com) / [Lism UI](https://lism-css.com/ui) のためのCLIツール。`lism-cli` コマンドで新規プロジェクト生成・UIコンポーネント追加・AIスキル配置を行います。
4
4
 
5
5
  ## 前提条件
6
6
 
@@ -9,9 +9,10 @@
9
9
  ## コマンド体系
10
10
 
11
11
  ```
12
- lism create [targetDir] [--template <name|category>] # templates から新規プロジェクト
13
- lism ui { init | add <names...> | list } # Lism UI コンポーネントの追加
14
- lism skill { add | check | update } # AI エージェント向け SKILL.md 配置
12
+ lism-cli create [targetDir] [--template <name|category>] [--lang <ja|en>] # templates から新規プロジェクト
13
+ lism-cli init [--ui-framework <react|astro>] [--ui-dir <path>] # lism.config ファイルの新規生成
14
+ lism-cli ui { add <names...> | list } # Lism UI コンポーネントの追加
15
+ lism-cli skill { add [skill] | check | update } # AI エージェント向け SKILL.md 配置
15
16
  ```
16
17
 
17
18
  ## 使い方
@@ -34,9 +35,28 @@ pnpm dlx lism-cli create --template blog-astro-minimal --lang en ./my-blog
34
35
 
35
36
  同じ動作は `pnpm create lism` / `npm create lism@latest` でも呼び出せます(`create-lism` パッケージ経由)。挙動は両者で共通です。
36
37
 
37
- `--lang <ja|en>` は CLI の表示言語に加えて、**生成されるテンプレート本体の言語**にも反映されます。`--lang` を指定しない場合は、対話端末(TTY)ではほかのどの選択よりも先に言語選択プロンプトが表示され、選んだ言語で以降の表示とテンプレート生成が確定します(非対話環境・CI 等では `en` にフォールバック)。対応言語版を持つテンプレート(`blog-astro-minimal` / `blog-astro-personal` / `blog-astro-techlog` / `lp-astro-corporate` / `lp-astro-interior`)では、指定言語のサイト文言・サンプルコンテンツで生成されます。言語版が無いテンプレートは、指定言語に関わらず既存(ベース)の内容で生成されます。
38
+ `--lang <ja|en>` は CLIの表示言語に加えて、**生成されるテンプレート本体の言語**にも反映されます。`--lang` を指定しない場合は、対話端末(TTY)ではほかのどの選択よりも先に言語選択プロンプトが表示され、選んだ言語で以降の表示とテンプレート生成が確定します(非対話環境・CI等では `en` にフォールバック)。対応言語版を持つテンプレート(`blog-astro-minimal` / `blog-astro-personal` / `blog-astro-techlog` / `lp-astro-corporate` / `lp-astro-interior`)では、指定言語のサイト文言・サンプルコンテンツで生成されます。言語版が無いテンプレートは、指定言語に関わらず既存(ベース)の内容で生成されます。
38
39
 
39
- ### UI コンポーネントの追加
40
+ ### lism.config の生成
41
+
42
+ 既存プロジェクトに Lism CSS を後付けする場合など、設定ファイルのひな形が必要なときは `init` を使います。
43
+
44
+ ```bash
45
+ pnpm dlx lism-cli init
46
+ ```
47
+
48
+ core 設定(`tokens` / `props` 等、コメントアウトされたひな形)を持つ `lism.config.js` を新規作成します。対話の中で「Lism UI のコンポーネントも使いますか?」と確認され(デフォルト: No)、Yes と答えた場合のみ `ui` セクション(`framework` / `dir`)も併せて生成されます。
49
+
50
+ `ui` セクションの値はオプションで先渡しできます。指定されなかった質問だけが対話で行われます。
51
+
52
+ - `--ui-framework <react|astro>`: framework の選択をスキップし、UI 利用の確認のみ行います(この場合のデフォルトは Yes)
53
+ - `--ui-dir <path>`: UI コンポーネントの出力先。指定すると UI 利用の意思とみなし、確認を省略して framework の選択のみ行います
54
+
55
+ 非対話環境(CI 等)では質問を出せないため、`--ui-framework` があれば `ui` セクション込みで生成し、無ければ `ui` セクション無しで生成します(`--ui-dir` のみの指定はエラーになります)。
56
+
57
+ 既に `lism.config.{ts,mjs,js}` がある場合は何も変更しません(`ui` セクションの後付けは、後述の `ui add` 実行時に表示されるスニペットを貼り付けてください)。
58
+
59
+ ### UIコンポーネントの追加
40
60
 
41
61
  ```bash
42
62
  # 単一 / 複数
@@ -53,27 +73,38 @@ pnpm dlx lism-cli ui list
53
73
  pnpm dlx lism-cli ui add accordion --ref dev
54
74
  ```
55
75
 
56
- コンポーネントは [`packages/lism-ui/src/components`](https://github.com/lism-css/lism-css/tree/main/packages/lism-ui/src/components) から [giget](https://github.com/unjs/giget) 経由で直接取得されます。`lism-ui` を更新するだけで CLI 側も自動で追従します。
76
+ コンポーネントは [`packages/lism-ui/src/components`](https://github.com/lism-css/lism-css/tree/main/packages/lism-ui/src/components) から [giget](https://github.com/unjs/giget) 経由で直接取得されるため、既存コンポーネントの実装を更新するだけでCLI側も自動で追従します。ただし、コンポーネントを追加・削除した場合は `lism-ui` 側で `registry-index.json` を再生成(ビルド時の `gen:registry`)してcommitする必要があります(`ui list` / `ui add --all` が参照するカタログのため)。
57
77
 
58
- 初回実行時に `lism.config.js` が無い場合は対話式セットアップが走り、`cli` セクションを書き込みます。
78
+ `ui` セクションの設定が見つからない状態で `ui add` を実行すると、対話式セットアップが走ります。
59
79
 
60
80
  ```
61
81
  ? フレームワークを選択してください: React
62
- ? コンポーネントの出力先ディレクトリ: src/components/ui
63
- ? helper の出力先ディレクトリ: src/components/ui/_helper
64
- ✔ lism.config.js を作成しました。
65
82
  ```
66
83
 
67
- `ui init` で設定の生成のみ行うこともできます。既存の `lism.config.js` には `cli` セクションのみ追記されます。
84
+ 出力先ディレクトリは既定値(`src/components/ui`)が使われます。変更したい場合は `--ui-dir` フラグで指定してください。
85
+
86
+ `ui add` は入力した値をその回の実行に使うだけで設定ファイルは書き換えず、最後に `lism.config.*` へ貼り付けるための `ui` セクションのスニペットを案内します(CSSカスタマイズ用に先に作られた設定を壊さないため)。
87
+
88
+ 設定をファイルとして残すには、`lism.config.*` が無い場合は `lism-cli init`(前述)で `ui` セクション込みの設定ファイルを生成し、既にある場合は上記スニペットを貼り付けてください。
68
89
 
69
90
  ### AI エージェント向けスキルの配置
70
91
 
71
- `SKILL.md` を各種 AI ツールの所定ディレクトリへ展開します。
92
+ 同梱スキル(`SKILL.md` ほか一式)を各種AIツールの所定ディレクトリへ展開します。
93
+
94
+ 同梱スキルは以下の2つです:
95
+
96
+ | スキル | 説明 |
97
+ |--------|------|
98
+ | `lism-css-guide` | Lism CSSでUI・ページを実装・修正する時に使う実装ガイド |
99
+ | `lism-css-refactor` | 既存の Lism CSSコードを、見た目や挙動を変えずにLismらしい書き方へ整理するリファクタガイド |
72
100
 
73
101
  ```bash
74
102
  # 対話モード(使用中のツールを自動検出)
75
103
  pnpm dlx lism-cli skill add
76
104
 
105
+ # スキル名を指定して個別に導入
106
+ pnpm dlx lism-cli skill add lism-css-refactor
107
+
77
108
  # ツールを明示指定
78
109
  pnpm dlx lism-cli skill add --claude --cursor
79
110
 
@@ -87,46 +118,51 @@ pnpm dlx lism-cli skill check
87
118
  pnpm dlx lism-cli skill update --claude
88
119
  ```
89
120
 
90
- 配置先の対応表:
121
+ `skill add` は引数なしで実行すると同梱スキルすべてを一括導入し、`skill add <skill>` でスキル名を指定すると、そのスキルだけを配置します。`check` / `update` はスキル引数を取らず、常に同梱スキル全体が対象です。
122
+
123
+ 配置先の対応表(`<skill>` にはスキル名が入ります):
91
124
 
92
125
  | ツール | 配置先 |
93
126
  |--------|--------|
94
- | `--claude` | `.claude/skills/lism-css-guide` |
95
- | `--codex` | `.agents/skills/lism-css-guide` |
96
- | `--cursor` | `.cursor/skills/lism-css-guide` |
97
- | `--windsurf` | `.windsurf/skills/lism-css-guide` |
98
- | `--cline` | `.cline/skills/lism-css-guide` |
99
- | `--copilot` | `.github/skills/lism-css-guide` |
100
- | `--gemini` | `.gemini/skills/lism-css-guide` |
101
- | `--junie` | `.junie/skills/lism-css-guide` |
127
+ | `--claude` | `.claude/skills/<skill>` |
128
+ | `--codex` | `.agents/skills/<skill>` |
129
+ | `--cursor` | `.cursor/skills/<skill>` |
130
+ | `--windsurf` | `.windsurf/skills/<skill>` |
131
+ | `--cline` | `.cline/skills/<skill>` |
132
+ | `--copilot` | `.github/skills/<skill>` |
133
+ | `--gemini` | `.gemini/skills/<skill>` |
134
+ | `--junie` | `.junie/skills/<skill>` |
102
135
 
103
136
  ## lism.config.js
104
137
 
105
- `ui init` / `ui add` が生成・読み込む設定ファイル。CSS の設定(`tokens` 等)と CLI 設定を同居できます。
138
+ `ui add` が読み込む設定ファイル(新規作成するのは `init`)。CSSの設定(`tokens` 等)とUI設定を同居できます。
106
139
 
107
140
  ```js
108
141
  export default {
109
- cli: {
142
+ ui: {
110
143
  framework: 'react', // 'react' | 'astro'
111
- componentsDir: 'src/components/ui',
112
- helperDir: 'src/components/ui/_helper',
144
+ dir: 'src/components/ui',
113
145
  },
114
146
  };
115
147
  ```
116
148
 
117
- `lism.config.mjs` も同様に読み込まれます。旧 `lism-ui.json` は廃止予定(互換ロードのみ。起動時に deprecation 警告)。
149
+ helper の配置先は個別に設定できず、常に `{dir}/_helper` に固定されます。旧キー `ui.componentsDir` `ui.dir` が無い場合のみ後方互換として読み込まれます。
118
150
 
119
- > **Note:** TypeScript `lism.config.ts` は現在未対応です。`lism-css` 本体の SCSS ビルド(`vite-plugin-lism-css` / `lism-css build`)も `.ts` を読み込まない設計のため、設定ファイルは `.js` / `.mjs` で記述してください。
151
+ 設定ファイルは `lism.config.ts` / `lism.config.mjs` / `lism.config.js` に対応しており、この順で探索して最初に見つかったものを読み込みます。`lism-css` 本体の設定読込(`@lism-css/plugin` / `lism-css build`)も同じ探索順です。
152
+
153
+ 旧 `cli` セクション名も後方互換のため読み込めますが、deprecation警告が出るので `ui` へのリネームを推奨します。
120
154
 
121
155
  ## パッケージが見つからないエラーが出る場合
122
156
 
123
- npm / pnpm の Safe Supply Chain 機能により、公開から間もないパッケージがブロックされる場合があります。
157
+ npm / pnpmには、公開から間もないバージョンのインストールを一定期間ブロックする仕組みがあります(npmの`min-release-age`設定、pnpmの`minimumReleaseAge`設定)。公開直後の`lism-cli`を実行すると、このガードによりパッケージが見つからないエラーになる場合があります。次のように一時的に無効化して実行できます。
124
158
 
125
159
  ```bash
126
- npm exec --safe-chain-skip-minimum-package-age lism-cli create
127
- pnpm --safe-chain-skip-minimum-package-age dlx lism-cli create
160
+ npm exec --min-release-age 0 lism-cli create
161
+ pnpm dlx --config.minimumReleaseAge=0 lism-cli create
128
162
  ```
129
163
 
164
+ Aikido Securityのsafe-chainなど、サードパーティのサプライチェーン保護ツールを導入している場合は、そのツール側の設定(例: `SAFE_CHAIN_MINIMUM_PACKAGE_AGE_HOURS=0`)も確認してください。
165
+
130
166
  ## License
131
167
 
132
168
  MIT
@@ -1,3 +1,30 @@
1
+ // <define:__LISM_PACKAGE_VERSIONS__>
2
+ var define_LISM_PACKAGE_VERSIONS_default = { "lism-css": "0.24.0", "@lism-css/ui": "0.24.0", "@lism-css/plugin": "0.3.0" };
3
+
4
+ // src/logger.ts
5
+ import pc from "picocolors";
6
+ var logger = {
7
+ info(msg) {
8
+ console.log(pc.cyan(msg));
9
+ },
10
+ success(msg) {
11
+ console.log(pc.green(msg));
12
+ },
13
+ warn(msg) {
14
+ console.log(pc.yellow(`WARN: ${msg}`));
15
+ },
16
+ error(msg) {
17
+ console.error(pc.red(`ERROR: ${msg}`));
18
+ },
19
+ log(msg) {
20
+ console.log(msg);
21
+ },
22
+ heading(msg) {
23
+ console.log(pc.bold(pc.cyan(`
24
+ \u25B8 ${msg}`)));
25
+ }
26
+ };
27
+
1
28
  // src/i18n.ts
2
29
  import { execFileSync } from "child_process";
3
30
 
@@ -31,31 +58,24 @@ var messages = {
31
58
  ja: "\u65E2\u5B58\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u5F37\u5236\u4E0A\u66F8\u304D",
32
59
  en: "Overwrite existing directory"
33
60
  },
61
+ // init
62
+ "cli.init.description": {
63
+ ja: "lism.config \u30D5\u30A1\u30A4\u30EB\u3092\u65B0\u898F\u751F\u6210\u3059\u308B",
64
+ en: "Generate a new lism.config file"
65
+ },
66
+ "cli.init.opt.uiFramework": {
67
+ ja: "UI \u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306E\u30D5\u30EC\u30FC\u30E0\u30EF\u30FC\u30AF\uFF08ui.framework\uFF09",
68
+ en: "Framework for UI components (ui.framework)"
69
+ },
70
+ "cli.init.opt.uiDir": {
71
+ ja: "UI \u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306E\u51FA\u529B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\uFF08ui.dir\uFF09",
72
+ en: "Output directory for UI components (ui.dir)"
73
+ },
34
74
  // ui
35
75
  "cli.ui.description": {
36
76
  ja: "Lism UI \u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306E\u8FFD\u52A0\u30FB\u7BA1\u7406",
37
77
  en: "Manage Lism UI components"
38
78
  },
39
- "cli.ui.init.description": {
40
- ja: "lism.config.js \u306E cli \u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u751F\u6210\u3059\u308B",
41
- en: "Generate the cli section of lism.config.js"
42
- },
43
- "cli.ui.init.opt.framework": {
44
- ja: "\u30D5\u30EC\u30FC\u30E0\u30EF\u30FC\u30AF",
45
- en: "Framework"
46
- },
47
- "cli.ui.init.opt.componentsDir": {
48
- ja: "\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306E\u51FA\u529B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA",
49
- en: "Output directory for components"
50
- },
51
- "cli.ui.init.opt.helperDir": {
52
- ja: "helper \u306E\u51FA\u529B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA",
53
- en: "Output directory for helpers"
54
- },
55
- "cli.ui.init.opt.force": {
56
- ja: "\u65E2\u5B58\u306E cli \u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u4E0A\u66F8\u304D",
57
- en: "Overwrite the existing cli section"
58
- },
59
79
  "cli.ui.add.description": {
60
80
  ja: "\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u3092\u8FFD\u52A0\u3059\u308B",
61
81
  en: "Add components"
@@ -89,6 +109,10 @@ var messages = {
89
109
  ja: "\u30B9\u30AD\u30EB\u3092\u914D\u7F6E\u3059\u308B",
90
110
  en: "Deploy skills"
91
111
  },
112
+ "cli.skill.add.arg.skill": {
113
+ ja: "\u914D\u7F6E\u3059\u308B\u30B9\u30AD\u30EB\u540D\uFF08\u7701\u7565\u6642\u306F\u5168\u30B9\u30AD\u30EB\uFF09",
114
+ en: "Skill name to deploy (all skills if omitted)"
115
+ },
92
116
  "cli.skill.add.opt.overwrite": {
93
117
  ja: "\u78BA\u8A8D\u306A\u3057\u3067\u4E0A\u66F8\u304D",
94
118
  en: "Overwrite without confirmation"
@@ -201,25 +225,48 @@ var messages = {
201
225
  en: "Failed to rewrite package.json name: {reason}"
202
226
  },
203
227
  "create.workspaceReplaced": {
204
- ja: " package.json \u306E workspace:* \u3092 ^{version} \u306B\u7F6E\u63DB\u3057\u307E\u3057\u305F\u3002",
205
- en: " Replaced workspace:* in package.json with ^{version}."
228
+ ja: " package.json \u306E workspace:* \u3092\u516C\u958B\u30D0\u30FC\u30B8\u30E7\u30F3\u306B\u7F6E\u63DB\u3057\u307E\u3057\u305F\u3002",
229
+ en: " Replaced workspace:* in package.json with published versions."
206
230
  },
207
231
  "create.workspaceFailed": {
208
232
  ja: "package.json \u306E\u66F8\u304D\u63DB\u3048\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {reason}",
209
233
  en: "Failed to rewrite package.json: {reason}"
210
234
  },
211
235
  // ---------------------------------------------------------------------------
236
+ // init
237
+ // ---------------------------------------------------------------------------
238
+ "init.alreadyExists": {
239
+ ja: "{filename} \u306F\u65E2\u306B\u5B58\u5728\u3059\u308B\u305F\u3081\u3001\u4F55\u3082\u5909\u66F4\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002",
240
+ en: "{filename} already exists; nothing was changed."
241
+ },
242
+ "init.promptUseUi": {
243
+ ja: "Lism UI \u306E\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u3082\u4F7F\u3044\u307E\u3059\u304B\uFF1F\uFF08ui \u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u8FFD\u52A0\u3057\u307E\u3059\uFF09",
244
+ en: "Will you also use Lism UI components? (adds a ui section)"
245
+ },
246
+ "init.created": {
247
+ ja: "{path} \u3092\u4F5C\u6210\u3057\u307E\u3057\u305F\u3002",
248
+ en: "Created {path}."
249
+ },
250
+ "init.uiFrameworkRequired": {
251
+ ja: "\u975E\u5BFE\u8A71\u74B0\u5883\u3067\u306F --ui-dir \u5358\u72EC\u3067 ui \u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u751F\u6210\u3067\u304D\u307E\u305B\u3093\u3002--ui-framework \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
252
+ en: "Cannot generate the ui section from --ui-dir alone in a non-interactive environment. Specify --ui-framework."
253
+ },
254
+ // ---------------------------------------------------------------------------
212
255
  // ui
213
256
  // ---------------------------------------------------------------------------
214
- // ui 共通(add / list で共有)
257
+ // ui 共通(add / init で共有)
258
+ "ui.promptFramework": {
259
+ ja: "\u30D5\u30EC\u30FC\u30E0\u30EF\u30FC\u30AF\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:",
260
+ en: "Select a framework:"
261
+ },
215
262
  "ui.catalogFailed": {
216
263
  ja: "\u30AB\u30BF\u30ED\u30B0\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F{refInfo}: {reason}",
217
264
  en: "Failed to fetch catalog{refInfo}: {reason}"
218
265
  },
219
266
  // ui add
220
267
  "ui.add.noConfig": {
221
- ja: "lism.config.js \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u958B\u59CB\u3057\u307E\u3059...\n",
222
- en: "lism.config.js not found. Starting setup...\n"
268
+ ja: "ui \u30BB\u30AF\u30B7\u30E7\u30F3\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u3044\u304F\u3064\u304B\u8CEA\u554F\u3057\u307E\u3059\u3002",
269
+ en: "No ui section found. A few questions to get you started."
223
270
  },
224
271
  "ui.add.addingAll": {
225
272
  ja: "\u5168 {count} \u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u3092\u8FFD\u52A0\u3057\u307E\u3059...",
@@ -285,46 +332,9 @@ var messages = {
285
332
  ja: " \u30B9\u30AD\u30C3\u30D7: {path}",
286
333
  en: " Skipped: {path}"
287
334
  },
288
- // ui init
289
- "ui.init.promptFramework": {
290
- ja: "\u30D5\u30EC\u30FC\u30E0\u30EF\u30FC\u30AF\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:",
291
- en: "Select a framework:"
292
- },
293
- "ui.init.promptComponentsDir": {
294
- ja: "\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306E\u51FA\u529B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA:",
295
- en: "Output directory for components:"
296
- },
297
- "ui.init.promptHelperDir": {
298
- ja: "helper \u306E\u51FA\u529B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA:",
299
- en: "Output directory for helpers:"
300
- },
301
- "ui.init.patchedUpdate": {
302
- ja: "{path} \u306B cli \u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\u3002",
303
- en: "Updated the cli section in {path}."
304
- },
305
- "ui.init.patchedAdd": {
306
- ja: "{path} \u306B cli \u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u8FFD\u8A18\u3057\u307E\u3057\u305F\u3002",
307
- en: "Added the cli section to {path}."
308
- },
309
- "ui.init.notPatched": {
310
- ja: "{path} \u306B\u65E2\u306B cli \u30BB\u30AF\u30B7\u30E7\u30F3\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u304B\u3001export default \u304C\u691C\u51FA\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u624B\u52D5\u3067\u8FFD\u8A18\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
311
- en: "Either {path} already contains a cli section or no export default was detected. Please add it manually."
312
- },
313
- "ui.init.created": {
314
- ja: "{path} \u3092\u4F5C\u6210\u3057\u307E\u3057\u305F\u3002",
315
- en: "Created {path}."
316
- },
317
- "ui.init.legacyDetected": {
318
- ja: "{filename} \u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002lism.config.js \u3078\u79FB\u884C\u3057\u307E\u3059\u3002\u53E4\u3044\u30D5\u30A1\u30A4\u30EB\u306F\u5F8C\u3067\u524A\u9664\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
319
- en: "Detected {filename}. Migrating to lism.config.js. Please remove the old file afterwards."
320
- },
321
- "ui.init.alreadyExists": {
322
- ja: "{filename} \u306B\u306F\u65E2\u306B cli \u30BB\u30AF\u30B7\u30E7\u30F3\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u4E0A\u66F8\u304D\u3059\u308B\u306B\u306F --force \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
323
- en: "{filename} already has a cli section. Use --force to overwrite."
324
- },
325
- "ui.init.willOverwrite": {
326
- ja: "{filename} \u306E\u65E2\u5B58\u306E cli \u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002",
327
- en: "Overwriting the existing cli section in {filename}."
335
+ "ui.add.snippetGuide": {
336
+ ja: "\u6B21\u56DE\u304B\u3089\u540C\u3058\u8CEA\u554F\u3092\u3055\u308C\u306A\u3044\u305F\u3081\u306B\u3001{filename} \u306E export default \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u5185\u306B\u4EE5\u4E0B\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044:\n\n{snippet}\n",
337
+ en: "To avoid being asked these questions again, paste the following inside the exported config object in {filename}:\n\n{snippet}\n"
328
338
  },
329
339
  // ui list
330
340
  "ui.list.fetching": {
@@ -356,8 +366,12 @@ var messages = {
356
366
  en: "No target tools were selected."
357
367
  },
358
368
  "skill.add.fetching": {
359
- ja: "\u30B9\u30AD\u30EB\u3092\u53D6\u5F97\u4E2D\uFF08ref: {ref}\uFF09...",
360
- en: "Fetching skills (ref: {ref})..."
369
+ ja: "\u30B9\u30AD\u30EB {skill} \u3092\u53D6\u5F97\u4E2D\uFF08ref: {ref}\uFF09...",
370
+ en: "Fetching skill {skill} (ref: {ref})..."
371
+ },
372
+ "skill.unknownSkill": {
373
+ ja: '\u30B9\u30AD\u30EB "{name}" \u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002\u5229\u7528\u53EF\u80FD: {list}',
374
+ en: 'Unknown skill "{name}". Available: {list}'
361
375
  },
362
376
  "skill.add.skippedSame": {
363
377
  ja: " \u30B9\u30AD\u30C3\u30D7\uFF08\u5DEE\u5206\u306A\u3057\uFF09: {label}",
@@ -397,8 +411,8 @@ var messages = {
397
411
  en: "No installed skills found. Run `{invoke} skill add` to deploy them."
398
412
  },
399
413
  "skill.check.fetching": {
400
- ja: "\u30EA\u30E2\u30FC\u30C8\u30B9\u30AD\u30EB\u3092\u53D6\u5F97\u4E2D\uFF08ref: {ref}\uFF09...",
401
- en: "Fetching remote skills (ref: {ref})..."
414
+ ja: "\u30EA\u30E2\u30FC\u30C8\u30B9\u30AD\u30EB {skill} \u3092\u53D6\u5F97\u4E2D\uFF08ref: {ref}\uFF09...",
415
+ en: "Fetching remote skill {skill} (ref: {ref})..."
402
416
  },
403
417
  "skill.check.upToDate": {
404
418
  ja: " \u2713 {label} (\u6700\u65B0)",
@@ -409,8 +423,8 @@ var messages = {
409
423
  en: "All skills are up to date."
410
424
  },
411
425
  "skill.check.outdated": {
412
- ja: "{count} \u4EF6\u306E\u30C4\u30FC\u30EB\u306B\u5DEE\u5206\u304C\u3042\u308A\u307E\u3059\u3002`{invoke} skill update` \u3067\u6700\u65B0\u306B\u66F4\u65B0\u3067\u304D\u307E\u3059\u3002",
413
- en: "{count} tools have changes. Run `{invoke} skill update` to update them."
426
+ ja: "{count} \u4EF6\u306E\u914D\u7F6E\u306B\u5DEE\u5206\u304C\u3042\u308A\u307E\u3059\u3002`{invoke} skill update` \u3067\u6700\u65B0\u306B\u66F4\u65B0\u3067\u304D\u307E\u3059\u3002",
427
+ en: "{count} deployment(s) differ from the remote. Run `{invoke} skill update` to update them."
414
428
  },
415
429
  "skill.check.diffModified": {
416
430
  ja: "\u5909\u66F4 {count}",
@@ -427,34 +441,26 @@ var messages = {
427
441
  // ---------------------------------------------------------------------------
428
442
  // config
429
443
  // ---------------------------------------------------------------------------
430
- "config.legacyWarning": {
431
- ja: '[deprecated] {filename} \u306F\u5EC3\u6B62\u4E88\u5B9A\u3067\u3059\u3002"{invoke} ui init" \u3067 lism.config.js \u3078\u79FB\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002',
432
- en: '[deprecated] {filename} is deprecated. Run "{invoke} ui init" to migrate to lism.config.js.'
433
- },
434
- "config.notFound": {
435
- ja: "lism.config.js / lism.config.mjs / lism-ui.json \u306E\u3044\u305A\u308C\u3082\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002",
436
- en: "None of lism.config.js / lism.config.mjs / lism-ui.json were found."
437
- },
438
- "config.cliSectionMissing": {
439
- ja: "{filename} \u304B\u3089 CLI \u8A2D\u5B9A\uFF08cli \u30AD\u30FC\uFF09\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002",
440
- en: "Failed to read the CLI config (cli key) from {filename}."
441
- },
442
444
  "config.invalidFramework": {
443
- ja: 'cli.framework \u306F "react" \u307E\u305F\u306F "astro" \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002',
444
- en: 'cli.framework must be "react" or "astro".'
445
+ ja: 'ui.framework \u306F "react" \u307E\u305F\u306F "astro" \u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002',
446
+ en: 'ui.framework must be "react" or "astro".'
445
447
  },
446
- "config.invalidComponentsDir": {
447
- ja: "cli.componentsDir \u306F\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
448
- en: "cli.componentsDir must be a string."
448
+ "config.invalidDir": {
449
+ ja: "ui.dir \u306F\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
450
+ en: "ui.dir must be a string."
449
451
  },
450
- "config.invalidHelperDir": {
451
- ja: "cli.helperDir \u306F\u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
452
- en: "cli.helperDir must be a string."
452
+ "config.cliKeyDeprecated": {
453
+ ja: '[deprecated] {filename} \u306E "cli:" \u30AD\u30FC\u306F "ui:" \u3078\u306E\u5909\u66F4\u304C\u63A8\u5968\u3055\u308C\u3066\u3044\u307E\u3059\u3002',
454
+ en: '[deprecated] The "cli:" key in {filename} is recommended to be renamed to "ui:".'
453
455
  },
454
456
  "config.loadFailed": {
455
457
  ja: "{path} \u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u69CB\u6587\u30A8\u30E9\u30FC\u7B49\uFF09\u3002\u4FEE\u6B63\u3057\u3066\u304B\u3089\u518D\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044: {reason}",
456
458
  en: "Failed to load {path} (syntax error, etc). Please fix it and retry: {reason}"
457
459
  },
460
+ "config.freshConfigExists": {
461
+ ja: "{path} \u306F\u65E2\u306B\u5B58\u5728\u3059\u308B\u305F\u3081\u65B0\u898F\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3002",
462
+ en: "Cannot create {path} because it already exists."
463
+ },
458
464
  // ---------------------------------------------------------------------------
459
465
  // common
460
466
  // ---------------------------------------------------------------------------
@@ -540,44 +546,25 @@ import path from "path";
540
546
  import { downloadTemplate } from "giget";
541
547
  import { select, input, confirm } from "@inquirer/prompts";
542
548
 
543
- // src/logger.ts
544
- import pc from "picocolors";
545
- var logger = {
546
- info(msg) {
547
- console.log(pc.cyan(msg));
548
- },
549
- success(msg) {
550
- console.log(pc.green(msg));
551
- },
552
- warn(msg) {
553
- console.log(pc.yellow(`WARN: ${msg}`));
554
- },
555
- error(msg) {
556
- console.error(pc.red(`ERROR: ${msg}`));
557
- },
558
- log(msg) {
559
- console.log(msg);
560
- },
561
- heading(msg) {
562
- console.log(pc.bold(pc.cyan(`
563
- \u25B8 ${msg}`)));
564
- }
565
- };
566
-
567
549
  // src/version.ts
568
- var LISM_CSS_VERSION = "0.22.2" ? "0.22.2" : "unknown";
569
- var CLI_VERSION = "0.6.0" ? "0.6.0" : "unknown";
550
+ var LISM_CSS_VERSION = "0.24.0" ? "0.24.0" : "unknown";
551
+ var LISM_PACKAGE_VERSIONS = typeof define_LISM_PACKAGE_VERSIONS_default !== "undefined" && define_LISM_PACKAGE_VERSIONS_default ? define_LISM_PACKAGE_VERSIONS_default : {
552
+ "lism-css": LISM_CSS_VERSION
553
+ };
554
+ var CLI_VERSION = "0.8.0" ? "0.8.0" : "unknown";
570
555
 
571
556
  // src/constants.ts
572
557
  var SOURCE_REPO = "lism-css/lism-css";
573
558
  var RAW_GITHUB_BASE = "https://raw.githubusercontent.com";
559
+ var NPM_REGISTRY_BASE = "https://registry.npmjs.org";
574
560
  var DEFAULT_UI_REF = "main";
575
561
  var DEFAULT_SKILL_REF = "main";
576
562
  var DEFAULT_TEMPLATES_REF = "main";
577
563
  var UI_COMPONENTS_PATH = "packages/lism-ui/src/components";
578
564
  var UI_HELPER_PATH = "packages/lism-ui/src/helper";
579
565
  var UI_REGISTRY_INDEX_PATH = "packages/lism-ui/registry-index.json";
580
- var SKILL_SOURCE_PATH = "skills/lism-css-guide";
566
+ var SKILL_SOURCE_BASE = "skills";
567
+ var SKILL_NAMES = ["lism-css-guide", "lism-css-refactor"];
581
568
  var TEMPLATES_PATH = "templates";
582
569
 
583
570
  // ../../templates/manifest.ts
@@ -602,6 +589,17 @@ var TEMPLATES = [
602
589
  description: { ja: "Vite + React \u30D9\u30FC\u30B9\u306E\u6700\u5C0F\u69CB\u6210", en: "Minimal Vite + React setup" },
603
590
  previewUrl: `${PREVIEW_ORIGIN}/minimal-vite/`
604
591
  },
592
+ {
593
+ slug: "minimal-next",
594
+ kind: "project",
595
+ category: "minimal",
596
+ stack: "next",
597
+ sourcePath: "minimal/next",
598
+ title: { ja: "Minimal Next", en: "Minimal Next" },
599
+ description: { ja: "Next.js (App Router) \u30D9\u30FC\u30B9\u306E\u6700\u5C0F\u69CB\u6210", en: "Minimal Next.js (App Router) setup" },
600
+ // preview サイト未配信・docs カード未整備のため draft(CLI 一覧・docs 本番ビルドから除外)
601
+ draft: true
602
+ },
605
603
  {
606
604
  slug: "blog-astro-minimal",
607
605
  kind: "project",
@@ -780,7 +778,7 @@ async function runCreateWithTemplates({ template, targetDir, force = false, lang
780
778
  await downloadTemplateSource(tpl, outDir, ref, force);
781
779
  await applyLangOverlay(tpl, outDir, ref, resolvedLang);
782
780
  ensureTemplateDownloaded(outDir, tpl);
783
- postProcessTemplate(outDir, tpl, resolvedLang);
781
+ await postProcessTemplate(outDir, tpl, resolvedLang);
784
782
  logger.success(t("create.created", { dir: outDir }));
785
783
  printNextSteps(outDir, tpl);
786
784
  }
@@ -911,7 +909,7 @@ async function applyLangOverlay(tpl, outDir, ref, lang) {
911
909
  fs.rmSync(overlayDir, { recursive: true, force: true });
912
910
  }
913
911
  }
914
- function postProcessTemplate(projectDir, tpl, lang) {
912
+ async function postProcessTemplate(projectDir, tpl, lang) {
915
913
  if (tpl.kind === "static-html") return;
916
914
  if (tpl.kind === "base-overlay" && tpl.rewritePackageName !== false) {
917
915
  rewritePackageName(projectDir, tpl.slug);
@@ -921,7 +919,7 @@ function postProcessTemplate(projectDir, tpl, lang) {
921
919
  rewritePackageName(projectDir, tpl.packageName ?? tpl.slug);
922
920
  }
923
921
  cleanupDevArtifacts(projectDir);
924
- rewriteWorkspaceDeps(projectDir);
922
+ await rewriteWorkspaceDeps(projectDir);
925
923
  }
926
924
  function cleanupDevArtifacts(projectDir) {
927
925
  const screenshotsDir = path.join(projectDir, "screenshots");
@@ -1078,31 +1076,69 @@ function rewritePackageName(projectDir, name) {
1078
1076
  logger.warn(t("create.packageNameFailed", { reason: String(err) }));
1079
1077
  }
1080
1078
  }
1081
- function rewriteWorkspaceDeps(projectDir) {
1079
+ var DEP_SECTIONS = ["dependencies", "devDependencies", "peerDependencies"];
1080
+ var REGISTRY_TIMEOUT_MS = 5e3;
1081
+ async function rewriteWorkspaceDeps(projectDir) {
1082
1082
  const pkgPath = path.join(projectDir, "package.json");
1083
1083
  if (!fs.existsSync(pkgPath)) return;
1084
1084
  try {
1085
1085
  const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
1086
+ const names = /* @__PURE__ */ new Set();
1087
+ for (const section of DEP_SECTIONS) {
1088
+ const deps = pkg[section];
1089
+ if (!deps) continue;
1090
+ for (const [name, value] of Object.entries(deps)) {
1091
+ if (typeof value === "string" && value.startsWith("workspace:")) names.add(name);
1092
+ }
1093
+ }
1094
+ if (names.size === 0) return;
1095
+ const versions = await resolveWorkspaceVersions([...names]);
1086
1096
  let touched = false;
1087
- for (const key of ["dependencies", "devDependencies", "peerDependencies"]) {
1088
- const deps = pkg[key];
1097
+ for (const section of DEP_SECTIONS) {
1098
+ const deps = pkg[section];
1089
1099
  if (!deps) continue;
1090
1100
  for (const [name, value] of Object.entries(deps)) {
1091
- if (typeof value !== "string") continue;
1092
- if (value.startsWith("workspace:")) {
1093
- deps[name] = `^${LISM_CSS_VERSION}`;
1101
+ if (typeof value === "string" && value.startsWith("workspace:")) {
1102
+ deps[name] = `^${versions[name]}`;
1094
1103
  touched = true;
1095
1104
  }
1096
1105
  }
1097
1106
  }
1098
1107
  if (touched) {
1099
1108
  fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
1100
- logger.log(t("create.workspaceReplaced", { version: LISM_CSS_VERSION }));
1109
+ logger.log(t("create.workspaceReplaced"));
1101
1110
  }
1102
1111
  } catch (err) {
1103
1112
  logger.warn(t("create.workspaceFailed", { reason: String(err) }));
1104
1113
  }
1105
1114
  }
1115
+ async function resolveWorkspaceVersions(names) {
1116
+ const entries = await Promise.all(names.map(async (name) => [name, await resolveDepVersion(name)]));
1117
+ return Object.fromEntries(entries);
1118
+ }
1119
+ function bakedVersion(name) {
1120
+ return LISM_PACKAGE_VERSIONS[name] ?? LISM_PACKAGE_VERSIONS["lism-css"] ?? "unknown";
1121
+ }
1122
+ async function resolveDepVersion(name) {
1123
+ const baked = bakedVersion(name);
1124
+ if (!LISM_PACKAGE_VERSIONS[name]) return baked;
1125
+ const latest = await fetchLatestVersion(name);
1126
+ return latest ?? baked;
1127
+ }
1128
+ async function fetchLatestVersion(name) {
1129
+ const url = `${NPM_REGISTRY_BASE}/${name.replace(/\//g, "%2F")}/latest`;
1130
+ try {
1131
+ const res = await fetch(url, {
1132
+ headers: { accept: "application/json" },
1133
+ signal: AbortSignal.timeout(REGISTRY_TIMEOUT_MS)
1134
+ });
1135
+ if (!res.ok) return null;
1136
+ const data = await res.json();
1137
+ return typeof data.version === "string" ? data.version : null;
1138
+ } catch {
1139
+ return null;
1140
+ }
1141
+ }
1106
1142
 
1107
1143
  export {
1108
1144
  logger,
@@ -1117,7 +1153,8 @@ export {
1117
1153
  UI_COMPONENTS_PATH,
1118
1154
  UI_HELPER_PATH,
1119
1155
  UI_REGISTRY_INDEX_PATH,
1120
- SKILL_SOURCE_PATH,
1156
+ SKILL_SOURCE_BASE,
1157
+ SKILL_NAMES,
1121
1158
  CLI_VERSION,
1122
1159
  runCreate,
1123
1160
  createCommand