runlist 0.98.0 → 0.98.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
@@ -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.0**.
75
- [Mac installer and release notes](https://github.com/reowens/runlist/releases/tag/desktop-v0.98.0).
74
+ CLI and desktop release version: **0.98.1**.
75
+ [Mac installer and release notes](https://github.com/reowens/runlist/releases/tag/desktop-v0.98.1).
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.97.0 is published and installed locally.** It adds the `runlist show`
109
- brief (outline, open boxes and `--section` reads with line numbers), counts
110
- checklists outside code fences only, and trims session and subagent start-up
111
- context. The desktop app's own code is unchanged from 0.96.1; it bundles the
112
- 0.97.0 engine. The Mac installer is signed, notarized and verified; installation
108
+ **0.98.0 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, and groups open boxes by phase;
111
+ `runlist use <doc>` briefs a doc over 500 lines. The agent workflow says to
112
+ read plans that way. The desktop app's own code is unchanged from 0.96.1; it
113
+ bundles the 0.98.0 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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runlist",
3
- "version": "0.98.0",
3
+ "version": "0.98.1",
4
4
  "description": "CLI for managing markdown documents with YAML frontmatter — index, query, validate, graph, export, lifecycle, and AI summaries.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runlist-codex",
3
- "version": "0.98.0",
3
+ "version": "0.98.1",
4
4
  "description": "Runlist workflow skill, session orientation, and tool guard for Codex",
5
5
  "author": {
6
6
  "name": "Reo Owens"
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/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
- for (const r of c.related) out.push(`${r.field}: ${r.path ?? `${r.ref} (missing)`}${r.status ? ` (${r.status})` : ''}`);
236
- if (c.links.length) out.push(`Linked from the body: ${c.links.map(l => l.path).join(', ')}`);
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
  });