@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.
- package/assets/skill/SKILL.md +21 -7
- package/assets/skill/references/artifacts-figma.md +1 -1
- package/assets/skill/references/criteria.md +10 -9
- package/assets/skill/references/docs.md +5 -5
- package/assets/skill/references/milestones.md +6 -6
- package/assets/skill/references/sessions.md +30 -30
- package/assets/skill/references/sprints.md +6 -6
- package/assets/skill/references/task-context.md +5 -5
- package/assets/skill/references/tasks.md +37 -15
- package/assets/skill/references/verify.md +3 -3
- package/dist/cli/src/commands/doc-list.js +4 -0
- package/dist/cli/src/commands/memory-promote.js +11 -4
- package/dist/cli/src/commands/memory-rm.js +1 -1
- package/dist/cli/src/commands/milestone-show.js +1 -1
- package/dist/cli/src/commands/next.js +1 -1
- package/dist/cli/src/commands/session-attach.js +5 -4
- package/dist/cli/src/commands/task-artifact-add.js +2 -2
- package/dist/cli/src/commands/task-criteria-set.js +3 -3
- package/dist/cli/src/commands/task-deps.js +12 -12
- package/dist/cli/src/commands/verify.js +1 -1
- package/dist/cli/src/commands/wrap/blocked-prompt-section.js +9 -9
- package/dist/cli/src/commands/wrap/fragment-usage-section.js +6 -6
- package/dist/cli/src/commands/wrap/memory-review-section.js +6 -6
- package/dist/cli/src/commands/wrap/progress-comment-section.js +11 -11
- package/dist/cli/src/index.js +7 -2
- package/dist/cli/src/lib/doc-input.js +10 -1
- package/dist/cli/src/lib/hook-runner.js +9 -9
- package/dist/cli/src/lib/wrap-panel.js +1 -1
- 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
|
-
?
|
|
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} |
|
|
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} |
|
|
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 "
|
|
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
|
-
`##
|
|
156
|
-
|
|
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
|
|
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' ? '
|
|
197
|
-
return `[Lumo] session_id=${sessionId} |
|
|
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('(
|
|
10
|
+
process.stdout.write('(no content)\n');
|
|
11
11
|
continue;
|
|
12
12
|
}
|
|
13
13
|
await section.run(opts);
|