diff --git a/CHANGELOG.md b/CHANGELOG.md index 43a9346d1263..3f9162bb30e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ Docs: https://docs.openclaw.ai - Gateway/thread routing: preserve Slack, Telegram, Mattermost, and ACP parent-thread delivery targets so subagent, cron, and stream-relay completion messages land back in the originating thread or topic. (#54840, #57056, #63228, #63506) Thanks @yzzymt. - Agents/timeouts: extend the default LLM idle window to 120s and keep silent no-token idle timeouts on recovery paths, so slow models can retry or fall back before users see an error. - Gateway/agents: preserve configured model selection and richer `IDENTITY.md` content across agent create/update flows and workspace moves, and fail safely instead of silently overwriting unreadable identity files. (#61577) Thanks @samzong. +- Skills/TaskFlow: restore valid frontmatter fences for the bundled `taskflow` and `taskflow-inbox-triage` skills so they stay discoverable and loadable after updates. (#64469) Thanks @extrasmall0. - Windows/exec: settle supervisor waits from child exit state after stdout and stderr drain even when `close` never arrives, so CLI commands stop hanging or dying with forced `SIGKILL` on Windows. (#64072) Thanks @obviyus. - Browser/sandbox: prevent sandbox browser CDP startup hangs by recreating containers when the browser security hash changes and by waiting on the correct sandbox browser lifecycle. (#62873) Thanks @Syysean. - iMessage/self-chat: distinguish normal DM outbound rows from true self-chat using `destination_caller_id` plus chat participants, while preserving multi-handle self-chat aliases so outbound DM replies stop looping back as inbound messages. (#61619) Thanks @neeravmakwana. diff --git a/skills/taskflow-inbox-triage/SKILL.md b/skills/taskflow-inbox-triage/SKILL.md index 8a6c5e3160ff..4848be64b207 100644 --- a/skills/taskflow-inbox-triage/SKILL.md +++ b/skills/taskflow-inbox-triage/SKILL.md @@ -1,3 +1,4 @@ +--- name: taskflow-inbox-triage description: Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some waiting on outside answers, and others rolling into a later summary. metadata: { "openclaw": { "emoji": "📥" } } diff --git a/skills/taskflow/SKILL.md b/skills/taskflow/SKILL.md index d2e0054d1488..30de7009a984 100644 --- a/skills/taskflow/SKILL.md +++ b/skills/taskflow/SKILL.md @@ -1,3 +1,4 @@ +--- name: taskflow description: Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence. metadata: { "openclaw": { "emoji": "🪝" } } diff --git a/src/agents/skills.bundled-frontmatter.test.ts b/src/agents/skills.bundled-frontmatter.test.ts new file mode 100644 index 000000000000..db815fc3ee33 --- /dev/null +++ b/src/agents/skills.bundled-frontmatter.test.ts @@ -0,0 +1,24 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { describe, expect, it } from "vitest"; +import { parseFrontmatter } from "./skills/frontmatter.js"; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); + +describe("bundled taskflow skill frontmatter", () => { + it("keeps the taskflow skills parseable from their shipped files", async () => { + const skillPaths = [ + "skills/taskflow/SKILL.md", + "skills/taskflow-inbox-triage/SKILL.md", + ] as const; + + for (const relativePath of skillPaths) { + const raw = await fs.readFile(path.join(repoRoot, relativePath), "utf8"); + const frontmatter = parseFrontmatter(raw); + + expect(frontmatter.name, relativePath).toBeTruthy(); + expect(frontmatter.description, relativePath).toBeTruthy(); + } + }); +});