agent: move "sketch-base" into git
The agent's notion of "initial commit" is kind of special, in that it
is used as the "base" for a bunch of git operations. It's hard for
the user to change (we only provide a workflow via restart), yet
sometimes you want to do just that.
So, instead we put it as data inside of it, named as a tag sketch-base.
It's abusing tags, but branches are no better.
diff --git a/claudetool/codereview/differential.go b/claudetool/codereview/differential.go
index 37728d4..f12b4f0 100644
--- a/claudetool/codereview/differential.go
+++ b/claudetool/codereview/differential.go
@@ -64,7 +64,7 @@
// This should help avoid the model getting blocked by a broken code review tool.
r.reviewed = append(r.reviewed, currentCommit)
- changedFiles, err := r.changedFiles(ctx, r.initialCommit, currentCommit)
+ changedFiles, err := r.changedFiles(ctx, r.sketchBaseRef, currentCommit)
if err != nil {
slog.DebugContext(ctx, "CodeReviewer.Run: failed to get changed files", "err", err)
return nil, err
@@ -154,7 +154,7 @@
if err != nil {
return err
}
- worktreeCmd := exec.CommandContext(ctx, "git", "worktree", "add", "--detach", tmpDir, r.initialCommit)
+ worktreeCmd := exec.CommandContext(ctx, "git", "worktree", "add", "--detach", tmpDir, r.sketchBaseRef)
worktreeCmd.Dir = r.repoRoot
out, err := worktreeCmd.CombinedOutput()
if err != nil {
@@ -274,7 +274,7 @@
}
// Check if the file exists in the initial commit
- checkCmd := exec.CommandContext(ctx, "git", "cat-file", "-e", fmt.Sprintf("%s:%s", r.initialCommit, relFile))
+ checkCmd := exec.CommandContext(ctx, "git", "cat-file", "-e", fmt.Sprintf("%s:%s", r.sketchBaseRef, relFile))
checkCmd.Dir = r.repoRoot
if err := checkCmd.Run(); err == nil {
// File exists in initial commit
@@ -491,21 +491,21 @@
}
func (r *CodeReviewer) IsInitialCommit(commit string) bool {
- return commit == r.initialCommit
+ return commit == r.sketchBaseRef
}
-// requireHEADDescendantOfInitialCommit returns an error if HEAD is not a descendant of r.initialCommit.
+// requireHEADDescendantOfSketchBaseRef returns an error if HEAD is not a descendant of r.initialCommit.
// This serves two purposes:
// - ensures we're not still on the initial commit
// - ensures we're not on a separate branch or upstream somewhere, which would be confusing
-func (r *CodeReviewer) requireHEADDescendantOfInitialCommit(ctx context.Context) error {
+func (r *CodeReviewer) requireHEADDescendantOfSketchBaseRef(ctx context.Context) error {
head, err := r.CurrentCommit(ctx)
if err != nil {
return err
}
// Note: Git's merge-base --is-ancestor checks strict ancestry (i.e., <), so a commit is NOT an ancestor of itself.
- cmd := exec.CommandContext(ctx, "git", "merge-base", "--is-ancestor", r.initialCommit, head)
+ cmd := exec.CommandContext(ctx, "git", "merge-base", "--is-ancestor", r.sketchBaseRef, head)
cmd.Dir = r.repoRoot
err = cmd.Run()
if err != nil {
@@ -890,7 +890,7 @@
}
buf := new(strings.Builder)
- fmt.Fprintf(buf, "Test regressions detected between initial commit (%s) and HEAD:\n\n", r.initialCommit)
+ fmt.Fprintf(buf, "Test regressions detected between initial commit (%s) and HEAD:\n\n", r.sketchBaseRef)
for i, reg := range regressions {
fmt.Fprintf(buf, "%d: %v: ", i+1, reg.Source())