@lumoai/cli 1.15.0 → 1.17.0

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.
@@ -10,7 +10,15 @@ const sanitize_1 = require("../lib/sanitize");
10
10
  function fmtDate(iso) {
11
11
  return iso ? iso.slice(0, 10) : '-';
12
12
  }
13
- function formatSprintShow(s, progress, tasks) {
13
+ function blockerLine(label, items) {
14
+ if (items.length === 0)
15
+ return null;
16
+ const rendered = items
17
+ .map(i => `${i.identifier} ${(0, sanitize_1.sanitizeField)(i.title)}`)
18
+ .join(', ');
19
+ return ` ${label.padEnd(11)}${rendered}`;
20
+ }
21
+ function formatSprintShow(s, progress, tasks, risk, topBlockers) {
14
22
  const lines = [
15
23
  `Sprint: #${s.number} ${(0, sanitize_1.sanitizeField)(s.name)}`,
16
24
  `Status: ${s.status}`,
@@ -22,6 +30,27 @@ function formatSprintShow(s, progress, tasks) {
22
30
  ``,
23
31
  `Progress: ${progress.done} / ${progress.total}`,
24
32
  ];
33
+ if (risk) {
34
+ lines.push(`Health: ${risk.level.toUpperCase()}`);
35
+ for (const r of risk.reasons) {
36
+ lines.push(` - ${(0, sanitize_1.sanitizeField)(r.detail)}`);
37
+ }
38
+ }
39
+ if (topBlockers) {
40
+ const blockerLines = [
41
+ blockerLine('Overdue:', topBlockers.overdueTaskIds),
42
+ blockerLine('Stalled:', topBlockers.stalledTaskIds),
43
+ blockerLine('Agent fail:', topBlockers.failingAgentTaskIds),
44
+ topBlockers.staleOpenPrNumbers.length > 0
45
+ ? ` ${'Stale PRs:'.padEnd(11)}${topBlockers.staleOpenPrNumbers
46
+ .map(n => `#${n}`)
47
+ .join(', ')}`
48
+ : null,
49
+ ].filter((l) => l !== null);
50
+ if (blockerLines.length > 0) {
51
+ lines.push('Blockers:', ...blockerLines);
52
+ }
53
+ }
25
54
  if (tasks.length > 0) {
26
55
  lines.push('', (0, format_1.formatTaskListTable)(tasks));
27
56
  }
@@ -75,7 +104,7 @@ async function sprintShow(identifier, opts) {
75
104
  console.error(`Error: sprint tasks failed (HTTP ${tasksRes.status})`);
76
105
  return 1;
77
106
  }
78
- const { sprint, progress } = (await sprintRes.json());
107
+ const { sprint, progress, risk, topBlockers } = (await sprintRes.json());
79
108
  const { tasks } = (await tasksRes.json());
80
- process.stdout.write(formatSprintShow(sprint, progress, tasks) + '\n');
109
+ process.stdout.write(formatSprintShow(sprint, progress, tasks, risk, topBlockers) + '\n');
81
110
  }
@@ -186,7 +186,7 @@ program
186
186
  .description('Install the Lumo Claude Code skill and wire hook handlers into .claude/settings.json. Run via `npx @lumoai/cli setup` for first-time onboarding.')
187
187
  .option('--user', 'Install into ~/.claude (applies across all projects for this user)')
188
188
  .option('--project', 'Install into ./.claude (applies to the current project only)')
189
- .option('--force', 'Overwrite an existing SKILL.md when its contents differ from the bundled version')
189
+ .option('--force', 'Overwrite existing skill files (SKILL.md + references/) when they differ from the bundled version')
190
190
  .option('--agent <token>', 'Coding agent these hooks run under (claude-code, codex, cursor, gemini-cli, github-copilot, windsurf). Baked into every hook command. Defaults to claude-code.')
191
191
  .action(wrap(options => (0, setup_1.setup)(options)));
192
192
  program
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumoai/cli",
3
- "version": "1.15.0",
3
+ "version": "1.17.0",
4
4
  "description": "Lumo CLI — manage tasks and sessions from the terminal",
5
5
  "license": "MIT",
6
6
  "author": "cli@uselumo.ai",