spec

package
v0.54.1 Latest Latest
Warning

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

Go to latest
Published: Mar 12, 2026 License: BSD-2-Clause Imports: 16 Imported by: 0

Documentation

Overview

Package spec handles specification file loading, status management, and listing.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AutoBranchName

func AutoBranchName(name string) string

AutoBranchName generates a canonical branch name from a spec file's basename (without .md extension). If the name has a numeric prefix, it returns "dark-factory/spec-NNN". Otherwise it returns "dark-factory/" + sanitized name.

func NormalizeSpecFilename

func NormalizeSpecFilename(ctx context.Context, name string, dirs ...string) (string, error)

NormalizeSpecFilename assigns a sequential numeric prefix to name if it does not already have one. Scans all given dirs for .md files, finds the highest existing numeric prefix across all dirs, and returns fmt.Sprintf("%03d-%s", highest+1, name) for unnumbered names. If name already has a valid numeric prefix, it is returned unchanged.

func ValidateBranchName

func ValidateBranchName(ctx context.Context, branch string) error

ValidateBranchName returns an error if branch contains characters unsafe for git checkout. An empty branch is always valid (the field is optional).

Types

type AutoCompleter

type AutoCompleter interface {
	CheckAndComplete(ctx context.Context, specID string) error
}

AutoCompleter checks if all linked prompts are completed and marks the spec as completed.

func NewAutoCompleter

func NewAutoCompleter(
	queueDir, completedDir, specsInboxDir, specsInProgressDir, specsCompletedDir string,
	currentDateTimeGetter libtime.CurrentDateTimeGetter,
	projectName string,
	n notifier.Notifier,
) AutoCompleter

NewAutoCompleter creates a new AutoCompleter.

type Frontmatter

type Frontmatter struct {
	Status    string   `yaml:"status"`
	Tags      []string `yaml:"tags,omitempty"`
	Approved  string   `yaml:"approved,omitempty"`
	Prompted  string   `yaml:"prompted,omitempty"`
	Verifying string   `yaml:"verifying,omitempty"`
	Completed string   `yaml:"completed,omitempty"`
	Branch    string   `yaml:"branch,omitempty"`
	Issue     string   `yaml:"issue,omitempty"`
}

Frontmatter represents the YAML frontmatter in a spec file.

type Lister

type Lister interface {
	List(ctx context.Context) ([]*SpecFile, error)
	Summary(ctx context.Context) (*Summary, error)
}

Lister lists spec files from a directory.

func NewLister

func NewLister(currentDateTimeGetter libtime.CurrentDateTimeGetter, dirs ...string) Lister

NewLister creates a new Lister that scans the given directories.

type SpecFile

type SpecFile struct {
	Path        string
	Frontmatter Frontmatter
	Name        string // filename without extension
	Body        []byte
	// contains filtered or unexported fields
}

SpecFile represents a loaded spec file with frontmatter and body.

func Load

func Load(
	ctx context.Context,
	path string,
	currentDateTimeGetter libtime.CurrentDateTimeGetter,
) (*SpecFile, error)

Load reads a spec file from disk, parsing frontmatter and body.

func (*SpecFile) MarkCompleted

func (s *SpecFile) MarkCompleted()

MarkCompleted sets the spec status to completed.

func (*SpecFile) MarkVerifying

func (s *SpecFile) MarkVerifying()

MarkVerifying sets the spec status to verifying.

func (*SpecFile) Save

func (s *SpecFile) Save(ctx context.Context) error

Save writes the spec file back to disk.

func (*SpecFile) SetBranchIfEmpty

func (s *SpecFile) SetBranchIfEmpty(branch string)

SetBranchIfEmpty sets the branch in the frontmatter only if it is not already set.

func (*SpecFile) SetStatus

func (s *SpecFile) SetStatus(status string)

SetStatus sets the status field in the frontmatter and stamps the matching timestamp once.

func (*SpecFile) SpecNumber

func (s *SpecFile) SpecNumber() int

SpecNumber returns the numeric prefix of the spec file name. Returns -1 if the name has no numeric prefix.

type Status

type Status string

Status represents the lifecycle state of a spec.

const (
	// StatusDraft indicates the spec has been written but not yet reviewed.
	StatusDraft Status = "draft"
	// StatusApproved indicates the spec has been reviewed and approved.
	StatusApproved Status = "approved"
	// StatusPrompted indicates prompts have been generated from the spec.
	StatusPrompted Status = "prompted"
	// StatusVerifying indicates all prompts completed, awaiting human verification.
	StatusVerifying Status = "verifying"
	// StatusCompleted indicates human verified all acceptance criteria.
	StatusCompleted Status = "completed"
)

type Summary

type Summary struct {
	Draft                  int
	Approved               int
	Prompted               int
	Verifying              int
	Completed              int
	Total                  int
	LinkedPromptsCompleted int `json:"linked_prompts_completed,omitempty"`
	LinkedPromptsTotal     int `json:"linked_prompts_total,omitempty"`
}

Summary holds counts of specs grouped by status.

Jump to

Keyboard shortcuts

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