Documentation
¶
Index ¶
- Constants
- Variables
- func CompareVersions(v1, v2 string) int
- func CopyFile(src, dst string) error
- func DispatchCodeJob(sync RepoSync, drivers ...CodeJobDriver) (string, error)
- func EvaluateTestResults(err error, output, moduleName string, msgs []string, skipRace bool) (testStatus, raceStatus string, stdTestsRan bool, newMsgs []string)
- func ExtractSections(content string) map[string]string
- func FindProjectRoot(startDir string) (string, error)
- func FindSlowestTest(output string, threshold float64) (string, float64)
- func FindTimedOutTests(output string) []string
- func FormatCommitMessage(message string) string
- func GenerateGitignore(targetDir string) error
- func GenerateHandlerFile(repoName, targetDir string) error
- func GenerateLicense(ownerName, targetDir string) error
- func GenerateREADME(repoName, description, targetDir string) error
- func GetBadgeColor(typ, value string) string
- func GetGoVersion() string
- func HandleDone(env *DotEnv, git *Git, prURL string) error
- func HasTimeoutFlag(args []string) bool
- func JulesSessionState(sessionID, apiKey string, client HTTPClient) (msg, prURL string, done bool, err error)
- func KebabToCamel(s string) string
- func MergePR() error
- func PrintError(msg string)
- func PrintInfo(msg string)
- func PrintSuccess(msg string)
- func PrintWarning(msg string)
- func RunCommand(name string, args ...string) (string, error)
- func RunCommandInDir(dir, name string, args ...string) (string, error)
- func RunCommandSilent(name string, args ...string) (string, error)
- func RunCommandWithRetryInDir(dir, name string, args []string, maxRetries int, delay time.Duration) (string, error)
- func RunCommandWithStdin(input, name string, args ...string) (string, error)
- func RunShellCommand(command string) (string, error)
- func RunShellCommandAsync(command string) error
- func ShouldEnableWasm(nativeOut, wasmOut string) bool
- func ValidateCommitMessage(message string) error
- func ValidateDescription(desc string) error
- func ValidateRepoName(name string) error
- func ValidateShellSafeMessage(message string) string
- type Badge
- type Badges
- func (h *Badges) BadgeMarkdown() string
- func (h *Badges) BuildBadges() ([]string, error)
- func (h *Badges) Err() error
- func (h *Badges) GenerateSVG() ([]byte, int, error)
- func (h *Badges) GoHandler() *Go
- func (h *Badges) OutputFile() string
- func (h *Badges) ReadmeFile() string
- func (h *Badges) SetLog(fn func(...any))
- type Bashrc
- type CodeJob
- type CodeJobDriver
- type CodeJobInitWizard
- type ConsoleFilter
- type DevBackup
- type DotEnv
- type FolderWatcher
- type Future
- type Git
- func (g *Git) Add() error
- func (g *Git) CheckRemoteAccess() error
- func (g *Git) Commit(message string) (bool, error)
- func (g *Git) CreateTag(tag string) (bool, error)
- func (g *Git) GenerateNextTag() (string, error)
- func (g *Git) GetConfigUserEmail() (string, error)
- func (g *Git) GetConfigUserName() (string, error)
- func (g *Git) GetLatestTag() (string, error)
- func (g *Git) GitIgnoreAdd(entry string) error
- func (g *Git) HasChanges() (bool, error)
- func (g *Git) HasPendingChanges() (bool, error)
- func (g *Git) HasUpstream() (bool, error)
- func (g *Git) IncrementTag(tag string) (string, error)
- func (g *Git) InitRepo(dir string) error
- func (g *Git) IsAheadOfRemote() (bool, error)
- func (g *Git) Push(message, tag string) (PushResult, error)
- func (g *Git) PushWithTags(tag string) (bool, error)
- func (g *Git) PushWithoutTags() (bool, error)
- func (g *Git) SetAuthRetrier(a GitHubAuthenticator)
- func (g *Git) SetCodeJobDrivers(drivers ...CodeJobDriver)
- func (g *Git) SetLog(fn func(...any))
- func (g *Git) SetRootDir(path string)
- func (g *Git) SetShouldWrite(f func() bool)
- func (g *Git) SetUserConfig(name, email string) error
- func (g *Git) TagExists(tag string) (bool, error)
- type GitClient
- type GitHub
- func (gh *GitHub) CreateRepo(owner, name, description, visibility string) error
- func (gh *GitHub) DeleteRepo(owner, name string) error
- func (gh *GitHub) GetCurrentUser() (string, error)
- func (gh *GitHub) GetHelpfulErrorMessage(err error) string
- func (gh *GitHub) IsNetworkError(err error) bool
- func (gh *GitHub) RepoExists(owner, name string) (bool, error)
- func (gh *GitHub) SetLog(fn func(...any))
- type GitHubAuth
- type GitHubAuthHandler
- type GitHubAuthenticator
- type GitHubClient
- type Go
- func (g *Go) DetectGoExecutable() (string, error)
- func (g *Go) FindDependentModules(modulePath, searchPath string) ([]string, error)
- func (g *Go) GetCurrentVersion(moduleDir, dependencyPath string) (string, error)
- func (g *Go) GetGit() GitClient
- func (g *Go) GetLog() func(...any)
- func (g *Go) GetModulePath() (string, error)
- func (g *Go) GoVersion() (string, error)
- func (g *Go) HasDependency(gomodPath, modulePath string) bool
- func (g *Go) Install(version string) (string, error)
- func (g *Go) ModExists() bool
- func (g *Go) ModExistsInCurrentOrParent() bool
- func (g *Go) ModInit(modulePath, targetDir string) error
- func (g *Go) Push(message, tag string, skipTests, skipRace, skipDependents, skipBackup bool, ...) (string, error)
- func (g *Go) SetConsoleOutput(fn func(string))
- func (g *Go) SetLog(fn func(...any))
- func (g *Go) SetRetryConfig(delay time.Duration, attempts int)
- func (g *Go) SetRootDir(path string)
- func (g *Go) Test(customArgs []string, skipRace bool, timeoutSec int, noCache bool, runAll bool) (string, error)
- func (g *Go) UpdateDependentModule(depDir, modulePath, version string) (string, error)
- func (g *Go) UpdateDependents(modulePath, version, searchPath string) ([]string, error)
- func (g *Go) UpdateModule(moduleDir, dependency, version string) error
- func (g *Go) Verify() error
- func (g *Go) WaitForVersionAvailable(modulePath, version string) error
- type GoModHandler
- func (m *GoModHandler) GetReplacePaths() ([]ReplaceEntry, error)
- func (m *GoModHandler) HasOtherReplaces(exceptModule string) bool
- func (g *GoModHandler) MainInputFileRelativePath() string
- func (g *GoModHandler) Name() string
- func (g *GoModHandler) NewFileEvent(fileName, extension, filePath, event string) error
- func (m *GoModHandler) RemoveReplace(modulePath string) bool
- func (m *GoModHandler) RunTidy() error
- func (m *GoModHandler) Save() error
- func (g *GoModHandler) SetFolderWatcher(watcher FolderWatcher)
- func (g *GoModHandler) SetLog(fn func(messages ...any))
- func (g *GoModHandler) SetRootDir(path string)
- func (g *GoModHandler) SupportedExtensions() []string
- func (g *GoModHandler) UnobservedFiles() []string
- type GoModInterface
- type GoNew
- type HTTPClient
- type JulesAuth
- type JulesConfig
- type JulesDriver
- type Keyring
- type LLM
- func (l *LLM) DetectInstalledLLMs() []LLMConfig
- func (l *LLM) ForceUpdate(configPath, masterContent string) error
- func (l *LLM) GetMasterContent() (string, error)
- func (l *LLM) GetSupportedLLMs() []LLMConfig
- func (l *LLM) SetLog(fn func(...any))
- func (l *LLM) SmartSync(configPath, masterContent string) (bool, error)
- func (l *LLM) Sync(specificLLM string, force bool) (string, error)
- type LLMConfig
- type MarkDown
- func (m *MarkDown) Extract(outputFile string) error
- func (m *MarkDown) InputByte(content []byte) *MarkDown
- func (m *MarkDown) InputEmbed(path string, readerFile func(name string) ([]byte, error)) *MarkDown
- func (m *MarkDown) InputPath(pathFile string, readerFile func(name string) ([]byte, error)) *MarkDown
- func (m *MarkDown) SetLog(fn func(...any))
- func (m *MarkDown) UpdateSection(sectionID, content string, afterLine ...string) error
- type MockGitHubAuth
- type NewProjectOptions
- type PushResult
- type ReplaceEntry
- type RepoSync
- type SessionProvider
- type TestCache
- func (tc *TestCache) GetCacheKey() (string, error)
- func (tc *TestCache) GetCachePath() (string, error)
- func (tc *TestCache) GetCachedMessage() string
- func (tc *TestCache) GetGitState() (string, error)
- func (tc *TestCache) InvalidateCache() error
- func (tc *TestCache) IsCacheValid() bool
- func (tc *TestCache) SaveCache(message string) error
Constants ¶
const ( ColorRed = "\033[0;31m" ColorGreen = "\033[0;32m" ColorYellow = "\033[0;33m" ColorCyan = "\033[0;36m" ColorNone = "\033[0m" )
const DefaultIssuePromptPath = "docs/PLAN.md"
DefaultIssuePromptPath is the conventional location for the task description file.
const DevFlowRepository = "github.com/tinywasm/devflow"
const DevflowOAuthClientID = "Ov23lijHU2vxBCpShn1Q"
DevflowOAuthClientID is the OAuth App Client ID for devflow.
IMPORTANT: This Client ID is intentionally hardcoded and is NOT a secret. OAuth Client IDs are public identifiers (like a username, not a password). The Client Secret is NEVER included in the code - Device Flow doesn't need it. This is the standard approach used by CLI tools like gh, goreleaser, hub, etc.
The OAuth App is registered under a personal GitHub account (not organization). Manage the app at: https://github.com/settings/developers -> OAuth Apps -> devflow
Variables ¶
var ExecCommand = exec.Command
ExecCommand is a variable to allow mocking in tests
Functions ¶
func CompareVersions ¶ added in v0.0.49
CompareVersions compares two semantic version strings (e.g., "v1.2.3"). It returns -1 if v1 < v2, 0 if v1 == v2, 1 if v1 > v2. It handles "v" prefix gracefully.
func DispatchCodeJob ¶ added in v0.2.12
func DispatchCodeJob(sync RepoSync, drivers ...CodeJobDriver) (string, error)
DispatchCodeJob dispatches CodeJob if PLAN.md exists and no active session is in .env. Returns ("", nil) when there is nothing to dispatch (active session or missing PLAN.md). Returns ("", error) when dispatch was attempted but failed. Returns (result, nil) on successful dispatch. If no drivers are provided, defaults to NewJulesDriver(JulesConfig{}).
func EvaluateTestResults ¶ added in v0.2.4
func EvaluateTestResults(err error, output, moduleName string, msgs []string, skipRace bool) (testStatus, raceStatus string, stdTestsRan bool, newMsgs []string)
EvaluateTestResults analyzes the output of go test and decides the outcome This function is pure and can be easily tested.
func ExtractSections ¶ added in v0.2.4
ExtractSections extrae secciones marcadas del contenido
func FindProjectRoot ¶ added in v0.0.72
FindProjectRoot looks for go.mod in startDir or its immediate parent. Returns the absolute path to the directory containing go.mod, or an empty string and error if not found.
func FindSlowestTest ¶ added in v0.2.4
FindSlowestTest parses -v test output and returns the name and duration of the slowest individual test across all packages if it exceeds the specified threshold.
func FindTimedOutTests ¶ added in v0.2.4
FindTimedOutTests parses go test output and extracts test names that timed out. Handles two scenarios: 1. Go's native timeout: "panic: test timed out after Ns\n running tests:\n TestName (Ns)" 2. Process killed externally (context.WithTimeout): finds the last "=== RUN" without a matching "--- PASS/FAIL"
func FormatCommitMessage ¶ added in v0.0.34
FormatCommitMessage ensures the message is trimmed.
func GenerateGitignore ¶ added in v0.0.13
GenerateGitignore generates .gitignore for Go
func GenerateHandlerFile ¶ added in v0.0.13
GenerateHandlerFile generates the main handler file
func GenerateLicense ¶ added in v0.0.13
GenerateLicense generates LICENSE (MIT)
func GenerateREADME ¶ added in v0.0.13
GenerateREADME generates README.md
func GetBadgeColor ¶ added in v0.2.4
func GetGoVersion ¶ added in v0.2.4
func GetGoVersion() string
func HandleDone ¶ added in v0.2.12
HandleDone executes cleanup when Jules completes: 1. git fetch --all 2. git checkout <jules-branch> for local review 3. os.Rename("docs/PLAN.md", "docs/CHECK_PLAN.md") 4. env.Delete("CODEJOB") 5. env.Set("CODEJOB_PR", prURL) 6. Update .gitignore
func HasTimeoutFlag ¶ added in v0.2.4
HasTimeoutFlag checks if -timeout is already present in the args
func JulesSessionState ¶ added in v0.2.12
func JulesSessionState(sessionID, apiKey string, client HTTPClient) (msg, prURL string, done bool, err error)
JulesSessionState polls the Jules API for session status. Returns (message, prURL, isDone, error).
func KebabToCamel ¶ added in v0.2.4
KebabToCamel converts kebab-case or snake_case to CamelCase
func MergePR ¶ added in v0.2.14
func MergePR() error
MergePR merges the Jules PR persisted in .env as CODEJOB_PR, deletes docs/CHECK_PLAN.md, and cleans up state. Called by 'codejob done'.
func PrintError ¶ added in v0.0.13
func PrintError(msg string)
PrintError prints an error message in red.
func PrintInfo ¶ added in v0.0.13
func PrintInfo(msg string)
PrintInfo prints an informational message in cyan.
func PrintSuccess ¶ added in v0.0.13
func PrintSuccess(msg string)
PrintSuccess prints a success message in green.
func PrintWarning ¶ added in v0.0.13
func PrintWarning(msg string)
PrintWarning prints a warning message in yellow.
func RunCommand ¶
RunCommand executes a shell command It returns the output (trimmed) and an error if the command fails
func RunCommandInDir ¶ added in v0.0.51
RunCommandInDir executes a command in a specific directory
func RunCommandSilent ¶
RunCommandSilent executes a command (alias for RunCommand now, as RunCommand is also silent on success) kept for backward compatibility if needed, or we can remove it. The previous implementation was identical except for logging.
func RunCommandWithRetryInDir ¶ added in v0.0.51
func RunCommandWithRetryInDir(dir, name string, args []string, maxRetries int, delay time.Duration) (string, error)
RunCommandWithRetryInDir executes a command in a specific directory with retries
func RunCommandWithStdin ¶ added in v0.2.12
RunCommandWithStdin executes a command with the given string piped to stdin. Use this instead of passing secrets as CLI args to avoid leaking them in error messages.
func RunShellCommand ¶ added in v0.0.10
RunShellCommand executes a shell command in a cross-platform way On Windows: uses cmd.exe /C On Unix (Linux/macOS): uses sh -c
func RunShellCommandAsync ¶ added in v0.0.13
RunShellCommandAsync starts a shell command asynchronously (non-blocking) Returns immediately after starting, does not wait for completion
func ShouldEnableWasm ¶ added in v0.2.4
ShouldEnableWasm decides if WASM tests should be run based on go list output differences
func ValidateCommitMessage ¶ added in v0.0.34
ValidateCommitMessage ensures that a commit message is provided and is valid. It trims whitespace and returns an error if the message is empty.
func ValidateDescription ¶ added in v0.0.13
ValidateDescription validates the repository description
func ValidateRepoName ¶ added in v0.0.13
ValidateRepoName validates the repository name Only alphanumeric, dash, and underscore allowed
func ValidateShellSafeMessage ¶ added in v0.0.34
ValidateShellSafeMessage provides a warning if the message contains characters that might need escaping in certain shells (like backticks, dollar signs, or single quotes) if it were to be used in a shell script, even though exec.Command is safe.
Types ¶
type Badge ¶ added in v0.0.13
type Badge struct {
Label string // The text displayed on the left side of the badge.
Value string // The text displayed on the right side of the badge.
Color string // The background color for the value part of the badge (e.g., "#4c1" or "green").
}
Badge represents a single badge with a label, value, and color. This is the primary struct used to define a badge's appearance and content.
For example, to create a "Go version" badge, you might use:
b := Badge{
Label: "Go",
Value: "1.18",
Color: "#007d9c",
}
type Badges ¶ added in v0.0.13
type Badges struct {
// contains filtered or unexported fields
}
Badges is responsible for creating and managing a collection of badges. It handles parsing input arguments, generating the SVG image, and preparing the necessary markdown to embed the badges in a file.
func (*Badges) BadgeMarkdown ¶ added in v0.0.13
BadgeMarkdown generates the markdown snippet for embedding the badge image.
func (*Badges) BuildBadges ¶ added in v0.0.13
BuildBadges generates the SVG image, writes it to the specified output file, and returns a slice of strings intended for updating a markdown file.
func (*Badges) Err ¶ added in v0.0.13
Err returns any error that occurred during the initialization or processing
func (*Badges) GenerateSVG ¶ added in v0.0.13
GenerateSVG creates an SVG image from the configured badges.
It returns the SVG content as a byte slice, the number of badges included, and an error if the generation fails. This method is typically called by BuildBadges, but it can be used directly if you only need the SVG data.
Example of a generated SVG for two badges ("License:MIT:blue" and "Go:1.22:blue"):
<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" width="168" height="20" viewBox="0 0 168 20">
<!-- Badge: License --> <g transform="translate(0, 0)"> <rect x="0" y="0" width="58" height="20" fill="#6c757d"/> <rect x="58" y="0" width="46" height="20" fill="blue"/> <text x="29" y="14" text-anchor="middle" font-family="sans-serif" font-size="11" fill="white">License</text> <text x="81" y="14" text-anchor="middle" font-family="sans-serif" font-size="11" fill="white">MIT</text> </g> <!-- Badge: Go --> <g transform="translate(109, 0)"> <rect x="0" y="0" width="34" height="20" fill="#6c757d"/> <rect x="34" y="0" width="25" height="20" fill="blue"/> <text x="17" y="14" text-anchor="middle" font-family="sans-serif" font-size="11" fill="white">Go</text> <text x="46" y="14" text-anchor="middle" font-family="sans-serif" font-size="11" fill="white">1.22</text> </g>
</svg>
func (*Badges) OutputFile ¶ added in v0.0.13
OutputFile returns the configured path for the output SVG file.
func (*Badges) ReadmeFile ¶ added in v0.0.13
ReadmeFile returns the configured path for the markdown file to be updated.
type Bashrc ¶ added in v0.0.10
type Bashrc struct {
FilePath string
}
Bashrc handles updates to .bashrc file using markers
func NewBashrc ¶ added in v0.0.10
func NewBashrc() *Bashrc
NewBashrc creates a new Bashrc handler for ~/.bashrc
func (*Bashrc) ExtractValue ¶ added in v0.2.4
ExtractValue extracts value from export statement Input: export KEY="value" or export KEY=value Output: value
type CodeJob ¶ added in v0.2.12
type CodeJob struct {
// contains filtered or unexported fields
}
CodeJob orchestrates sending a coding task to a chain of AI agent drivers. It validates the prompt file, then tries each driver in priority order, falling back to the next on failure.
func NewCodeJob ¶ added in v0.2.12
func NewCodeJob(drivers ...CodeJobDriver) *CodeJob
NewCodeJob creates a CodeJob with the given ordered drivers.
func (*CodeJob) Send ¶ added in v0.2.12
Send validates issuePromptPath, checks repo sync, then tries each driver in order until one succeeds. Returns an error if the file is missing, empty, the repo is out of sync, or all drivers fail.
func (*CodeJob) SetRepoSync ¶ added in v0.2.12
SetRepoSync injects a RepoSync for pre-flight synchronization check. When set, Send() will refuse to dispatch if the local repo is not in sync with the remote.
type CodeJobDriver ¶ added in v0.2.12
type CodeJobDriver interface {
Name() string
SetLog(fn func(...any))
Send(prompt, title string) (string, error)
}
CodeJobDriver defines the contract for an external AI coding agent. Implementations: JulesDriver, (future: OllamaDriver, etc.) title is the human-readable job name (e.g. "owner/repo"), derived by CodeJob.
type CodeJobInitWizard ¶ added in v0.2.12
type CodeJobInitWizard struct {
// contains filtered or unexported fields
}
CodeJobInitWizard implements the one-time setup wizard for codejob. It follows the same wizard.Step pattern as gonew_wizard.go.
func NewCodeJobInitWizard ¶ added in v0.2.12
func NewCodeJobInitWizard() *CodeJobInitWizard
NewCodeJobInitWizard creates a CodeJobInitWizard.
func (*CodeJobInitWizard) GetSteps ¶ added in v0.2.12
func (c *CodeJobInitWizard) GetSteps() []*wizard.Step
GetSteps returns the single onboarding step: save the Jules API key to keyring.
func (*CodeJobInitWizard) Run ¶ added in v0.2.12
func (c *CodeJobInitWizard) Run() error
Run drives the init wizard from a CLI context. It handles masked input for the API key step.
func (*CodeJobInitWizard) SetLog ¶ added in v0.2.12
func (c *CodeJobInitWizard) SetLog(fn func(...any))
SetLog sets the logging function.
type ConsoleFilter ¶
type ConsoleFilter struct {
// contains filtered or unexported fields
}
func NewConsoleFilter ¶
func NewConsoleFilter(output func(string)) *ConsoleFilter
func (*ConsoleFilter) Add ¶
func (cf *ConsoleFilter) Add(input string)
func (*ConsoleFilter) Flush ¶
func (cf *ConsoleFilter) Flush()
type DevBackup ¶ added in v0.0.10
type DevBackup struct {
// contains filtered or unexported fields
}
DevBackup handles backup operations
func NewDevBackup ¶ added in v0.0.10
func NewDevBackup() *DevBackup
NewDevBackup creates a new DevBackup instance
func (*DevBackup) GetCommand ¶ added in v0.0.10
GetCommand retrieves the backup command First checks environment variable, then falls back to .bashrc
func (*DevBackup) Run ¶ added in v0.0.10
Run executes the backup command asynchronously Returns a message for the summary or empty string if not configured
func (*DevBackup) SetCommand ¶ added in v0.0.10
SetCommand sets the backup command in .bashrc and current environment
type DotEnv ¶ added in v0.2.12
type DotEnv struct {
// contains filtered or unexported fields
}
DotEnv handles .env files while trying to preserve non-key=value lines (comments, empty lines).
type FolderWatcher ¶ added in v0.0.74
type FolderWatcher interface {
AddDirectoriesToWatch(paths ...string) error
RemoveDirectoriesFromWatcher(paths ...string) error
}
FolderWatcher defines interface for adding/removing directories to watch
type Future ¶ added in v0.0.36
type Future struct {
// contains filtered or unexported fields
}
Future holds the async result of any initialization. It uses any (interface{}) for flexibility without generic syntax.
func NewResolvedFuture ¶ added in v0.0.41
NewResolvedFuture creates a Future that is already resolved with the given value. Useful for tests or when the value is already available synchronously.
type Git ¶
type Git struct {
// contains filtered or unexported fields
}
Git handler for Git operations
func (*Git) CheckRemoteAccess ¶ added in v0.0.69
CheckRemoteAccess verifies connectivity to the remote repository. If an auth error is detected and an authRetrier is configured, it triggers the Device Flow auth automatically and retries once.
func (*Git) Commit ¶ added in v0.0.73
Commit creates a commit with the given message Returns true if a commit was created
func (*Git) GenerateNextTag ¶
GenerateNextTag calculates the next semantic version
func (*Git) GetConfigUserEmail ¶ added in v0.0.13
GetConfigUserEmail gets the git user.email
func (*Git) GetConfigUserName ¶ added in v0.0.13
GetConfigUserName gets the git user.name
func (*Git) GetLatestTag ¶
GetLatestTag gets the latest tag
func (*Git) GitIgnoreAdd ¶ added in v0.0.32
GitIgnoreAdd adds entry to .gitignore if shouldWrite allows and entry not present. Creates .gitignore if it doesn't exist.
func (*Git) HasChanges ¶ added in v0.2.4
HasChanges checks if there are staged changes
func (*Git) HasPendingChanges ¶ added in v0.2.12
HasPendingChanges returns true if there are uncommitted or unpushed changes. Used by CodeJob to ensure the file is visible to Jules before dispatching. It ignores changes to .env and .gitignore files.
func (*Git) HasUpstream ¶ added in v0.2.4
HasUpstream checks if the branch has upstream
func (*Git) IncrementTag ¶ added in v0.0.73
IncrementTag increments a specific tag (e.g., v0.0.12 -> v0.0.13)
func (*Git) IsAheadOfRemote ¶ added in v0.0.82
IsAheadOfRemote checks if local branch is ahead of remote
func (*Git) Push ¶
func (g *Git) Push(message, tag string) (PushResult, error)
Push executes the complete push workflow (add, commit, tag, push) Returns a PushResult and error if any.
func (*Git) PushWithTags ¶ added in v0.0.73
PushWithTags pushes commits and tag
func (*Git) PushWithoutTags ¶ added in v0.0.82
PushWithoutTags pushes commits without pushing tags
func (*Git) SetAuthRetrier ¶ added in v0.2.12
func (g *Git) SetAuthRetrier(a GitHubAuthenticator)
SetAuthRetrier injects an authenticator to use for auto-recovery on access errors
func (*Git) SetCodeJobDrivers ¶ added in v0.2.13
func (g *Git) SetCodeJobDrivers(drivers ...CodeJobDriver)
SetCodeJobDrivers injects AI agent drivers for CodeJob dispatch. If not set, Push() defaults to NewJulesDriver(JulesConfig{}).
func (*Git) SetRootDir ¶ added in v0.0.32
SetRootDir sets the root directory for git operations
func (*Git) SetShouldWrite ¶ added in v0.0.32
SetShouldWrite sets a function that determines if Git write operations (like updating .gitignore) should be allowed.
func (*Git) SetUserConfig ¶ added in v0.0.13
SetUserConfig sets git user name and email
type GitClient ¶ added in v0.0.69
type GitClient interface {
CheckRemoteAccess() error
Push(message, tag string) (PushResult, error)
GetLatestTag() (string, error)
SetLog(fn func(...any))
SetShouldWrite(fn func() bool)
SetRootDir(path string)
GitIgnoreAdd(entry string) error
GetConfigUserName() (string, error)
GetConfigUserEmail() (string, error)
InitRepo(dir string) error
Add() error
Commit(message string) (bool, error)
CreateTag(tag string) (bool, error)
PushWithTags(tag string) (bool, error)
HasPendingChanges() (bool, error)
}
GitClient defines the interface for Git operations.
type GitHub ¶ added in v0.0.13
type GitHub struct {
// contains filtered or unexported fields
}
GitHub handler for GitHub operations
func NewGitHub ¶ added in v0.0.13
func NewGitHub(logFn func(...any), auth ...GitHubAuthenticator) (*GitHub, error)
NewGitHub creates handler and verifies gh CLI availability. logFn is used to display authentication messages during Device Flow. If not authenticated, it initiates OAuth Device Flow automatically.
func (*GitHub) CreateRepo ¶ added in v0.0.13
CreateRepo creates a new empty repository on GitHub If owner is provided, creates repo under that organization
func (*GitHub) DeleteRepo ¶ added in v0.0.39
DeleteRepo deletes a repository on GitHub. WARNING: This permanently deletes the repository and cannot be undone. Use with caution, primarily for test cleanup.
func (*GitHub) GetCurrentUser ¶ added in v0.0.13
GetCurrentUser gets the current authenticated user
func (*GitHub) GetHelpfulErrorMessage ¶ added in v0.0.13
GetHelpfulErrorMessage returns a helpful message for common errors
func (*GitHub) IsNetworkError ¶ added in v0.0.13
IsNetworkError checks if an error is likely a network error
func (*GitHub) RepoExists ¶ added in v0.0.13
RepoExists checks if a repository exists
type GitHubAuth ¶ added in v0.0.23
type GitHubAuth struct {
// contains filtered or unexported fields
}
GitHubAuth handles GitHub authentication and token management
func NewGitHubAuth ¶ added in v0.0.23
func NewGitHubAuth() *GitHubAuth
NewGitHubAuth creates a new GitHub authentication handler
func (*GitHubAuth) DeviceFlowAuth ¶ added in v0.0.23
func (a *GitHubAuth) DeviceFlowAuth(kr *Keyring) (string, error)
DeviceFlowAuth initiates GitHub OAuth Device Flow and returns an access token
func (*GitHubAuth) EnsureGitHubAuth ¶ added in v0.0.23
func (a *GitHubAuth) EnsureGitHubAuth() error
EnsureGitHubAuth checks if GitHub is authenticated via keyring, and if not, initiates Device Flow
func (*GitHubAuth) Name ¶ added in v0.0.70
func (a *GitHubAuth) Name() string
Name returns the handler name for TUI display.
func (*GitHubAuth) SetLog ¶ added in v0.0.23
func (a *GitHubAuth) SetLog(fn func(...any))
SetLog sets the logger function
type GitHubAuthHandler ¶ added in v0.0.70
type GitHubAuthHandler interface {
GitHubAuthenticator
Name() string
}
GitHubAuthHandler defines the interface for GitHub auth as a TUI handler.
type GitHubAuthenticator ¶ added in v0.0.70
GitHubAuthenticator defines the interface for GitHub authentication. This allows mocking authentication in tests.
type GitHubClient ¶ added in v0.0.66
type GitHubClient interface {
SetLog(fn func(...any))
GetCurrentUser() (string, error)
RepoExists(owner, name string) (bool, error)
CreateRepo(owner, name, description, visibility string) error
DeleteRepo(owner, name string) error
IsNetworkError(err error) bool
GetHelpfulErrorMessage(err error) string
}
GitHubClient defines the interface for GitHub operations. This allows mocking the GitHub dependency in tests.
type Go ¶
type Go struct {
// contains filtered or unexported fields
}
Go handler for Go operations
func (*Go) DetectGoExecutable ¶ added in v0.0.13
DetectGoExecutable returns the path to the go executable
func (*Go) FindDependentModules ¶ added in v0.2.4
FindDependentModules searches for modules that have modulePath as dependency
func (*Go) GetCurrentVersion ¶ added in v0.0.49
GetCurrentVersion returns the current version of a dependency in a module
func (*Go) GetModulePath ¶ added in v0.2.4
GetModulePath gets full module path
func (*Go) GoVersion ¶ added in v0.0.13
GoVersion reads the Go version from the go.mod file in the current directory. It returns the version string (e.g., "1.18") or an empty string if not found.
func (*Go) HasDependency ¶ added in v0.2.4
HasDependency checks if a go.mod contains a specific dependency
func (*Go) Install ¶ added in v0.1.51
Install builds and installs all commands in the cmd/ directory It injects the version using ldflags if provided
func (*Go) ModExistsInCurrentOrParent ¶ added in v0.0.33
ModExistsInCurrentOrParent checks if go.mod exists in the rootDir or one directory up.
func (*Go) Push ¶
func (g *Go) Push(message, tag string, skipTests, skipRace, skipDependents, skipBackup bool, searchPath string) (string, error)
Push executes the complete workflow for Go projects Parameters:
message: Commit message tag: Optional tag skipTests: If true, skips tests skipRace: If true, skips race tests skipDependents: If true, skips updating dependent modules skipBackup: If true, skips backup searchPath: Path to search for dependent modules (default: "..")
func (*Go) SetConsoleOutput ¶ added in v0.2.4
SetConsoleOutput sets the function for console output (used by ConsoleFilter)
func (*Go) SetRetryConfig ¶ added in v0.0.69
SetRetryConfig sets the retry configuration for network operations
func (*Go) SetRootDir ¶ added in v0.0.33
SetRootDir sets the root directory for Go operations
func (*Go) Test ¶
func (g *Go) Test(customArgs []string, skipRace bool, timeoutSec int, noCache bool, runAll bool) (string, error)
Test executes the test suite for the project. timeoutSec sets the per-package timeout in seconds (0 = default 30s).
func (*Go) UpdateDependentModule ¶ added in v0.0.45
UpdateDependentModule updates a dependent module and optionally pushes it This is called for each module that depends on the one we just published UpdateDependentModule updates a specific dependent module It modifies go.mod to require the new version and runs go mod tidy
func (*Go) UpdateDependents ¶ added in v0.2.4
UpdateDependents updates modules that depend on the current one
func (*Go) UpdateModule ¶ added in v0.2.4
UpdateModule updates a specific module to a new version
func (*Go) WaitForVersionAvailable ¶ added in v0.0.69
WaitForVersionAvailable waits for a module version to be available on Go proxy
type GoModHandler ¶ added in v0.0.74
type GoModHandler struct {
Lines []string // all lines of the file
Modified bool // track if changes were made
// contains filtered or unexported fields
}
GoModHandler represents a parsed go.mod file and handles file events
func NewGoModHandler ¶ added in v0.0.74
func NewGoModHandler() *GoModHandler
NewGoModHandler reads and parses a go.mod file or returns an empty handler if path is empty
func (*GoModHandler) GetReplacePaths ¶ added in v0.0.76
func (m *GoModHandler) GetReplacePaths() ([]ReplaceEntry, error)
GetReplacePaths returns absolute paths from local replace directives. Relative paths are resolved starting from the directory containing go.mod.
func (*GoModHandler) HasOtherReplaces ¶ added in v0.0.74
func (m *GoModHandler) HasOtherReplaces(exceptModule string) bool
HasOtherReplaces returns true if there are replace directives other than the specified module
func (*GoModHandler) MainInputFileRelativePath ¶ added in v0.0.74
func (g *GoModHandler) MainInputFileRelativePath() string
func (*GoModHandler) Name ¶ added in v0.0.74
func (g *GoModHandler) Name() string
func (*GoModHandler) NewFileEvent ¶ added in v0.0.74
func (g *GoModHandler) NewFileEvent(fileName, extension, filePath, event string) error
NewFileEvent handles changes to go.mod
func (*GoModHandler) RemoveReplace ¶ added in v0.0.74
func (m *GoModHandler) RemoveReplace(modulePath string) bool
RemoveReplace removes a replace directive for the given module Returns true if a replace was found and removed
func (*GoModHandler) RunTidy ¶ added in v0.0.74
func (m *GoModHandler) RunTidy() error
RunTidy executes 'go mod tidy' in the directory of the go.mod file
func (*GoModHandler) Save ¶ added in v0.0.74
func (m *GoModHandler) Save() error
Save writes changes back to the file if modified
func (*GoModHandler) SetFolderWatcher ¶ added in v0.0.74
func (g *GoModHandler) SetFolderWatcher(watcher FolderWatcher)
func (*GoModHandler) SetLog ¶ added in v0.0.74
func (g *GoModHandler) SetLog(fn func(messages ...any))
func (*GoModHandler) SetRootDir ¶ added in v0.0.74
func (g *GoModHandler) SetRootDir(path string)
func (*GoModHandler) SupportedExtensions ¶ added in v0.0.74
func (g *GoModHandler) SupportedExtensions() []string
func (*GoModHandler) UnobservedFiles ¶ added in v0.0.74
func (g *GoModHandler) UnobservedFiles() []string
type GoModInterface ¶ added in v0.0.74
type GoModInterface interface {
NewFileEvent(fileName, extension, filePath, event string) error
SetFolderWatcher(watcher FolderWatcher)
Name() string
SupportedExtensions() []string
MainInputFileRelativePath() string
UnobservedFiles() []string
SetLog(fn func(...any))
SetRootDir(path string)
GetReplacePaths() ([]ReplaceEntry, error)
}
GoModInterface defines interface for go.mod handling
type GoNew ¶ added in v0.0.13
type GoNew struct {
// contains filtered or unexported fields
}
GoNew orchestrator
func (*GoNew) Create ¶ added in v0.0.13
func (gn *GoNew) Create(opts NewProjectOptions) (string, error)
Create executes full workflow with remote (or local-only fallback)
type HTTPClient ¶ added in v0.2.12
HTTPClient defines the interface for HTTP operations (injectable for tests).
type JulesAuth ¶ added in v0.2.12
type JulesAuth struct {
// contains filtered or unexported fields
}
JulesAuth manages the Jules API key via the system keyring. On first use it prompts the user to enter the key and stores it securely.
func NewJulesAuth ¶ added in v0.2.12
NewJulesAuth creates a JulesAuth with an initialized keyring.
func (*JulesAuth) EnsureAPIKey ¶ added in v0.2.12
EnsureAPIKey returns the Jules API key from the keyring. If absent, prompts the user for it once and persists it.
type JulesConfig ¶ added in v0.2.12
type JulesConfig struct {
APIKey string // optional: loaded from keyring if empty
SourceID string // optional: auto-detected via gh CLI if empty
StartBranch string // optional: auto-detected via git if empty
SessionTitle string // optional: defaults to prompt filename
SourceIndexTimeout time.Duration // optional: max wait for source to appear (default 2m)
SourceIndexInterval time.Duration // optional: polling interval for source check (default 10s)
}
JulesConfig holds the configuration for the Jules driver. All fields are optional: APIKey is loaded from keyring if empty, SourceID and StartBranch are auto-detected via gh/git if empty.
type JulesDriver ¶ added in v0.2.12
type JulesDriver struct {
// contains filtered or unexported fields
}
JulesDriver implements CodeJobDriver for the Jules AI agent.
func NewJulesDriver ¶ added in v0.2.12
func NewJulesDriver(config JulesConfig) *JulesDriver
NewJulesDriver creates a JulesDriver. All JulesConfig fields are optional.
func (*JulesDriver) Name ¶ added in v0.2.12
func (d *JulesDriver) Name() string
Name returns the driver name.
func (*JulesDriver) Send ¶ added in v0.2.12
func (d *JulesDriver) Send(prompt, title string) (string, error)
Send creates a Jules session using the prompt and title resolved by CodeJob. Jules accesses the referenced file directly from the repository via its GitHub App access. If the source is not yet indexed in Jules (404 on new repos), it polls GET /sources until the source appears or the timeout is exceeded.
func (*JulesDriver) SessionID ¶ added in v0.2.12
func (d *JulesDriver) SessionID() string
SessionID returns the last session ID created.
func (*JulesDriver) SetHTTPClient ¶ added in v0.2.12
func (d *JulesDriver) SetHTTPClient(client HTTPClient)
SetHTTPClient replaces the HTTP client (for testing).
func (*JulesDriver) SetLog ¶ added in v0.2.12
func (d *JulesDriver) SetLog(fn func(...any))
SetLog sets the logging function.
type Keyring ¶ added in v0.0.23
type Keyring struct {
// contains filtered or unexported fields
}
Keyring provides secure credential storage using the system keyring
func NewKeyring ¶ added in v0.0.23
NewKeyring creates a keyring handler and ensures dependencies are installed
type LLM ¶ added in v0.0.79
type LLM struct {
// contains filtered or unexported fields
}
LLM handles synchronization of LLM configuration files
func (*LLM) DetectInstalledLLMs ¶ added in v0.0.79
DetectInstalledLLMs detecta qué LLMs están instalados Returns: lista de LLMConfig para los LLMs instalados
func (*LLM) ForceUpdate ¶ added in v0.2.4
ForceUpdate sobrescribe completamente el archivo (con backup)
func (*LLM) GetMasterContent ¶ added in v0.0.79
GetMasterContent lee el contenido del archivo maestro embebido
func (*LLM) GetSupportedLLMs ¶ added in v0.0.79
GetSupportedLLMs retorna la lista de LLMs soportados
type LLMConfig ¶ added in v0.0.79
type LLMConfig struct {
Name string // "claude", "gemini"
Dir string // "~/.claude", "~/.gemini"
ConfigFile string // "CLAUDE.md", "GEMINI.md"
}
LLMConfig representa la configuración de un LLM específico
type MarkDown ¶ added in v0.0.13
type MarkDown struct {
// contains filtered or unexported fields
}
func NewMarkDown ¶ added in v0.0.13
func NewMarkDown(rootDir, destination string, writerFile func(name string, data []byte) error) *MarkDown
NewMarkDown creates a new MarkDown instance with the root directory. Destination (output directory) and input must be set via methods.
func (*MarkDown) Extract ¶ added in v0.0.13
Extract extracts code blocks from the configured input and writes to outputFile The output file extension determines which code type to extract (.go, .js, .css)
func (*MarkDown) InputByte ¶ added in v0.0.13
InputByte sets the input as a byte slice (markdown content)
func (*MarkDown) InputEmbed ¶ added in v0.0.13
InputEmbed sets the input as any ReaderFile implementation and a relative path inside it
func (*MarkDown) InputPath ¶ added in v0.0.13
func (m *MarkDown) InputPath(pathFile string, readerFile func(name string) ([]byte, error)) *MarkDown
InputPath sets the input as a file path (relative to rootDir)
func (*MarkDown) UpdateSection ¶ added in v0.0.13
UpdateSection updates or creates a section in the input file based on identifier. sectionID: The identifier for the section (e.g., "BADGES"). content: The new content to insert. afterLine: Optional. Implementation tries to insert after this line number if section doesn't exist.
type MockGitHubAuth ¶ added in v0.0.70
type MockGitHubAuth struct {
EnsureAuthError error // Set this to simulate auth failure
// contains filtered or unexported fields
}
MockGitHubAuth is a mock implementation of GitHubAuthenticator for testing.
func NewMockGitHubAuth ¶ added in v0.0.70
func NewMockGitHubAuth() *MockGitHubAuth
NewMockGitHubAuth creates a new mock authenticator.
func (*MockGitHubAuth) EnsureGitHubAuth ¶ added in v0.0.70
func (m *MockGitHubAuth) EnsureGitHubAuth() error
EnsureGitHubAuth simulates the authentication process.
func (*MockGitHubAuth) Name ¶ added in v0.0.70
func (m *MockGitHubAuth) Name() string
Name returns the handler name for TUI display.
func (*MockGitHubAuth) SetLog ¶ added in v0.0.70
func (m *MockGitHubAuth) SetLog(fn func(...any))
SetLog sets the logger function.
type NewProjectOptions ¶ added in v0.0.13
type NewProjectOptions struct {
Name string // Required, must be valid (alphanumeric, dash, underscore only)
Description string // Required, max 350 chars
Owner string // GitHub owner/organization (default: detected from gh or git config)
Visibility string // "public" or "private" (default: "public")
Directory string // Supports ~/path, ./path, /abs/path (default: ./{Name})
LocalOnly bool // If true, skip remote creation
License string // Default "MIT"
}
NewProjectOptions options for creating a new project
type PushResult ¶ added in v0.0.80
type PushResult struct {
Summary string // Human-readable summary of operations performed
Tag string // The tag that was created and pushed
}
PushResult contains the results of a Git push operation
func MergeAndPublish ¶ added in v0.2.16
func MergeAndPublish(git *Git) (PushResult, error)
MergeAndPublish merges the Jules PR, pulls the merged commit, commits any cleanup files (e.g. .gitignore updated by HandleDone), creates a new semver tag, and pushes it. This is the "close the loop" step that leaves the repo tagged and published, mirroring what 'push' does for regular commits.
type ReplaceEntry ¶ added in v0.0.74
type ReplaceEntry struct {
ModulePath string // The module being replaced
LocalPath string // The local path replacement
}
ReplaceEntry represents a local replace directive found in go.mod
type RepoSync ¶ added in v0.2.12
RepoSync checks whether the local repository is in sync with the remote. CodeJob uses this to refuse dispatch when local changes haven't been pushed yet.
type SessionProvider ¶ added in v0.2.12
type SessionProvider interface {
SessionID() string
}
SessionProvider is implemented by CodeJobDrivers that return a session ID after a successful Send(). CodeJob uses this to persist to .env.
type TestCache ¶ added in v0.0.63
type TestCache struct {
CacheDir string
}
TestCache provides git-based test caching to avoid re-running tests when the code hasn't changed since the last successful test run.
func NewTestCache ¶ added in v0.0.63
func NewTestCache() *TestCache
NewTestCache creates a new TestCache instance
func (*TestCache) GetCacheKey ¶ added in v0.2.4
GetCacheKey returns a unique key for the current module based on its path
func (*TestCache) GetCachePath ¶ added in v0.2.4
GetCachePath returns the full path to the cache file
func (*TestCache) GetCachedMessage ¶ added in v0.0.63
GetCachedMessage returns the cached test output message
func (*TestCache) GetGitState ¶ added in v0.2.4
GetGitState returns current git state: commit hash + diff hash This uniquely identifies the exact state of the code
func (*TestCache) InvalidateCache ¶ added in v0.0.63
InvalidateCache removes the cache file
func (*TestCache) IsCacheValid ¶ added in v0.0.63
IsCacheValid checks if tests were already run successfully with the current code
Source Files
¶
- badge.go
- badge_svg.go
- badges.go
- bashrc.go
- code_jules.go
- codejob.go
- codejob_auth.go
- codejob_init.go
- codejob_state.go
- colors.go
- commit_message.go
- console_filter.go
- devbackup.go
- dotenv.go
- executor.go
- future.go
- git_handler.go
- git_ignore.go
- git_test_cache.go
- github.go
- github_auth.go
- go_handler.go
- go_mod.go
- gonew.go
- gonew_wizard.go
- gotest.go
- interface.go
- keyring.go
- llm_skill.go
- markdown.go
- markdown_extractor.go
- markdown_updater.go
- mock_github_auth.go
- project_templates.go
- semver.go