- step → movement, agent → persona に用語統一(CLAUDE.md, pieces.md, agents.md) - Piece YAML Schema にセクションマップ(personas, policies, knowledge, instructions)を反映 - Directory Structure を facets/ 構造に更新 - README の YAML 例から架空の simple ピースを削除 - e2e.md から削除済み export-cc テスト記述を除去
17 KiB
17 KiB
E2Eテスト概要
このドキュメントは、E2Eテストの目的・前提条件・実行方法を短くまとめた索引です。 E2Eテストを追加・変更した場合は、このドキュメントも更新してください。
前提条件
ghCLI が利用可能で、対象GitHubアカウントでログイン済みであること。takt-testingリポジトリが対象アカウントに存在すること(E2Eがクローンして使用)。- 必要に応じて
TAKT_E2E_PROVIDERを設定すること(例:claude/codex/opencode)。 TAKT_E2E_PROVIDER=opencodeの場合はTAKT_E2E_MODELが必須(例:opencode/big-pickle)。- 実行時間が長いテストがあるため、タイムアウトに注意すること。
- E2Eは
e2e/helpers/test-repo.tsがghでリポジトリをクローンし、テンポラリディレクトリで実行する。 - 対話UIを避けるため、E2E環境では
TAKT_NO_TTY=1を設定してTTYを無効化する。 - 実行ディレクトリの形式(macOSの例):
- リポジトリクローン:
$(os.tmpdir())/takt-e2e-repo-<random>/ - 実行環境:
$(os.tmpdir())/takt-e2e-<runId>-<random>/
- リポジトリクローン:
E2E用config.yaml
- E2Eのグローバル設定は
e2e/fixtures/config.e2e.yamlを基準に生成する。 createIsolatedEnv()は毎回一時ディレクトリ配下($TAKT_CONFIG_DIR/config.yaml)にこの基準設定を書き出す。- E2E実行中の
takt内通知音はnotification_sound: falseで無効化する。 npm run test:e2eは成否にかかわらず最後に1回ベルを鳴らし、終了コードはテスト結果を維持する。- 各スペックで
providerやconcurrencyを変更する場合は、updateIsolatedConfig()を使って差分のみ上書きする。 ~/.takt/config.yamlはE2Eでは参照されないため、通常実行の設定には影響しない。
実行コマンド
npm run test:e2e: E2E全体を実行。npm run test:e2e:mock: mock固定のE2Eのみ実行。npm run test:e2e:provider:claudeとcodexの両方で実行。npm run test:e2e:provider:claude:TAKT_E2E_PROVIDER=claudeで実行。npm run test:e2e:provider:codex:TAKT_E2E_PROVIDER=codexで実行。npm run test:e2e:provider:opencode:TAKT_E2E_PROVIDER=opencodeで実行(TAKT_E2E_MODEL必須)。npm run test:e2e:all:mock+providerを通しで実行。npm run test:e2e:claude:test:e2e:provider:claudeの別名。npm run test:e2e:codex:test:e2e:provider:codexの別名。npm run test:e2e:opencode:test:e2e:provider:opencodeの別名。npx vitest run e2e/specs/add-and-run.e2e.ts: 単体実行の例。
シナリオ一覧
- Add task and run(
e2e/specs/add-and-run.e2e.ts)- 目的:
.takt/tasks.yamlに pending タスクを配置し、takt runが実行できることを確認。 - LLM: 条件付き(
TAKT_E2E_PROVIDERがclaude/codexの場合に呼び出す) - 手順(ユーザー行動/コマンド):
.takt/tasks.yamlにタスクを作成(pieceはe2e/fixtures/pieces/simple.yamlを指定)。takt runを実行する。README.mdに行が追加されることを確認する。- 実行後にタスクが
tasks.yamlでcompletedステータスになることを確認する。
- 目的:
- Worktree/Clone isolation(
e2e/specs/worktree.e2e.ts)- 目的:
--create-worktree yes指定で隔離環境に実行されることを確認。 - LLM: 条件付き(
TAKT_E2E_PROVIDERがclaude/codexの場合に呼び出す) - 手順(ユーザー行動/コマンド):
takt --task 'Add a line "worktree test" to README.md' --piece e2e/fixtures/pieces/simple.yaml --create-worktree yesを実行する。- コマンドが成功終了することを確認する。
- 目的:
- Pipeline mode(
e2e/specs/pipeline.e2e.ts)- 目的: ブランチ作成→タスク実行→コミット→push→PR作成の一連フローを確認。
- LLM: 条件付き(
TAKT_E2E_PROVIDERがclaude/codexの場合に呼び出す) - 手順(ユーザー行動/コマンド):
takt --pipeline --task 'Create a file called hello.txt with the content "Hello World"' --piece e2e/fixtures/pieces/simple.yaml --auto-pr --repo <owner>/<repo>を実行する。- 出力に
completedとPR createdが含まれることを確認する。 gh pr list --repo <owner>/<repo>でPRが作成されていることを確認する。
- GitHub Issue processing(
e2e/specs/github-issue.e2e.ts)- 目的: Issue番号からパイプラインを起動してPR作成までを確認。
- LLM: 条件付き(
TAKT_E2E_PROVIDERがclaude/codexの場合に呼び出す) - 手順(ユーザー行動/コマンド):
gh issue create --title 'E2E Test Issue' --body 'Create a file called issue-test.txt with the content \"Issue resolved\"' --repo <owner>/<repo>でIssueを作成する。- 作成したIssue番号を控える。
takt --pipeline --issue <issue-number> --piece e2e/fixtures/pieces/simple.yaml --auto-pr --repo <owner>/<repo>を実行する。- 出力に
Issue #/completed/PR createdが含まれることを確認する。 gh pr list --repo <owner>/<repo>でPR一覧にIssueタイトルがあることを確認する。
- Direct task execution(
e2e/specs/direct-task.e2e.ts)- 目的:
--taskの直接実行が、プロンプトなしで完了することを確認。 - LLM: 呼び出さない(
--provider mock固定) - 手順(ユーザー行動/コマンド):
takt --task 'Create a file called noop.txt' --piece e2e/fixtures/pieces/mock-single-step.yaml --create-worktree no --provider mockを実行する。TAKT_MOCK_SCENARIO=e2e/fixtures/scenarios/execute-done.jsonを設定する。- 出力に
Piece completedが含まれることを確認する。
- 目的:
- Pipeline mode with --skip-git(
e2e/specs/pipeline-skip-git.e2e.ts)- 目的:
--skip-git指定時にGit操作を行わずパイプラインが完了することを確認。 - LLM: 呼び出さない(
--provider mock固定) - 手順(ユーザー行動/コマンド):
takt --pipeline --task 'Create a file called noop.txt' --piece e2e/fixtures/pieces/mock-single-step.yaml --skip-git --provider mockを実行する。TAKT_MOCK_SCENARIO=e2e/fixtures/scenarios/execute-done.jsonを設定する。- 出力に
completedが含まれることを確認する。
- 目的:
- Report + Judge phases(
e2e/specs/report-judge.e2e.ts)- 目的: reportフェーズとjudgeフェーズを通ることを確認(mockシナリオ)。
- LLM: 呼び出さない(
--provider mock固定) - 手順(ユーザー行動/コマンド):
takt --task 'Create a short report and finish' --piece e2e/fixtures/pieces/report-judge.yaml --create-worktree no --provider mockを実行する。TAKT_MOCK_SCENARIO=e2e/fixtures/scenarios/report-judge.jsonを設定する。- 出力に
Piece completedが含まれることを確認する。
- Add task(
e2e/specs/add.e2e.ts)- 目的:
takt addがIssue参照からタスクファイルを生成できることを確認。 - LLM: 呼び出さない(
provider: mock+TAKT_MOCK_SCENARIO固定) - 手順(ユーザー行動/コマンド):
gh issue create ...でIssueを作成する。TAKT_MOCK_SCENARIO=e2e/fixtures/scenarios/add-task.jsonを設定する。takt add '#<issue>'を実行し、Create worktree?にnで回答する。.takt/tasks.yamlにtask_dirが保存され、.takt/tasks/{slug}/order.mdが生成されることを確認する。
- 目的:
- Watch tasks(
e2e/specs/watch.e2e.ts)- 目的:
takt watchが監視中に追加されたタスクを実行できることを確認。 - LLM: 呼び出さない(
--provider mock固定) - 手順(ユーザー行動/コマンド):
takt watch --provider mockを起動する。.takt/tasks.yamlに pending タスクを追加する(pieceにe2e/fixtures/pieces/mock-single-step.yamlを指定)。- 出力に
Task "watch-task" completedが含まれることを確認する。 Ctrl+Cで終了する。
- 目的:
- Run recovery and high-priority run flows(
e2e/specs/run-recovery.e2e.ts)- 目的: 高優先度ユースケース(異常終了リカバリー、並列実行、初期化〜add〜run)をまとめて確認。
- LLM: 呼び出さない(
--provider mock固定) - 手順(ユーザー行動/コマンド):
- 異常終了リカバリー:
.takt/tasks.yamlに pending タスク2件を投入し、takt run --provider mock実行中にプロセスを強制終了する。- 再度
takt run --provider mockを実行し、Recovered 1 interrupted running task(s) to pending.が出力されることを確認する。 - 復旧対象を含む全タスクが完了し、
.takt/tasks.yamlが空になることを確認する。
- 高並列実行:
concurrency: 10を設定し、pending タスク12件を投入してtakt run --provider mockを実行する。- 出力に
Concurrency: 10とTasks Summaryが含まれること、および.takt/tasks.yamlが空になることを確認する。
- 初期化〜add〜run:
- グローバル
config.yaml不在の環境でtakt addを2回実行し、takt run --provider mockを実行する。 - タスク実行完了後に
.takt/tasks/配下の2タスクディレクトリ生成、.takt/.gitignore生成、.takt/tasks.yamlの空状態を確認する。
- グローバル
- 異常終了リカバリー:
- Run tasks graceful shutdown on SIGINT(
e2e/specs/run-sigint-graceful.e2e.ts)- 目的:
takt runを並列実行中にCtrl+Cした際、新規クローン投入を止めてグレースフルに終了することを確認。 - LLM: 呼び出さない(
--provider mock固定) - 手順(ユーザー行動/コマンド):
.takt/tasks.yamlにworktree: trueの pending タスクを3件投入する(concurrency: 2)。- 各タスクの
pieceにe2e/fixtures/pieces/mock-slow-multi-step.yamlを指定する。 TAKT_MOCK_SCENARIO=e2e/fixtures/scenarios/run-sigint-parallel.jsonを設定する。takt run --provider mockを起動し、=== Running Piece:が出たらCtrl+Cを送る。- 3件目タスク(
sigint-c)が開始されないことを確認する。 === Tasks Summary ===以降に新規タスク開始やクローン作成ログが出ないことを確認する。
- 目的:
- Runtime config injection with provider(
e2e/specs/runtime-config-provider.e2e.ts)- 目的:
config.yamlのruntime.prepareが provider 実行時に反映される正例と、未設定時の失敗再現(env未注入)を確認。 - LLM: 条件付き(
TAKT_E2E_PROVIDERがclaude/codex/opencodeの場合に実行、未指定時は skip) - 手順(ユーザー行動/コマンド):
- E2E用
config.yamlにruntime.prepare: [gradle, node]を設定する。 takt --task '<gradle/npm を実行する指示>' --piece e2e/fixtures/pieces/simple.yaml --create-worktree noを実行する。- 正例では、作業リポジトリに
.runtime/env.shと.runtime/{tmp,cache,config,state,gradle,npm}が作成されていることを確認する。 - 負例(
runtime.prepare未設定)では、GRADLE_USER_HOME is requiredと npm キャッシュ書き込み失敗が出力され、.runtime/env.shが生成されないことを確認する。
- E2E用
- 目的:
- List tasks non-interactive(
e2e/specs/list-non-interactive.e2e.ts)- 目的:
takt listの非対話モードでブランチ操作ができることを確認。 - LLM: 呼び出さない(LLM不使用の操作のみ)
- 手順(ユーザー行動/コマンド):
takt list --non-interactive --action delete --branch <branch> --yesを実行する。- 対象ブランチが削除されることを確認する。
takt list --non-interactive --action diff --branch <branch>で差分統計が出力されることを確認する。takt list --non-interactive --action try --branch <branch>で変更がステージされることを確認する。takt list --non-interactive --action merge --branch <branch>でブランチがマージされ削除されることを確認する。
- 目的:
- Reset categories(
e2e/specs/cli-reset-categories.e2e.ts)- 目的:
takt reset categoriesでカテゴリオーバーレイのリセットを確認。 - LLM: 呼び出さない(LLM不使用の操作のみ)
- 手順(ユーザー行動/コマンド):
takt reset categoriesを実行する。- 出力に
resetを含むことを確認する。 $TAKT_CONFIG_DIR/preferences/piece-categories.yamlが存在しpiece_categories: {}を含むことを確認する。
- 目的:
- Reset config(
e2e/specs/cli-reset-config.e2e.ts)- 目的:
takt reset configでグローバル設定をテンプレートへ戻し、旧設定をバックアップすることを確認。 - LLM: 呼び出さない(LLM不使用の操作のみ)
- 手順(ユーザー行動/コマンド):
$TAKT_CONFIG_DIR/config.yamlに任意の設定を書き込む(例:language: ja,provider: mock)。takt reset configを実行する。- 出力に
resetとbackup:を含むことを確認する。 $TAKT_CONFIG_DIR/config.yamlがテンプレート内容(例:branch_name_strategy: ai,concurrency: 2)に置き換わっていることを確認する。$TAKT_CONFIG_DIR/直下にconfig.yaml.YYYYMMDD-HHmmss.old形式のバックアップファイルが1件作成されることを確認する。
- 目的:
追記シナリオ(2026-02-19)
過去にドキュメント未反映だったシナリオを以下に追記する。
- Config priority(
e2e/specs/config-priority.e2e.ts)- 目的:
pieceとauto_prの優先順位(config/env/CLI)を検証。 - 手順(要約):
--pipelineで--piece未指定時に設定値のpieceが使われることを確認。auto_pr未設定時は確認デフォルトtrueが反映されることを確認。configとTAKT_AUTO_PRの優先を確認。
- 目的:
- Pipeline --skip-git on local/non-git directories(
e2e/specs/pipeline-local-repo.e2e.ts)- 目的: ローカルGitリポジトリおよび非Gitディレクトリで
--pipeline --skip-gitが動作することを確認。
- 目的: ローカルGitリポジトリおよび非Gitディレクトリで
- Task content_file reference(
e2e/specs/task-content-file.e2e.ts)- 目的:
tasks.yamlのcontent_file参照が解決されること、および不正参照時エラーを確認。
- 目的:
- Task status persistence(
e2e/specs/task-status-persistence.e2e.ts)- 目的: 成功時/失敗時の
tasks.yaml状態遷移(完了消込・失敗記録)を確認。
- 目的: 成功時/失敗時の
- Run multiple tasks(
e2e/specs/run-multiple-tasks.e2e.ts)- 目的: 複数pendingタスクの連続実行、途中失敗時継続、タスク空時の終了挙動を確認。
- Session NDJSON log output(
e2e/specs/session-log.e2e.ts)- 目的: NDJSONログの主要イベント(
piece_complete/piece_abort等)出力を確認。
- 目的: NDJSONログの主要イベント(
- Structured output rule matching(
e2e/specs/structured-output.e2e.ts)- 目的: structured output によるルール判定(Phase 3)を確認。
- Piece error handling(
e2e/specs/piece-error-handling.e2e.ts)- 目的: エージェントエラー、最大反復到達、前回応答受け渡しの挙動を確認。
- Multi-step with parallel movements(
e2e/specs/multi-step-parallel.e2e.ts)- 目的: 並列ムーブメントを含む複数ステップ遷移を確認。
- Sequential multi-step session log transitions(
e2e/specs/multi-step-sequential.e2e.ts)- 目的: 逐次ステップでのセッションログ遷移を確認。
- Cycle detection via loop_monitors(
e2e/specs/cycle-detection.e2e.ts)- 目的: ループ監視設定による abort/continue の境界を確認。
- Provider error handling(
e2e/specs/provider-error.e2e.ts)- 目的: provider上書き、mockシナリオ不足時の挙動、シナリオ不在時エラーを確認。
- Model override(
e2e/specs/model-override.e2e.ts)- 目的:
--modelオプションが通常実行/--pipeline --skip-gitで反映されることを確認。
- 目的:
- Error handling edge cases(
e2e/specs/error-handling.e2e.ts)- 目的: 不正引数・存在しないpiece・不正YAMLなど代表エラーケースを確認。
- Quiet mode(
e2e/specs/quiet-mode.e2e.ts)- 目的:
--quietでAIストリーム出力が抑制されることを確認。
- 目的:
- Catalog command(
e2e/specs/cli-catalog.e2e.ts)- 目的:
takt catalogの一覧表示・型指定・不正型エラーを確認。
- 目的:
- Prompt preview command(
e2e/specs/cli-prompt.e2e.ts)- 目的:
takt promptのプレビュー出力と不正piece時エラーを確認。
- 目的:
- Switch piece command(
e2e/specs/cli-switch.e2e.ts)- 目的:
takt switchの切替成功・不正piece時エラーを確認。
- 目的:
- Clear sessions command(
e2e/specs/cli-clear.e2e.ts)- 目的:
takt clearでセッション情報が削除されることを確認。
- 目的:
- Help command(
e2e/specs/cli-help.e2e.ts)- 目的:
takt --helpとtakt run --helpの表示内容を確認。
- 目的:
- Eject builtin pieces(
e2e/specs/eject.e2e.ts)- 目的:
takt ejectのproject/global出力、既存時スキップ、facet個別ejectを確認。
- 目的: