Documentation
¶
Overview ¶
Package facts interprets the declared project.md layers, merges them with the detection probes and the contract's defaults, and attributes every effective value to its origin. It is the one component of f10 allowed to interpret instruction prose - bin/f10-load-project.sh stays a concatenator.
Interpretation stays shallow: only the sub-facts with a fixed vocabulary (Layering, Visibility, Storage, the tracker kind and its id prefix, the remote review's four facts) become structure; everything else is shown as the declared prose, attributed but unparsed. The binary may be incomplete, never wrong - what it cannot place it shows as-is instead of guessing.
It writes that prose too, in scaffold.go: `f10 init` renders detection as a project.md. Reader and writer share a package so the vocabulary one keys on and the words the other emits cannot drift apart.
Index ¶
- Constants
- Variables
- func JudgeKind(flow []string, i int) 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 ReviewHalves(arg string) (bool, bool)
- func ShipEntries(flow []string) []string
- func SplitEntry(e string) (string, string)
- type Declared
- type Draft
- type Effective
- type Fact
- type Field
- type Flow
- type Labels
- type Migration
- type Problem
- type Review
- type ReviewDecl
- type StandupDecl
- type Steps
- type TrackerDecl
Constants ¶
const ( OriginDetected = "detected" OriginDefault = "default" OriginAbsent = "absent" )
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 DefaultFlow = "plan implement pr"
DefaultFlow is the flow a project that declares none runs.
Variables ¶
var ErrHasFrontmatter = errors.New("already has a frontmatter block and nothing left to migrate")
ErrHasFrontmatter refuses a second migration.
var StatusMoments = []string{"started", "shipped"}
StatusMoments are the moments tracker.status may name.
Functions ¶
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 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, for a project that declares no id format. The host's letters would name every GitLab project GL; the project's own name says which project in a branch or a plan filename. A short name with a digit keeps its letters (f10 -> F10, r3 -> R3), several segments give initials (git-undo -> GU), one word gives its first three characters (herdr -> HER). A name that yields nothing usable (one letter, a leading digit) derives no prefix, so only explicit ids are accepted and f10 init leaves the Tracker section to a human.
func ReviewHalves ¶ added in v0.43.0
ReviewHalves is which halves a review entry's argument runs: none or `local` the local review, `ci` the remote one, `local+ci` both, in either order. Neither for any other argument.
func ShipEntries ¶ added in v0.43.0
ShipEntries is what /f10:ship runs: the flow after a leading `plan`.
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 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"`
// 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 Draft ¶
A Draft is one rendered project.md: the markdown, the frontmatter keys and prose sections it carries, and the sections left out because nothing detected them.
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
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
// 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.
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", "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 YAML list, or one string split on whitespace and arrows, never on commas, which an entry's argument may hold. The old `review (local)` form stays one entry here; normalizeEntry turns it into `review:local`.
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>"
}
A Migration is what `f10 init --migrate` makes of one project.md: the file with its facts in a frontmatter block on top, and the prose each moved fact came from, for the user to delete.
func Migrate ¶ added in v0.29.0
Migrate reads the facts one project.md declares in prose, with the same readers the fallback uses, and puts them in a frontmatter block above the untouched file. Only what the file declares moves: defaults and detection stay out, so the block says no more than the prose did. A file that already has a block gets its old keys rewritten: pipelines, planless, pipeline_by_area and drive_chain into flows, old-form entries into the colon form, review_traces into traces; and every prose fact the block does not declare yet added to it.
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 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 reads the manual how as the kind and its text: a comment posting the first code span (`comment `@claude review“), or a review requested from the span's login. Both need the code span: a request to a word guessed from prose would reach a real account. false when the trigger is not manual or the how reads as neither. Reading it is what lets a flow run post it.
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 four facts and the optional settled mark, in the vocabulary the prose items use, so the same sub-parsers read both.
type StandupDecl ¶ added in v0.33.0
type StandupDecl struct {
Upkeep []string `yaml:"upkeep,omitempty"`
}
StandupDecl is what `f10 standup` reads: the paths that, alone in a commit, make it upkeep, on top of the lockfiles, generated files and snapshots it knows (schema dumps, a project's own codegen output).
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 tracker's kind, its task id format (`FT-###`), the priority map for host issues, which have no priority field of their own (a level of the driver contract's vocabulary to the labels that carry it), the status map: a moment f10 reports, `started` or `shipped`, to the tracker's own word for it, and the title template (`{id}: {title}`).