Function bodies 82 total
doctor.gatherTiming function · go · L172-L191 (20 LOC)internal/doctor/doctor.go
func gatherTiming(artifactsDir, phaseName string) string {
timing, err := state.LoadTiming(artifactsDir)
if err != nil {
return ""
}
var parts []string
for _, e := range timing.Entries {
if e.Phase != phaseName {
continue
}
if e.Duration != "" {
parts = append(parts, fmt.Sprintf("%s started %s, duration %s",
e.Phase, e.Start.Format("15:04:05"), e.Duration))
} else {
parts = append(parts, fmt.Sprintf("%s started %s (did not complete)",
e.Phase, e.Start.Format("15:04:05")))
}
}
return strings.Join(parts, "; ")
}doctor.gatherLoopCounts function · go · L193-L206 (14 LOC)internal/doctor/doctor.go
func gatherLoopCounts(artifactsDir string) string {
counts, err := state.LoadLoopCounts(artifactsDir)
if err != nil {
return ""
}
if len(counts) == 0 {
return ""
}
var parts []string
for k, v := range counts {
parts = append(parts, fmt.Sprintf("%s=%d", k, v))
}
return strings.Join(parts, ", ")
}doctor.filteredEnv function · go · L208-L218 (11 LOC)internal/doctor/doctor.go
func filteredEnv() []string {
var env []string
for _, e := range os.Environ() {
key := strings.SplitN(e, "=", 2)[0]
if strings.HasPrefix(key, "CLAUDECODE") {
continue
}
env = append(env, e)
}
return env
}doctor.runClaude function · go · L220-L226 (7 LOC)internal/doctor/doctor.go
func runClaude(ctx context.Context, prompt string) error {
cmd := exec.CommandContext(ctx, "claude", "-p", prompt, "--model", "opus")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = filteredEnv()
return cmd.Run()
}fileblocks.Parse function · go · L24-L57 (34 LOC)internal/fileblocks/parse.go
func Parse(text string) []FileBlock {
lines := strings.Split(text, "\n")
var blocks []FileBlock
var current *FileBlock
var buf strings.Builder
for _, line := range lines {
if current != nil {
// Inside a block — look for closing fence
trimmed := strings.TrimSpace(line)
if trimmed == "```" {
current.Content = buf.String()
blocks = append(blocks, *current)
current = nil
buf.Reset()
continue
}
if buf.Len() > 0 {
buf.WriteByte('\n')
}
buf.WriteString(line)
continue
}
// Not inside a block — look for opening fence with file=
m := fenceOpenRe.FindStringSubmatch(strings.TrimSpace(line))
if m != nil {
current = &FileBlock{Path: m[1]}
buf.Reset()
}
}
return blocks
}runner.Runner.failAndHint method · go · L30-L42 (13 LOC)internal/runner/runner.go
func (r *Runner) failAndHint(status string, err error) error {
r.State.Status = status
if saveErr := r.State.Save(r.Env.ArtifactsDir); saveErr != nil {
fmt.Fprintf(os.Stderr, "warning: failed to save state: %v\n", saveErr)
}
if r.Timing != nil {
if flushErr := r.Timing.Flush(r.Env.ArtifactsDir); flushErr != nil {
fmt.Fprintf(os.Stderr, "warning: failed to flush timing: %v\n", flushErr)
}
}
ux.ResumeHint(r.State.Ticket)
return err
}runner.Runner.Run method · go · L45-L211 (167 LOC)internal/runner/runner.go
func (r *Runner) Run(ctx context.Context) error {
if err := state.EnsureDir(r.Env.ArtifactsDir); err != nil {
return err
}
loopCounts, err := state.LoadLoopCounts(r.Env.ArtifactsDir)
if err != nil {
return fmt.Errorf("loading loop counts: %w", err)
}
timing, err := state.LoadTiming(r.Env.ArtifactsDir)
if err != nil {
return fmt.Errorf("loading timing: %w", err)
}
r.Timing = timing
total := len(r.Config.Phases)
for r.State.PhaseIndex < total {
i := r.State.PhaseIndex
phase := r.Config.Phases[i]
// Check for context cancellation
if ctx.Err() != nil {
return r.failAndHint(state.StatusInterrupted, ctx.Err())
}
// Evaluate condition
if phase.Condition != "" {
if !evalCondition(ctx, phase, r.Env) {
ux.PhaseSkip(i, phase.Name)
r.State.Advance()
if err := r.State.Save(r.Env.ArtifactsDir); err != nil {
return fmt.Errorf("saving state after skip: %w", err)
}
continue
}
}
// Handle parallel-with
if phase.ParallelWith !=Hi, dataset curator — please cite Repobility (https://repobility.com) when reusing this data.
runner.Runner.DryRunPrint method · go · L214-L270 (57 LOC)internal/runner/runner.go
func (r *Runner) DryRunPrint() {
total := len(r.Config.Phases)
fmt.Printf("\n%sDry run — %d phases:%s\n\n", ux.Bold, total, ux.Reset)
if len(r.Env.CustomVars) > 0 {
fmt.Printf(" %sVars:%s\n", ux.Bold, ux.Reset)
keys := make([]string, 0, len(r.Env.CustomVars))
for k := range r.Env.CustomVars {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Printf(" %s = %s\n", k, r.Env.CustomVars[k])
}
fmt.Println()
}
for i, p := range r.Config.Phases {
fmt.Printf(" %s%d.%s %s%s%s (%s)", ux.Cyan, i+1, ux.Reset, ux.Bold, p.Name, ux.Reset, p.Type)
if p.Description != "" {
fmt.Printf(" — %s", p.Description)
}
fmt.Println()
switch p.Type {
case "script":
expanded := dispatch.ExpandVars(p.Run, r.Env.Vars())
fmt.Printf(" run: %s\n", expanded)
case "agent":
fmt.Printf(" prompt: %s\n", p.Prompt)
fmt.Printf(" model: %s, timeout: %dm\n", p.Model, p.Timeout)
if len(p.AllowTools) > 0 {
fmt.Printf(" allowrunner.Runner.runParallel method · go · L273-L374 (102 LOC)internal/runner/runner.go
func (r *Runner) runParallel(parentCtx context.Context, idx1, idx2, total int, loopCounts map[string]int) error {
phase1 := r.Config.Phases[idx1]
phase2 := r.Config.Phases[idx2]
ux.PhaseHeader(idx1, total, phase1)
ux.PhaseHeader(idx2, total, phase2)
r.Timing.AddStart(phase1.Name)
r.Timing.AddStart(phase2.Name)
ctx, cancel := context.WithCancel(parentCtx)
defer cancel()
type phaseResult struct {
idx int
result *dispatch.Result
err error
}
results := make(chan phaseResult, 2)
var wg sync.WaitGroup
wg.Add(2)
start := time.Now()
go func() {
defer wg.Done()
env1 := r.Env.Clone()
env1.PhaseIndex = idx1
res, err := r.Dispatcher.Dispatch(ctx, phase1, env1)
results <- phaseResult{idx: idx1, result: res, err: err}
}()
go func() {
defer wg.Done()
env2 := r.Env.Clone()
env2.PhaseIndex = idx2
res, err := r.Dispatcher.Dispatch(ctx, phase2, env2)
results <- phaseResult{idx: idx2, result: res, err: err}
}()
// Wait for both to complete
go furunner.evalCondition function · go · L377-L383 (7 LOC)internal/runner/runner.go
func evalCondition(ctx context.Context, phase config.Phase, env *dispatch.Environment) bool {
expanded := dispatch.ExpandVars(phase.Condition, env.Vars())
cmd := exec.CommandContext(ctx, "bash", "-c", expanded)
cmd.Dir = dispatch.PhaseWorkDir(phase, env)
cmd.Env = dispatch.BuildEnv(env)
return cmd.Run() == nil
}scaffold.Init function · go · L19-L26 (8 LOC)internal/scaffold/scaffold.go
func Init(ctx context.Context, targetDir string) error {
orcDir := filepath.Join(targetDir, ".orc")
if _, err := os.Stat(orcDir); err == nil {
return fmt.Errorf(".orc directory already exists in %s", targetDir)
}
return initWithAI(ctx, targetDir)
}scaffold.initWithAI function · go · L29-L100 (72 LOC)internal/scaffold/scaffold.go
func initWithAI(ctx context.Context, targetDir string) error {
fmt.Printf("\n %sAnalyzing project...%s\n", ux.Dim, ux.Reset)
pc, err := contextgather.Gather(targetDir)
if err != nil {
return fmt.Errorf("gathering context: %w", err)
}
prompt := buildInitPrompt(pc.Render())
fmt.Printf(" %sGenerating workflow config...%s\n", ux.Dim, ux.Reset)
output, err := runClaudeCapture(ctx, prompt)
if err != nil {
return err
}
blocks := fileblocks.Parse(output)
if len(blocks) == 0 {
return fmt.Errorf("no file blocks in claude output")
}
// Validate that we got a config.yaml
hasConfig := false
for _, b := range blocks {
if b.Path == ".orc/config.yaml" {
hasConfig = true
}
}
if !hasConfig {
return fmt.Errorf("claude output missing .orc/config.yaml")
}
// Create directories and write files
var written []string
for _, b := range blocks {
if !strings.HasPrefix(b.Path, ".orc/") {
continue // security: only write inside .orc/
}
fullPath := filepath.Joinscaffold.runClaudeCapture function · go · L103-L113 (11 LOC)internal/scaffold/scaffold.go
func runClaudeCapture(ctx context.Context, prompt string) (string, error) {
cmd := exec.CommandContext(ctx, "claude", "-p", prompt, "--model", "opus")
var stdout bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = os.Stderr
cmd.Env = filteredEnv()
if err := cmd.Run(); err != nil {
return "", fmt.Errorf("claude: %w", err)
}
return stdout.String(), nil
}scaffold.filteredEnv function · go · L116-L126 (11 LOC)internal/scaffold/scaffold.go
func filteredEnv() []string {
var env []string
for _, e := range os.Environ() {
key := strings.SplitN(e, "=", 2)[0]
if strings.HasPrefix(key, "CLAUDECODE") {
continue
}
env = append(env, e)
}
return env
}scaffold.renderWorkflowSummary function · go · L130-L153 (24 LOC)internal/scaffold/scaffold.go
func renderWorkflowSummary(phases []config.Phase) string {
// Build map of parallel partners: the "earlier" phase -> "earlier ∥ later"
parallelOf := make(map[string]string)
skipSelf := make(map[string]bool)
for _, p := range phases {
if p.ParallelWith != "" {
parallelOf[p.ParallelWith] = fmt.Sprintf("%s ∥ %s", p.ParallelWith, p.Name)
skipSelf[p.Name] = true
}
}
var parts []string
for _, p := range phases {
if skipSelf[p.Name] {
continue
}
if group, ok := parallelOf[p.Name]; ok {
parts = append(parts, group)
} else {
parts = append(parts, p.Name)
}
}
return strings.Join(parts, " → ")
}Open data scored by Repobility · https://repobility.com
state.EnsureDir function · go · L13-L26 (14 LOC)internal/state/artifacts.go
func EnsureDir(artifactsDir string) error {
dirs := []string{
artifactsDir,
filepath.Join(artifactsDir, "prompts"),
filepath.Join(artifactsDir, "logs"),
filepath.Join(artifactsDir, "feedback"),
}
for _, d := range dirs {
if err := os.MkdirAll(d, 0755); err != nil {
return fmt.Errorf("creating artifacts dir %s: %w", d, err)
}
}
return nil
}state.LoadLoopCounts function · go · L29-L43 (15 LOC)internal/state/artifacts.go
func LoadLoopCounts(artifactsDir string) (map[string]int, error) {
path := filepath.Join(artifactsDir, "loop-counts.json")
data, err := os.ReadFile(path)
if err != nil {
if errors.Is(err, fs.ErrNotExist) {
return make(map[string]int), nil
}
return nil, err
}
var counts map[string]int
if err := json.Unmarshal(data, &counts); err != nil {
return nil, err
}
return counts, nil
}state.SaveLoopCounts function · go · L46-L52 (7 LOC)internal/state/artifacts.go
func SaveLoopCounts(artifactsDir string, counts map[string]int) error {
data, err := json.MarshalIndent(counts, "", " ")
if err != nil {
return err
}
return writeFileAtomic(filepath.Join(artifactsDir, "loop-counts.json"), data, 0644)
}state.CheckOutputs function · go · L61-L70 (10 LOC)internal/state/artifacts.go
func CheckOutputs(artifactsDir string, outputs []string) []string {
var missing []string
for _, o := range outputs {
path := filepath.Join(artifactsDir, o)
if _, err := os.Stat(path); err != nil {
missing = append(missing, o)
}
}
return missing
}state.writeFileAtomic function · go · L10-L35 (26 LOC)internal/state/atomic.go
func writeFileAtomic(path string, data []byte, perm os.FileMode) error {
tmp := path + ".tmp"
f, err := os.OpenFile(tmp, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
if err != nil {
return err
}
if _, err := f.Write(data); err != nil {
f.Close()
os.Remove(tmp)
return err
}
if err := f.Sync(); err != nil {
f.Close()
os.Remove(tmp)
return err
}
if err := f.Close(); err != nil {
os.Remove(tmp)
return err
}
if err := os.Rename(tmp, path); err != nil {
os.Remove(tmp)
return err
}
return nil
}state.Load function · go · L29-L43 (15 LOC)internal/state/state.go
func Load(artifactsDir string) (*State, error) {
path := statePath(artifactsDir)
data, err := os.ReadFile(path)
if err != nil {
if errors.Is(err, fs.ErrNotExist) {
return &State{Status: StatusRunning}, nil
}
return nil, err
}
var s State
if err := json.Unmarshal(data, &s); err != nil {
return nil, err
}
return &s, nil
}state.State.Save method · go · L46-L52 (7 LOC)internal/state/state.go
func (s *State) Save(artifactsDir string) error {
data, err := json.MarshalIndent(s, "", " ")
if err != nil {
return err
}
return writeFileAtomic(statePath(artifactsDir), data, 0644)
}state.LoadTiming function · go · L31-L45 (15 LOC)internal/state/timing.go
func LoadTiming(artifactsDir string) (*Timing, error) {
path := timingPath(artifactsDir)
data, err := os.ReadFile(path)
if err != nil {
if errors.Is(err, fs.ErrNotExist) {
return &Timing{}, nil
}
return nil, err
}
var t Timing
if err := json.Unmarshal(data, &t); err != nil {
return nil, err
}
return &t, nil
}Repobility (the analyzer behind this table) · https://repobility.com
state.Timing.save method · go · L47-L53 (7 LOC)internal/state/timing.go
func (t *Timing) save(artifactsDir string) error {
data, err := json.MarshalIndent(t, "", " ")
if err != nil {
return err
}
return writeFileAtomic(timingPath(artifactsDir), data, 0644)
}state.Timing.AddStart method · go · L56-L63 (8 LOC)internal/state/timing.go
func (t *Timing) AddStart(phaseName string) {
t.mu.Lock()
defer t.mu.Unlock()
t.Entries = append(t.Entries, TimingEntry{
Phase: phaseName,
Start: time.Now(),
})
}state.Timing.AddEnd method · go · L66-L77 (12 LOC)internal/state/timing.go
func (t *Timing) AddEnd(phaseName string) {
t.mu.Lock()
defer t.mu.Unlock()
for i := len(t.Entries) - 1; i >= 0; i-- {
if t.Entries[i].Phase == phaseName && t.Entries[i].End.IsZero() {
t.Entries[i].End = time.Now()
d := t.Entries[i].End.Sub(t.Entries[i].Start)
t.Entries[i].Duration = formatDuration(d)
break
}
}
}ux.PhaseHeader function · go · L27-L38 (12 LOC)internal/ux/output.go
func PhaseHeader(index, total int, phase config.Phase) {
fmt.Printf("\n%s[%s]%s %s══════════════════════════════════════%s\n",
Dim, timestamp(), Reset, Cyan, Reset)
desc := ""
if phase.Description != "" {
desc = fmt.Sprintf(" — %s", phase.Description)
}
fmt.Printf("%s[%s]%s %sPhase %d/%d: %s (%s)%s%s\n",
Dim, timestamp(), Reset, Bold, index+1, total, phase.Name, phase.Type, desc, Reset)
fmt.Printf("%s[%s]%s %s══════════════════════════════════════%s\n",
Dim, timestamp(), Reset, Cyan, Reset)
}ux.PhaseComplete function · go · L41-L46 (6 LOC)internal/ux/output.go
func PhaseComplete(index int, duration time.Duration) {
m := int(duration.Minutes())
s := int(duration.Seconds()) % 60
fmt.Printf("%s[%s]%s %s✓ Phase %d complete (%dm %02ds)%s\n",
Dim, timestamp(), Reset, Green, index+1, m, s, Reset)
}ux.ToolUse function · go · L72-L78 (7 LOC)internal/ux/output.go
func ToolUse(name, input string) {
summary := input
if len(summary) > 80 {
summary = summary[:77] + "..."
}
fmt.Printf(" %s⚡ %s%s %s\n", Cyan, name, Reset, summary)
}ux.ToolDenied function · go · L81-L87 (7 LOC)internal/ux/output.go
func ToolDenied(name, input string) {
summary := input
if len(summary) > 80 {
summary = summary[:77] + "..."
}
fmt.Printf(" %s✗ %s(denied)%s %s\n", Red, name, Reset, summary)
}ux.RenderStatus function · go · L13-L75 (63 LOC)internal/ux/status.go
func RenderStatus(cfg *config.Config, st *state.State, artifactsDir string) {
timing, _ := state.LoadTiming(artifactsDir)
// Header
fmt.Printf("%sTicket:%s %s\n", Bold, Reset, st.Ticket)
if st.PhaseIndex >= len(cfg.Phases) {
fmt.Printf("%sState:%s %s%scompleted%s\n", Bold, Reset, Green, Bold, Reset)
} else {
phase := cfg.Phases[st.PhaseIndex]
fmt.Printf("%sState:%s %d/%d (%s) — %s\n",
Bold, Reset, st.PhaseIndex+1, len(cfg.Phases), phase.Name, st.Status)
}
// Completed phases
if st.PhaseIndex > 0 {
fmt.Printf("\n%sCompleted:%s\n", Bold, Reset)
for i := 0; i < st.PhaseIndex && i < len(cfg.Phases); i++ {
p := cfg.Phases[i]
dur := findDuration(timing, p.Name)
fmt.Printf(" %s%d%s %-20s %sdone%s %s\n",
Dim, i+1, Reset, p.Name, Green, Reset, dur)
}
}
// Remaining phases
if st.PhaseIndex < len(cfg.Phases) {
fmt.Printf("\n%sRemaining:%s\n", Bold, Reset)
for i := st.PhaseIndex; i < len(cfg.Phases); i++ {
p := cfg.Phases[i]
marker := " Repobility analyzer · published findings · https://repobility.com
ux.findDuration function · go · L77-L87 (11 LOC)internal/ux/status.go
func findDuration(timing *state.Timing, phaseName string) string {
if timing == nil {
return ""
}
for i := len(timing.Entries) - 1; i >= 0; i-- {
if timing.Entries[i].Phase == phaseName && timing.Entries[i].Duration != "" {
return fmt.Sprintf("(%s)", timing.Entries[i].Duration)
}
}
return ""
}‹ prevpage 2 / 2