artifact

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 26, 2025 License: MIT Imports: 12 Imported by: 0

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

View Source
const (
	ArtifactSpec           = "spec.md"
	ArtifactImplementation = "implementation.diff"
	ArtifactReview         = "review.json"
	ArtifactTestOutput     = "test-output.json"
	ArtifactLintOutput     = "lint-output.json"
)

Standard artifact names

View Source
const (
	SeverityCritical = "critical"
	SeverityError    = "error"
	SeverityWarning  = "warning"
	SeverityInfo     = "info"
)

FindingSeverity constants

View Source
const (
	CategorySecurity    = "security"
	CategoryPerformance = "performance"
	CategoryStyle       = "style"
	CategoryLogic       = "logic"
	CategoryTest        = "test"
)

FindingCategory constants

View Source
const (
	VerdictApprove         = "APPROVE"
	VerdictRequestChanges  = "REQUEST_CHANGES"
	VerdictNeedsDiscussion = "NEEDS_DISCUSSION"
)

ReviewVerdict constants

Variables

View Source
var (
	ErrArtifactNotFound = errors.New("artifact not found")
)

Artifact errors

View Source
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

func NewManager(cfg Config) *Manager

NewManager creates an artifact manager with the given config

func (*Manager) ArtifactDir

func (m *Manager) ArtifactDir(runID string) string

ArtifactDir returns the artifacts directory for a run

func (*Manager) BaseDir

func (m *Manager) BaseDir() string

BaseDir returns the base directory

func (*Manager) DeleteArtifact

func (m *Manager) DeleteArtifact(runID, name string) error

DeleteArtifact removes an artifact

func (*Manager) EnsureRunDir

func (m *Manager) EnsureRunDir(runID string) error

EnsureRunDir creates the run directory structure

func (*Manager) FilesDir

func (m *Manager) FilesDir(runID string) string

FilesDir returns the generated files directory

func (*Manager) GetArtifactInfo

func (m *Manager) GetArtifactInfo(runID, name string) (*Info, error)

GetArtifactInfo returns info about a specific artifact

func (*Manager) HasArtifact

func (m *Manager) HasArtifact(runID, name string) bool

HasArtifact checks if an artifact exists

func (*Manager) ListArtifacts

func (m *Manager) ListArtifacts(runID string) ([]Info, error)

ListArtifacts returns all artifacts for a run

func (*Manager) ListFiles

func (m *Manager) ListFiles(runID string) ([]string, error)

ListFiles returns all generated files for a run

func (*Manager) LoadArtifact

func (m *Manager) LoadArtifact(runID, name string) ([]byte, error)

LoadArtifact loads an artifact (handles compression transparently)

func (*Manager) LoadDiff

func (m *Manager) LoadDiff(runID string) (string, error)

LoadDiff loads an implementation diff artifact

func (*Manager) LoadFile

func (m *Manager) LoadFile(runID, filename string) ([]byte, error)

LoadFile loads a generated file from the files subdirectory

func (*Manager) LoadJSON

func (m *Manager) LoadJSON(runID, name string, v any) error

LoadJSON loads and unmarshals a JSON artifact

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) LoadSpec

func (m *Manager) LoadSpec(runID string) (string, error)

LoadSpec loads a specification artifact

func (*Manager) LoadTestOutput

func (m *Manager) LoadTestOutput(runID string) (*TestOutput, error)

LoadTestOutput loads test output artifact

func (*Manager) RunDir

func (m *Manager) RunDir(runID string) string

RunDir returns the directory for a run

func (*Manager) SaveArtifact

func (m *Manager) SaveArtifact(runID, name string, data []byte) error

SaveArtifact saves an artifact with automatic compression

func (*Manager) SaveDiff

func (m *Manager) SaveDiff(runID string, diff string) error

SaveDiff saves an implementation diff artifact

func (*Manager) SaveFile

func (m *Manager) SaveFile(runID, filename string, data []byte) error

SaveFile saves a generated file to the files subdirectory

func (*Manager) SaveJSON

func (m *Manager) SaveJSON(runID, name string, v any) error

SaveJSON saves arbitrary JSON data as an artifact

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) SaveSpec

func (m *Manager) SaveSpec(runID string, spec string) error

SaveSpec saves a specification 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

type Type

type Type struct {
	Name         string
	Extensions   []string
	Compressible bool
	Searchable   bool
}

Type describes an artifact type

func InferType

func InferType(filename string) Type

InferType infers the artifact type from filename

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL