Takashi Morikubo 50935a1244
Remove worktree prompt from execute action (#414)
* fix: remove execute worktree prompt and deprecate create-worktree option

* test(e2e): align specs with removed --create-worktree

* fix: remove execute worktree leftovers and align docs/tests

---------

Co-authored-by: Takashi Morikubo <azurite0107@gmail.com>
2026-03-02 16:12:18 +09:00

18 KiB
Raw Permalink Blame History

E2Eテスト概要

このドキュメントは、E2Eテストの目的・前提条件・実行方法を短くまとめた索引です。 E2Eテストを追加・変更した場合は、このドキュメントも更新してください。

前提条件

  • gh CLI が利用可能で、対象GitHubアカウントでログイン済みであること。
  • takt-testing リポジトリが対象アカウントに存在することE2Eがクローンして使用
  • 必要に応じて TAKT_E2E_PROVIDER を設定すること(例: claude / codex / cursor / opencode)。
  • TAKT_E2E_PROVIDER=cursor の場合は cursor-agent CLI が利用可能で、認証済みであること。
  • TAKT_E2E_PROVIDER=opencode の場合は TAKT_E2E_MODEL が必須(例: opencode/big-pickle)。
  • 実行時間が長いテストがあるため、タイムアウトに注意すること。
  • E2Eは e2e/helpers/test-repo.tsgh でリポジトリをクローンし、テンポラリディレクトリで実行する。
  • 対話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回ベルを鳴らし、終了コードはテスト結果を維持する。
  • 各スペックで providerconcurrency を変更する場合は、updateIsolatedConfig() を使って差分のみ上書きする。
  • ~/.takt/config.yaml はE2Eでは参照されないため、通常実行の設定には影響しない。

実行コマンド

  • npm run test:e2e: E2E全体を実行。
  • npm run test:e2e:mock: mock固定のE2Eのみ実行。
  • npm run test:e2e:provider: claudecodex の両方で実行。
  • 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:cursor: TAKT_AUTO_PR=false TAKT_E2E_PROVIDER=cursor で実行Cursor専用スイート: add-and-run / worktree)。
  • 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:cursor: test:e2e:provider:cursor の別名。
  • npm run test:e2e:opencode: test:e2e:provider:opencode の別名。
  • npx vitest run e2e/specs/add-and-run.e2e.ts: 単体実行の例。

