@lumoai/cli 1.25.0 → 1.26.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.
Files changed (29) hide show
  1. package/assets/skill/SKILL.md +21 -7
  2. package/assets/skill/references/artifacts-figma.md +1 -1
  3. package/assets/skill/references/criteria.md +10 -9
  4. package/assets/skill/references/docs.md +5 -5
  5. package/assets/skill/references/milestones.md +6 -6
  6. package/assets/skill/references/sessions.md +30 -30
  7. package/assets/skill/references/sprints.md +6 -6
  8. package/assets/skill/references/task-context.md +5 -5
  9. package/assets/skill/references/tasks.md +37 -15
  10. package/assets/skill/references/verify.md +3 -3
  11. package/dist/cli/src/commands/doc-list.js +4 -0
  12. package/dist/cli/src/commands/memory-promote.js +11 -4
  13. package/dist/cli/src/commands/memory-rm.js +1 -1
  14. package/dist/cli/src/commands/milestone-show.js +1 -1
  15. package/dist/cli/src/commands/next.js +1 -1
  16. package/dist/cli/src/commands/session-attach.js +5 -4
  17. package/dist/cli/src/commands/task-artifact-add.js +2 -2
  18. package/dist/cli/src/commands/task-criteria-set.js +3 -3
  19. package/dist/cli/src/commands/task-deps.js +12 -12
  20. package/dist/cli/src/commands/verify.js +1 -1
  21. package/dist/cli/src/commands/wrap/blocked-prompt-section.js +9 -9
  22. package/dist/cli/src/commands/wrap/fragment-usage-section.js +6 -6
  23. package/dist/cli/src/commands/wrap/memory-review-section.js +6 -6
  24. package/dist/cli/src/commands/wrap/progress-comment-section.js +11 -11
  25. package/dist/cli/src/index.js +7 -2
  26. package/dist/cli/src/lib/doc-input.js +10 -1
  27. package/dist/cli/src/lib/hook-runner.js +9 -9
  28. package/dist/cli/src/lib/wrap-panel.js +1 -1
  29. package/package.json +1 -1
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.unreadableFileMessage = unreadableFileMessage;
36
37
  exports.resolveDocContent = resolveDocContent;
37
38
  exports.readStdinToString = readStdinToString;
38
39
  exports.readFileUtf8 = readFileUtf8;
@@ -45,6 +46,14 @@ const path_guard_1 = require("./path-guard");
45
46
  * mutually exclusive. stdin is only consulted when neither flag is set
46
47
  * and the shell is non-TTY.
47
48
  */
