Skip to content

Release the slide feature without the experimental flag - #422

Open
tomoasleep wants to merge 9 commits into
mainfrom
release-slide-feature
Open

tomoasleep wants to merge 9 commits into
mainfrom
release-slide-feature

Conversation

@tomoasleep

@tomoasleep tomoasleep commented Sep 25, 2026 •

Copy link
Copy Markdown
Member

What

qiita.config.json の experimentalSlideFeatureEnabled を廃止し、スライド機能(new --slide / publish / pull / preview)を設定なしで使えるようにする。

  • UserConfig と既定値から experimentalSlideFeatureEnabled を削除する。qiita init が生成する qiita.config.json にもこのキーは出なくなる
  • publish / pull / preview は常にスライドを同期し、publish はスライドも投稿対象にする(getSlideFileSystemRepoIfEnabled を削除)
  • qiita new --slide のフラグ判定とエラーを削除する
  • /api/slides のルートを常に登録し、フラグ無効時の 404 stub を削除する
  • help とエラーメッセージを「記事、スライド」の文言に固定し、「実験的機能」の注記を消す
  • README に「Qiita CLI でスライドを管理する」セクションを追加し、pull の説明をスライドを含む形にする

既存の qiita.config.json にこのキーが残っていても、読み込まれて使われないだけなのでエラーにはならない。

slides/ は必要になったときだけ作る

これまでは SlideFileSystemRepo.build() が slides/ と slides/.remote/ を必ず作っていた。フラグを外すとスライドを使わない人のリポジトリにも空のディレクトリができるので、次のように変えた。

  • build() ではディレクトリを作らない
  • 書き込み(createSlide / updateSlideFrontmatter / 同期時のミラーとローカルの書き込み)の直前に、書き込み先のディレクトリを mkdir -p する
  • 読み込みでは、ディレクトリがなければ(ENOENT)スライドなしとして扱う。ENOENT 以外のエラーはそのまま投げる

そのため、スライドがないアカウントで pull / publish --all / preview を実行しても slides/ はできない。スライドを作ったとき、または Qiita 上にスライドがあるときにだけできる。

help を定数に戻す

getHelpText() は #414 でフラグを読むためだけに async にしたものなので、フラグの廃止に合わせて #414 以前の helpText 定数に戻した。未知のコマンドのときに getHelpText() の失敗を拾っていた try/catch も不要になったので消している。

How

マージの順番

  • Apply the approved preview design to the slide page #421 の上に積んだ stack PR になっている。Apply the approved preview design to the slide page #421 のマージ後に base を main へ切り替える
  • この PR をマージすると、publish / pull / preview が起動時に必ずスライド API を呼ぶ。スライド API が 404 を返すと、記事だけを扱うユーザーのコマンドも失敗する。そのため、qiita.com でスライド API が一般公開されてからマージする
  • バージョンを上げるリリース PR は、このマージ後に別で出す

動作確認

自動テスト

yarn test(24 suites, 214 tests)、eslint .、tsc --noEmit、yarn build がいずれも成功。

  • src/lib/slide-file-system-repo.test.ts: build() でディレクトリが作られないこと / slides/ がないときに loadSlides() と loadPublishTargets() が [] を返すこと / ENOENT 以外のエラーは投げること / createSlide() が書き込み前に slides/ を作ること / saveSlides() が slides/ と slides/.remote/ を作り、空配列なら何も作らないこと
  • src/commands/publish.test.ts / pull.test.ts / preview.test.ts: スライドを常に同期し、preview が public/ と slides/ の両方を watch すること
  • src/commands/publish.test.ts: 記事にもスライドにもない basename を渡すと Error: '<basename>' is not found で終了すること
  • src/commands/newArticles.test.ts: フラグなしで --slide を渡すとスライドが作られること
  • src/commands/help.test.ts / src/lib/error-handler.test.ts: スライドを含む文言になり、実験的機能の注記がないこと

手動確認

ビルド済み CLI(node dist/main.js)で、空のディレクトリに対して確認した。

# 操作 結果
1 qiita init 生成された qiita.config.json は includePrivate / host / port だけで、experimentalSlideFeatureEnabled がない。slides/ は作られない
2 qiita new --slide foo 設定なしで slides/foo.md が生成される(slides/.remote/ は作られない)
3 qiita help new --slide の注記が消え、publish / pull の説明が「記事、スライド」になっている

preview の watcher(chokidar v4)は、起動時に存在しない slides/ を watch しても落ちず、後から作られた slides/ とその中のファイルの追加・変更を検知することを確認した。

Qiita の API に対する publish / pull / preview の確認は、スライド API の一般公開後、マージ前に行う。

Why

スライド機能は experimentalSlideFeatureEnabled: true を設定したときだけ使える実験的機能として入れてきた。投稿・同期と Preview のデザイン反映が揃ったので、フラグなしで使えるようにする。

Refs

🤖 Generated by Claude Code

🤖 Generated with Claude Code

tomoasleep

This comment was marked as outdated.

@tomoasleep
tomoasleep added this pull request to stack #424 September 25, 2026 08:01
@tomoasleep

Copy link
Copy Markdown
Member Author

AI Review への対応です。

🤖 Generated by Claude Code

@tomoasleep tomoasleep left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Review 🤖

問題はありません。

その他確認した項目

何を確認したか

  • PR: #422
  • diff: apply-design-to-slide-feature...release-slide-feature
  • CI state: success
  • 既存レビュー: 未解決の行コメント0件。general comment 1件(tomoasleep 本人による前回 AI Review 対応の報告)

見たが問題にしなかった観点

  • general comment(basename が記事にもスライドにも見つからないときの not found 分岐のテスト復元)は対応済みと確認した。55e085f で publish.test.ts に該当ケースが復元され、publish(["deck"]) がエラーメッセージと process.exit(1) を伴って終了することを検証している。ローカルの yarn test でも該当テストを含む214件すべてが green だった。
  • experimentalSlideFeatureEnabled フラグの撤去は一貫している。config・get-slide-file-system-repo・publish/pull/preview・newArticles・help・error-handler・server/app の各所から分岐が漏れなく除去されており、フラグ名や関連関数名の残存参照はテストの否定アサーション文字列以外に見当たらない。
  • slides/ ディレクトリの遅延作成は安全に見える。SlideFileSystemRepo.build() はディレクトリを作らず、getSlideFilenames() は ENOENT のときのみ空配列を返し、それ以外は re-throw する。書き込み系は書き込み直前に mkdir する実装になっており、ディレクトリが無い状態と有る状態の両方をテストが個別にカバーしている。
  • preview が常にスライドのルートパスを watch 対象に加える変更は、起動時にディレクトリが存在しなくても動作し、後から作られても検知できることを前提にしており、コード上追加のガードは不要と判断できる。
  • ローカルでも eslint . と tsc --noEmit をエラーなしで確認した。

tomoasleep に確認するべき点

stack 登録の状態をこの環境の gh stack view からは再現確認できない

gh stack link によるスタック登録は GitHub 側の GraphQL(pullRequest.stack)では #421→#422 として確認できるが、レビューに使った worktree の gh stack view では「stack の一部ではない」という結果になり、ローカルの git 設定には反映されていない。GitHub 側の登録自体は問題なさそうだが、マージ前に PR ページ上でスタックのリンク表示を目視確認できると安心。

補足

CI は6チェックすべて成功しており、ローカルでも yarn test(214 tests)・eslint .・tsc --noEmit に問題はなかった。


head: 55e085f

@tomoasleep

tomoasleep commented Sep 28, 2026 •

Copy link
Copy Markdown
Member Author

GitHub 側で rebase stack したら conflict したので、 Conflict 解消してほしい

@tomoasleep
tomoasleep force-pushed the release-slide-feature branch from 55e085f to 69c8ce2 Compare September 28, 2026 08:13
Base automatically changed from apply-design-to-slide-feature to main September 28, 2026 08:53
tomoasleep and others added 9 commits September 28, 2026 17:53
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The help text had become async only to read the experimental flag, so it
goes back to a constant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@tomoasleep
tomoasleep force-pushed the release-slide-feature branch from 69c8ce2 to a102ca4 Compare September 28, 2026 08:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant