@rness/cli 0.21.0 → 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,9 +29,8 @@ Inside a workspace, every `rness` delegates to the copy pinned in
29
29
  rness logout
30
30
  rness context [--scope <name>] [--json]
31
31
  rness status [<tab>] [--json]
32
- rness pulse create [<collection>] [-y]
33
- rness pulse sync
34
- rness pulse note [--plan <path>] [--kind approach|deviation|blocker|done] [<text>]
32
+ rness board push [-y]
33
+ rness note [--plan <path>] [--kind approach|deviation|blocker|done] [<text>]
35
34
  rness validate
36
35
  rness mcp
37
36
 
@@ -64,8 +63,8 @@ when dropped, red `?` when missing.
64
63
  - `--json`, terminal or not: the tabs and their rows — each row with the
65
64
  colour of its status on Agent Pulse (`color`, the board's name for it:
66
65
  `yellow` for `In progress`; `red` without a status) and its item there
67
- (`link`, the board filtered on its path; null without a pulse) — the
68
- board (`pulse`), and what a Claude Code session shows of the workspace,
66
+ (`link`, the board filtered on its path; null without a board, or before
67
+ `board push` creates it) — the board (`pulse`), and what a Claude Code session shows of the workspace,
69
68
  worded by the CLI — the session-start banner, the footer's label, the
70
69
  scope's plans `In progress` and the notes of the safety net (see
71
70
  "Hooks"). The plugin's mod reads it (see
@@ -198,7 +197,7 @@ the pinned copy, and computes nothing itself:
198
197
  document is read from `.rness/` without its front matter, as the
199
198
  board's card shows it; `q` brings the list back, Esc still closes. An
200
199
  edit of the document shows at the next refresh. **Agent
201
- Pulse is a link** when the workspace declares a pulse: the board from the
200
+ Pulse is a link** when the workspace has a board: the board from the
202
201
  list, the document's item (the board filtered on its path) from the
203
202
  document. The terminal opens it as it opens any hyperlink (cmd+click on
204
203
  macOS, as a rule), a desktop surface on a click. In `claude -p`, or where
@@ -247,7 +246,7 @@ workspace root's carry four Claude Code hooks, all run by the pinned copy:
247
246
  A Claude Code too old for the plugin's mod gets one more line, once (see
248
247
  "The mod"). When a board keeps a journal and the scope has a plan in
249
248
  progress, the model gets one more line: how and when to post a note (see
250
- "Pulse"). After a compaction, the context only.
249
+ "Boards"). After a compaction, the context only.
251
250
  - **Before an edit** (`PreToolUse` on `Edit|Write`): refused, with the
252
251
  reason for the model, when it would change what `sync` generates — a
253
252
  line of the block of an `AGENTS.md` or `CLAUDE.md` (the reason names the
@@ -263,10 +262,10 @@ workspace root's carry four Claude Code hooks, all run by the pinned copy:
263
262
  to the model, which fixes them in the same turn. Any other edit costs one
264
263
  path check. Stale blocks are left to `sync`. When a board declares
265
264
  `mark` and holds the document, the edit is then marked on it, broken or
266
- not; see "Pulse".
265
+ not; see "Boards".
267
266
  - **At session end** (`SessionEnd`): when a board declares `clear-marks`,
268
267
  clears the marks this session set and syncs; when one declares
269
- `journal-summary`, posts the session's summary; see "Pulse". Without
268
+ `journal-summary`, posts the session's summary; see "Boards". Without
270
269
  either, nothing.
271
270
 
272
271
  Each hook is one fixed `sh` line: it runs
@@ -280,31 +279,37 @@ own hooks stay where they are.
280
279
  Claude Code runs hooks from a committed settings file without asking each
281
280
  developer, including in `claude -p`. These four read `.rness/`, write
282
281
  no file of the workspace and run no install; with a journal, the session
283
- start records the clone's `HEAD` in its git directory. Only with a pulse declared do
282
+ start records the clone's `HEAD` in its git directory. Only with a board created do
284
283
  they reach the network, through a detached `rness` process that uses your
285
- login; when that process fails, it writes why to `pulse.json` in rness's
284
+ login; when that process fails, it writes why to `board.json` in rness's
286
285
  configuration directory (`~/.config/rness/` by default), which the next
287
- session start reads, says once and deletes. See "Pulse". Review a change to
286
+ session start reads, says once and deletes (0.21 wrote `pulse.json`: read
287
+ once too). See "Boards". Review a change to
288
288
  them like code. Verified with Claude Code 2.1.284 on 2026-09-29: in a clone
289
289
  and at the root, the model received the context; after an edit that broke a
290
290
  status, it received the problem. The `sh` line is not verified on Windows.
291
291
 
292
- ### Pulse
293
-
294
- rness pulse create # once per organization: the board, then a first sync
295
- rness pulse create marketing # a collection's own project (0.17.0)
296
- rness pulse sync # every declared project, as often as wanted
297
-
298
- A projection of rness's state on the organization's GitHub Projects,
299
- each declared in `rness.json`: first **Agent Pulse**, where the team sees —
300
- and reads — every document of `.rness/`, and sees when an agent is at work
301
- on one. rness writes the boards; if it is not in rness, it does not belong
302
- there.
303
-
304
- - **Boards declared in `rness.json`** (0.21.0): `projects` maps a name to
305
- a board, written whole — its `number`, `collections`, `colors`,
306
- `fields`, `labels`, `views`, and optionally `title`, `description`,
307
- `readme` and `updates` (files of `.rness/`). What `rness.json` says is
292
+ ### Boards
293
+
294
+ rness board push # every board rness.json declares: created if it is not yet, then brought up to date
295
+ rness note "…" # the agent's journal on the plan in progress
296
+
297
+ A board is a view of the rules the agent applies: the documents of
298
+ `.rness/` — decisions, specifications, plans, a team's own collections —
299
+ and where an agent is at work on them. The provider supplies the tool:
300
+ GitHub Projects today. Each board is declared in `rness.json`, under
301
+ `boards`: first **Agent Pulse** (`pulse`), where the team sees — and reads
302
+ — every document of `.rness/`, and sees when an agent is at work on one.
303
+ rness writes the boards; if it is not in rness, it does not belong there.
304
+
305
+ - **Boards declared in `rness.json`** (0.21.0; `boards` since 0.22.0,
306
+ `projects` before): `boards` maps a name to a board, written whole — its
307
+ `number`, `collections`, `colors`, `fields`, `labels`, `views`, and
308
+ optionally `title`, `description`, `readme` and `updates` (files of
309
+ `.rness/`) — or to a preset not created yet, by name:
310
+ `"boards": { "pulse": "agent-pulse", "marketing": "collection" }`
311
+ (`agent-pulse` for `pulse`, `collection` for a collection's board; see
312
+ "A board created"). What `rness.json` says is
308
313
  the board; what it does not declare, the board does not have, but the
309
314
  engine's own: one issue of `.rness` per document, found by its `Path`,
310
315
  its `Status`, the label `rness`. Nothing knows Agent Pulse by name: it
@@ -328,7 +333,7 @@ there.
328
333
  status its tone, a collection pink). A colour changed is set at the
329
334
  next sync, every card keeping its value.
330
335
  - A board that `rness.json` declares wrongly is refused alone, by its
331
- full key (`"projects.marketing.views[2].date" must name a date
336
+ full key (`"boards.marketing.views[2].date" must name a date
332
337
  field`); the others sync. `validate` reports it, and also a collection
333
338
  that is no directory of `.rness/`, one on two boards, a `readme` or
334
339
  `updates` not there, a README that still declares (below). `readme`
@@ -343,12 +348,12 @@ field`); the others sync. `validate` reports it, and also a collection
343
348
  delete it on GitHub if unwanted`), as is a field no longer declared and
344
349
  views out of the declared order (GitHub reorders none). A roadmap's
345
350
  date is chosen in its settings: GitHub's API does not set it.
346
- - **Presets and their revisions.** `pulse create` writes a board from a
351
+ - **Presets and their revisions.** `board push` writes a board from a
347
352
  preset, `agent-pulse` or `collection`, recording it (`"preset":
348
353
  "agent-pulse/1"`). When a later rness ships a newer revision, `rness
349
354
  sync` merges it into the board value by value: a value the team never
350
355
  changed takes the new one, one it changed is kept, and said when the
351
- revision changed it too (`kept projects.pulse.colors.Draft: kept orange,
356
+ revision changed it too (`kept boards.pulse.colors.Draft: kept orange,
352
357
  agent-pulse/2 gives blue`). Removing `preset` takes a board off the
353
358
  merge. An upgrade commits the result, for the team to read before
354
359
  pushing.
@@ -358,7 +363,12 @@ upgrade` runs — writes it whole; nothing changes on GitHub. A
358
363
  collection's `README.md` that declared `description`, `statuses`,
359
364
  `fields` or `labels` has them moved into its board and out of its front
360
365
  matter (a value declared otherwise in both is refused, naming both).
361
- Until then, `pulse sync` skips a board whose README still declares.
366
+ Until then, `board push` skips a board whose README still declares.
367
+ - **From 0.21 and before.** `projects`, and the older
368
+ `"pulse": { "project": <number> }`, still read as `boards`; more than
369
+ one of the three at once is refused. `rness sync` renames the key
370
+ (`renamed projects to boards in .rness/rness.json`), the boards as they
371
+ were, and every write of `rness.json` writes `boards`.
362
372
 
363
373
  - **Items**: one per document of `rness status`, an issue of
364
374
  `<org>/.rness` added to the project. GitHub shows it only to people who
@@ -394,10 +404,9 @@ status, …`) and its body the document (see **Body**). It carries the
394
404
  on `main`, and branches of it are rare). The project is linked to
395
405
  `.rness`, so Agent Pulse shows in its Projects tab. Comments are the
396
406
  team's: a spec's discussion lives on its issue, and rness never writes
397
- or deletes one. `pulse create` and `pulse sync` need Issues on
398
- `.rness`. Without them they stop before
399
- writing anything: `the pulse needs Issues on <org>/.rness: turn them on
400
- in its Settings`.
407
+ or deletes one. `board push` needs Issues on `.rness`. Without them it
408
+ stops before writing anything: `boards need Issues on <org>/.rness: turn
409
+ them on in its Settings`.
401
410
  - **Body**: the document, the same bytes for the same document. It starts
402
411
  with a first line: the document's path and a link to the file. Then comes
403
412
  the document without its front matter (the status is a field) and
@@ -430,36 +439,46 @@ Session → Working session`). A board per directory, named as
430
439
  `rness status` names its tab, filtered on its `Collection`, its columns
431
440
  that collection's own steps: each collection has its own status field
432
441
  (`ADR status`, `Specs status`, …; a directory without statuses is columned
433
- by `Status`, which holds them all for the `All` table). `pulse sync`
442
+ by `Status`, which holds them all for the `All` table). `board push`
434
443
  remakes a board built by an earlier version (its URL changes once); a `Working` table, filtered on `Agent: working`. A first view named `View 1` (GitHub's default) becomes `All` when no `All` exists, on create and on sync, showing Title, Collection, Status and Working session. Options are coloured (statuses by lifecycle: blue proposed, purple approved, yellow in progress, red blocked or rejected, yellow superseded, green done, gray abandoned; collections and `working` too); a sync recolours rness's options and leaves other options' colours alone. rness does
435
444
  not set the project's visibility: the project gets GitHub's default for a
436
445
  new organization project, which is private (`public: false`). Verified
437
446
  with Claude Code 2.1.284 on 2026-09-29.
438
- - **Login**: the pulse needs the `project` scope. `rness login` asks for it
439
- when the workspace declares a pulse, or when `pulse create` needs it (in a
440
- terminal it offers to log in; with `-y` or off a terminal it stops with
441
- `the pulse needs a GitHub login: run rness login` or
442
- `the pulse needs the project scope: run rness login`). A developer who
443
- never uses the pulse grants nothing more than `repo read:org`. When GitHub
444
- cannot be asked, the pulse says so (`cannot reach GitHub: …`, or GitHub's
445
- own answer) instead of asking for a login. A classic `GITHUB_TOKEN` works
446
- if it carries the scope; a fine-grained or GitHub App token reports no
447
- scope, so the pulse refuses it whatever its permissions. An organization
447
+ - **Login**: boards need the `project` scope. `rness login` asks for it
448
+ when the workspace declares a board, and `board push` when it creates one
449
+ (in a terminal it offers to log in; with `-y` or off a terminal it stops
450
+ with `boards need a GitHub login: run rness login` or
451
+ `boards need the project scope: run rness login`). A developer who never
452
+ uses boards grants nothing more than `repo read:org`. When GitHub cannot
453
+ be asked, rness says so (`cannot reach GitHub: …`, or GitHub's own
454
+ answer) instead of asking for a login. A classic `GITHUB_TOKEN` works if
455
+ it carries the scope; a fine-grained or GitHub App token reports no
456
+ scope, so boards refuse it whatever its permissions. An organization
448
457
  that restricts OAuth apps must approve "Rness", as for its private
449
458
  repositories.
450
- - **`pulse create`** needs an `org` in `rness.json` (a blank workspace is
451
- refused) and no pulse yet. It creates the project and at once writes the
452
- board whole, from the preset `agent-pulse`, into `projects.pulse` (and
453
- the `provider`) in `rness.json`,
454
- then adds the fields, options and views, and runs a first sync; its
455
- `created` lines say what it added. If a step after the project fails, it
456
- exits 1 with the pulse declared, and `rness pulse sync` completes the
457
- layout. Commit `rness.json` in `.rness`. The number is that of the
458
- project in the organization. A CLI older than 0.12.0 refuses the key, so
459
- the pin moves first (`rness upgrade`). A workspace without a `provider`
460
- whose repositories look like GitLab is refused before anything is
461
- created: write `"provider": "github"` if the organization is on GitHub.
462
- - **`pulse sync`** works in two passes. First every document gets its
459
+ - **A board created** (0.22.0): a board of `boards` without a `number` —
460
+ a preset's name, or a declaration that leaves it out — is not on GitHub
461
+ yet, and `board push` creates it. Its name is `pulse` or a collection of
462
+ `.rness/`, else it is refused before GitHub is asked anything (`validate`
463
+ says so too). In a terminal push asks once
464
+ (`Create Agent Pulse (pulse) on GitHub, in acme?`); `-y` does not ask.
465
+ Off a terminal without `-y`, or declined, it creates none, pushes the
466
+ others and exits 1: `not created: pulse — rness board push in a terminal,
467
+ or with --yes, creates it`. Then, in order: the login and its `project`
468
+ scope, Issues on `.rness`, the project, and at once its `number` in
469
+ `rness.json` — a preset's name is written whole from that preset, a
470
+ declaration gets its `number` and nothing else — with the `provider`;
471
+ then the fields, options and views, and a first push. Its `created` lines
472
+ say what it added, and the last line what to commit
473
+ (`git -C .rness commit -am "chore: board pulse"`). If a step after the
474
+ project fails, it exits 1 with the number written, and the next
475
+ `board push` completes the layout. A project deleted on GitHub is not
476
+ made again: push stops on `GitHub has no project 4 in acme`; removing the
477
+ `number` asks for a new one. A workspace needs an `org` (a blank one is
478
+ refused); one without a `provider` whose repositories look like GitLab
479
+ is refused before anything is created: write `"provider": "github"` if
480
+ the organization is on GitHub.
481
+ - **`board push`** works in two passes. First every document gets its
463
482
  issue — created, converted from a 0.12.0 draft, or reopened — with its
464
483
  title, label and fields. Then the bodies whose digest differs are
465
484
  written, since a body links to other documents' issues by number. It
@@ -479,15 +498,14 @@ unchanged`.
479
498
  as the team's item. A workflow someone turns on (`Item closed`, `Item
480
499
  added to project`) may change a field of rness's items; the next sync
481
500
  writes it back.
482
- - **A collection's own project** (0.17.0): `rness pulse create <collection>`
483
- gives a directory of `.rness/` whose documents carry a status — a tab of
484
- `rness status` — a project of its own, named after it, written whole
485
- from the preset `collection` into `projects.<collection>` (0.21.0;
486
- before, `"projects": { "pulse": 4, "marketing": 5 }`). Agent Pulse keeps every
487
- other collection and the `Working` table; the collection's items leave
488
- it (`deleteProjectV2Item`, their issues untouched) once its project
489
- holds them. `pulse sync` syncs the collections' projects, then Agent
490
- Pulse. The project is written from the collection's files, one way:
501
+ - **A collection's own board** (0.17.0): `"marketing": "collection"` in
502
+ `boards`, then `rness board push`, gives a directory of `.rness/` whose
503
+ documents carry a status — a tab of `rness status` — a project of its
504
+ own, named after it, written whole from the preset `collection` into
505
+ `boards.marketing`. Agent Pulse keeps every other collection and the
506
+ `Working` table; the collection's items leave it (`deleteProjectV2Item`,
507
+ their issues untouched) once its board holds them. `board push` pushes
508
+ the collections' boards, then Agent Pulse. The project is written from the collection's files, one way:
491
509
  - `<collection>/README.md` is its README (`readme` in its board since
492
510
  0.21.0, where `description`, `statuses`, `fields` and `labels` are
493
511
  declared too: what follows is how a README declared them before,
@@ -522,11 +540,11 @@ added to project`) may change a field of rness's items; the next sync
522
540
  organization's and the hooks run on every developer's machine. The
523
541
  preset `agent-pulse` declares all three, which is 0.20's behaviour;
524
542
  removing `hooks` from a board turns its marking off, and a board without
525
- them is only what `pulse sync` makes of the documents. For each event,
526
- one detached `rness pulse run <event>` does every board's actions, in
527
- the order of `projects`; a failure is recorded naming the board and the
528
- action (`mark on Marketing failed: …`). `rness pulse mark`, which 0.20's
529
- hooks started, stays, hidden, through 0.21.x. With Agent Pulse's preset:
543
+ them is only what `board push` makes of the documents. For each event,
544
+ one detached `rness board run <event>` does every board's actions, in
545
+ the order of `boards`; a failure is recorded naming the board and the
546
+ action (`mark on Marketing failed: …`). A board not created yet runs
547
+ none. With Agent Pulse's preset:
530
548
  session start marks the `In progress` plans of the session's scope
531
549
  `Agent: working`, with the session; an edit of a document of `.rness/` marks it — one the agent has just written, with no item yet, gets its issue first
532
550
  through a sync, and so does one whose status the edit changed, so its
@@ -541,8 +559,8 @@ added to project`) may change a field of rness's items; the next sync
541
559
  its file 3 s after `/exit`. It uses your login: with none, without the
542
560
  scope, or when GitHub cannot be reached, nothing is sent, and the next
543
561
  session start's banner says why, once:
544
- `rness: pulse not updated — <reason>`, such as
545
- `the pulse needs the project scope: run rness login` or
562
+ `rness: board not updated — <reason>`, such as
563
+ `boards need the project scope: run rness login` or
546
564
  `cannot reach GitHub: …`. Two sessions marking one plan both write; the
547
565
  last wins.
548
566
  - **Agent journal** (spec 0030, 0.21.0): how a plan was implemented, in
@@ -550,7 +568,7 @@ added to project`) may change a field of rness's items; the next sync
550
568
  `{ "action": "journal", "to": "plan" | "repo", "limit": 5 }` at
551
569
  `session-start`, and `journal-summary` at `session-end`. With a plan
552
570
  `In progress` in the session's scope, the session start tells the model
553
- to post a note — `rness pulse note`, or `rness_note` — when it chooses an
571
+ to post a note — `rness note`, or `rness_note` — when it chooses an
554
572
  approach, deviates from the plan, is blocked, and when done: decisions
555
573
  and their reasons, not steps. A note is a comment headed
556
574
  `**Approach** · claude · 1a2b3c4d · \`feat/limits\` @ \`9f8e7d6\``
@@ -579,7 +597,7 @@ the one plan in progress when there is a commit; with neither, nothing.
579
597
  It counts toward no limit. Not verified against GitHub yet (2026-10-06):
580
598
  a sub-issue across repositories, and `Closes` on a pull request merged
581
599
  into the default branch.
582
- - **One issue per document**: before making an issue, `pulse sync` reads
600
+ - **One issue per document**: before making an issue, `board push` reads
583
601
  the open issues of `.rness` labelled `rness` (one request per 100, and
584
602
  only when it has one to make). One whose body starts with the document's
585
603
  first line was made by an earlier sync, whose item the board's listing
@@ -596,10 +614,16 @@ a sub-issue across repositories, and `Closes` on a pull request merged
596
614
  documents, 2026-09-30): the migration from 0.12.0 took 169 s with no
597
615
  wait; a sync with nothing to change, 4 s; the listing, one page of
598
616
  852 KB in about 1 s.
599
- - **Not yet**: GitLab and Atlassian. `create` lists them, disabled; a
600
- workspace whose `rness.json` names one is refused by `pulse`. `Waiting`
601
- and `Review` statuses, several agents on one board and hooks for agents
602
- other than Claude Code are not built.
617
+ - **Not yet**: GitLab and Atlassian, and their own boards. `create` lists
618
+ them, disabled; a workspace whose `rness.json` names one is refused by
619
+ `board push`. `Waiting` and `Review` statuses, several agents on one
620
+ board and hooks for agents other than Claude Code are not built.
621
+ - **`rness pulse`**, the name of all this until 0.21: hidden, each of its
622
+ commands still runs as its new one and says so once on stderr
623
+ (`rness pulse sync is now rness board push`); `rness pulse create
624
+ [<collection>]` adds the preset's name to `boards` when it is not there,
625
+ then pushes without asking. `rness pulse mark`, which 0.20's hooks
626
+ started, exits 0 and does nothing. The alias goes in a later minor.
603
627
 
604
628
  ### Provider
605
629
 
@@ -618,15 +642,16 @@ repository, the board).
618
642
  names.
619
643
  - A workspace without the key is read from its first repository URL: a
620
644
  GitLab host reads as `gitlab`, any other host — or no repository — as
621
- `github`. Nothing to change: `pulse create` writes it, and refuses a
622
- detected provider this version cannot talk to. The order of keys is
623
- `contract`, `provider`, `org`, `agents`, `projects`, `repos`, `scopes`.
624
- The former `"pulse": { "project": <number> }` still reads, as
625
- `"projects": { "pulse": <number> }`; both at once are refused. Since
626
- 0.21.0 a board in `projects` is written whole, on several lines; a
627
- number still reads, as its preset, until `rness sync` writes it whole.
645
+ `github`. Nothing to change: `board push` writes it when it creates a
646
+ board, and refuses a detected provider this version cannot talk to. The
647
+ order of keys is `contract`, `provider`, `org`, `agents`, `boards`,
648
+ `repos`, `scopes`. The former `projects` and
649
+ `"pulse": { "project": <number> }` still read, as `boards`; more than one
650
+ of them at once is refused. A board in `boards` is written whole, on
651
+ several lines, once created; a number still reads, as its preset, until
652
+ `rness sync` writes it whole.
628
653
  - A provider _written_ in `rness.json` that this version cannot talk to
629
- (`gitlab`) is refused by `validate`, `create`, `login` and `pulse`:
654
+ (`gitlab`) is refused by `validate`, `create`, `login` and `board`:
630
655
  `provider "gitlab" is not supported by @rness/cli 0.17.1 (supported:
631
656
  github)`. `add`, `sync` and the local commands never refuse. `null` is not a
632
657
  value: an absent key means none.
@@ -646,7 +671,7 @@ as the server starts (Claude Code starts it with the session):
646
671
  | `rness_list({ collection, status? })` | every document of a collection, across scopes, optionally of one status |
647
672
  | `rness_read({ path })` | one file of `.rness/`, 256 KiB at most; nothing outside it |
648
673
  | `rness_search({ query, collection? })` | the documents that match, most matching first, with the matching lines |
649
- | `rness_note({ text, session, kind?, plan? })` | a note of the agent's journal posted to GitHub, as `rness pulse note` posts it; the issue it went to (see "Pulse") |
674
+ | `rness_note({ text, session, kind?, plan? })` | a note of the agent's journal posted to GitHub, as `rness note` posts it; the issue it went to (see "Boards") |
650
675
 
651
676
  - MCP over stdio, one message per line: the `2026-07-28` revision and the
