@rness/cli 0.17.0 → 0.17.2

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
@@ -114,7 +114,8 @@ the files a given agent needs, for the agents the team declares in
114
114
  it asks, one question at a time. The skill stays in the conversation for
115
115
  the next turns, and the file carries the work to the next session
116
116
  (`/rness:adr 0010` reopens it). The agent may start one itself — an ADR
117
- when a choice is expensive to reverse — but writes nothing without a yes.
117
+ when a choice is expensive to reverse — but writes nothing without a yes,
118
+ except `/rness:done` on a plan whose last task has just passed.
118
119
  The rules stay in `.rness/CONVENTIONS.md`; the skills only add the steps.
119
120
  A new document takes the collection's first status (`Proposed` for an
120
121
  ADR, `Draft` otherwise) and the next number of the local checkout; two
@@ -122,7 +123,13 @@ the files a given agent needs, for the agents the team declares in
122
123
  `{ id: <session id>, agent: <model> }` to `sessions:` in the front matter
123
124
  of what it writes or closes. The agent is the model it runs as, as Claude
124
125
  Code names it (`Claude Opus 5.5`): no variable gives it to a skill. An
125
- edit made without a skill leaves none. No skill commits.
126
+ edit made without a skill leaves none. The agent moves a status with the
127
+ work (a plan `In progress`, then `Completed`; a specification
128
+ `Implemented`) and whenever the developer says so; accepting an ADR or
129
+ approving a specification stays the developer's unless they asked it to
130
+ go ahead. Each skill ends in a commit of the files the agent alone
131
+ changed, added by name; a file someone else changed too is left
132
+ uncommitted and named. No skill pushes.
126
133
  - rness owns values, not files: what is missing is added, nothing else is
127
134
  touched, and a file it cannot parse is reported, never rewritten.
128
135
  `sync --check` and `validate` report a missing value. Removing an agent
@@ -388,7 +395,7 @@ repository, the board).
388
395
  `"projects": { "pulse": <number> }`; both at once are refused.
389
396
  - A provider _written_ in `rness.json` that this version cannot talk to
390
397
  (`gitlab`) is refused by `validate`, `create`, `login` and `pulse`:
391
- `provider "gitlab" is not supported by @rness/cli 0.17.0 (supported:
398
+ `provider "gitlab" is not supported by @rness/cli 0.17.1 (supported:
392
399
  github)`. `add`, `sync` and the local commands never refuse. `null` is not a
393
400
  value: an absent key means none.
394
401
 
@@ -565,6 +572,33 @@ per repository, the files to commit there.
565
572
  Exit codes: 0 success, 1 failure, 2 usage — or a refusal without a TTY.
566
573
  `RNESS_DEBUG=1` adds stack traces; `RNESS_NO_DELEGATE=1` skips the delegation.
567
574
 
575
+ ## 0.17.2 — the lifecycle skills move statuses and commit their files
576
+
577
+ - `/rness:adr`, `/rness:spec`, `/rness:plan` and `/rness:done` let the
578
+ agent move a status as the work does — a plan `In progress` as its tasks
579
+ start, `Completed` once they pass, a specification `Implemented` with its
580
+ last plan — and whenever the developer says so. Accepting an ADR or
581
+ approving a specification stays the developer's unless they asked the
582
+ agent to go ahead. `/rness:done` closes a plan whose last task has just
583
+ passed without asking first.
584
+ - Each of them ends in a commit of the files the agent alone changed, in
585
+ their repository, added by name. A file that had uncommitted changes
586
+ before the agent's first edit, or that someone else changed since, is
587
+ left out and named. Nothing is pushed. Until now they committed nothing,
588
+ which left their files for someone else to find.
589
+ - `rness upgrade` rewrites the four skills under `.claude/skills/rness/`;
590
+ commit them in each repository, as its next steps list.
591
+
592
+ ## 0.17.1 — pulse shows it is at work
593
+
594
+ - `pulse create` and `pulse sync` show a transient line while they write a
595
+ project's items and bodies: each item is a few requests, one at a time,
596
+ and 34 cards took minutes with nothing on screen.
597
+ - A collection's label is made only when a document carries it: a
598
+ directory with no card (`assets/`) is no label.
599
+ - `pulse create <collection>` says `linked Marketing to <org>/.rness`, not
600
+ `Agent Pulse`.
601
+
568
602
  ## 0.17.0 — a collection on its own GitHub Project
569
603
 
570
604
  - `rness pulse create <collection>` gives a collection of `.rness/` a
package/dist/bin/rness.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  findDelegate,
7
7
  reportError,
8
8
  run
9
- } from "../chunk-X52SHBRY.js";
9
+ } from "../chunk-REDELHNC.js";
10
10
 
11
11
  // src/bin/rness.ts
12
12
  import { pathToFileURL } from "url";
@@ -508,7 +508,7 @@ function parseRepoSpec(spec, org, host) {
508
508
  }
509
509
 
510
510
  // src/version.ts
511
- var VERSION = "0.17.0";
511
+ var VERSION = "0.17.2";
512
512
 
513
513
  // src/core/pm.ts
514
514
  import { execFile as execFile2 } from "child_process";
@@ -1642,7 +1642,9 @@ function layoutOf(tabs, own) {
1642
1642
  ...want.map((w) => w.values[f.name]).filter((v) => typeof v === "string")
1643
1643
  ]) : []
1644
1644
  })),
1645
- labels: once(want.flatMap((w) => [...w.labels, ...w.unlabels]))
1645
+ // Made only when a document carries it: a directory with no card is no
1646
+ // label, though one carrying it once is taken off (`unlabels`).
1647
+ labels: once(want.flatMap((w) => w.labels))
1646
1648
  };
1647
1649
  }
1648
1650
  var sessionsOf2 = (row) => row.sessions?.map((e) => e.agent === void 0 ? e.id : `${e.agent} \xB7 ${e.id}`).join(", ") ?? null;
@@ -4343,6 +4345,17 @@ then \`npx @rness/cli status\` (q to close), then \`fg\`; or in another
4343
4345
  terminal, from the workspace's \`.rness/\`: \`${localRunner(pm)} rness status\`._
4344
4346
  `;
4345
4347
  }
4348
+ var STATUS_RULE = `Move a status yourself when the work calls for it, and whenever the
4349
+ developer says so: a plan \`In progress\` as you start its tasks,
4350
+ \`Completed\` once they pass; a specification \`Implemented\` with its last
4351
+ plan; a document \`Superseded\` by the one that replaces it. Accepting a
4352
+ decision \u2014 an ADR \`Accepted\`, a specification \`Approved\` \u2014 is the
4353
+ developer's, unless they asked you to go ahead with the work.`;
4354
+ var COMMIT_RULE = `Commit each file you changed, in its own repository, and only the files
4355
+ you alone changed: add them by name, never \`git add -A\` nor \`commit -a\`.
4356
+ A file that had uncommitted changes before your first edit (\`git status\`
4357
+ tells you), or that someone else changed since, stays uncommitted: say
4358
+ which. Never push.`;
4346
4359
  var LIFECYCLE2 = [
4347
4360
  {
4348
4361
  name: "adr",
@@ -4379,9 +4392,12 @@ Writing:
4379
4392
  \`Claude\`: for example \`Claude Opus 5.5\`.
4380
4393
  - The rness hook checks every edit under \`${rness}/\`: fix what it reports.
4381
4394
 
4382
- After writing: give the path and the Decision section, and say the ADR
4383
- stays \`Proposed\` until the developer accepts it. Change a status only when
4384
- the developer says so. Do not commit.
4395
+ After writing: give the path and the Decision section. The ADR stays
4396
+ \`Proposed\` until it is accepted.
4397
+
4398
+ ${STATUS_RULE}
4399
+
4400
+ ${COMMIT_RULE}
4385
4401
  `
4386
4402
  },
4387
4403
  {
@@ -4420,9 +4436,13 @@ Writing:
4420
4436
  \`Claude\`: for example \`Claude Opus 5.5\`.
4421
4437
  - The rness hook checks every edit under \`${rness}/\`: fix what it reports.
4422
4438
 
4423
- After writing: give the path and the summary. It stays \`Draft\` until the
4424
- developer moves it (\`Proposed\` for review, \`Approved\` to plan it). No plan
4425
- here: \`/rness:plan NNNN\` once approved. Do not commit.
4439
+ After writing: give the path and the summary. It starts \`Draft\`:
4440
+ \`Proposed\` for review, \`Approved\` to plan it. No plan here:
4441
+ \`/rness:plan NNNN\` once approved.
4442
+
4443
+ ${STATUS_RULE}
4444
+
4445
+ ${COMMIT_RULE}
4426
4446
  `
4427
4447
  },
4428
4448
  {
@@ -4464,8 +4484,13 @@ Writing:
4464
4484
  \`Claude\`: for example \`Claude Opus 5.5\`.
4465
4485
  - The rness hook checks every edit under \`${rness}/\`: fix what it reports.
4466
4486
 
4467
- After writing: give the path and the list of tasks. It becomes \`Ready\` when
4468
- the developer agrees. Do not commit.
4487
+ After writing: give the path and the list of tasks. It starts \`Draft\`, and
4488
+ becomes \`Ready\` once the developer agrees with it or asks you to carry it
4489
+ out.
4490
+
4491
+ ${STATUS_RULE}
4492
+
4493
+ ${COMMIT_RULE}
4469
4494
  `
4470
4495
  },
4471
4496
  {
@@ -4479,8 +4504,9 @@ Arguments: \`$ARGUMENTS\`.
4479
4504
 
4480
4505
  1. The plan: the one named, else the one \`In progress\`. Several or none:
4481
4506
  ask.
4482
- 2. If the developer did not ask to close it in so many words, propose it in
4483
- a single line and wait for a yes.
4507
+ 2. The developer asked to close it, or its last task has just passed in
4508
+ this session: close it. Otherwise propose it in a single line and wait
4509
+ for a yes.
4484
4510
  3. Read the plan, its specification and \`${rness}/CONVENTIONS.md\`.
4485
4511
  4. Evidence first. For each task, what shows it done: a test, a build, a
4486
4512
  command's output in this session. A task without evidence: run its
@@ -4502,7 +4528,9 @@ Arguments: \`$ARGUMENTS\`.
4502
4528
  blocker written in it. Say what remains.
4503
4529
  7. The rness hook checks every edit under \`${rness}/\`: fix what it reports.
4504
4530
 
4505
- After: list the files changed and the statuses moved. Do not commit.
4531
+ After: list the files changed and the statuses moved.
4532
+
4533
+ ${COMMIT_RULE}
4506
4534
  `
4507
4535
  }
4508
4536
  ];
@@ -8695,7 +8723,7 @@ var eachAdded = (ui, added) => {
8695
8723
  if (a.startsWith("renamed ")) ui.line("renamed", a.slice("renamed ".length));
8696
8724
  else ui.line("added", a);
8697
8725
  };
