fix: always return minimal n8n output
Build and Push Docker Container / build-and-push (push) Successful in 4m36s

- Node now outputs only stdout (parsed or raw) plus optional stderr

- Keep output stable across all operations to simplify n8n mappings

- Trim trailing newlines from runner stdout/stderr for cleaner display

- Bump server version to 1.0.3 to ship runner/output changes

- Bump n8n node package via versioned build artifacts
This commit is contained in:
2026-06-24 12:04:34 +02:00
parent 3bda4002fe
commit a953214c20
7 changed files with 57 additions and 8 deletions
@@ -14,6 +14,7 @@ export interface ObsidianCommandResult extends IDataObject {
stderr: string;
duration_ms: number;
timed_out: boolean;
parsed_stdout?: IDataObject;
}
export interface ObsidianCredentials extends IDataObject {
@@ -72,6 +73,9 @@ export async function executeObsidianCommand(
}
const result = normalizeCommandResult(response);
const parsed = maybeParseStdout(result);
if (parsed) result.parsed_stdout = parsed;
if (result.exit_code !== 0) {
throw new NodeOperationError(
context.getNode(),
@@ -139,6 +143,42 @@ function extractErrorMessage(body: unknown): string {
return '';
}
function maybeParseStdout(result: ObsidianCommandResult): IDataObject | undefined {
const lastArg = result.command[result.command.length - 1];
if (lastArg !== 'vault' && lastArg !== 'vaults') return undefined;
// Obsidian CLI prints either:
// vault:
// key<TAB>value\nkey<TAB>value\n...
// vaults:
// often one vault per line (names) or a similar tabular output.
const lines = (result.stdout || '')
.split(/\r?\n/)
.map((l) => l.trim())
.filter(Boolean);
if (!lines.length) return undefined;
const isKv = lines.some((l) => l.includes('\t'));
if (!isKv && lastArg === 'vaults') {
return { vaults: lines };
}
const kv: Record<string, string | number> = {};
for (const line of lines) {
const parts = line.split('\t');
if (parts.length < 2) continue;
const key = parts[0].trim();
const rawValue = parts.slice(1).join('\t').trim();
if (!key || !rawValue) continue;
if (/^-?\d+$/.test(rawValue)) kv[key] = Number(rawValue);
else kv[key] = rawValue;
}
return Object.keys(kv).length ? kv : undefined;
}
function normalizeCommandResult(response: unknown): ObsidianCommandResult {
const data = extractResponseBody(response);
const result = typeof data === 'string' ? JSON.parse(data) : data;