Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
c0633c9
Fix attribution inflation from intermediate commits
peyton-alt Mar 31, 2026
fab7ee6
Fix attribution inflation from pre-session worktree dirt
peyton-alt Mar 31, 2026
51fe59e
Add PromptAttributionsJSON, UpdateCheckpointSummary, and CombinedAttr…
peyton-alt Mar 31, 2026
654be48
Address PR review: consistent parentTree line counting, deduplicate p…
peyton-alt Apr 1, 2026
7f17a37
Merge branch 'main' into fix/attribution-intermediate-commit-inflation
peyton-alt Apr 1, 2026
48ad357
fix: accurate per-session attribution in multi-session checkpoints
peyton-alt Apr 3, 2026
f423519
Add migrate v2 command
computermode Apr 4, 2026
8df056f
don't show multiple spaces for codex single line start message rendering
Soph Apr 5, 2026
eec5268
handle optional message concats
Soph Apr 5, 2026
8494d93
Address review; add prompt helpers
computermode Apr 6, 2026
f2a9361
Update log output for migration
computermode Apr 6, 2026
8f9b331
Update the logs
computermode Apr 6, 2026
c30039b
Merge branch 'main' into fix/attribution-intermediate-commit-inflation
peyton-alt Apr 7, 2026
5ee884b
chore: remove accidentally committed build cache
peyton-alt Apr 7, 2026
d891ac5
fix: restore .superpowers/ in .gitignore
peyton-alt Apr 7, 2026
262949c
chore: remove local-only attribution debug tests
peyton-alt Apr 7, 2026
5430c3c
Merge branch 'main' into fix/attribution-intermediate-commit-inflation
peyton-alt Apr 7, 2026
bb4afc9
test: add coverage for multi-session cross-exclusion and metadata fil…
peyton-alt Apr 7, 2026
23737d7
fix: replace naive-sum combined attribution with holistic calculation
peyton-alt Apr 7, 2026
b9fae24
Merge pull request #812 from entireio/fix/attribution-intermediate-co…
gtrrz-victor Apr 7, 2026
9a070c1
Merge pull request #857 from entireio/soph/codex-warning-fix
Soph Apr 7, 2026
e72a29e
linter
computermode Apr 7, 2026
1e97bad
Merge branch 'main' of https://github.com/entireio/cli into add-migra…
computermode Apr 7, 2026
6f282ba
Switch from if to switch statement
computermode Apr 7, 2026
f0ebe4d
Remove migrate command discoverability for now
computermode Apr 7, 2026
d7e367f
Move 'origin' to const, add helpers
computermode Apr 7, 2026
67bd8f7
Fix task handling
computermode Apr 7, 2026
2663640
linter
computermode Apr 7, 2026
cb31d50
Check for any missing components when rerunning a backfill
computermode Apr 7, 2026
93edd79
Linter
computermode Apr 7, 2026
a8806e1
Merge branch 'main' into add-migrate-v2-command
computermode Apr 8, 2026
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
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