Documentation
¶
Overview ¶
Package artifact provides storage and lifecycle management for workflow artifacts.
Core types:
- Manager: Saves and loads artifacts for workflow runs
- LifecycleManager: Handles cleanup, archival, and retention
- ReviewResult: Code review findings artifact
- TestOutput: Test execution results artifact
- LintOutput: Linting results artifact
- Specification: Feature specification artifact
Example usage:
mgr := artifact.NewManager(artifact.Config{
BaseDir: ".devflow/runs",
CompressAbove: 1024,
})
err := mgr.SaveArtifact("run-123", "output.json", data)
data, err := mgr.LoadArtifact("run-123", "output.json")
Index ¶
- Constants
- Variables
- type CleanupResult
- type Config
- type DiskUsageStats
- type Info
- type LifecycleManager
- func (m *LifecycleManager) Cleanup(dryRun bool) (*CleanupResult, error)
- func (m *LifecycleManager) CleanupArchives(dryRun bool) (*CleanupResult, error)
- func (m *LifecycleManager) DeleteArchive(runID string) error
- func (m *LifecycleManager) DiskUsage() (*DiskUsageStats, error)
- func (m *LifecycleManager) GetArchiveSize(runID string) (int64, error)
- func (m *LifecycleManager) ListArchives() ([]string, error)
- func (m *LifecycleManager) RestoreArchive(runID string) error
- type LintIssue
- type LintOutput
- type LintSummary
- type Manager
- func (m *Manager) ArtifactDir(runID string) string
- func (m *Manager) BaseDir() string
- func (m *Manager) DeleteArtifact(runID, name string) error
- func (m *Manager) EnsureRunDir(runID string) error
- func (m *Manager) FilesDir(runID string) string
- func (m *Manager) GetArtifactInfo(runID, name string) (*Info, error)
- func (m *Manager) HasArtifact(runID, name string) bool
- func (m *Manager) ListArtifacts(runID string) ([]Info, error)
- func (m *Manager) ListFiles(runID string) ([]string, error)
- func (m *Manager) LoadArtifact(runID, name string) ([]byte, error)
- func (m *Manager) LoadDiff(runID string) (string, error)
- func (m *Manager) LoadFile(runID, filename string) ([]byte, error)
- func (m *Manager) LoadJSON(runID, name string, v any) error
- func (m *Manager) LoadLintOutput(runID string) (*LintOutput, error)
- func (m *Manager) LoadReview(runID string) (*ReviewResult, error)
- func (m *Manager) LoadSpec(runID string) (string, error)
- func (m *Manager) LoadTestOutput(runID string) (*TestOutput, error)
- func (m *Manager) RunDir(runID string) string
- func (m *Manager) SaveArtifact(runID, name string, data []byte) error
- func (m *Manager) SaveDiff(runID string, diff string) error
- func (m *Manager) SaveFile(runID, filename string, data []byte) error
- func (m *Manager) SaveJSON(runID, name string, v any) error
- func (m *Manager) SaveLintOutput(runID string, output *LintOutput) error
- func (m *Manager) SaveReview(runID string, review *ReviewResult) error
- func (m *Manager) SaveSpec(runID string, spec string) error
- func (m *Manager) SaveTestOutput(runID string, output *TestOutput) error
- type RetentionConfig
- type ReviewFinding
- type ReviewMetrics
- type ReviewResult
- type Specification
- type TestCoverage
- type TestFailure
- type TestOutput
- type Type
Constants ¶
const ( ArtifactSpec = "spec.md" ArtifactImplementation = "implementation.diff" ArtifactReview = "review.json" ArtifactTestOutput = "test-output.json" ArtifactLintOutput = "lint-output.json" )
Standard artifact names
const ( SeverityCritical = "critical" SeverityError = "error" SeverityWarning = "warning" SeverityInfo = "info" )
FindingSeverity constants
const ( CategorySecurity = "security" CategoryPerformance = "performance" CategoryStyle = "style" CategoryLogic = "logic" CategoryTest = "test" )
FindingCategory constants
const ( VerdictApprove = "APPROVE" VerdictRequestChanges = "REQUEST_CHANGES" VerdictNeedsDiscussion = "NEEDS_DISCUSSION" )
ReviewVerdict constants
Variables ¶
var (
ErrArtifactNotFound = errors.New("artifact not found")
)
Artifact errors
var KnownTypes = map[string]Type{ "specification": {"specification", []string{".md"}, true, true}, "diff": {"diff", []string{".diff", ".patch"}, true, true}, "json": {"json", []string{".json"}, true, true}, "text": {"text", []string{".txt", ".log"}, true, true}, "code": {"code", []string{".go", ".py", ".js", ".ts", ".java", ".rb"}, true, true}, "binary": {"binary", []string{".png", ".jpg", ".jpeg", ".gif", ".pdf", ".zip", ".tar", ".gz"}, false, false}, }
KnownTypes maps type names to their definitions
Functions ¶
This section is empty.
Types ¶
type CleanupResult ¶
type CleanupResult struct {
Archived []string `json:"archived"`
Deleted []string `json:"deleted"`
Kept []string `json:"kept"`
Errors []string `json:"errors,omitempty"`
SpaceSaved int64 `json:"spaceSaved"`
}
CleanupResult summarizes cleanup actions
type Config ¶
type Config struct {
BaseDir string // Base directory for storage (default: ".devflow")
CompressAbove int64 // Compress artifacts larger than this (default: 10KB)
RetentionDays int // Days to keep artifacts (default: 30)
}
Config holds configuration for artifact management
type DiskUsageStats ¶
type DiskUsageStats struct {
RunCount int `json:"runCount"`
ArchiveCount int `json:"archiveCount"`
ActiveSize int64 `json:"activeSize"`
ArchiveSize int64 `json:"archiveSize"`
TotalSize int64 `json:"totalSize"`
}
DiskUsageStats contains disk usage statistics
type Info ¶
type Info struct {
Name string `json:"name"`
Size int64 `json:"size"`
Compressed bool `json:"compressed"`
CreatedAt time.Time `json:"createdAt"`
Type string `json:"type"`
}
Info contains metadata about a stored artifact
type LifecycleManager ¶
type LifecycleManager struct {
// contains filtered or unexported fields
}
LifecycleManager handles artifact lifecycle
func NewLifecycleManager ¶
func NewLifecycleManager(baseDir string, config RetentionConfig) *LifecycleManager
NewLifecycleManager creates a lifecycle manager
func (*LifecycleManager) Cleanup ¶
func (m *LifecycleManager) Cleanup(dryRun bool) (*CleanupResult, error)
Cleanup performs retention policy
func (*LifecycleManager) CleanupArchives ¶
func (m *LifecycleManager) CleanupArchives(dryRun bool) (*CleanupResult, error)
CleanupArchives removes archives older than retention period
func (*LifecycleManager) DeleteArchive ¶
func (m *LifecycleManager) DeleteArchive(runID string) error
DeleteArchive removes an archived run
func (*LifecycleManager) DiskUsage ¶
func (m *LifecycleManager) DiskUsage() (*DiskUsageStats, error)
DiskUsage returns disk usage statistics
func (*LifecycleManager) GetArchiveSize ¶
func (m *LifecycleManager) GetArchiveSize(runID string) (int64, error)
GetArchiveSize returns the size of an archive
func (*LifecycleManager) ListArchives ¶
func (m *LifecycleManager) ListArchives() ([]string, error)
ListArchives returns all archived run IDs
func (*LifecycleManager) RestoreArchive ¶
func (m *LifecycleManager) RestoreArchive(runID string) error
RestoreArchive restores an archived run
type LintIssue ¶
type LintIssue struct {
File string `json:"file"`
Line int `json:"line"`
Column int `json:"column,omitempty"`
Rule string `json:"rule"`
Severity string `json:"severity"` // error, warning
Message string `json:"message"`
Fixable bool `json:"fixable,omitempty"`
}
LintIssue represents a single lint issue
type LintOutput ¶
type LintOutput struct {
Passed bool `json:"passed"`
Tool string `json:"tool"` // ruff, eslint, golint, etc.
Issues []LintIssue `json:"issues,omitempty"`
Summary LintSummary `json:"summary"`
}
LintOutput represents linting results
type LintSummary ¶
type LintSummary struct {
TotalIssues int `json:"totalIssues"`
Errors int `json:"errors"`
Warnings int `json:"warnings"`
FixableCount int `json:"fixableCount"`
FilesChecked int `json:"filesChecked"`
}
LintSummary contains summary statistics
type Manager ¶
type Manager struct {
// contains filtered or unexported fields
}
Manager manages run artifacts
func NewManager ¶
NewManager creates an artifact manager with the given config
func (*Manager) ArtifactDir ¶
ArtifactDir returns the artifacts directory for a run
func (*Manager) DeleteArtifact ¶
DeleteArtifact removes an artifact
func (*Manager) EnsureRunDir ¶
EnsureRunDir creates the run directory structure
func (*Manager) GetArtifactInfo ¶
GetArtifactInfo returns info about a specific artifact
func (*Manager) HasArtifact ¶
HasArtifact checks if an artifact exists
func (*Manager) ListArtifacts ¶
ListArtifacts returns all artifacts for a run
func (*Manager) LoadArtifact ¶
LoadArtifact loads an artifact (handles compression transparently)
func (*Manager) LoadLintOutput ¶
func (m *Manager) LoadLintOutput(runID string) (*LintOutput, error)
LoadLintOutput loads lint output artifact
func (*Manager) LoadReview ¶
func (m *Manager) LoadReview(runID string) (*ReviewResult, error)
LoadReview loads a review result artifact
func (*Manager) LoadTestOutput ¶
func (m *Manager) LoadTestOutput(runID string) (*TestOutput, error)
LoadTestOutput loads test output artifact
func (*Manager) SaveArtifact ¶
SaveArtifact saves an artifact with automatic compression
func (*Manager) SaveLintOutput ¶
func (m *Manager) SaveLintOutput(runID string, output *LintOutput) error
SaveLintOutput saves lint output artifact
func (*Manager) SaveReview ¶
func (m *Manager) SaveReview(runID string, review *ReviewResult) error
SaveReview saves a review result artifact
func (*Manager) SaveTestOutput ¶
func (m *Manager) SaveTestOutput(runID string, output *TestOutput) error
SaveTestOutput saves test output artifact
type RetentionConfig ¶
type RetentionConfig struct {
RetentionDays int // Days to keep active runs
ArchiveAfterDays int // Days before archiving
ArchiveRetentionDays int // Days to keep archived runs
KeepFailed bool // Keep failed runs longer
KeepMinRuns int // Minimum runs to keep regardless of age
}
RetentionConfig defines retention policy
func DefaultRetentionConfig ¶
func DefaultRetentionConfig() RetentionConfig
DefaultRetentionConfig returns sensible defaults
type ReviewFinding ¶
type ReviewFinding struct {
File string `json:"file"`
Line int `json:"line,omitempty"`
EndLine int `json:"endLine,omitempty"`
Severity string `json:"severity"` // critical, error, warning, info
Category string `json:"category"` // security, performance, style, logic, test
Message string `json:"message"`
Suggestion string `json:"suggestion,omitempty"`
Code string `json:"code,omitempty"` // Code snippet
}
ReviewFinding represents a single review finding
type ReviewMetrics ¶
type ReviewMetrics struct {
LinesReviewed int `json:"linesReviewed"`
FilesReviewed int `json:"filesReviewed"`
TokensUsed int `json:"tokensUsed"`
Duration float64 `json:"durationSeconds,omitempty"`
}
ReviewMetrics contains metrics about the review
type ReviewResult ¶
type ReviewResult struct {
Approved bool `json:"approved"`
Verdict string `json:"verdict,omitempty"` // APPROVE, REQUEST_CHANGES, NEEDS_DISCUSSION
Summary string `json:"summary"`
Findings []ReviewFinding `json:"findings,omitempty"`
Metrics ReviewMetrics `json:"metrics,omitempty"`
}
ReviewResult represents the result of a code review
func (*ReviewResult) FindingsByFile ¶
func (r *ReviewResult) FindingsByFile() map[string][]ReviewFinding
FindingsByFile groups findings by file
func (*ReviewResult) FindingsBySeverity ¶
func (r *ReviewResult) FindingsBySeverity() map[string][]ReviewFinding
FindingsBySeverity groups findings by severity
func (*ReviewResult) HasCriticalFindings ¶
func (r *ReviewResult) HasCriticalFindings() bool
HasCriticalFindings returns true if any finding is critical
func (*ReviewResult) HasErrors ¶
func (r *ReviewResult) HasErrors() bool
HasErrors returns true if any finding is an error or higher
type Specification ¶
type Specification struct {
Title string `json:"title"`
Overview string `json:"overview"`
Requirements []string `json:"requirements,omitempty"`
Design string `json:"design,omitempty"`
APIChanges string `json:"apiChanges,omitempty"`
DBChanges string `json:"dbChanges,omitempty"`
TestPlan string `json:"testPlan,omitempty"`
Risks []string `json:"risks,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
Raw string `json:"raw,omitempty"` // Original markdown
}
Specification represents a generated specification
type TestCoverage ¶
type TestCoverage struct {
Percentage float64 `json:"percentage"`
Lines int `json:"lines"`
Covered int `json:"covered"`
ByPackage map[string]float64 `json:"byPackage,omitempty"`
}
TestCoverage represents code coverage data
type TestFailure ¶
type TestFailure struct {
Name string `json:"name"`
Package string `json:"package,omitempty"`
Message string `json:"message"`
File string `json:"file,omitempty"`
Line int `json:"line,omitempty"`
Output string `json:"output,omitempty"`
Expected string `json:"expected,omitempty"`
Actual string `json:"actual,omitempty"`
}
TestFailure represents a single test failure
type TestOutput ¶
type TestOutput struct {
Passed bool `json:"passed"`
TotalTests int `json:"totalTests"`
PassedTests int `json:"passedTests"`
FailedTests int `json:"failedTests"`
SkippedTests int `json:"skippedTests"`
Duration string `json:"duration"`
Failures []TestFailure `json:"failures,omitempty"`
Coverage *TestCoverage `json:"coverage,omitempty"`
}
TestOutput represents test execution results
func (*TestOutput) SuccessRate ¶
func (t *TestOutput) SuccessRate() float64
SuccessRate returns the percentage of tests that passed