8698
- var createdByKind = (ui, added) => {
8726
+ var createdByKind = (ui, added, project) => {
8699
8727
  for (const kind of ["field", "option", "view"]) {
8700
8728
  const names = added.filter((a) => a.startsWith(`${kind} `)).map((a) => a.slice(kind.length + 1));
8701
8729
  if (names.length > 0) ui.line("created", `${kind}s ${names.join(", ")}`);
@@ -8703,9 +8731,13 @@ var createdByKind = (ui, added) => {
8703
8731
  for (const a of added) {
8704
8732
  if (a.startsWith("label ")) ui.line("created", a);
8705
8733
  else if (a.startsWith("link "))
8706
- ui.line("linked", `Agent Pulse to ${a.slice("link ".length)}`);
8734
+ ui.line("linked", `${project} to ${a.slice("link ".length)}`);
8707
8735
  }
8708
8736
  };
8737
+ async function working(ui, doing, count3, work) {
8738
+ if (count3 === 0) return work();
8739
+ await ui.step({ doing, quiet: true }, work, () => null);
8740
+ }
8709
8741
  async function filesOf2(rnessDir) {
8710
8742
  const files = /* @__PURE__ */ new Set();
8711
8743
  const walk = async (rel) => {
@@ -8761,7 +8793,11 @@ function sayDone(ui, org, documents2, steps, writes, adopted, on) {
8761
8793
  async function syncBoard(c, board, ui, sayLayout, scope) {
8762
8794
  await fromGithub(c.provider.checkIssues(c.org));
8763
8795
  const { want } = scope;
8764
- sayLayout(ui, await fromGithub(c.provider.ensureLayout(board, scope.layout)));
8796
+ sayLayout(
8797
+ ui,
8798
+ await fromGithub(c.provider.ensureLayout(board, scope.layout)),
8799
+ scope.label
8800
+ );
8765
8801
  const have = await fromGithub(c.provider.items(board));
8766
8802
  const record = await openedFile(c.rnessDir);
8767
8803
  const all = await readOpened(record);
@@ -8781,17 +8817,24 @@ async function syncBoard(c, board, ui, sayLayout, scope) {
8781
8817
  const created = /* @__PURE__ */ new Map();
8782
8818
  const closed = /* @__PURE__ */ new Set();
8783
8819
  try {
8784
- for (const step2 of steps) {
8785
- const p = await fromGithub(c.provider.apply(board, step2));
8786
- if (p !== null && (step2.kind === "create" || step2.kind === "convert"))
8787
- placed.set(step2.want.path, p);
8788
- if (p?.adopted === true) adopted++;
8789
- else if (p !== null && step2.kind === "create")
8790
- created.set(step2.want.path, p);
8791
- if (step2.kind === "close" || step2.kind === "archive")
8792
- closed.add(step2.id);
8793
- if (step2.kind !== "unchanged") made++;
8794
- }
8820
+ await working(
8821
+ ui,
8822
+ `writing ${plural(changes)} on ${scope.label}`,
8823
+ changes,
8824
+ async () => {
8825
+ for (const step2 of steps) {
8826
+ const p = await fromGithub(c.provider.apply(board, step2));
8827
+ if (p !== null && (step2.kind === "create" || step2.kind === "convert"))
8828
+ placed.set(step2.want.path, p);
8829
+ if (p?.adopted === true) adopted++;
8830
+ else if (p !== null && step2.kind === "create")
8831
+ created.set(step2.want.path, p);
8832
+ if (step2.kind === "close" || step2.kind === "archive")
8833
+ closed.add(step2.id);
8834
+ if (step2.kind !== "unchanged") made++;
8835
+ }
8836
+ }
8837
+ );
8795
8838
  } finally {
8796
8839
  await writeOpened(
8797
8840
  record,
@@ -8817,10 +8860,17 @@ async function syncBoard(c, board, ui, sayLayout, scope) {
8817
8860
  })
8818
8861
  );
8819
8862
  writes = planBodies(bodies, issued);
8820
- for (const step2 of writes) {
8821
- await fromGithub(c.provider.apply(board, step2));
8822
- made++;
8823
- }
8863
+ await working(
8864
+ ui,
8865
+ `writing ${plural(writes.length)} bodies on ${scope.label}`,
8866
+ writes.length,
8867
+ async () => {
8868
+ for (const step2 of writes) {
8869
+ await fromGithub(c.provider.apply(board, step2));
8870
+ made++;
8871
+ }
8872
+ }
8873
+ );
8824
8874
  } catch (e) {
8825
8875
  if (!(e instanceof RateLimitError)) throw e;
8826
8876
  const total = changes + writes.length;
@@ -9555,4 +9605,4 @@ export {
9555
9605
  OWN_COMMANDS,
9556
9606
  catchUp
9557
9607
  };
9558
- //# sourceMappingURL=chunk-X52SHBRY.js.map
9608
+ //# sourceMappingURL=chunk-REDELHNC.js.map