tbdflow 0.27.0

A CLI to streamline your Git workflow for Trunk-Based Development.
Documentation
# ═══════════════════════════════════════════════════════════════════════════════
# tbdflow — Workflow Completion (merge & cleanup)
# ═══════════════════════════════════════════════════════════════════════════════
# User Story: As a developer, I want to merge my short-lived branch back to
# main with a single command so that integration is fast and friction-free.
# ═══════════════════════════════════════════════════════════════════════════════

feature "tbdflow Workflow Completion"

actors: Terminal

settings {
    timeout_seconds = 30
    stop_on_failure = true
    shell_path = "/bin/bash"
}

var REPO_DIR = "/tmp/tbdflow_complete_test"
var BARE_REPO = "/tmp/tbdflow_complete_bare.git"

# ═══════════════════════════════════════════════════════════════════════════════
# IMPLEMENTATION LAYER — Tasks hide the "how"
# ═══════════════════════════════════════════════════════════════════════════════

# --- Setup drivers ---

task init_repo(repo, bare) {
    Terminal run "rm -rf ${repo} ${bare} && mkdir -p ${repo}"
    Terminal run "git init --bare ${bare}"
    Terminal run "git -C ${repo} init && git -C ${repo} commit --allow-empty -m 'init'"
    Terminal run "git -C ${repo} remote add origin ${bare}"
    Terminal run "git -C ${repo} push -u origin main"
    Terminal set_cwd "${repo}"
}

task cleanup_repo(repo, bare) {
    Terminal run "rm -rf ${repo} ${bare}"
}

# --- Action drivers ---

task create_branch(type, name) {
    Terminal run "tbdflow branch -t ${type} -n ${name}"
}

task make_change(filename, content) {
    Terminal run "echo ${content} > ${filename}"
}

task commit(type, message) {
    Terminal run "tbdflow commit -t ${type} -m '${message}'"
}

task complete_branch(type, name) {
    Terminal run "tbdflow complete -t ${type} -n ${name}"
}

task sync() {
    Terminal run "tbdflow sync"
}

task check_status() {
    Terminal run "tbdflow status"
}

# --- Condition drivers ---

task verify_branch_merged_and_deleted() {
    Terminal last_command succeeded
    Terminal output_contains "merged into main"
    Terminal output_contains "deleted"
}

task verify_on_main_with_commit(expected_message) {
    Terminal last_command succeeded
    Terminal output_contains "${expected_message}"
    Terminal output_contains "On main branch"
}

task verify_working_tree_clean() {
    Terminal last_command succeeded
    Terminal output_contains "clean"
}

# ═══════════════════════════════════════════════════════════════════════════════
# BUSINESS SPECIFICATION LAYER — Scenarios describe the "what"
# ═══════════════════════════════════════════════════════════════════════════════

# AC1: `tbdflow complete` must merge the branch back to main.
# AC2: The feature branch must be deleted after merging.
# AC3: The commit history on main must contain the work from the branch.
# AC4: The working tree must be clean after completion.

scenario "Full branch lifecycle: create, commit, complete" {

    test Setup "Initialise test repository" {
        given:
            Test can_start
        when:
            init_repo("${REPO_DIR}", "${BARE_REPO}")
        then:
            Terminal last_command succeeded
    }

    test CreateBranch "Start a short-lived feature branch" {
        given:
            Test has_succeeded Setup
        when:
            create_branch("feat", "user-settings")
        then:
            Terminal last_command succeeded
            Terminal output_contains "feat/user-settings"
            Terminal output_not_contains "Error"
    }

    test CommitWork "Commit work on the branch" {
        given:
            Test has_succeeded CreateBranch
        when:
            make_change("settings.txt", "settings_page")
            commit("feat", "add user settings page")
        then:
            Terminal last_command succeeded
            Terminal output_not_contains "Error"
    }

    test CompleteWork "Merge the branch back to main" {
        given:
            Test has_succeeded CommitWork
        when:
            complete_branch("feat", "user-settings")
        then:
            verify_branch_merged_and_deleted()
    }

    test VerifyMergeOnMain "The commit exists on main after merge" {
        given:
            Test has_succeeded CompleteWork
        when:
            sync()
        then:
            verify_on_main_with_commit("add user settings page")
    }

    test WorkingTreeClean "Working directory is clean after complete" {
        given:
            Test has_succeeded VerifyMergeOnMain
        when:
            check_status()
        then:
            verify_working_tree_clean()
    }

    after {
        cleanup_repo("${REPO_DIR}", "${BARE_REPO}")
    }
}