akari-video 0.1.6 → 0.1.7

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 (64) hide show
  1. package/README.md +14 -2
  2. package/bin/akari.mjs +39 -1
  3. package/package.json +1 -1
  4. package/src/cli.mjs +48 -13
  5. package/src/internal-command.mjs +19 -2
  6. package/src/messages.mjs +45 -3
  7. package/src/repo-assets.mjs +6 -2
  8. package/src/self-update.mjs +383 -0
  9. package/src/sounds-setup.mjs +22 -7
  10. package/src/update-check.mjs +130 -3
  11. package/vendor/.akari-capability-sources.json +3 -4
  12. package/vendor/docs/contract-2026-08-05-fx-v0.md +9 -0
  13. package/vendor/docs/contract-2026-08-11-analysis-vision-tracks-v0.md +177 -0
  14. package/vendor/docs/contract-2026-08-11-review-session-ui-events.md +89 -0
  15. package/vendor/packages/akari-launcher/README.md +14 -2
  16. package/vendor/packages/akari-launcher/bin/akari.mjs +39 -1
  17. package/vendor/packages/akari-launcher/package.json +1 -1
  18. package/vendor/packages/asset-resolver/src/paid-zip.mjs +1 -1
  19. package/vendor/packages/overlay-runtime/README.md +140 -0
  20. package/vendor/packages/overlay-runtime/package.json +2 -2
  21. package/vendor/packages/project-scaffold/src/index.mjs +17 -6
  22. package/vendor/packages/project-scaffold/test/create-project.test.mjs +46 -2
  23. package/vendor/packages/schemas/analysis.schema.json +42 -0
  24. package/vendor/packages/schemas/bin/validate-edit.mjs +6 -11
  25. package/vendor/packages/schemas/edit.schema.json +2 -16
  26. package/vendor/packages/schemas/examples/edit-cuts-fx-intensity-out-of-range-invalid/edit.json +1 -1
  27. package/vendor/packages/schemas/examples/edit-cuts-fx-unknown-key-invalid/edit.json +1 -1
  28. package/vendor/packages/schemas/examples/edit-cuts-fx-valid/edit.json +5 -5
  29. package/vendor/packages/schemas/test/validate-edit.test.mjs +8 -17
  30. package/vendor/skills/analyze-footage/SKILL.md +2 -0
  31. package/vendor/skills/analyze-footage/analysis-json.md +2 -0
  32. package/vendor/skills/analyze-footage/bin/vision-tracks/vision-tracks-helper.swift +399 -0
  33. package/vendor/skills/analyze-footage/bin/vision-tracks/vision-tracks.mjs +476 -0
  34. package/vendor/skills/analyze-footage/references/vision-tracks.schema.json +215 -0
  35. package/vendor/skills/analyze-footage/test/fixtures/vision-tracks/dummy-helper.mjs +91 -0
  36. package/vendor/skills/analyze-footage/test/fixtures/vision-tracks/example-face-landmarks.json +27 -0
  37. package/vendor/skills/analyze-footage/test/fixtures/vision-tracks/example-hand-pose.json +24 -0
  38. package/vendor/skills/analyze-footage/test/fixtures/vision-tracks/invalid-missing-required-landmark.json +25 -0
  39. package/vendor/skills/analyze-footage/test/fixtures/vision-tracks/invalid-out-of-range-coordinate.json +22 -0
  40. package/vendor/skills/analyze-footage/test/fixtures/vision-tracks/invalid-unknown-kind.json +8 -0
  41. package/vendor/skills/analyze-footage/test/vision-tracks-assembly.test.mjs +209 -0
  42. package/vendor/skills/analyze-footage/test/vision-tracks-check.test.mjs +77 -0
  43. package/vendor/skills/analyze-footage/test/vision-tracks-coords.test.mjs +106 -0
  44. package/vendor/skills/analyze-footage/test/vision-tracks-schema.test.mjs +89 -0
  45. package/vendor/skills/analyze-footage/vision-tracks.md +212 -0
  46. package/vendor/skills/compile-review-session/bin/compile-review-session.mjs +12 -1
  47. package/vendor/skills/compile-review-session/bin/core/compiler.mjs +7 -3
  48. package/vendor/skills/compile-review-session/bin/core/time-mapping.mjs +166 -8
  49. package/vendor/skills/compile-review-session/compilation-rules.md +46 -0
  50. package/vendor/skills/compile-review-session/dev-fixtures/README.md +1 -0
  51. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0009/audio.wav +0 -0
  52. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0009/edit.snapshot.json +12 -0
  53. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0009/events.jsonl +5 -0
  54. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0009/session.json +11 -0
  55. package/vendor/skills/compile-review-session/test/ui-events.test.mjs +331 -0
  56. package/vendor/skills/edit-plan/bin/generated/contract-validators.cjs +417 -72
  57. package/vendor/skills/overlay-authoring/3d.md +41 -0
  58. package/vendor/templates/project-default/akari.sh +119 -11
  59. package/vendor/docs/contract-2026-08-06-direction-recipes-v0.md +0 -280
  60. package/vendor/packages/direction/README.md +0 -86
  61. package/vendor/packages/direction/bin/expand-direction.mjs +0 -193
  62. package/vendor/packages/direction/package.json +0 -13
  63. package/vendor/packages/schemas/examples/edit-cuts-fx-color-overlay-missing-color-invalid/edit.json +0 -9
  64. /package/vendor/packages/schemas/examples/{edit-cuts-fx-invalid-id → edit-cuts-fx-unknown-id-valid}/edit.json +0 -0
