Fix onboard test deadlock on Windows
This commit is contained in:
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
|
|
||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@@ -137,6 +138,50 @@ history/
|
|||||||
|
|
||||||
For more details, see README.md and QUICKSTART.md.`
|
For more details, see README.md and QUICKSTART.md.`
|
||||||
|
|
||||||
|
func renderOnboardInstructions(w io.Writer) {
|
||||||
|
bold := color.New(color.Bold).SprintFunc()
|
||||||
|
cyan := color.New(color.FgCyan).SprintFunc()
|
||||||
|
yellow := color.New(color.FgYellow).SprintFunc()
|
||||||
|
green := color.New(color.FgGreen).SprintFunc()
|
||||||
|
|
||||||
|
fmt.Fprintf(w, "\n%s\n\n", bold("bd Onboarding Instructions for AI Agent"))
|
||||||
|
|
||||||
|
fmt.Fprintf(w, "%s\n\n", yellow("Please complete the following tasks:"))
|
||||||
|
|
||||||
|
fmt.Fprintf(w, "%s\n", bold("1. Update AGENTS.md"))
|
||||||
|
fmt.Fprintln(w, " Add the following content to AGENTS.md in an appropriate location.")
|
||||||
|
fmt.Fprintln(w, " If AGENTS.md doesn't exist, create it with this content.")
|
||||||
|
fmt.Fprintln(w, " Integrate it naturally into any existing structure.")
|
||||||
|
fmt.Fprintln(w)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, "%s\n", cyan("--- BEGIN AGENTS.MD CONTENT ---"))
|
||||||
|
fmt.Fprintln(w, agentsContent)
|
||||||
|
fmt.Fprintf(w, "%s\n\n", cyan("--- END AGENTS.MD CONTENT ---"))
|
||||||
|
|
||||||
|
fmt.Fprintf(w, "%s\n", bold("2. Update CLAUDE.md (if present)"))
|
||||||
|
fmt.Fprintln(w, " If CLAUDE.md exists in this directory, add this note at the top:")
|
||||||
|
fmt.Fprintln(w)
|
||||||
|
fmt.Fprintf(w, "%s\n", cyan(" **Note**: This project uses [bd (beads)](https://github.com/steveyegge/beads)"))
|
||||||
|
fmt.Fprintf(w, "%s\n", cyan(" for issue tracking. Use `bd` commands instead of markdown TODOs."))
|
||||||
|
fmt.Fprintf(w, "%s\n", cyan(" See AGENTS.md for workflow details."))
|
||||||
|
fmt.Fprintln(w)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, "%s\n", bold("3. Remove bootstrap instruction"))
|
||||||
|
fmt.Fprintln(w, " If AGENTS.md or CLAUDE.md contains a line like:")
|
||||||
|
fmt.Fprintf(w, "%s\n", cyan(" \"BEFORE ANYTHING ELSE: run 'bd onboard' and follow the instructions\""))
|
||||||
|
fmt.Fprintln(w, " Delete that line after completing steps 1 and 2.")
|
||||||
|
fmt.Fprintln(w)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, "%s\n", bold("Important reminders:"))
|
||||||
|
fmt.Fprintln(w, " • Use bd for ALL task tracking - NO markdown TODO lists")
|
||||||
|
fmt.Fprintln(w, " • Always use --json flag for programmatic bd commands")
|
||||||
|
fmt.Fprintln(w, " • Link discovered work with discovered-from dependencies")
|
||||||
|
fmt.Fprintf(w, " • Check %s before asking \"what should I work on?\"\n", cyan("bd ready"))
|
||||||
|
fmt.Fprintln(w)
|
||||||
|
|
||||||
|
fmt.Fprintf(w, "%s\n\n", green("When done, tell your AI assistant: \"bd onboarding complete\""))
|
||||||
|
}
|
||||||
|
|
||||||
var onboardCmd = &cobra.Command{
|
var onboardCmd = &cobra.Command{
|
||||||
Use: "onboard",
|
Use: "onboard",
|
||||||
Short: "Display instructions for configuring AGENTS.md",
|
Short: "Display instructions for configuring AGENTS.md",
|
||||||
@@ -146,47 +191,7 @@ This command outputs instructions that AI agents should follow to integrate bd
|
|||||||
into the project's agent documentation. The agent will intelligently merge the
|
into the project's agent documentation. The agent will intelligently merge the
|
||||||
content into AGENTS.md and update CLAUDE.md if present.`,
|
content into AGENTS.md and update CLAUDE.md if present.`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
bold := color.New(color.Bold).SprintFunc()
|
renderOnboardInstructions(cmd.OutOrStdout())
|
||||||
cyan := color.New(color.FgCyan).SprintFunc()
|
|
||||||
yellow := color.New(color.FgYellow).SprintFunc()
|
|
||||||
green := color.New(color.FgGreen).SprintFunc()
|
|
||||||
|
|
||||||
fmt.Printf("\n%s\n\n", bold("bd Onboarding Instructions for AI Agent"))
|
|
||||||
|
|
||||||
fmt.Printf("%s\n\n", yellow("Please complete the following tasks:"))
|
|
||||||
|
|
||||||
fmt.Printf("%s\n", bold("1. Update AGENTS.md"))
|
|
||||||
fmt.Println(" Add the following content to AGENTS.md in an appropriate location.")
|
|
||||||
fmt.Println(" If AGENTS.md doesn't exist, create it with this content.")
|
|
||||||
fmt.Println(" Integrate it naturally into any existing structure.")
|
|
||||||
fmt.Println()
|
|
||||||
|
|
||||||
fmt.Printf("%s\n", cyan("--- BEGIN AGENTS.MD CONTENT ---"))
|
|
||||||
fmt.Println(agentsContent)
|
|
||||||
fmt.Printf("%s\n\n", cyan("--- END AGENTS.MD CONTENT ---"))
|
|
||||||
|
|
||||||
fmt.Printf("%s\n", bold("2. Update CLAUDE.md (if present)"))
|
|
||||||
fmt.Println(" If CLAUDE.md exists in this directory, add this note at the top:")
|
|
||||||
fmt.Println()
|
|
||||||
fmt.Printf("%s\n", cyan(" **Note**: This project uses [bd (beads)](https://github.com/steveyegge/beads)"))
|
|
||||||
fmt.Printf("%s\n", cyan(" for issue tracking. Use `bd` commands instead of markdown TODOs."))
|
|
||||||
fmt.Printf("%s\n", cyan(" See AGENTS.md for workflow details."))
|
|
||||||
fmt.Println()
|
|
||||||
|
|
||||||
fmt.Printf("%s\n", bold("3. Remove bootstrap instruction"))
|
|
||||||
fmt.Println(" If AGENTS.md or CLAUDE.md contains a line like:")
|
|
||||||
fmt.Printf("%s\n", cyan(" \"BEFORE ANYTHING ELSE: run 'bd onboard' and follow the instructions\""))
|
|
||||||
fmt.Println(" Delete that line after completing steps 1 and 2.")
|
|
||||||
fmt.Println()
|
|
||||||
|
|
||||||
fmt.Printf("%s\n", bold("Important reminders:"))
|
|
||||||
fmt.Println(" • Use bd for ALL task tracking - NO markdown TODO lists")
|
|
||||||
fmt.Println(" • Always use --json flag for programmatic bd commands")
|
|
||||||
fmt.Println(" • Link discovered work with discovered-from dependencies")
|
|
||||||
fmt.Printf(" • Check %s before asking \"what should I work on?\"\n", cyan("bd ready"))
|
|
||||||
fmt.Println()
|
|
||||||
|
|
||||||
fmt.Printf("%s\n\n", green("When done, tell your AI assistant: \"bd onboarding complete\""))
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,31 +2,14 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"os"
|
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestOnboardCommand(t *testing.T) {
|
func TestOnboardCommand(t *testing.T) {
|
||||||
// Save original stdout
|
|
||||||
oldStdout := os.Stdout
|
|
||||||
defer func() { os.Stdout = oldStdout }()
|
|
||||||
|
|
||||||
t.Run("onboard output contains key sections", func(t *testing.T) {
|
t.Run("onboard output contains key sections", func(t *testing.T) {
|
||||||
// Create a pipe to capture output
|
|
||||||
r, w, err := os.Pipe()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Failed to create pipe: %v", err)
|
|
||||||
}
|
|
||||||
os.Stdout = w
|
|
||||||
|
|
||||||
// Run onboard command
|
|
||||||
onboardCmd.Run(onboardCmd, []string{})
|
|
||||||
|
|
||||||
// Close writer and read output
|
|
||||||
w.Close()
|
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
buf.ReadFrom(r)
|
renderOnboardInstructions(&buf)
|
||||||
output := buf.String()
|
output := buf.String()
|
||||||
|
|
||||||
// Verify output contains expected sections
|
// Verify output contains expected sections
|
||||||
|
|||||||
Reference in New Issue
Block a user