Skip to content
4 changes: 2 additions & 2 deletions cmd/entire/cli/checkpoint/committed.go
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ func (s *GitStore) writeSessionToSubdirectory(ctx context.Context, opts WriteCom

// Write prompts
if len(opts.Prompts) > 0 {
promptContent := redact.String(strings.Join(opts.Prompts, "\n\n---\n\n"))
promptContent := redact.String(JoinPrompts(opts.Prompts))
blobHash, err := CreateBlobFromContent(s.repo, []byte(promptContent))
if err != nil {
return filePaths, err
Expand Down Expand Up @@ -1281,7 +1281,7 @@ func (s *GitStore) UpdateCommitted(ctx context.Context, opts UpdateCommittedOpti

// Replace prompts (apply redaction as safety net)
if len(opts.Prompts) > 0 {
promptContent := redact.String(strings.Join(opts.Prompts, "\n\n---\n\n"))
promptContent := redact.String(JoinPrompts(opts.Prompts))
blobHash, err := CreateBlobFromContent(s.repo, []byte(promptContent))
if err != nil {
return fmt.Errorf("failed to create prompt blob: %w", err)
Expand Down
25 changes: 25 additions & 0 deletions cmd/entire/cli/checkpoint/prompts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package checkpoint

import "strings"

// PromptSeparator is the canonical separator used in prompt.txt when multiple
// prompts are stored in a single file.
const PromptSeparator = "\n\n---\n\n"

// JoinPrompts serializes prompts to prompt.txt format.
func JoinPrompts(prompts []string) string {
return strings.Join(prompts, PromptSeparator)
}

// SplitPromptContent deserializes prompt.txt content into individual prompts.
func SplitPromptContent(content string) []string {
if content == "" {
return nil
}

prompts := strings.Split(content, PromptSeparator)
for len(prompts) > 0 && prompts[len(prompts)-1] == "" {
prompts = prompts[:len(prompts)-1]
}
return prompts
}
29 changes: 29 additions & 0 deletions cmd/entire/cli/checkpoint/prompts_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package checkpoint

import (
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestJoinAndSplitPrompts_RoundTrip(t *testing.T) {
t.Parallel()

original := []string{
"first line\nwith newline",
"second prompt",
}

joined := JoinPrompts(original)
split := SplitPromptContent(joined)

require.Len(t, split, 2)
assert.Equal(t, original, split)
}

func TestSplitPromptContent_EmptyContent(t *testing.T) {
t.Parallel()

assert.Nil(t, SplitPromptContent(""))
}
4 changes: 2 additions & 2 deletions cmd/entire/cli/checkpoint/v2_committed.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ func (s *V2GitStore) updateCommittedMain(ctx context.Context, opts UpdateCommitt
sessionPath := fmt.Sprintf("%s%d/", basePath, sessionIndex)

if len(opts.Prompts) > 0 {
promptContent := redact.String(strings.Join(opts.Prompts, "\n\n---\n\n"))
promptContent := redact.String(JoinPrompts(opts.Prompts))
blobHash, err := CreateBlobFromContent(s.repo, []byte(promptContent))
if err != nil {
return 0, fmt.Errorf("failed to create prompt blob: %w", err)
Expand Down Expand Up @@ -334,7 +334,7 @@ func (s *V2GitStore) writeMainSessionToSubdirectory(opts WriteCommittedOptions,

// Write prompts
if len(opts.Prompts) > 0 {
promptContent := redact.String(strings.Join(opts.Prompts, "\n\n---\n\n"))
promptContent := redact.String(JoinPrompts(opts.Prompts))
blobHash, err := CreateBlobFromContent(s.repo, []byte(promptContent))
if err != nil {
return filePaths, err
Expand Down
Loading
Loading