8000 Releases · lolay/nowline · GitHub
[go: up one dir, main page]

Skip to content

Releases

v0.12.1

Choose a tag to compare

@github-actions github-actions released this 04 Nov 04:06

Fixed

  • The GitHub Action installs @nowline/cli into a directory under $RUNNER_TEMP and adds it to PATH instead of running npm install -g, so it works on a stock ubuntu-latest runner without actions/setup-node (#243).

v0.12.0

Choose a tag to compare

@github-actions github-actions released this 04 Nov 02:42

Added

  • GitHub Action: now input sets the now-line date (- hides it, or a date pins it), so a committed image of an unchanged roadmap renders byte-identical and the commit step skips it. Without it the now-line defaults to today and the image changes daily.
  • GitHub Action: args input appends extra arguments to every nowline call, for CLI options the action has no input for.
  • GitHub Action: changed output, 'true' when any file changed and 'false' otherwise.

Fixed

  • NL.E0004 (at least one swimlane) counts swimlanes from roadmap:merge includes and roadmap:isolate regions, so a roadmap whose content all comes from includes validates (#235).
  • Label chips show the label's title, falling back to its id when there is no title, matching size and status chips. Previously the id won whenever both were set, so label team-web "web" painted team-web.
  • GitHub Action: changed-files lists only files whose content changed. A diagram that renders byte-identical to the file on disk is no longer rewritten or listed, so a step gated on changed-files != '' stops running on every build.

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 06:08

Added

  • --include-root <dir> confines includes to a directory: every include, at any depth, must be a relative path that resolves, symlinks followed, inside <dir>, or it is NL.E0208 and nothing is read. With stdin, includes resolve against <dir> instead of the working directory, and diagnostics in an included file name it relative to <dir>.
  • --no-includes turns includes off: every include is NL.E0209 ("Includes are not supported in this context") and nothing is read from disk. For a service that validates untrusted source on stdin.
  • An include chain deeper than 16 includes stops with NL.E0210, so resolution is bounded even through a symlinked directory that contains itself.

Fixed

  • An include that cannot be read (missing file, directory, permission denied, or not a .nowline file) is now error NL.E0203 on the include line, exit 1, instead of exit 3 ("output error") with an OS message that named the absolute path. The other include errors are coded too, on the same line: a cycle NL.E0204 (caught before the file is read again), a duplicate include NL.E0205, an isolate without a roadmap NL.E0206, and a start: mismatch NL.E0207. They are reported with the wave-rule diagnostics instead of hiding them, in the CLI, --serve, the export kernel (IncludeResolveError), MCP (validate and render now report them) and the browser (rows carry the code and the path's column, not include).
  • A misspelled wave: value (NL.E1101) now gets the bare wave id as its suggestion (build, not wave:build () in --diagnostic-format json, the text output's "did you mean", and the MCP server's diagnostics, in every locale. Coded diagnostics take their suggestion from the message arguments instead of parsing the rendered message.
  • Text diagnostics no longer repeat the suggestion: a message like Did you mean "status"? used to get an extra English — did you mean 'status'? appended, even under --locale=fr.

Security

  • A caller that validates untrusted source can now stop includes from reading other files, with --no-includes or --include-root. By default, as before, an include from stdin resolves against the working directory and may read any .nowline file the process can, and a parse error in that file quotes its first token; a hosted validator should pass one of the two flags.

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 22:55
b869f72

Added

  • Agent plugin for the MCP server: this repository is now a plugin marketplace, so Claude Code users can run /plugin install nowline --marketplace lolay/nowline (GitHub Copilot CLI and Codex read the same marketplace). In Codex, register the server with nowline --mcp-install codex instead: Codex starts plugin servers in its plugin cache and doesn't send MCP roots, so the plugin's file tools can't find your project.

Changed

  • MCP server: without --root, @nowline/mcp and nowline --mcp now resolve file paths against the roots the client advertises over MCP (relative paths against the first root, every root allowed) and follow notifications/roots/list_changed, falling back to the working directory when the client has no roots.

Fixed

  • gemini-extension.json reports the current release version; it had stayed at 0.8.5.

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 23 Oct 06:17

Added

  • @nowline/core — waves: wave declarations and the wave: property (milestone m2o, specs/waves.md): a roadmap can declare ordered waves (wave build "Build", optionally after:<anchor | dated milestone | YYYY-MM-DD> as a start floor), and item, group and parallel join one with wave:build, inherited by descendants. A wave is a strict barrier across every swimlane: no item in the next wave starts before every item in this one has ended. wave is a new keyword, but the bare word stays a valid identifier and value everywhere a v1 file could already use it (item wave, after:wave, labels:[wave], style:wave), and the JSON AST of existing files is unchanged. The canonical printer prints wave declarations and orders wave: between owner: and after:.
  • @nowline/core — wave validation (NL.E1100–E1106, NL.W1100–W1101, NL.W0702): the validator checks wave declarations (a wave needs an id; before:, date:, duration: and other span keys are rejected; a wave's after: accepts only anchors, dated milestones or one ISO date), wave: values (exactly one wave declared earlier, only on item / group / parallel, a descendant cannot disagree with its container, never on a default line), and the wave order. NL.E1103 reports work that could never start because the lane or group order, an after:, a parallel join, or a chain through background work forces it past the end of its own wave, once per root cause with the fix in the message. NL.W1100 flags a before: the waves make impossible to meet, and NL.W1101 flags after: / before: references layout ignores (later swimlanes, later in the same flow, floating milestones, an enclosing container), which matter more once waves move every lane's columns. Messages ship in English and French. @nowline/core exports the pure rule functions (checkWaveDeclarations, evaluateWaveProperties, evaluateWaveOrder) and membership helpers (ownWaves, assignWaves, waveFloorDate) for the include resolver, layout and editors.
  • @nowline/core + @nowline/export + @nowline/cli + @nowline/browser + @nowline/mcp — waves across includes (include rule 12, NL.E0202, NL.W0701): every merge or isolate include that carries a roadmap, swimlanes or waves must declare the same waves, in the same order, with the same resolved start floors as the file that includes it (NL.E0202, reported on the include line; both directions are errors). A wave whose title or presentation differs is a warning (NL.W0701) and the including file's definition wins. Waves never merge, so diamond includes produce no shadow warnings. The include resolver also runs the wave rules on included files, which are parsed without validation, and runs the wave-order check over the merged lanes and each isolated region, reporting at the included file's path and line. Coded resolver diagnostics (ResolveDiagnostic.code / args, plus a rule: 'wave' marker) are reported like validator diagnostics everywhere: nowline exits 1 with the file and line, includes them in the --diagnostic-format json document and localizes them with --locale; --serve, the browser diagnostics table and the MCP validate / render / export tools show them with their codes. Include errors without a code (a missing file, a circular include, a start: mismatch) keep their exact output and exit 3, and take precedence when both occur. @nowline/export adds IncludeResolveError and an onResolveDiagnostics input; @nowline/core exports buildWavePlan, localizeResolveDiagnostic and isRoutedResolveDiagnostic.
  • @nowline/layout — wave barriers in the schedule (NL.W1002, NL.I1006, NL.I1007): layout places every member of wave k+1 at or after the end of every member of wave k, across all swimlanes and isolated include regions, so a wave opens for every lane at the instant the slowest member of the previous wave ends and lanes that finish early idle at the boundary. Items with no wave are background work: never held back, never extending a wave, but still pushing later items in their own lane. A wave's after: floor holds its start back to an anchor, a dated milestone or a date, leaving a gap. after:<wave> means the end of that wave, so a floating milestone … after:build sits exactly on the boundary; wave references draw no dependency or slack arrows. The pixel layout, the date-window sizing and scheduleRoadmap (used by the XLSX export) apply the same barrier, and a wave past length: grows the window. The positioned model gains waves (span, dates, member count, the member that holds each barrier, the floor that set a gap) and waveSolve, items gain waveRole (member / background), and milestones gain onWaveBoundary / overrunByWave; RoadmapSchedule gains waves. New layout insights: the barrier passes did not settle (NL.W1002), empty waves (NL.I1006, one message naming every empty wave: Waves "abc" and "xyz" won't be displayed: they have no items assigned.), and a wave overrunning a dated milestone that waits for it (NL.I1007). Roadmaps without waves lay out exactly as before.
  • @nowline/layout + @nowline/renderer — waves in the picture: a roadmap with waves gets a 20 px wave strip under the date header, with one cell per wave (title, falling back to the id, a shortened title, then #k when the column is narrow; a tooltip with its dates and the member that holds the barrier), and a 2 px teal boundary line at every barrier from the strip down through the last lane. Lanes that finish early show their idle time up to the boundary. Background work (items without a wave) is hatched, with a dashed crossing mark where a boundary runs across it and a Background (no wave) tooltip. A wave with no items is not drawn, though it still schedules (its after: floor still holds later waves back), and when no wave has items nothing about waves is drawn: no strip, boundaries, hatch or legend. A start-floor gap shows its floor reference, and a wave whose floor is a date shows the calendar glyph at the left of its strip cell, with the date on hover. A milestone that sits exactly on a boundary keeps its diamond but drops its cut line; a dated milestone a wave overruns slips like one an item overruns. A wave's style: can tint its column (bg), colour its boundary (fg), set its label colour (text) and dash its boundary (border). An untitled, unstyled group wave:x draws nothing, no bracket and no label, even when it has an id. A legend under the chart explains the background hatch, and a shortened wave label keeps its full title in its cell's tooltip. Isolated include regions re-draw the boundaries inside their box. New theme tokens (theme.wave.*) in light, dark and grayscale, with contrast tests; the hatch carries over to PNG and PDF. SVG output for roadmaps without waves is byte-identical.
  • @nowline/export-xlsx + @nowline/export-mermaid + @nowline/export-msproj — waves in the exports: in a roadmap with waves, the XLSX Items sheet gains a Wave column after Parallel (each item's effective wave, blank for background work) and a last Waves sheet (ID, Title, Order, Start, End (exclusive), Items, Held by, After, Description) dated from the same barrier schedule the picture uses. Mermaid gains a section Waves of wave-end milestones before the lanes, and members of each later wave start after the previous wave's end; wave start floors can't be expressed and are counted in the %% drop summary. MS Project gains one zero-duration (wave end) milestone task per wave, finish-to-start links from each wave's members to its end and from each wave's end to the next wave's members, and after:<wave> links to the wave-end task; an anchor or dated-milestone start floor becomes a predecessor of the wave's members and end task, while inline-date floors and members without an id are counted in the lossy summary (wave-floor, wave-member-no-id). Exports of roadmaps without waves are byte-identical.
  • @nowline/lsp + VS Code extension — editor support for waves: go to definition, find references and rename work from a wave declaration and from wave:, after:, before: and on: references (renaming wave wave edits the id, not the keyword); wave: completes the declared waves in order and after: / before: / on: completion includes them; waves appear in the document outline; hovering a wave shows its position (wave 2 of 3), title, labels, description and member count, and hovering an item shows its wave, where it inherits it from, or background (no wave). The TextMate grammar colours wave as a keyword only at the start of a declaration line and wave: as a property key; new wave and item-wave snippets.
  • @nowline/mcp + nowline(5) — waves in the reference: the MCP schema tool lists wave as an entity type and an item property key, and the condensed reference gains a Waves section. The nowline(5) man page (en and fr, also served as the MCP full reference) documents the wave declaration, the wave: property and its inheritance, wave ids as after: / before: / on: targets, include agreement, the default ban, and every wave diagnostic code.
  • @nowline/layout + @nowline/renderer + @nowline/export-msproj + @nowline/core + @nowline/lsp — \n in an item title forces a line break (#60): item tech "Technology\nSelection" duration:2w paints "Technology" over "Selection" inside the bar. The author's lines are authoritative: no auto-wrap runs on them and the two-line cap does not apply, so a three-line title stays in the bar (and grows it 16px per extra line when it has a meta line). If a line is too wide for the bar, the whole title spills to the right as a stacked block with its breaks kept. \\n shows the literal text \n. Elsewhere a break behaves as w...
Read more

v0.8.6

Choose a tag to compare

@github-actions github-actions released this 01 Oct 06:25

What's Changed

  • Update dependencies and GitHub Actions; move MCP to SDK v2 by @GaryRudolph in #69
  • add machine-readable diagnostics on dry-run and fix stdin redirect by @GaryRudolph in #70

Full Changelog: v0.8.5...v0.8.6

v0.8.5

Choose a tag to compare

@github-actions github-actions released this 20 Jun 15:32

Full Changelog: v0.8.4...v0.8.5

v0.8.4

Choose a tag to compare

@github-actions github-actions released this 19 Jun 19:18

Full Changelog: v0.8.3...v0.8.4

v0.8.3

Choose a tag to compare

@github-actions github-actions released this 19 Jun 05:06

Full Changelog: v0.8.2...v0.8.3

v0.8.2

Choose a tag to compare

@github-actions github-actions released this 18 Jun 14:00

Full Changelog: v0.8.1...v0.8.2

0