runlist 0.98.0 → 0.98.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 +9 -8
- package/bin/runlist.mjs +1 -1
- package/package.json +1 -1
- package/plugins/runlist-codex/.codex-plugin/plugin.json +1 -1
- package/src/brief.mjs +1 -1
- package/src/prompts.mjs +1 -1
- package/src/show.mjs +19 -3
package/README.md
CHANGED
|
@@ -71,8 +71,8 @@ controls are experimental; live retrieval depends on a compatible external
|
|
|
71
71
|
provider. Local chat and push are deferred.
|
|
72
72
|
|
|
73
73
|
<!-- runlist:release:start -->
|
|
74
|
-
CLI and desktop release version: **0.98.
|
|
75
|
-
[Mac installer and release notes](https://github.com/reowens/runlist/releases/tag/desktop-v0.98.
|
|
74
|
+
CLI and desktop release version: **0.98.2**.
|
|
75
|
+
[Mac installer and release notes](https://github.com/reowens/runlist/releases/tag/desktop-v0.98.2).
|
|
76
76
|
Normal product releases publish both components; an installed Mac app is updated with rollback after it has quit.
|
|
77
77
|
<!-- runlist:release:end -->
|
|
78
78
|
|
|
@@ -105,11 +105,12 @@ Host source, cache and registry copies are labelled separately; a cache entry
|
|
|
105
105
|
alone does not prove which copy a running host has loaded. No package manager or
|
|
106
106
|
host command runs to produce the `doctor --project` installation report.
|
|
107
107
|
|
|
108
|
-
**0.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
108
|
+
**0.98.1 is published and installed locally.** `runlist show` briefs a plan
|
|
109
|
+
(outline, open boxes and `--section` reads with line numbers), marks each
|
|
110
|
+
phase's tally and the active phase, groups open boxes by phase, and caps long
|
|
111
|
+
related-plan and link lists; `runlist use <doc>` briefs a doc over 500 lines.
|
|
112
|
+
The agent workflow says to read plans that way. The desktop app's own code is
|
|
113
|
+
unchanged from 0.96.1; it bundles the 0.98.1 engine. The Mac installer is signed, notarized and verified; installation
|
|
113
114
|
retained the previous app for rollback. Open it with `rl desktop`. See the
|
|
114
115
|
[release validation](desktop/VALIDATION.md#current-mac-release--2026-10-22)
|
|
115
116
|
for checks and evidence. Full-app dialog accessibility remains an open finding;
|
|
@@ -742,7 +743,7 @@ replacement checks.
|
|
|
742
743
|
To associate a child handoff with its parent, use
|
|
743
744
|
`runlist baton --subagent review --parent resume-session-name @/tmp/review.md`.
|
|
744
745
|
This saves `parent_prompt: resume-session-name`; the parent can be saved later.
|
|
745
|
-
`rl prompts` collapses children into a `[+
|
|
746
|
+
`rl prompts` collapses children into a `[+N subagent]` count on
|
|
746
747
|
the matching `resume-*` prompt's line. Use `rl prompts --verbose` to expand their names
|
|
747
748
|
and target plans. Existing `subagent-*`, `agent-*`
|
|
748
749
|
and `session-*` names also group when they share the parent's name stem (the
|
package/bin/runlist.mjs
CHANGED
|
@@ -1313,7 +1313,7 @@ Pass \`--no-claim\` to read and archive the prompt without starting the plan.
|
|
|
1313
1313
|
|
|
1314
1314
|
Default prompt statuses: pending, archived.
|
|
1315
1315
|
|
|
1316
|
-
The default list shows [+
|
|
1316
|
+
The default list shows [+N subagent] on their resume-* parent's line.
|
|
1317
1317
|
Use --verbose to expand their names and targets.
|
|
1318
1318
|
Record the parent with \`baton --subagent <task> --parent resume-<name>\`;
|
|
1319
1319
|
legacy child names sharing the parent's name stem also group. Missing-parent
|
package/package.json
CHANGED
package/src/brief.mjs
CHANGED
|
@@ -16,7 +16,7 @@ export const LIMITS = {
|
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
// Several files at once is a survey; each one gets less.
|
|
19
|
-
export const SURVEY_LIMITS = { ...LIMITS, outline: 20, boxes: 10 };
|
|
19
|
+
export const SURVEY_LIMITS = { ...LIMITS, outline: 20, boxes: 10, listItems: 4 };
|
|
20
20
|
|
|
21
21
|
export const cut = (text, width = LIMITS.width) =>
|
|
22
22
|
text.length > width ? `${text.slice(0, width - 3)}...` : text;
|
package/src/prompts.mjs
CHANGED
|
@@ -186,7 +186,7 @@ function renderPromptQueueList(index, config) {
|
|
|
186
186
|
const visible = groups.filter(group => !isAgentHandoff(group.doc));
|
|
187
187
|
const maxSlug = Math.min(36, Math.max(0, ...visible.map(({ doc }) => path.basename(doc.path, '.md').length)));
|
|
188
188
|
const nextPath = queue[0]?.doc.path;
|
|
189
|
-
const childCount = children => `[
|
|
189
|
+
const childCount = children => `[+${children.length} subagent]`;
|
|
190
190
|
for (const { doc: p, children } of visible) {
|
|
191
191
|
const slug = path.basename(p.path, '.md').padEnd(maxSlug);
|
|
192
192
|
const marker = p.path === nextPath ? green('[NEXT]') : ' ';
|
package/src/show.mjs
CHANGED
|
@@ -79,6 +79,9 @@ export function showDoc(abs, config) {
|
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
// A long next step is cut in the brief, as the pickup card cuts it.
|
|
83
|
+
const NEXT_STEP_WIDTH = 300;
|
|
84
|
+
|
|
82
85
|
// Fields the text card prints. Everything else non-empty is named on one line
|
|
83
86
|
// so a reader knows it is there without printing the frontmatter.
|
|
84
87
|
const CARD_FIELDS = new Set(['title', 'status', 'next_step', 'blockers']);
|
|
@@ -228,12 +231,25 @@ export function runShow(args, config) {
|
|
|
228
231
|
cards.forEach((c, n) => {
|
|
229
232
|
if (n) process.stdout.write('\n');
|
|
230
233
|
const out = [`${c.title} (${c.status ?? 'no status'})`, c.path];
|
|
231
|
-
if (c.nextStep) out.push(`Next: ${c.nextStep}`);
|
|
234
|
+
if (c.nextStep) out.push(`Next: ${c.brief ? cut(c.nextStep, NEXT_STEP_WIDTH) : c.nextStep}`);
|
|
232
235
|
for (const b of c.blockers) out.push(`Blocker: ${b}`);
|
|
233
236
|
// The brief's open-box line carries the same count, read outside code fences.
|
|
234
237
|
if (c.checklist?.total && !c.brief) out.push(`Checklist: ${c.checklist.completed} of ${c.checklist.total} done`);
|
|
235
|
-
|
|
236
|
-
|
|
238
|
+
// With the brief, each related field and the body links show their first
|
|
239
|
+
// few entries and a count: a hub's dozens of related plans outweighed the
|
|
240
|
+
// brief itself. --card and --json list every one.
|
|
241
|
+
const cap = c.brief ? limits.listItems : Infinity;
|
|
242
|
+
const perField = new Map();
|
|
243
|
+
for (const r of c.related) {
|
|
244
|
+
const n = (perField.get(r.field) ?? 0) + 1;
|
|
245
|
+
perField.set(r.field, n);
|
|
246
|
+
if (n <= cap) out.push(`${r.field}: ${r.path ?? `${r.ref} (missing)`}${r.status ? ` (${r.status})` : ''}`);
|
|
247
|
+
}
|
|
248
|
+
for (const [field, n] of perField) if (n > cap) out.push(`${field}: +${n - cap} more (--card lists all)`);
|
|
249
|
+
if (c.links.length) {
|
|
250
|
+
const shown = c.links.slice(0, cap).map(l => l.path).join(', ');
|
|
251
|
+
out.push(`Linked from the body: ${shown}${c.links.length > cap ? ` (+${c.links.length - cap} more)` : ''}`);
|
|
252
|
+
}
|
|
237
253
|
if (c.brief) out.push(...renderBrief(c, c.brief));
|
|
238
254
|
process.stdout.write(out.join('\n') + '\n');
|
|
239
255
|
});
|