Replace ALL exec.Command calls with proc.go helpers backed by go-process: - runCmd/runCmdEnv/runCmdOK — general command execution - gitCmd/gitCmdOK/gitOutput — git-specific helpers - ensureProcess() — lazy default service init Refactored files (0 source files import os/exec now): - verify.go: runGoTests, runPHPTests, runNodeTests, rebaseBranch - dispatch.go: runQA (3 exec.Command chains → runCmdOK) - prep.go: getGitLog, prepWorkspace clone/branch - pr.go: createPR branch detection + push - auto_pr.go: commit counting + push - mirror.go: all git ops + gh CLI calls - review_queue.go: pushAndMerge, buildReviewCommand (returns string+args now) - paths.go: DefaultBranch Coverage: 77.2% → 78.4% (+1.2pp from testable process paths) 802 tests Co-Authored-By: Virgil <virgil@lethean.io>
110 lines
2.9 KiB
Go
110 lines
2.9 KiB
Go
// SPDX-License-Identifier: EUPL-1.2
|
|
|
|
package agentic
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
"unsafe"
|
|
|
|
core "dappco.re/go/core"
|
|
)
|
|
|
|
// fs provides unrestricted filesystem access (root "/" = no sandbox).
|
|
//
|
|
// r := fs.Read("/etc/hostname")
|
|
// if r.OK { core.Print(nil, "%s", r.Value.(string)) }
|
|
var fs = newFs("/")
|
|
|
|
// newFs creates a core.Fs with the given root directory.
|
|
// Root "/" means unrestricted access (same as coreio.Local).
|
|
func newFs(root string) *core.Fs {
|
|
type fsRoot struct{ root string }
|
|
f := &core.Fs{}
|
|
(*fsRoot)(unsafe.Pointer(f)).root = root
|
|
return f
|
|
}
|
|
|
|
// LocalFs returns an unrestricted filesystem instance for use by other packages.
|
|
//
|
|
// r := agentic.LocalFs().Read("/tmp/agent-status.json")
|
|
// if r.OK { core.Print(nil, "%s", r.Value.(string)) }
|
|
func LocalFs() *core.Fs { return fs }
|
|
|
|
// WorkspaceRoot returns the root directory for agent workspaces.
|
|
// Checks CORE_WORKSPACE env var first, falls back to ~/Code/.core/workspace.
|
|
//
|
|
// wsDir := core.JoinPath(agentic.WorkspaceRoot(), "go-io-1774149757")
|
|
func WorkspaceRoot() string {
|
|
return core.JoinPath(CoreRoot(), "workspace")
|
|
}
|
|
|
|
// CoreRoot returns the root directory for core ecosystem files.
|
|
// Checks CORE_WORKSPACE env var first, falls back to ~/Code/.core.
|
|
//
|
|
// root := agentic.CoreRoot()
|
|
func CoreRoot() string {
|
|
if root := core.Env("CORE_WORKSPACE"); root != "" {
|
|
return root
|
|
}
|
|
return core.JoinPath(core.Env("DIR_HOME"), "Code", ".core")
|
|
}
|
|
|
|
// PlansRoot returns the root directory for agent plans.
|
|
//
|
|
// plansDir := agentic.PlansRoot()
|
|
func PlansRoot() string {
|
|
return core.JoinPath(CoreRoot(), "plans")
|
|
}
|
|
|
|
// AgentName returns the name of this agent based on hostname.
|
|
// Checks AGENT_NAME env var first.
|
|
//
|
|
// name := agentic.AgentName() // "cladius" on Snider's Mac, "charon" elsewhere
|
|
func AgentName() string {
|
|
if name := core.Env("AGENT_NAME"); name != "" {
|
|
return name
|
|
}
|
|
h := core.Lower(core.Env("HOSTNAME"))
|
|
if core.Contains(h, "snider") || core.Contains(h, "studio") || core.Contains(h, "mac") {
|
|
return "cladius"
|
|
}
|
|
return "charon"
|
|
}
|
|
|
|
// DefaultBranch detects the default branch of a repo (main, master, etc.).
|
|
//
|
|
// base := agentic.DefaultBranch("./src")
|
|
func DefaultBranch(repoDir string) string {
|
|
ctx := context.Background()
|
|
if ref := gitOutput(ctx, repoDir, "symbolic-ref", "refs/remotes/origin/HEAD", "--short"); ref != "" {
|
|
if core.HasPrefix(ref, "origin/") {
|
|
return core.TrimPrefix(ref, "origin/")
|
|
}
|
|
return ref
|
|
}
|
|
for _, branch := range []string{"main", "master"} {
|
|
if gitCmdOK(ctx, repoDir, "rev-parse", "--verify", branch) {
|
|
return branch
|
|
}
|
|
}
|
|
return "main"
|
|
}
|
|
|
|
// GitHubOrg returns the GitHub org for mirror operations.
|
|
//
|
|
// org := agentic.GitHubOrg() // "dAppCore"
|
|
func GitHubOrg() string {
|
|
if org := core.Env("GITHUB_ORG"); org != "" {
|
|
return org
|
|
}
|
|
return "dAppCore"
|
|
}
|
|
|
|
func parseInt(value string) int {
|
|
n, err := strconv.Atoi(core.Trim(value))
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
return n
|
|
}
|