Documentation
¶
Overview ¶
Package facts merges the declared project.md layers with detection and the contract's defaults. Only facts with a fixed vocabulary become structure, so the binary is incomplete but never wrong; scaffold.go writes the prose here too, so its words cannot drift from the readers' vocabulary.
Index ¶
- Constants
- Variables
- func BuiltinPaces() map[string]Pace
- func CheckAgentKey(key string, steps []string) error
- func CheckCeiling(c Ceiling) []string
- func CheckPace(name string, p Pace) []string
- func FlowSteps[F ~[]string](flows map[string]F) []string
- func JudgeKind(flow []string, i int) string
- func LabeledEntries(entries, labels []string) []string
- func ParseDriverTimeout(value string) (time.Duration, error)
- func ParseStaleAfter(value string) (time.Duration, error)
- func Planless(flow []string) bool
- func ProjectPrefix(name string) string
- func ScopeVerify(cmds []VerifyDecl, changed []string) ([]VerifyPick, []VerifyDecl)
- func ShipEntries(flow []string) []string
- func ShipLabels(flow, labels []string) []string
- func SplitEntry(e string) (string, string)
- type By
- type Ceiling
- type Declared
- type Dial
- type Dials
- type Draft
- type Effective
- type Fact
- type Field
- type Flow
- type Labels
- type Migration
- type Pace
- type PaceSet
- func (s *PaceSet) Capped(name string) (Pace, map[string]Dial)
- func (s *PaceSet) CeilingOrigin(key string) string
- func (s *PaceSet) Exempt(name string) bool
- func (s *PaceSet) Lookup(name string) (Pace, error)
- func (s *PaceSet) Names() []string
- func (s *PaceSet) Over(paces map[string]Pace, origin func(name, key string) string)
- func (s *PaceSet) PaceProblems(flows map[string][]string) []string
- func (s *PaceSet) ResolveFlow(flowName string, flow []string, pace string) (Resolved, error)
- type Problem
- type Resolved
- type ResolvedEntry
- type Review
- type ReviewDecl
- type StandupDecl
- type Steps
- type TrackerDecl
- type VerifyDecl
- type VerifyPick
Constants ¶
const ( OriginDetected = "detected" OriginDefault = "default" OriginAbsent = "absent" // OriginJudgment is guidance the probe could not turn into commands OriginJudgment = "judgment" )
Origins an effective value can have. Declared origins are qualified by the layer label at build time: "declared (main)", "declared (worktree)".
const ( ReviewerBot = "bot" ReviewerHuman = "human" ReviewerCheck = "check" ArrivesComment = "issue comment" ArrivesInline = "inline review" ArrivesCheck = "check run" TriggerAutomatic = "automatic" TriggerManual = "manual" DonePosted = "posted" DoneMarker = "marker" DoneSubmitted = "submitted" DoneConcluded = "concluded" HandledReaction = "reaction" HandledMarker = "marker" HandledCheckbox = "checkbox" HandledThread = "thread resolved" )
The vocabularies, as the words the parser looks for.
const ( ManualComment = "comment" ManualRequest = "request" )
The manual triggers `f10 review trigger` can perform: a comment on the request, or a review requested from a login.
const AgentKeyDefault = "default"
AgentKeyDefault is the key the task's agent runs on.
const DefaultFlow = "plan implement pr"
DefaultFlow is the flow a project that declares none runs.
const DefaultPaceName = "medium"
DefaultPaceName is the pace an unnamed run takes when no layer names one.
const PaceFinishKey = "finish"
PaceFinishKey is the one key that names no flow entry: whether a run that would stop at an open PR goes on to finish.
const PaceOriginBuiltin = "built-in"
PaceOriginBuiltin is the origin of a dial f10 ships.
Variables ¶
var ErrHasFrontmatter = errors.New("already has a frontmatter block and nothing left to migrate")
ErrHasFrontmatter refuses a second migration.
var GenericSteps = []string{
"brainstorm", "capture", "catchup", "cleanup", "commit", "debug", "demo", "deploy", "explain", "fetch",
"finish", "handoff", "implement", "judge", "plan", "pr", "push", "resolve", "review", "standup",
}
GenericSteps is every generic step a flow entry may name, plus finish, which drive runs. A label never takes one of these names, so status and stats never show a step that did not run.
var StatusMoments = []string{"started", "shipped"}
StatusMoments are the moments tracker.status may name.
var TaskKinds = []string{"feature", "bug", "refactor", "spike"}
TaskKinds are the kinds a step key may be scoped by: `plan.bug` sets the plan step's profile for a bug. The words are the plan's Kind line.
Functions ¶
func BuiltinPaces ¶ added in v0.54.0
BuiltinPaces are the paces f10 ships. medium is empty: naming it runs every flow as declared, the way to switch a faster default off.
func CheckAgentKey ¶ added in v0.48.0
CheckAgentKey reports why key is no agents key: not `default`, not a step some flow names, or a kind scope outside TaskKinds. steps are the step names every flow names, merged; a map read outside a project (the user's file) passes nil and keeps any step word.
func CheckCeiling ¶ added in v0.54.0
CheckCeiling reports what is wrong with a ceiling, each line naming ceiling.<key>. A cap needs an order from fast to slow, so off, by and marker are refused.
func CheckPace ¶ added in v0.54.0
CheckPace reports what is wrong with one pace, each line naming paces.<name>.<key>.
func JudgeKind ¶ added in v0.43.0
JudgeKind is what the judge at entry i judges: the plan before any `implement`, the change after one.
func LabeledEntries ¶ added in v0.56.0
LabeledEntries is entries as written, each with its label.
func ParseDriverTimeout ¶ added in v0.46.0
ParseDriverTimeout reads a driver_timeout value, a positive Go duration like `45s` or `2m`.
func ParseStaleAfter ¶ added in v0.43.0
ParseStaleAfter reads a stale_after value, `10d` or `3w`.
func ProjectPrefix ¶ added in v0.38.0
ProjectPrefix derives a task id prefix from the project's name, since the host's letters would name every GitLab project GL. A name yielding nothing usable derives none, so f10 init leaves the Tracker section to a human.
func ScopeVerify ¶ added in v0.52.0
func ScopeVerify(cmds []VerifyDecl, changed []string) ([]VerifyPick, []VerifyDecl)
ScopeVerify splits the declared commands into those the changed files call for and those they do not, each in declared order.
func ShipEntries ¶ added in v0.43.0
ShipEntries is what /f10:ship runs: the flow after a leading `plan`.
func ShipLabels ¶ added in v0.56.0
ShipLabels is labels cut as ShipEntries cuts their flow.
func SplitEntry ¶ added in v0.43.0
SplitEntry is an entry's step and its argument, in either form: `review:local` and `review (local)` are both review and local.
Types ¶
type By ¶ added in v0.54.0
type By struct {
Local, CI, CIOptional bool
}
By is who a review entry runs: the local review, the CI review, or both. CIOptional is a `ci?`, which runs only where it can (Settle).
func ReviewBy ¶ added in v0.54.0
ReviewBy reads a review entry's argument: none, `local` or `host` the local review (`host` on the host's own code review), `ci` the CI review, `local+ci` both in either order, `ci?` marking the CI review optional. False for any other argument.
type Ceiling ¶ added in v0.54.0
type Ceiling struct {
Pace Pace `yaml:"-"` // read and written by the methods below
Except []string `yaml:"-"`
}
A Ceiling caps every pace but the ones Except names: a dial the pace sets faster than the ceiling's takes the ceiling's value. It is the project's alone, since a cap a user sets on themselves is just a pace.
func (Ceiling) MarshalYAML ¶ added in v0.54.0
MarshalYAML writes the dials and except side by side, as they are read.
type Declared ¶ added in v0.29.0
type Declared struct {
Visibility string `yaml:"visibility,omitempty"`
Storage string `yaml:"storage,omitempty"`
Layering string `yaml:"layering,omitempty"`
Tracker TrackerDecl `yaml:"tracker,omitempty"`
MergeMethod string `yaml:"merge_method,omitempty"`
Catchup string `yaml:"catchup,omitempty"`
CatchupStacked string `yaml:"catchup_stacked,omitempty"` // how a branch catches up with a base that is another task's branch
Traces string `yaml:"traces,omitempty"`
Lore string `yaml:"lore,omitempty"`
LoreGate string `yaml:"lore_gate,omitempty"` // what finish does with a failing lore check before a merge
StaleAfter string `yaml:"stale_after,omitempty"` // a task older than this is judged before it is planned
DriverTimeout string `yaml:"driver_timeout,omitempty"` // one driver verb's limit, a Go duration
ReviewTraces string `yaml:"review_traces,omitempty"` // the old spelling of traces, read and folded in
Flows map[string]Flow `yaml:"flows,omitempty"`
FlowByArea map[string]string `yaml:"flow_by_area,omitempty"` // an area, in Roles' plain words, to the flow its tasks run
DriveFinish string `yaml:"drive_finish,omitempty"`
DriveEnv []string `yaml:"drive_env,omitempty"` // environment keys a drive passes to its commands, beyond the built-in ones
Watch string `yaml:"watch,omitempty"` // what the daemon does for tasks no drive owns
WatchCatchup string `yaml:"watch_catchup,omitempty"` // the watcher also catches an undriven open PR up with its target
ReportBack string `yaml:"report_back,omitempty"`
Review ReviewDecl `yaml:"review,omitempty"`
Standup StandupDecl `yaml:"standup,omitempty"`
Verify []VerifyDecl `yaml:"verify,omitempty"` // verify commands, each scoped to the paths it checks
Agents map[string]string `yaml:"agents,omitempty"` // a step, `default` or `step.kind` to the agent profile it runs on
Paces map[string]Pace `yaml:"paces,omitempty"` // a pace's name to its dials, laid over the built-ins key by key
Pace string `yaml:"pace,omitempty"` // the pace a run takes when it names none
Ceiling *Ceiling `yaml:"ceiling,omitempty"` // the cap on every pace but the ones it excepts
// The keys flows replaces, read and converted with a warning.
Pipelines map[string]Steps `yaml:"pipelines,omitempty"`
Planless []string `yaml:"planless,omitempty"`
ByArea map[string]string `yaml:"pipeline_by_area,omitempty"`
DriveChain Steps `yaml:"drive_chain,omitempty"`
}
Declared is one layer's frontmatter.
type Dial ¶ added in v0.54.0
type Dial struct {
Name string `json:"name"`
Value string `json:"value"`
Origin string `json:"origin"`
Capped string `json:"capped,omitempty"` // what the pace had before the ceiling replaced it
}
A Dial is one resolved setting on an entry, with where it came from.
type Dials ¶ added in v0.54.0
type Dials struct {
Off bool `yaml:"-"`
On bool `yaml:"-"` // a ceiling's word: the step runs under every pace
Finish string `yaml:"-"` // on or off, the finish key only
By string `yaml:"by,omitempty"`
Rounds int `yaml:"rounds,omitempty"`
Depth string `yaml:"depth,omitempty"`
Effort string `yaml:"effort,omitempty"`
Marker string `yaml:"marker,omitempty"`
// contains filtered or unexported fields
}
Dials is one step's settings under a pace. Each field belongs to one step (dialSteps); a zero field sets nothing.
func (Dials) MarshalYAML ¶ added in v0.54.0
MarshalYAML writes the shorthand a word stands for, so a migrated finish or off reads back as it was written.
type Draft ¶
A Draft is one rendered project.md, with what it carries and the sections nothing detected.
type Effective ¶
type Effective struct {
Fields []Field `json:"fields"`
Unrecognized []Field `json:"unrecognized,omitempty"`
// The fixed-vocabulary sub-facts.
Layering string `json:"layering"`
Visibility string `json:"visibility"`
Storage string `json:"storage"`
TrackerKind string `json:"trackerKind,omitempty"`
IDPrefix string `json:"idPrefix,omitempty"` // "ABC", "F10" - the task id format's letters
IDPrefixOrigin string `json:"idPrefixOrigin,omitempty"` // "declared (<layer>)" or "derived from project name <name>"
IDPrefixDerived bool `json:"idPrefixDerived,omitempty"` // the prefix came from the project's name, not a declaration
// PriorityLabels is tracker.priority inverted: a lower-cased host label
// to the level it carries; nil when none is declared.
PriorityLabels map[string]string `json:"priorityLabels,omitempty"`
// TitleTemplate is tracker.title, the template a task's title is written
// through on the tracker; "" when none is declared, and titles stay bare.
TitleTemplate tasktitle.Template `json:"titleTemplate,omitempty"`
// TrackerStatus is tracker.status: `started` and `shipped` to the
// tracker's own word; nil when none is declared, and f10 moves no status.
TrackerStatus map[string]string `json:"trackerStatus,omitempty"`
// The remote review's four facts (review.go); zero when Review declares
// no remote reviewer.
Review Review `json:"review"`
// The rest of the typed facts (resolve.go). MergeMethod "" means none
// declared: finish asks the repo.
MergeMethod string `json:"mergeMethod,omitempty"`
Catchup string `json:"catchup"`
CatchupStacked string `json:"catchupStacked"` // catchup_stacked: the method for a base that is another task's branch
Traces bool `json:"traces"` // traces: on; a step's commits carry trailers, the squash commit keeps the task, a review or judge after the PR leaves a status and a comment
Lore string `json:"lore"` // local: lore under the storage root; committed: .lore/ at the checkout root
LoreGate string `json:"loreGate"` // lore_gate: warn or block, what f10 finish does with a failing lore check before a merge
StaleAfter string `json:"staleAfter,omitempty"` // stale_after: a task older than this is judged before it is planned; "" is off
DriverTimeout time.Duration `json:"driverTimeout"` // driver_timeout: one driver verb's limit
Flows map[string][]string `json:"flows"` // a flow's name to its entries, in the colon form
FlowLabels map[string][]string `json:"flowLabels,omitempty"` // a flow's name to its entries' display labels by index; only flows with one
FlowByArea map[string]string `json:"flowByArea,omitempty"` // flow_by_area: an area to the flow its tasks run
DriveFinish bool `json:"driveFinish"` // drive_finish: f10 drive ends each task with finish
DriveEnv []string `json:"driveEnv,omitempty"` // drive_env: environment keys a drive passes on, beyond the built-in ones
Watch string `json:"watch"` // watch: report, finish or off, for tasks no drive owns; finish unless declared
WatchCatchup bool `json:"watchCatchup"` // watch_catchup: on; a watch pass also catches an undriven open PR up with its target and pushes it
ReportBack bool `json:"reportBack"` // report_back: a ship run posts its shipment on the task; on unless declared off
UpkeepPaths []string `json:"upkeepPaths,omitempty"` // standup.upkeep: globs on top of the defaults
// Verify is the frontmatter's verify list, which f10 config verify
// scopes to the diff; VerifyOrigin names its layer. Nil when undeclared,
// and the Verify field is the whole of verify.
Verify []VerifyDecl `json:"verify,omitempty"`
VerifyOrigin string `json:"verifyOrigin,omitempty"`
// Agents is agents: a step, `default` or `step.kind` to the profile it
// runs on, the layers merged key by key; AgentsOrigin names each key's
// layer. Nil when none is declared.
Agents map[string]string `json:"agents,omitempty"`
AgentsOrigin map[string]string `json:"agentsOrigin,omitempty"`
// Paces is the project's paces: merged across its layers per pace and
// key, PacesOrigin naming each <pace>.<key>'s layer; nil when none is
// declared. Pace is the declared default, "" for none.
Paces map[string]Pace `json:"paces,omitempty"`
PacesOrigin map[string]string `json:"pacesOrigin,omitempty"`
Pace string `json:"pace,omitempty"`
PaceOrigin string `json:"paceOrigin,omitempty"`
// Ceiling caps every pace but those CeilingExcept names, merged key by
// key across the layers; nil when none is declared.
Ceiling Pace `json:"ceiling,omitempty"`
CeilingOrigin map[string]string `json:"ceilingOrigin,omitempty"`
CeilingExcept []string `json:"ceilingExcept,omitempty"`
CeilingExceptOrigin string `json:"ceilingExceptOrigin,omitempty"`
// Facts is every typed value with its origin; Problems what is wrong
// with how they were declared.
Facts []Fact `json:"facts"`
Problems []Problem `json:"problems,omitempty"`
// contains filtered or unexported fields
}
Effective is the merged, attributed view of a project's configuration.
func Build ¶
Build merges the declared layers with detection and the contract's defaults into one attributed view.
func (*Effective) Errors ¶ added in v0.29.0
Errors are the problems that stop a command, joined for its message.
func (*Effective) Flow ¶ added in v0.43.0
Flow is the named flow, in any case, and whether it is declared.
type Fact ¶ added in v0.29.0
type Fact struct {
Key string `json:"key"`
Value string `json:"value"`
Origin string `json:"origin"`
}
A Fact is one typed value and where it came from.
type Field ¶
type Field struct {
Name string `json:"name"`
Value string `json:"value"`
Prose bool `json:"prose,omitempty"` // multi-line prose, not a scalar
Origin string `json:"origin"` // "detected", "declared (<layer>)", "default", "judgment", "absent"
Source string `json:"source,omitempty"` // file for declared, evidence for detected
}
A Field is one effective configuration value with its provenance.
type Flow ¶ added in v0.43.0
type Flow []string
Flow is one declared flow's entries as written: a list, or one string split on whitespace and arrows, never on commas, which an argument may hold. The old `review (local)` form stays one entry until normalizeEntry.
func (Flow) MarshalYAML ¶ added in v0.43.0
MarshalYAML writes the flow as one space-separated string, the shape f10 init --migrate leaves.
type Labels ¶ added in v0.38.0
type Labels []string
Labels is a list of label names, written as a YAML list or as one string.
type Migration ¶ added in v0.29.0
type Migration struct {
Content string
Moved []string // the frontmatter keys written
Superseded []string // "<key>: <where in the prose>"
Notes []string // advice the move raised, such as a ceiling for drive_finish off
}
A Migration is what `f10 init --migrate` makes of one project.md, with the prose each moved fact came from, for the user to delete.
type PaceSet ¶ added in v0.54.0
type PaceSet struct {
Remote bool // Review declares a remote reviewer, which an optional CI review needs
Paces map[string]Pace
Origins map[string]string // <pace>.<key> to the layer that set it
Default string // pace: the pace a run takes when it names none; "" for none
DefaultOrigin string
Ceiling Pace // the project's cap on every pace Except does not name
CeilingOrigins map[string]string // <key> to the layer that set it
Except []string
ExceptOrigin string
}
PaceSet is every pace a run can name, merged key by key: the built-ins, the user's ~/.f10/paces.md, then the project's paces.
func (*PaceSet) Capped ¶ added in v0.54.0
Capped is the pace with the ceiling laid on, and each replaced dial keyed `<step>.<dial>` (bare finish). Silence on finish or rounds is the faster default, so it is capped; silence on effort leaves the agents map alone.
func (*PaceSet) CeilingOrigin ¶ added in v0.54.0
CeilingOrigin is how a dial the ceiling set names its source.
func (*PaceSet) Exempt ¶ added in v0.54.0
Exempt says whether the ceiling leaves the named pace alone.
func (*PaceSet) Lookup ¶ added in v0.54.0
Lookup is the named pace, and an error listing the names when none is.
func (*PaceSet) Over ¶ added in v0.54.0
Over lays paces on the set, key by key: a layer tuning fast's review keeps the lower layer's judge. An empty pace still declares its name.
func (*PaceSet) PaceProblems ¶ added in v0.54.0
PaceProblems resolves every flow under every pace and reports each pace that breaks one, so a broken pace shows before a run picks it.
func (*PaceSet) ResolveFlow ¶ added in v0.54.0
ResolveFlow lays the named pace on a flow. An entry argument beats the pace for the dial it expresses (review:local fixes by), and the pace beats the step's own default. No pace ("") leaves the flow as declared, an optional CI review settled.
type Problem ¶ added in v0.29.0
A Problem is something wrong with the declaration. An error stops the commands that act on facts; a warning is shown and nothing else.
type Resolved ¶ added in v0.54.0
type Resolved struct {
Flow string `json:"flow"`
Pace string `json:"pace,omitempty"`
Entries []ResolvedEntry `json:"entries"`
Finish *Dial `json:"finish,omitempty"` // set only when the pace says and the run ends at a PR
}
Resolved is a flow under a pace.
func (Resolved) Changed ¶ added in v0.54.0
Changed reports a resolution that differs from the declared flow.
func (Resolved) Labeled ¶ added in v0.56.0
Labeled is the entries that run as written, each with its label: the list /f10:ship runs and passes to its badge.
func (Resolved) WithLabels ¶ added in v0.56.0
WithLabels is r with each entry given its label, by index.
type ResolvedEntry ¶ added in v0.54.0
type ResolvedEntry struct {
Entry string `json:"entry"` // as it runs: review:local when the pace named who reviews
Declared string `json:"declared"`
Step string `json:"step"`
Label string `json:"label,omitempty"` // the entry's display name, from its [label]
Skipped string `json:"skipped,omitempty"` // why it does not run: the pace's off, or an optional CI review dropped; "" when it runs
Dials []Dial `json:"dials,omitempty"`
}
A ResolvedEntry is one flow entry as a pace leaves it.
type Review ¶ added in v0.26.0
type Review struct {
Reviewer string `json:"reviewer,omitempty"` // the identity: a login, or a check's name
ReviewerKind string `json:"reviewerKind,omitempty"` // bot | human | check
Arrives string `json:"arrives,omitempty"` // issue comment | inline review | check run
Trigger string `json:"trigger,omitempty"` // automatic | manual | automatic, manual
TriggerHow string `json:"triggerHow,omitempty"` // the rest of the line: how a human fires it
ManualHow string `json:"manualHow,omitempty"` // the manual part alone, when the line names both
Done string `json:"done,omitempty"` // posted | marker | submitted | concluded
DoneText string `json:"doneText,omitempty"` // the marker's text
Handled string `json:"handled,omitempty"` // reaction | marker | checkbox | thread resolved
HandledText string `json:"handledText,omitempty"` // the reaction's emoji, or the marker's text
Settled string `json:"settled,omitempty"` // reaction | marker
SettledText string `json:"settledText,omitempty"` // the reaction's emoji, or the marker's text
// contains filtered or unexported fields
}
A Review is the parsed remote-review contract. The zero value means the section declares no remote reviewer, which is the common case.
func (Review) Manual ¶ added in v0.43.0
Manual is how the manual trigger fires: the manual part of a line naming both, else the whole how, so a code span describing the automatic half is never posted.
func (Review) ManualAction ¶ added in v0.38.0
ManualAction is the manual how as a kind and its text: a comment posting the first code span, or a review requested from the span's login. Both need the span, since a word guessed from prose could reach a real account.
type ReviewDecl ¶ added in v0.29.0
type ReviewDecl struct {
Reviewer string `yaml:"reviewer,omitempty"`
Arrives string `yaml:"arrives,omitempty"`
Trigger string `yaml:"trigger,omitempty"`
Done string `yaml:"done,omitempty"`
Settled string `yaml:"settled,omitempty"`
}
ReviewDecl is the remote review's facts in the prose items' vocabulary, so the same sub-parsers read both.
type StandupDecl ¶ added in v0.33.0
type StandupDecl struct {
Upkeep []string `yaml:"upkeep,omitempty"`
}
StandupDecl lists paths that, alone in a commit, make it upkeep, on top of the lockfiles and generated files standup already knows.
type Steps ¶ added in v0.29.0
type Steps []string
Steps is an ordered list of names, written as a YAML list or as one `a → b → c` string.
type TrackerDecl ¶ added in v0.29.0
type TrackerDecl struct {
Kind string `yaml:"kind,omitempty"`
ID string `yaml:"id,omitempty"`
Priority map[string]Labels `yaml:"priority,omitempty"`
Status map[string]string `yaml:"status,omitempty"`
Title string `yaml:"title,omitempty"`
}
TrackerDecl is the frontmatter's tracker key. Priority maps a contract level to host labels, since issues have no priority field of their own.
type VerifyDecl ¶ added in v0.52.0
VerifyDecl is one verify command and the paths it checks, in standup's glob syntax; a command with no paths runs on every diff.
type VerifyPick ¶ added in v0.52.0
type VerifyPick struct {
VerifyDecl
Pattern string
File string
}
A VerifyPick is a declared command the diff calls for, with the pattern and the changed file that matched; both are "" for a command with no paths.