diff --git a/README.md b/README.md index 037fe01..c9fdeae 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ kt install ``` The installer prompts for: -- **Slash commands**: `/kt-create`, `/kt-run` (global or project scope) +- **Slash commands**: `/kt-create`, `/kt-run`, `/kt-run-all` (global or project scope) - **kt permission**: Allows Claude to run kt commands without prompting ## AI Agent Setup @@ -41,6 +41,7 @@ Add to your project's `CLAUDE.md`: |---------|-------------| | `/kt-create` | Create epic and tasks from a plan | | `/kt-run` | Work through tasks: ready → start → implement → close | +| `/kt-run-all` | Process ALL tasks until none remain | ### Prompting Example diff --git a/internal/cmd/cmd_test.go b/internal/cmd/cmd_test.go index d027f85..ed56ad1 100644 --- a/internal/cmd/cmd_test.go +++ b/internal/cmd/cmd_test.go @@ -1515,6 +1515,8 @@ func TestInstallSlashCommands_Project(t *testing.T) { assert.NoError(t, err) _, err = os.Stat(filepath.Join(dir, ".claude/commands/kt-run.md")) assert.NoError(t, err) + _, err = os.Stat(filepath.Join(dir, ".claude/commands/kt-run-all.md")) + assert.NoError(t, err) // Check content content, _ := os.ReadFile(filepath.Join(dir, ".claude/commands/kt-create.md")) @@ -1534,6 +1536,8 @@ func TestInstallSlashCommands_Global(t *testing.T) { assert.NoError(t, err) _, err = os.Stat(filepath.Join(dir, "commands/kt-run.md")) assert.NoError(t, err) + _, err = os.Stat(filepath.Join(dir, "commands/kt-run-all.md")) + assert.NoError(t, err) } func TestWriteKtMd(t *testing.T) { diff --git a/internal/cmd/install.go b/internal/cmd/install.go index 9b2be67..1ada008 100644 --- a/internal/cmd/install.go +++ b/internal/cmd/install.go @@ -46,7 +46,7 @@ var installCmd = &cobra.Command{ // Install slash commands globalDir := getClaudeConfigDir() - cmdChoice := promptChoice(reader, "Install slash commands (/kt-create, /kt-run)?", []string{ + cmdChoice := promptChoice(reader, "Install slash commands (/kt-create, /kt-run, /kt-run-all)?", []string{ fmt.Sprintf("Global (%s/commands/)", globalDir), "Project (.claude/commands/)", "Skip", @@ -138,7 +138,7 @@ func installSlashCommands(global bool) error { return fmt.Errorf("create commands directory: %w", err) } - commands := []string{"kt-create.md", "kt-run.md"} + commands := []string{"kt-create.md", "kt-run.md", "kt-run-all.md"} for _, cmd := range commands { content, err := templatesFS.ReadFile("templates/" + cmd) if err != nil { @@ -154,7 +154,7 @@ func installSlashCommands(global bool) error { if global { scope = "global" } - fmt.Printf("Installed /kt-create, /kt-run (%s)\n", scope) + fmt.Printf("Installed /kt-create, /kt-run, /kt-run-all (%s)\n", scope) return nil } diff --git a/internal/cmd/templates/kt-run-all.md b/internal/cmd/templates/kt-run-all.md new file mode 100644 index 0000000..7daeaf3 --- /dev/null +++ b/internal/cmd/templates/kt-run-all.md @@ -0,0 +1,21 @@ +Use kt to implement ALL tasks automatically. + +1. Run `kt ready` to see available tasks +2. Start with first task, `kt start ` +3. Implement the task +4. `kt close ` when done +5. Loop back to step 1 until `kt ready` shows no tasks + +## Workflow +- Process tasks in priority order (top first) +- Do NOT stop after one task—continue until all complete +- Use `kt add-note` to log blockers if stuck + +## kt reference +```sh +kt ready # show actionable tasks +kt show # view task details +kt start|close # workflow transitions +kt add-note "text" # log progress +kt ls --status=in_progress # see active work +```