Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 2 additions & 7 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,12 +166,7 @@ func main() {
fmt.Println("---")
}

// Output all rules
for _, rule := range result.Rules {
fmt.Println(rule.Content)
}

// Output task
fmt.Println(result.Task.Content)
// Output the combined prompt (rules + task)
fmt.Println(result.Prompt)
}
}
9 changes: 9 additions & 0 deletions pkg/codingcontext/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,21 @@ func (cc *Context) Run(ctx context.Context, taskName string) (*Result, error) {
// Estimate tokens for task
cc.logger.Info("Total estimated tokens", "tokens", cc.totalTokens)

// Build the combined prompt from all rules and task content
var promptBuilder strings.Builder
for _, rule := range cc.rules {
promptBuilder.WriteString(rule.Content)
promptBuilder.WriteString("\n")
}
promptBuilder.WriteString(cc.task.Content)

// Build and return the result
result := &Result{
Rules: cc.rules,
Task: cc.task,
Tokens: cc.totalTokens,
Agent: cc.agent,
Prompt: promptBuilder.String(),
}

return result, nil
Expand Down
1 change: 1 addition & 0 deletions pkg/codingcontext/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ type Result struct {
Task markdown.Markdown[markdown.TaskFrontMatter] // Task file with frontmatter and content
Tokens int // Total token count
Agent Agent // The agent used (from task or -a flag)
Prompt string // Combined prompt: all rules and task content
}

// MCPServers returns all MCP server configurations from rules.
Expand Down
61 changes: 61 additions & 0 deletions pkg/codingcontext/result_test.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,73 @@
package codingcontext

import (
"context"
"log/slog"
"os"
"testing"

"github.com/kitproj/coding-context-cli/pkg/codingcontext/markdown"
"github.com/kitproj/coding-context-cli/pkg/codingcontext/mcp"
)

func TestResult_Prompt(t *testing.T) {
tests := []struct {
name string
setup func(t *testing.T, dir string)
taskName string
want string
}{
{
name: "task only without rules",
setup: func(t *testing.T, dir string) {
createTask(t, dir, "test-task", "task_name: test-task", "Task content\n")
},
taskName: "test-task",
want: "Task content\n",
},
{
name: "single rule and task",
setup: func(t *testing.T, dir string) {
createTask(t, dir, "test-task", "task_name: test-task", "Task content\n")
createRule(t, dir, ".agents/rules/rule1.md", "", "Rule 1 content\n")
},
taskName: "test-task",
want: "Rule 1 content\n\nTask content\n",
},
{
name: "multiple rules and task",
setup: func(t *testing.T, dir string) {
createTask(t, dir, "test-task", "task_name: test-task", "Task content\n")
createRule(t, dir, ".agents/rules/rule1.md", "", "Rule 1 content\n")
createRule(t, dir, ".agents/rules/rule2.md", "", "Rule 2 content\n")
},
taskName: "test-task",
want: "Rule 1 content\n\nRule 2 content\n\nTask content\n",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tmpDir := t.TempDir()
tt.setup(t, tmpDir)

ctx := New(
WithSearchPaths("file://"+tmpDir),
WithLogger(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))),
)

result, err := ctx.Run(context.Background(), tt.taskName)
if err != nil {
t.Fatalf("Run() error = %v", err)
}

if result.Prompt != tt.want {
t.Errorf("Result.Prompt = %q, want %q", result.Prompt, tt.want)
}
})
}
}

func TestResult_MCPServers(t *testing.T) {
tests := []struct {
name string
Expand Down