652
677
  earlier ones that open with `initialize` (`2025-11-25` back to
@@ -686,7 +711,7 @@ anonymously.
686
711
  it — CI needs no login.
687
712
  - rness asks for `repo` and `read:org`: GitHub has no read-only scope for
688
713
  private repositories. It only lists and clones. Where the workspace
689
- declares a pulse it asks for `project` too; see "Pulse".
714
+ declares a board it asks for `project` too; see "Boards".
690
715
  - A new workspace has to reach GitHub before teammates can join it. Logged
691
716
  in, the `create` wizard offers to do it: it creates the private repository
692
717
  `<org>/.rness` and pushes the context with `git`. Declined, refused by
@@ -823,6 +848,42 @@ per repository, the files to commit there.
823
848
  Exit codes: 0 success, 1 failure, 2 usage — or a refusal without a TTY.
824
849
  `RNESS_DEBUG=1` adds stack traces; `RNESS_NO_DELEGATE=1` skips the delegation.
825
850
 
851
+ ## 0.22.1 — what rness writes carries no em dash
852
+
853
+ - Nothing rness writes carries an em dash (U+2014) any more: the `AGENTS.md`
854
+ block, the title `rness doc new` opens (`# NNNN - Title`), the `rness:adr`,
855
+ `rness:spec` and `rness:plan` skills, the scaffold, the titles of a board's
856
+ issues (`NNNN - Title`, renamed once at the next `rness board push`), and
857
+ the messages of the CLI and of the mod: " - ", a comma or a colon take its
858
+ place. A title written with the old separator still reads. The
859
+ repository's lint refuses a new one in a string of the CLI or the mod.
860
+
861
+ ## 0.22.0 — `board`, not `pulse`: `rness board push`, `rness note`, `boards` in rness.json
862
+
863
+ - One word for the view, whatever the provider (spec 0033, see "Boards"):
864
+ `rness board push` replaces `rness pulse sync`, `rness note` replaces
865
+ `rness pulse note`, and the hooks start `rness board run`. `rness.json`
866
+ names its boards `boards`; `projects` and the older `pulse` still read,
867
+ and `rness sync` (which `rness upgrade` runs) renames the key. `pulse`
868
+ stays the name of the board rness ships, Agent Pulse.
869
+ - A board comes to exist by its declaration and a push: there is no
870
+ `create`. A board of `boards` without a `number`, or a preset by name
871
+ (`"pulse": "agent-pulse"`, `"marketing": "collection"`), is created by
872
+ `rness board push` once asked (`-y` off a terminal), its number then
873
+ written into `rness.json`.
874
+ - `rness pulse …` still runs, hidden, as its new command, and says so on
875
+ stderr; it goes in a later minor. `rness pulse mark`, kept through
876
+ 0.21.x for 0.20's hooks, now exits 0 and does nothing. Spec 0031's
877
+ `eject` is not built and will not be: every board is written whole.
878
+ - The session-start notice is `rness: board not updated — …`, its record
879
+ `board.json` (one 0.21 left in `pulse.json` is said once), and messages
880
+ name boards: `boards need a GitHub login: run rness login`.
881
+ - Upgrade with `npx @rness/cli@latest upgrade`, which runs the new copy
882
+ throughout: a 0.21 copy cannot read `boards` (`unknown key "boards"`).
883
+ - For the package's API: `Manifest.projects` is `Manifest.boards`
884
+ (`Boards`, a record of `BoardEntry`: a number, a preset's name, or a
885
+ `BoardDeclaration`, whose `number` is null until the board is created).
886
+
826
887
  ## 0.21.0 — boards declared in rness.json; what a session does to a board, declared; the agent's journal
827
888
 
828
889
  - The agent journal (spec 0030, see "Pulse"): a board declares `journal`
@@ -857,9 +918,14 @@ BoardDeclaration>`; `BoardDeclaration` and `parseBoard` are exported.
857
918
  its commit it lists the files to commit in the clones, and that list read
858
919
  the plugin's mod from the folder of the copy running it, which the install
859
920
  had just removed. The list now takes the paths alone. The upgrade itself
860
- was complete: 0.20.0 to 0.20.1 printed the error after its commit. An
861
- upgrade from 0.20.1 still prints it, since the copy that runs it is the
862
- old one; `pnpm dlx @rness/cli upgrade` runs the new one.
921
+ was complete: 0.20.0 to 0.20.1 printed the error after its commit.
922
+ - An upgrade to 0.21.0 run by a 0.20 copy (`pnpm rness upgrade` from
923
+ `.rness/`) ends, after its commit, on `rness.json: "projects" must map
924
+ names to distinct project numbers`: the old copy, finishing, cannot read
925
+ the boards the new version has just written. The upgrade is complete, and
926
+ `rness validate` passes. `npx @rness/cli@latest upgrade` runs the new
927
+ copy throughout; `pnpm dlx @rness/cli` takes the previous version for a
928
+ day after a release, pnpm refusing a version younger than 24 hours.
863
929
 
864
930
  ## 0.20.1 — the workspace's line in the prompt footer, without a warning sign; the mod never installs the pin
865
931
 
package/dist/bin/rness.js CHANGED
@@ -4,11 +4,11 @@ import {
4
4
  catchUp,
5
5
  findDelegate,
6
6
  run
7
- } from "../chunk-T5PINUCP.js";
7
+ } from "../chunk-SX7D5W43.js";
8
8
  import {
9
9
  VERSION,
10
10
  reportError
11
- } from "../chunk-D3D2WCGW.js";
11
+ } from "../chunk-OUZQGG6V.js";
12
12
 
13
13
  // src/bin/rness.ts
14
14
  import { pathToFileURL } from "url";