package/README.md CHANGED
@@ -31,14 +31,26 @@ akari
31
31
  (PATH に opencode が無ければ、インストール案内を出して終了する)
32
32
  ```
33
33
 
34
- サブコマンド: `akari update`(更新確認)/ `akari init`(作業場の作成・確認のみ)/
34
+ install.sh 経由インストール(`~/.akari/app`)では、新版の検知・裏 staging DL・sha256 検証・
35
+ 次回起動時の自動適用がすべて既定で走る(`AKARI_NO_AUTO_UPDATE=1` で無効化可)。起動を
36
+ ブロックすることは無く、適用は次回起動の頭でアトミックにスワップする(`src/update-check.mjs`
37
+ の `maybeStageInBackground` / `maybeApplyPendingUpdateOnLaunch`、実体は `src/self-update.mjs`
38
+ の `stageSelfUpdate` / `swapStagedApp`)。
39
+
40
+ サブコマンド: `akari update`(オンデマンドの確認・適用。install.sh 経由インストールなら
41
+ DL・sha256 検証・適用まで実行。それ以外(npm グローバル / git checkout)や旧フィードでは
42
+ 更新案内のみ表示。`--rollback` で直前 1 世代へ戻す。`src/self-update.mjs`)/
43
+ `akari init`(作業場の作成・確認のみ)/
35
44
  `akari new <target-dir> [--template <path>]`(新規プロジェクト作成)/
36
45
  `akari narration generate ...`(VOICEVOX / fal-qwen3 ナレーション生成)/
37
46
  `akari internal beat-sync-<beatmap|probe-frame|render-when-idle> ...`(beat-sync-edit 内部実行物)/
38
47
  `akari sounds [--variant wav] [--force]`(公式音源の一括ダウンロード。プロンプトなし・headless 可)/
39
48
  `akari store <connect|status|download|disconnect>`(AKARI Store 連携。マイページで発行した
40
49
  接続トークンを `~/.akari/store-credentials.json`(0600)に保存し、購入済み一覧の確認と
41
- 配布物の取得ができる。`src/store-command.mjs`)。
50
+ 配布物の取得ができる。`src/store-command.mjs`)/
51
+ `akari assets <list|fetch|sync|...>`(素材カタログの一覧・取得・同期。
52
+ `packages/asset-resolver` の CLI への薄い委譲で、カタログ合成・entitlements 判定・
53
+ sha256 検証・fail-closed は resolver 側の責務のまま。`src/assets-command.mjs`)。
42
54
 
43
55
  `akari` に渡した引数はそのまま `opencode` に転送する(例: `akari --continue` は
44
56
  `opencode --continue` を起動する)。
package/bin/akari.mjs CHANGED
@@ -10,6 +10,42 @@ import { runAcceptCommand } from '../src/accept-command.mjs';
10
10
  import { runCapabilityCommand } from '../src/capability-command.mjs';
11
11
  import { runStoreCommand } from '../src/store-command.mjs';
12
12
  import { runAssetsCommand } from '../src/assets-command.mjs';
13
+ import { maybeApplyPendingUpdateOnLaunch, readOwnVersion } from '../src/update-check.mjs';
14
+ import { describeCliHelp } from '../src/messages.mjs';
15
+
16
+ // `akari --version` / `-v`: インストール済みの版を表示するだけの最小コマンド
17
+ // (タスク契約 2026-08-11-update-u4-cli-self-update の受け入れ条件 —
18
+ // `akari update` / `--rollback` 後にインストール先の版を観測する手段として必要)。
19
+ async function printVersion() {
20
+ console.log(`v${readOwnVersion()}`);
21
+ return { exitCode: 0 };
22
+ }
23
+
24
+ // `akari --help` / `-h`: 引数なしのトップレベル一覧を表示するだけの最小コマンド
25
+ // (タスク契約 2026-08-11-onboarding-o3-firstrun-plain §4。それ以前はこの分岐が無く、
26
+ // `--help` は claude/opencode へそのまま転送されてしまっていた — AKARI Video 自身の
27
+ // コマンド一覧が一度も出ない行き止まりだったため新設した)。
28
+ async function printCliHelp() {
29
+ for (const line of describeCliHelp()) {
30
+ console.log(line);
31
+ }
32
+ return { exitCode: 0 };
33
+ }
34
+
35
+ // 起動の頭で保留中の自動適用があれば適用する(契約 §11・タスク契約
36
+ // 2026-08-11-update-u5-cli-auto-update)。すべてのサブコマンド分岐より前に置く —
37
+ // 「起動」= akari バイナリの実行そのものであり、`--version` や `akari update` の
38
+ // 入口でも既に新版へ切り替わっている必要がある(受け入れ条件: 2 回目の起動で
39
+ // `akari --version` が新版を返す。スワップは rename ベースで `~/.akari/app` の
40
+ // 実体を差し替えるだけなので、このプロセス自身がこの後 `readOwnVersion()` を
41
+ // 読み直せば新版の内容を観測できる — 同一 argv での re-exec はしない設計判断
42
+ // (理由は report.md 参照))。失敗は他の起動時副作用と同じく握りつぶし、
43
+ // claude/opencode 起動やサブコマンド実行を止めない。
44
+ try {
45
+ maybeApplyPendingUpdateOnLaunch({ env: process.env, log: (line) => console.log(line) });
46
+ } catch (error) {
47
+ console.error(`自動更新の適用確認でエラーが発生しました(続行します): ${error instanceof Error ? error.message : String(error)}`);
48
+ }
13
49
 
14
50
  const argv = process.argv.slice(2);
15
51
  // `akari update` / `akari init` / `akari new` / `akari narration` / `akari internal` /
@@ -18,7 +54,9 @@ const argv = process.argv.slice(2);
18
54
  // タスク契約 launcher-init(内部リポ)/ 音源カタログ既定化のオーナー裁定 2026-08-03 /
19
55
  // AKARI Store 連携 / タスク契約 2026-08-09-agent-assets-discovery)。
20
56
  // それ以外の引数はすべて従来どおり claude へ転送する。
21
- const invoke = argv[0] === 'update' ? runUpdateCommand(argv.slice(1))
57
+ const invoke = (argv[0] === '--version' || argv[0] === '-v') ? printVersion()
58
+ : (argv[0] === '--help' || argv[0] === '-h') ? printCliHelp()
59
+ : argv[0] === 'update' ? runUpdateCommand(argv.slice(1))
22
60
  : argv[0] === 'init' ? runInitCommand(argv.slice(1))
23
61
  : argv[0] === 'new' ? runNewCommand(argv.slice(1))
24
62
  : argv[0] === 'narration' ? runNarrationCommand(argv.slice(1))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akari-video",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "AKARI Video launcher CLI — start an AI-edited video project from any directory: scaffold, connection check, then hand over to Claude Code (or opencode). AKARI Video を opencode や Claude Code で、どのディレクトリからでも始めるための `akari` ランチャー CLI。接続確認(doctor)→ 未セットアップならプロジェクト雛形を作成 → AI エージェントを起動する。外部 npm 依存ゼロ(Node.js 組み込みモジュールのみ)。",
5
5
  "type": "module",
6
6
  "bin": {
package/src/cli.mjs CHANGED
@@ -11,12 +11,15 @@ import { resolveEffectiveProjectRoot } from './first-run.mjs';
11
11
  import { maybeShowAssetIntroNotice } from './sounds-setup.mjs';
12
12
  import {
13
13
  checkForUpdateSync,
14
+ compareVersions,
15
+ isValidFeedShape,
14
16
  readCacheSync,
15
17
  readOwnVersion,
16
18
  recordDismissalSync,
17
19
  resolveCachePath,
18
20
  triggerBackgroundRefresh
19
21
  } from './update-check.mjs';
22
+ import { applySelfUpdate, isRunningFromAppDir, rollbackSelfUpdate } from './self-update.mjs';
20
23
 
21
24
  /**
22
25
  * `akari` ランチャーの本体。3 入口契約(ターミナル `akari` / セッション内 `/akari` /
@@ -173,11 +176,15 @@ function defaultSpawnOpencode(opencodePath, args, projectRoot) {
173
176
  }
174
177
 
175
178
  /**
176
- * `akari update`: 現在版・最新版・リリースノート URL を表示し、更新手順を**案内するだけ**
177
- * (自動実行はしない 契約 §4-1)。`--dismiss` を渡すと、キャッシュに載っている最新版の
178
- * 通知を今後出さないよう記録する。ネットワークには一切触れない
179
- * (表示に使う情報はすべて既存キャッシュ由来 最新情報は `akari` 起動時のバックグラウンド
180
- * fetch で更新される)。
179
+ * `akari update`: 新版があり、かつ自己更新の対象(app 経由実行 + フィードに
180
+ * `components.app` がある)なら DL → sha256 検証 → 適用まで実行する(契約 §11。
181
+ * 「update は明示操作」なので U2 の沈黙原則は適用せず、失敗は必ず表示する)。
182
+ * 対象外(npm グローバル / git checkout・旧フィード)のときは従来どおり
183
+ * **案内するだけ**(自動実行はしない — 契約 §4-1)に縮退する。`--dismiss` は
184
+ * 自己更新を試みず、キャッシュに載っている最新版の通知を今後出さないよう記録するだけ
185
+ * (既存挙動を維持)。`--rollback` は直前 1 世代(`~/.akari/app-previous/`)へ戻す。
186
+ * ネットワークに触れるのは自己更新の DL 区間のみ — フィード自体は既存キャッシュ由来
187
+ * (最新情報は `akari` 起動時のバックグラウンド fetch で更新される)。
181
188
  */
182
189
  export async function runUpdateCommand(args, options = {}) {
183
190
  const log = options.log ?? ((line) => console.log(line));
@@ -186,16 +193,44 @@ export async function runUpdateCommand(args, options = {}) {
186
193
  const cachePath = resolveCachePath(env);
187
194
  const cache = readCacheSync(cachePath);
188
195
  const dismissRequested = args.includes('--dismiss');
196
+ const rollbackRequested = args.includes('--rollback');
189
197
 
190
- let dismissed = false;
191
- if (dismissRequested && typeof cache?.feed?.product === 'string') {
192
- recordDismissalSync({ version: cache.feed.product, env });
193
- dismissed = true;
198
+ if (rollbackRequested) {
199
+ return (options.rollbackSelfUpdate ?? rollbackSelfUpdate)({ env, log });
194
200
  }
195
201
 
196
- const finalCache = dismissed ? readCacheSync(cachePath) : cache;
197
- for (const line of describeUpdateCommand({ currentVersion, cache: finalCache, dismissed })) {
198
- log(line);
202
+ if (dismissRequested) {
203
+ let dismissed = false;
204
+ if (typeof cache?.feed?.product === 'string') {
205
+ recordDismissalSync({ version: cache.feed.product, env });
206
+ dismissed = true;
207
+ }
208
+ const finalCache = dismissed ? readCacheSync(cachePath) : cache;
209
+ for (const line of describeUpdateCommand({ currentVersion, cache: finalCache, dismissed })) {
210
+ log(line);
211
+ }
212
+ return { exitCode: 0 };
199
213
  }
200
- return { exitCode: 0 };
214
+
215
+ const feed = cache?.feed;
216
+ const updateAvailable = isValidFeedShape(feed) && compareVersions(feed.product, currentVersion) > 0;
217
+ const selfUpdateEligible = updateAvailable
218
+ && !!feed.components?.app?.url
219
+ && !!feed.components?.app?.sha256
220
+ && (options.isRunningFromAppDir ?? isRunningFromAppDir)({ env, launcherRoot: options.launcherRoot });
221
+
222
+ if (!selfUpdateEligible) {
223
+ for (const line of describeUpdateCommand({ currentVersion, cache, dismissed: false })) {
224
+ log(line);
225
+ }
226
+ return { exitCode: 0 };
227
+ }
228
+
229
+ return (options.applySelfUpdate ?? applySelfUpdate)({
230
+ env,
231
+ feed,
232
+ log,
233
+ fetchImpl: options.fetchImpl,
234
+ runNpmInstall: options.runNpmInstall
235
+ });
201
236
  }
@@ -1,11 +1,15 @@
1
+ import { existsSync } from 'node:fs';
1
2
  import { spawnSync } from 'node:child_process';
3
+ import path from 'node:path';
2
4
 
3
5
  import { resolveLauncherAssets } from './repo-assets.mjs';
4
6
 
5
7
  const commands = [
6
8
  'beat-sync-beatmap',
7
9
  'beat-sync-probe-frame',
8
- 'beat-sync-render-when-idle'
10
+ 'beat-sync-render-when-idle',
11
+ 'vision-finger-frame',
12
+ 'eye-bar'
9
13
  ];
10
14
 
11
15
  const usage = [
@@ -27,10 +31,23 @@ export async function runInternalCommand(args, options = {}) {
27
31
  return { exitCode: 0 };
28
32
  }
29
33
 
34
+ // vision-finger-frame は task/2026-08-11-finger-frame-generator の境界規約により
35
+ // repo-assets.mjs(別タスク task/2026-08-11-eye-bar-generator と衝突しやすい共有ファイル)を
36
+ // 編集せず、他コマンドと違い assets.repoRoot から自己解決する(resolveRepoAssets() 側に
37
+ // フィールドを追加していない唯一の例外 -- 経緯は非公開の内部記録を参照)。
38
+ const fingerFrameScript = assets.repoRoot
39
+ ? path.join(assets.repoRoot, 'packages', 'akari-tools', 'bin', 'finger-frame.mjs')
40
+ : null;
41
+
30
42
  const definitions = {
31
43
  'beat-sync-beatmap': { path: assets.beatmapScript, node: true },
32
44
  'beat-sync-probe-frame': { path: assets.probeFrameScript, node: true },
33
- 'beat-sync-render-when-idle': { path: assets.renderWhenIdleScript, node: false }
45
+ 'beat-sync-render-when-idle': { path: assets.renderWhenIdleScript, node: false },
46
+ 'vision-finger-frame': {
47
+ path: fingerFrameScript && existsSync(fingerFrameScript) ? fingerFrameScript : null,
48
+ node: true
49
+ },
50
+ 'eye-bar': { path: assets.eyeBarScript, node: true }
34
51
  };
35
52
  const definition = definitions[subcommand];
36
53
  if (!definition) {
package/src/messages.mjs CHANGED
@@ -163,18 +163,25 @@ export function initFailedError(errorMessage) {
163
163
  }
164
164
 
165
165
  /**
166
- * 素材の取得方式案内 + 公式音源ライブラリ(AKARI Sounds)明示再入口(`akari sounds`)の
167
- * 文言群。1 行主義の既存流儀に従う。
166
+ * 素材の取得方式案内 + 無料スターターパック(`akari store connect`)+ 公式音源ライブラリ
167
+ * (AKARI Sounds)明示再入口(`akari sounds`)の文言群。1 行主義の既存流儀に従う。
168
168
  *
169
169
  * 2026-08-04 オーナー方針(正本: `planning/notes-2026-08-04-asset-reference-distribution.md`
170
170
  * §8)により、初回起動での AKARI Sounds 一括ダウンロード [Y/n] 質問(2026-08-03 裁定)は
171
171
  * 廃止した。素材は resolver がオンデマンド取得する設計に一本化されたため、質問文言
172
172
  * (`soundsPromptText` / `soundsDeclinedNotice`)はもう使わない。
173
+ *
174
+ * 2026-08-11 オーナー裁定(正本: 内部リポ `planning/notes-2026-08-11-onboarding-firstrun.md`
175
+ * §3 R2)により、無料スターターパックの案内を同じ 1 回だけの通知に統合した(別画面を増やさない
176
+ * =「1 画面 1 問まで」の精神)。件数は明記しない(実際のパック内容は入れ替わりうるため
177
+ * 実数依存の表現にしない)。表示条件は `sounds-setup.mjs` の `maybeShowAssetIntroNotice` が
178
+ * 持つ — 既にアカウント連携済みなら、この文言ごと表示をスキップする(連携ずみの人には
179
+ * 「連携すると使える」という案内自体が的外れなため)。
173
180
  */
174
181
 
175
182
  /** `akari` 起動時に生涯 1 回だけ出す素材案内(質問ではない・対話をブロックしない)。 */
176
183
  export function assetIntroNotice() {
177
- return '素材(B-roll・背景・音源)は使うときに必要な分だけ自動で取得されます。`akari store connect` でアカウントを接続すると購入済み素材も同じ一覧に並びます。まとめて欲しい場合は `akari sounds` で音源を一括ダウンロードできます(この案内は次回以降表示しません)。';
184
+ return '素材(B-roll・背景・音源)は使うときに必要な分だけ自動で取得されます。無料の素材パックもあります — `akari store connect` でアカウント連携すると使えるようになります。まとめて音源だけ欲しい場合は `akari sounds` で一括ダウンロードできます(この案内は次回以降表示しません)。';
178
185
  }
179
186
 
180
187
  /** ダウンロード成功後の完了 + 追加カタログ(外部補完)の案内。`akari sounds` の完了時に使う。 */
@@ -196,3 +203,38 @@ export function soundsUnavailableError() {
196
203
  export function assetsResolverUnavailableError() {
197
204
  return '素材 resolver(asset-resolver)が見つかりませんでした。`akari assets` は使えません。';
198
205
  }
206
+
207
+ /**
208
+ * `akari --help` / `akari -h`(Node CLI 版。npm 配布 `akari-video` パッケージの `akari`
209
+ * コマンド)の出力(タスク契約 `2026-08-11-onboarding-o3-firstrun-plain` §4)。
210
+ * `akari.sh` の `-h|--help` 出力と同じ「作る → プレビュー → 連携/素材 → 更新」の初心者目線の
211
+ * 並びに揃え、開発者向けのフラグ・サブコマンドは末尾に降格する。プレビューサーバーは
212
+ * シェル版(`akari.sh --preview`)専用の機能で npm 版の `akari` 単体には同梱されないため、
213
+ * 案内が行き止まりにならないようその旨を明示する。
214
+ */
215
+ export function describeCliHelp() {
216
+ return [
217
+ 'AKARI Video — AI が主体で動画を編集するツール',
218
+ '',
219
+ '使い方: akari [command] [options...]',
220
+ '',
221
+ 'よく使うコマンド:',
222
+ ' (引数なし) プロジェクトを開いて AI エージェントを起動(未作成なら自動作成)',
223
+ ' store connect アカウント連携(無料の素材パックと購入済み素材が使えるようになる)',
224
+ ' sounds 公式音源ライブラリを一括ダウンロード(無料)',
225
+ ' update 更新を確認する',
226
+ ' status 接続状態を確認する',
227
+ '',
228
+ '開発者向け:',
229
+ ' --opencode Claude Code の代わりに opencode を起動する',
230
+ ' --claude, --claudecode Claude Code を明示的に起動する',
231
+ ' -y, --yes 自動承認(確認をスキップ)',
232
+ ' --version, -v インストール済みのバージョンを表示',
233
+ ' new <dir> 雛形からプロジェクトを新規作成',
234
+ ' init 保存フォルダ(作業場)だけを作成・確認',
235
+ ' narration / assets / internal / capability 各機能の詳細は `akari <command> --help`',
236
+ ' -h, --help このヘルプを表示',
237
+ '',
238
+ 'プレビューサーバー(ブラウザで確認する画面)はシェル版のみ対応です: akari.sh --preview'
239
+ ];
240
+ }
@@ -34,6 +34,7 @@ const ASSET_RESOLVER_CLI_RELATIVE = path.join('packages', 'asset-resolver', 'bin
34
34
  const BEATMAP_SCRIPT_RELATIVE = path.join('packages', 'akari-tools', 'bin', 'beatmap.mjs');
35
35
  const PROBE_FRAME_SCRIPT_RELATIVE = path.join('packages', 'akari-tools', 'bin', 'probe-frame.mjs');
36
36
  const RENDER_WHEN_IDLE_SCRIPT_RELATIVE = path.join('packages', 'akari-tools', 'bin', 'render-when-idle.sh');
37
+ const EYE_BAR_SCRIPT_RELATIVE = path.join('packages', 'akari-tools', 'bin', 'eye-bar.mjs');
37
38
 
38
39
  /**
39
40
  * 指定ルート配下に同梱されているスキル正本・雛形・schemas・scaffold 実装・creator-root
@@ -51,6 +52,7 @@ export function resolveRepoAssets(repoRoot = DEFAULT_REPO_ROOT_CANDIDATE) {
51
52
  const beatmapScript = path.join(repoRoot, BEATMAP_SCRIPT_RELATIVE);
52
53
  const probeFrameScript = path.join(repoRoot, PROBE_FRAME_SCRIPT_RELATIVE);
53
54
  const renderWhenIdleScript = path.join(repoRoot, RENDER_WHEN_IDLE_SCRIPT_RELATIVE);
55
+ const eyeBarScript = path.join(repoRoot, EYE_BAR_SCRIPT_RELATIVE);
54
56
 
55
57
  return {
56
58
  repoRoot,
@@ -64,7 +66,8 @@ export function resolveRepoAssets(repoRoot = DEFAULT_REPO_ROOT_CANDIDATE) {
64
66
  assetResolverCliPath: existsSync(assetResolverCliPath) ? assetResolverCliPath : null,
65
67
  beatmapScript: existsSync(beatmapScript) ? beatmapScript : null,
66
68
  probeFrameScript: existsSync(probeFrameScript) ? probeFrameScript : null,
67
- renderWhenIdleScript: existsSync(renderWhenIdleScript) ? renderWhenIdleScript : null
69
+ renderWhenIdleScript: existsSync(renderWhenIdleScript) ? renderWhenIdleScript : null,
70
+ eyeBarScript: existsSync(eyeBarScript) ? eyeBarScript : null
68
71
  };
69
72
  }
70
73
 
@@ -80,6 +83,7 @@ export function resolveLauncherAssets({
80
83
  const checkout = resolveRepoAssets(candidateRoot);
81
84
  const found = checkout.skillsSourceDir || checkout.templateDir || checkout.schemasSourceDir
82
85
  || checkout.doctorScript || checkout.scaffoldModulePath || checkout.creatorRootModulePath
83
- || checkout.beatmapScript || checkout.probeFrameScript || checkout.renderWhenIdleScript;
86
+ || checkout.beatmapScript || checkout.probeFrameScript || checkout.renderWhenIdleScript
87
+ || checkout.eyeBarScript;
84
88
  return found ? checkout : resolveRepoAssets(vendorRoot);
85
89
  }