feat(ui): AI Tools modal, one-button lane tool picker, AgentHub settings in Overview, markdown preview
- AI Tools moves from a Settings section into a modal behind a button at the Settings tab bar's right edge (AiToolsModal, `actions` on PageTabs, /settings#ai-tools); rows get an enable switch, Default badge, and an Update button for every tool whose catalog names an updater (no version lookup on open); not-installed tools fold behind a disclosure, a finished job's log folds to one line; shared AiToolIcon - codex updates through its own `codex update`, openclaw/hermes gain `update --yes`; update-all runs every installed updater and skips an npm one only when npm does not manage the binary - Add-lane tool picker is one button showing the chosen tool that opens the enabled tools as buttons - Claude Code / Codex AgentHub sub-tab folded into Overview (home editor, hooks, pricing); the path list drops CLAUDE_HOME/CODEX_HOME; HomeDirSetting shows the saved value only while the field differs - Preview/Raw toggle for markdown files in the config FileViewer and the Changes panel's whole-file view (MarkdownPreview: react-markdown + remark-gfm, raw HTML never run, frontmatter as a code block) - docs and the CLAUDE.md marker updated
This commit is contained in:
@@ -371,7 +371,12 @@ describe("jobs", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("update-all runs the badged npm tools and every self updater", async () => {
|
||||
it("update-all runs every npm-managed tool and every self updater, asking npm no version", async () => {
|
||||
let viewed = 0;
|
||||
versions.__setExec(async (_f, args) => {
|
||||
if (args[0] === "view") viewed++;
|
||||
return { stdout: args[0] === "prefix" ? `${prefix}\n` : "1.0.0\n" };
|
||||
});
|
||||
await jobs.startUpdateAll();
|
||||
const done = await settle();
|
||||
assert.equal(done.status, "ok");
|
||||
@@ -379,5 +384,6 @@ describe("jobs", () => {
|
||||
spawned.map((s) => s.argv.slice(1).join(" ")),
|
||||
["install -g npm-tool@latest", "update --yes"]
|
||||
);
|
||||
assert.equal(viewed, 0);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -164,7 +164,7 @@ describe("install / update / icons", () => {
|
||||
const { body } = await request("GET", "/api/ai-tools");
|
||||
const codex = body.tools.find((t) => t.id === "codex");
|
||||
assert.deepEqual(codex.install, { kind: "npm", package: "@openai/codex" });
|
||||
assert.deepEqual(codex.update, { kind: "npm" });
|
||||
assert.deepEqual(codex.update, { kind: "self", args: ["update"] }); // standalone or npm
|
||||
assert.equal(body.catalog.source, "builtin");
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user