import { installSkill } from "../agents/skills-install.js"; import { buildWorkspaceSkillStatus } from "../agents/skills-status.js"; import { formatCliCommand } from "../cli/command-format.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { RuntimeEnv } from "../runtime.js"; import { normalizeSecretInput } from "../utils/normalize-secret-input.js"; import type { WizardPrompter } from "../wizard/prompts.js"; import { detectBinary, resolveNodeManagerOptions } from "./onboard-helpers.js";
for (const name of selected) { const target = installable.find((s) => s.name === name); if (!target || target.install.length === 0) { continue;
} const installId = target.install[0]?.id; if (!installId) { continue;
} const spin = prompter.progress(`Installing ${name}…`); const result = await installSkill({
workspaceDir,
skillName: target.name,
installId,
config: next,
}); const warnings = result.warnings ?? []; if (result.ok) {
spin.stop(warnings.length > 0 ? `Installed ${name} (with warnings)` : `Installed ${name}`); for (const warning of warnings) {
runtime.log(warning);
} continue;
} const code = result.code == null ? "" : ` (exit ${result.code})`; const detail = summarizeInstallFailure(result.message);
spin.stop(`Install failed: ${name}${code}${detail ? ` — ${detail}` : ""}`); for (const warning of warnings) {
runtime.log(warning);
} if (result.stderr) {
runtime.log(result.stderr.trim());
} elseif (result.stdout) {
runtime.log(result.stdout.trim());
}
runtime.log(
`Tip: run \`${formatCliCommand("openclaw doctor")}\` to review skills + requirements.`,
);
runtime.log("Docs: https://docs.openclaw.ai/skills");
}
}
for (const skill of missing) { if (!skill.primaryEnv || skill.missing.env.length === 0) { continue;
} const wantsKey = await prompter.confirm({
message: `Set ${skill.primaryEnv} for ${skill.name}?`,
initialValue: false,
}); if (!wantsKey) { continue;
} const apiKey = await prompter.text({
message: `Enter ${skill.primaryEnv}`,
validate: (value) => (value?.trim() ? undefined : "Required"),
});
next = upsertSkillEntry(next, skill.skillKey, { apiKey: normalizeSecretInput(apiKey) });
}
return next;
}
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.12Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-06-09)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.