49
+ /**
50
+ * Actionable message for an unreadable --file path: agents most often pass a
51
+ * path that doesn't exist relative to the current working directory.
52
+ */
53
+ function unreadableFileMessage(file) {
54
+ return (`could not read file ${file} (cwd: ${process.cwd()}) — ` +
55
+ `check the path exists; pass a project-local relative path`);
56
+ }
48
57
  async function resolveDocContent(args) {
49
58
  const hasContent = args.content !== undefined;
50
59
  const hasFile = args.file !== undefined && args.file.length > 0;
@@ -62,7 +71,7 @@ async function resolveDocContent(args) {
62
71
  return {
63
72
  kind: 'error',
64
73
  message: check.reason === 'unreadable'
65
- ? `could not read file ${args.file}`
74
+ ? unreadableFileMessage(args.file)
66
75
  : `refusing to read ${args.file} — ${check.detail}. ` +
67
76
  `--file must be a non-sensitive path inside the project directory.`,
68
77
  };
@@ -102,7 +102,7 @@ function formatHookStdoutLines(path, responseBody, now = new Date()) {
102
102
  const sessionId = body.sessionId;
103
103
  const tb = body.taskBinding;
104
104
  if (tb && tb.bound === true) {
105
- lines.push(`[Lumo] session_id=${sessionId} | 当前任务: ${tb.taskIdentifier} - ${(0, sanitize_1.sanitizeField)(tb.taskTitle ?? '')}`);
105
+ lines.push(`[Lumo] session_id=${sessionId} | Current task: ${tb.taskIdentifier} - ${(0, sanitize_1.sanitizeField)(tb.taskTitle ?? '')}`);
106
106
  }
107
107
  else if (tb && tb.bound === false) {
108
108
  lines.push(unboundPromptLine(sessionId));
@@ -135,11 +135,11 @@ function formatHookStdoutLines(path, responseBody, now = new Date()) {
135
135
  * no task could be inferred from local git — the user is asked to name one.
136
136
  */
137
137
  function unboundPromptLine(sessionId) {
138
- return `[Lumo] session_id=${sessionId} | 当前未绑定任务。请告诉我你要处理的任务编号(如 LUM-42),或说"跳过"。`;
138
+ return `[Lumo] session_id=${sessionId} | No task bound. Tell me the task you want to work on (e.g. LUM-42), or say "skip".`;
139
139
  }
140
140
  const MAX_UNRESOLVED = 5;
141
141
  /**
142
- * Render the "续上次进度" recovery card from the structured previousSession
142
+ * Render the "resuming previous session" recovery card from the structured previousSession
143
143
  * payload. Returns undefined when there's nothing to show (null payload or an
144
144
  * empty headline). Free text (headline / unresolved) is sanitized here — it's
145
145
  * LLM-generated and routed to Claude Code stdout. unresolved is capped at
@@ -152,18 +152,18 @@ function renderRecoveryCard(prev, taskIdentifier, now) {
152
152
  const ago = (0, format_1.relativeTime)(new Date(prev.lastActivityAt), now);
153
153
  const dur = (0, format_1.formatDuration)(prev.durationMs);
154
154
  const lines = [
155
- `## 续上次进度 (上一段 session · ${ago} · ${dur})`,
156
- `上次干到:${(0, sanitize_1.sanitizeField)(prev.headline)}`,
155
+ `## Resuming previous session (${ago} · ${dur})`,
156
+ `Last stopped at: ${(0, sanitize_1.sanitizeField)(prev.headline)}`,
157
157
  ];
158
158
  const unresolved = Array.isArray(prev.unresolved) ? prev.unresolved : [];
159
159
  if (unresolved.length > 0) {
160
- lines.push('未完成:');
160
+ lines.push('Unfinished:');
161
161
  const shown = unresolved.slice(0, MAX_UNRESOLVED);
162
162
  for (const u of shown)
163
163
  lines.push(`- ${(0, sanitize_1.sanitizeField)(u)}`);
164
164
  const extra = unresolved.length - shown.length;
165
165
  if (extra > 0) {
166
- lines.push(`- …(+${extra} more, lumo task context ${taskIdentifier} 查看全部)`);
166
+ lines.push(`- … (+${extra} more run \`lumo task context ${taskIdentifier}\` for the full list)`);
167
167
  }
168
168
  }
169
169
  return lines.join('\n');
@@ -193,8 +193,8 @@ function sessionContextEnvelope(parts) {
193
193
  * context surface only once the user actually attaches.
194
194
  */
195
195
  function formatSuggestLine(sessionId, match) {
196
- const basis = match.source === 'branch' ? '分支名' : '最近 commit';
197
- return `[Lumo] session_id=${sessionId} | 检测到 ${match.identifier}(依据${basis})。运行 lumo session attach ${match.identifier} 绑定。`;
196
+ const basis = match.source === 'branch' ? 'branch name' : 'recent commits';
197
+ return `[Lumo] session_id=${sessionId} | Detected ${match.identifier} (from ${basis}). Run \`lumo session attach ${match.identifier}\` to bind.`;
198
198
  }
199
199
  /**
200
200
  * Build the stdout lines for a session-start response. When the server reports
@@ -7,7 +7,7 @@ async function runWrapPanel(sections, opts) {
7
7
  process.stdout.write(`\n━━ ${section.title} ━━\n`);
8
8
  const hasContent = await section.prepare();
9
9
  if (!hasContent) {
10
- process.stdout.write('(无内容)\n');
10
+ process.stdout.write('(no content)\n');
11
11
  continue;
12
12
  }
13
13
  await section.run(opts);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumoai/cli",
3
- "version": "1.25.0",
3
+ "version": "1.26.0",
4
4
  "description": "Lumo CLI — manage tasks and sessions from the terminal",
5
5
  "license": "MIT",
6
6
  "author": "cli@uselumo.ai",