シナリオ一覧

  • Add task and rune2e/specs/add-and-run.e2e.ts
    • 目的: .takt/tasks.yaml に pending タスクを配置し、takt run が実行できることを確認。
    • LLM: 条件付き(TAKT_E2E_PROVIDERclaude / codex の場合に呼び出す)
    • 手順(ユーザー行動/コマンド):
      • .takt/tasks.yaml にタスクを作成(piecee2e/fixtures/pieces/simple.yaml を指定)。
      • takt run を実行する。
      • README.md に行が追加されることを確認する。
      • 実行後にタスクが tasks.yamlcompleted ステータスになることを確認する。
  • Worktree/Clone isolatione2e/specs/worktree.e2e.ts
    • 目的: worktree: true タスクが隔離環境に実行されることを確認。
    • LLM: 条件付き(TAKT_E2E_PROVIDERclaude / codex の場合に呼び出す)
    • 手順(ユーザー行動/コマンド):
      • .takt/tasks.yamlworktree: true のタスクを追加して takt run を実行する。
      • コマンドが成功終了することを確認する。
  • Pipeline modee2e/specs/pipeline.e2e.ts
    • 目的: ブランチ作成→タスク実行→コミット→push→PR作成の一連フローを確認。
    • LLM: 条件付き(TAKT_E2E_PROVIDERclaude / 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> を実行する。
      • 出力に completedPR created が含まれることを確認する。
      • gh pr list --repo <owner>/<repo> でPRが作成されていることを確認する。
  • GitHub Issue processinge2e/specs/github-issue.e2e.ts
    • 目的: Issue番号からパイプラインを起動してPR作成までを確認。
    • LLM: 条件付き(TAKT_E2E_PROVIDERclaude / 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 executione2e/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 --provider mock を実行する。
      • TAKT_MOCK_SCENARIO=e2e/fixtures/scenarios/execute-done.json を設定する。
      • 出力に Piece completed が含まれることを確認する。
  • Pipeline mode with --skip-gite2e/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 phasese2e/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 --provider mock を実行する。
      • TAKT_MOCK_SCENARIO=e2e/fixtures/scenarios/report-judge.json を設定する。
      • 出力に Piece completed が含まれることを確認する。
  • Add taske2e/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.yamltask_dir が保存され、.takt/tasks/{slug}/order.md が生成されることを確認する。
  • Watch taskse2e/specs/watch.e2e.ts
    • 目的: takt watch が監視中に追加されたタスクを実行できることを確認。
    • LLM: 呼び出さない(--provider mock 固定)
    • 手順(ユーザー行動/コマンド):
      • takt watch --provider mock を起動する。
      • .takt/tasks.yaml に pending タスクを追加する(piecee2e/fixtures/pieces/mock-single-step.yaml を指定)。
      • 出力に Task "watch-task" completed が含まれることを確認する。
      • Ctrl+C で終了する。
  • Run recovery and high-priority run flowse2e/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: 10Tasks 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 SIGINTe2e/specs/run-sigint-graceful.e2e.ts
    • 目的: takt run を並列実行中に Ctrl+C した際、新規クローン投入を止めてグレースフルに終了することを確認。
    • LLM: 呼び出さない(--provider mock 固定)
    • 手順(ユーザー行動/コマンド):
      • .takt/tasks.yamlworktree: true の pending タスクを3件投入するconcurrency: 2)。
      • 各タスクの piecee2e/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 providere2e/specs/runtime-config-provider.e2e.ts
    • 目的: config.yamlruntime.prepare が provider 実行時に反映される正例と、未設定時の失敗再現env未注入を確認。
    • LLM: 条件付き(TAKT_E2E_PROVIDERclaude / codex / opencode の場合に実行、未指定時は skip
    • 手順(ユーザー行動/コマンド):
      • E2E用 config.yamlruntime.prepare: [gradle, node] を設定する。
      • takt --task '<gradle/npm を実行する指示>' --piece e2e/fixtures/pieces/simple.yaml を実行する。
      • 正例では、作業リポジトリに .runtime/env.sh.runtime/{tmp,cache,config,state,gradle,npm} が作成されていることを確認する。
      • 負例(runtime.prepare 未設定)では、GRADLE_USER_HOME is required と npm キャッシュ書き込み失敗が出力され、.runtime/env.sh が生成されないことを確認する。
  • List tasks non-interactivee2e/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 categoriese2e/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 confige2e/specs/cli-reset-config.e2e.ts
    • 目的: takt reset config でグローバル設定をテンプレートへ戻し、旧設定をバックアップすることを確認。
    • LLM: 呼び出さないLLM不使用の操作のみ
    • 手順(ユーザー行動/コマンド):
      • $TAKT_CONFIG_DIR/config.yaml に任意の設定を書き込む(例: language: ja, provider: mock)。
      • takt reset config を実行する。
      • 出力に resetbackup: を含むことを確認する。
      • $TAKT_CONFIG_DIR/config.yaml がテンプレート内容(例: branch_name_strategy: ai, concurrency: 2)に置き換わっていることを確認する。
      • $TAKT_CONFIG_DIR/ 直下に config.yaml.YYYYMMDD-HHmmss.old 形式のバックアップファイルが1件作成されることを確認する。

追記シナリオ2026-02-19

過去にドキュメント未反映だったシナリオを以下に追記する。

  • Config prioritye2e/specs/config-priority.e2e.ts
    • 目的: pieceauto_pr の優先順位config/env/CLIを検証。
    • 手順(要約):
      • --pipeline--piece 未指定時に設定値の piece が使われることを確認。
      • auto_pr 未設定時は確認デフォルト true が反映されることを確認。
      • configTAKT_AUTO_PR の優先を確認。
  • Pipeline --skip-git on local/non-git directoriese2e/specs/pipeline-local-repo.e2e.ts
    • 目的: ローカルGitリポジトリおよび非Gitディレクトリで --pipeline --skip-git が動作することを確認。
  • Task content_file referencee2e/specs/task-content-file.e2e.ts
    • 目的: tasks.yamlcontent_file 参照が解決されること、および不正参照時エラーを確認。
  • Task status persistencee2e/specs/task-status-persistence.e2e.ts
    • 目的: 成功時/失敗時の tasks.yaml 状態遷移(完了消込・失敗記録)を確認。
  • Run multiple taskse2e/specs/run-multiple-tasks.e2e.ts
    • 目的: 複数pendingタスクの連続実行、途中失敗時継続、タスク空時の終了挙動を確認。
  • Session NDJSON log outpute2e/specs/session-log.e2e.ts
    • 目的: NDJSONログの主要イベントpiece_complete / piece_abort 等)出力を確認。
  • Structured output rule matchinge2e/specs/structured-output.e2e.ts
    • 目的: structured output によるルール判定Phase 3を確認。
  • Piece error handlinge2e/specs/piece-error-handling.e2e.ts
    • 目的: エージェントエラー、最大反復到達、前回応答受け渡しの挙動を確認。
  • Multi-step with parallel movementse2e/specs/multi-step-parallel.e2e.ts
    • 目的: 並列ムーブメントを含む複数ステップ遷移を確認。
  • Sequential multi-step session log transitionse2e/specs/multi-step-sequential.e2e.ts
    • 目的: 逐次ステップでのセッションログ遷移を確認。
  • Cycle detection via loop_monitorse2e/specs/cycle-detection.e2e.ts
    • 目的: ループ監視設定による abort/continue の境界を確認。
  • Provider error handlinge2e/specs/provider-error.e2e.ts
    • 目的: provider上書き、mockシナリオ不足時の挙動、シナリオ不在時エラーを確認。
  • Model overridee2e/specs/model-override.e2e.ts
    • 目的: --model オプションが通常実行/--pipeline --skip-git で反映されることを確認。
  • Error handling edge casese2e/specs/error-handling.e2e.ts
    • 目的: 不正引数・存在しないpiece・不正YAMLなど代表エラーケースを確認。
  • Quiet modee2e/specs/quiet-mode.e2e.ts
    • 目的: --quiet でAIストリーム出力が抑制されることを確認。
  • Catalog commande2e/specs/cli-catalog.e2e.ts
    • 目的: takt catalog の一覧表示・型指定・不正型エラーを確認。
  • Prompt preview commande2e/specs/cli-prompt.e2e.ts
    • 目的: takt prompt のプレビュー出力と不正piece時エラーを確認。
  • Switch piece commande2e/specs/cli-switch.e2e.ts
    • 目的: takt switch の切替成功・不正piece時エラーを確認。
  • Clear sessions commande2e/specs/cli-clear.e2e.ts
    • 目的: takt clear でセッション情報が削除されることを確認。
  • Help commande2e/specs/cli-help.e2e.ts
    • 目的: takt --helptakt run --help の表示内容を確認。
  • Eject builtin piecese2e/specs/eject.e2e.ts
    • 目的: takt eject のproject/global出力、既存時スキップ、facet個別ejectを確認。