Help us shape the future of Go! Take the 2026 Go Developer Survey

roadmap

package
v1.3.15 Latest Latest
Warning

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

Go to latest
Published: Oct 15, 2026 License: MIT Imports: 5 Imported by: 0

Documentation

Overview

Package roadmap reads docs/roadmap.sexp and renders ROADMAP.md from it.

The roadmap is data: one `(roadmap "v1" ...)` form read through pkg/sexp (nothing is evaluated), decoded here into typed records, and refused whole, every problem named, when a record is not exactly the shape below. tools/roadmap writes the rendered page; each repository that keeps one holds its committed ROADMAP.md to what Render makes of its committed sexp (here internal/docs), so the page is never written by hand (#4855 deleted the hand-written one). It is the one copy of the roadmap code: nova-sprint's roadmapdoc package was a renamed fork of it, and imports this package instead.

The shape:

(roadmap "v1"
 :title "<page title>"
 :text "<the page's opening paragraph>"
 :scheduled ((scheduled "<id>" :release "<vX.Y>" :title "..." :text "..." :date "YYYY-MM-DD") ...)
 :done ((done "<id>" :title "..." :text "..." :date "YYYY-MM-DD" [:kept (...)]) ...)
 :groups ((group "<id>" :title "..." :text "...") ...)
 :items ((item "<id>" :group "<group id>" :title "..." :text "..." :date "YYYY-MM-DD"
          [:why "..."] [:area "..."] [:exists "..."] [:cards <n>]
          [:origin "<where it came from: issue #n, PR #n, a card>"] [:release "<target release>"]
          [:kept (:<key> "<value>" ...)]) ...))

:kept holds the fields a move between docs/roadmap.sexp and docs/fixes.sexp carried that have no meaning where the record now is (an item's :why on a fix, a fix's :status on an item), each under a key naming where it came from (item-why, fix-status), so a move never drops one and a move back restores it. It is data for nova-work roadmap (nova-sprint's roadmap editor) and is not rendered.

Text values may be wrapped across lines in the file; Render joins every run of whitespace into one blank, so the page reads the same however the file is wrapped.

Index

Constants

View Source
const FixesFormat = "v1"

FixesFormat is the one format string the fixes form carries.

View Source
const Format = "v1"

Format is the one format string the roadmap form carries.

Variables

View Source
var Limits = sexp.Limits{MaxBytes: 10 << 20, MaxDepth: 8, MaxNodes: 10 << 20}

Limits bounds a roadmap read: a file of at most 10 MiB (owner 2026-10-15: no practical limit wanted; schema's roadmap passed 1 MiB; still bounded against a hostile file), the shape's depth with room to spare, and at most one atom per byte, so the byte bound is the one that binds.

Functions

func Render

func Render(doc *Doc, source string) string

Render returns the ROADMAP.md the document makes: the same bytes for the same document, every time.

func RenderFixes

func RenderFixes(fx *Fixes, source string) string

RenderFixes returns the FIXES.md the file makes: the same bytes for the same file, every time. Releases and their fixes keep the file's order.

Types

type Doc

type Doc struct {
	Title     string
	Text      string
	Scheduled []Note
	Done      []Note
	Groups    []Group
	Items     []Item
}

Doc is a decoded roadmap.

func Decode

func Decode(file string, data []byte) (*Doc, error)

Decode reads one roadmap file and returns it, or every shape problem of the file together in one error.

func (*Doc) GroupCount

func (doc *Doc) GroupCount() map[string]int

GroupCount returns the number of items under each group id.

type Fix

type Fix struct {
	ID, Release, Title, Text, Origin, Status string
	Kept                                     []Pair
}

Fix is one item of a point release: where it came from (a pull request, a card, a commit or a ledger line) and how far it has got.

type Fixes

type Fixes struct {
	Title, Text string
	Releases    []Release
	Items       []Fix
}

Fixes is a decoded fixes file.

func DecodeFixes

func DecodeFixes(file string, data []byte) (*Fixes, error)

DecodeFixes reads one fixes file and returns it, or every shape problem of the file together in one error.

type Group

type Group struct {
	ID, Title, Text string
}

Group is one heading of the roadmap; every item names the group it sits under.

type Item

type Item struct {
	ID, Group, Title, Text, Why, Date string
	Area, Exists                      string
	Cards                             int
	// Origin names where the item came from (an issue, a pull request, a card
	// moved out of the sprint); Release is the release it is aimed at, when one is.
	Origin, Release string
	Kept            []Pair
}

Item is one piece of work after the last scheduled release. Exists says what of it the code already has, so the item covers only the gap; Cards is how many open sprint cards the item replaces (each card is mapped to the item's id in the sprint's own record: card ids carry friend names, which a living file of this repository never does, docs/SPEC-CI.md#generality-text).

type Note

type Note struct {
	ID, Release, Title, Text, Date string
	Kept                           []Pair
}

Note is one record of work that is not on the roadmap: scheduled into a named release, or already done. Release is empty for a done note.

type Pair

type Pair struct {
	Key, Value string
}

Pair is one field a move carried under :kept: its key and its value, which may be empty (an empty value records that the field was absent).

type Release

type Release struct {
	ID, Status, Text, Date string
}

Release is one point release.

Jump to

Keyboard shortcuts

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