@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 +37 -3
- package/dist/bin/rness.js +1 -1
- package/dist/{chunk-X52SHBRY.js → chunk-REDELHNC.js} +82 -32
- package/dist/chunk-REDELHNC.js.map +1 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-X52SHBRY.js.map +0 -1
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.
|
|
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.
|
|
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
|
@@ -508,7 +508,7 @@ function parseRepoSpec(spec, org, host) {
|
|
|
508
508
|
}
|
|
509
509
|
|
|
510
510
|
// src/version.ts
|
|
511
|
-
var VERSION = "0.17.
|
|
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
|
-
|
|
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
|
|
4383
|
-
|
|
4384
|
-
|
|
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
|
|
4424
|
-
|
|
4425
|
-
|
|
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
|
|
4468
|
-
the developer agrees
|
|
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.
|
|
4483
|
-
a single line and wait
|
|
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.
|
|
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",
|
|
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(
|
|
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
|
-
|
|
8785
|
-
|
|
8786
|
-
|
|
8787
|
-
|
|
8788
|
-
|
|
8789
|
-
|
|
8790
|
-
|
|
8791
|
-
|
|
8792
|
-
|
|
8793
|
-
|
|
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
|
-
|
|
8821
|
-
|
|
8822
|
-
|
|
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-
|
|
9608
|
+
//# sourceMappingURL=chunk-REDELHNC.js.map
|