mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-06 05:51:15 +08:00
refactor: remove skill workshop plugin package
This commit is contained in:
@@ -1,90 +0,0 @@
|
||||
# Skill Workshop animated GIF autocreate
|
||||
|
||||
```yaml qa-scenario
|
||||
id: skill-workshop-animated-gif-autocreate
|
||||
title: Skill Workshop animated GIF autocreate
|
||||
surface: plugins
|
||||
coverage:
|
||||
primary:
|
||||
- plugins.skill-workshop
|
||||
secondary:
|
||||
- plugins.skills
|
||||
- skills.hot-refresh
|
||||
objective: Verify a non-trivial animated GIF correction is captured as a workspace skill and becomes visible without restart.
|
||||
plugins:
|
||||
- skill-workshop
|
||||
gatewayConfigPatch:
|
||||
plugins:
|
||||
entries:
|
||||
skill-workshop:
|
||||
enabled: true
|
||||
config:
|
||||
autoCapture: true
|
||||
approvalPolicy: auto
|
||||
reviewMode: heuristic
|
||||
successCriteria:
|
||||
- The model receives a realistic animated GIF task plus a durable correction.
|
||||
- Skill Workshop writes an animated GIF workflow skill automatically.
|
||||
- The new skill appears in skills.status without restarting the gateway.
|
||||
docsRefs:
|
||||
- docs/plugins/skill-workshop.md
|
||||
- docs/tools/skills.md
|
||||
codeRefs:
|
||||
- extensions/skill-workshop/index.ts
|
||||
- extensions/skill-workshop/src/signals.ts
|
||||
- extensions/skill-workshop/src/skills.ts
|
||||
execution:
|
||||
kind: flow
|
||||
summary: Ask for an animated GIF workflow correction and verify Skill Workshop creates a hot workspace skill.
|
||||
config:
|
||||
prompt: |-
|
||||
Find two sources for small animated loading GIFs and summarize what should be checked before using one.
|
||||
|
||||
Next time when asked for animated GIFs, verify the URL really resolves to an animated GIF, record attribution, and avoid hotlinking when a local asset is needed.
|
||||
```
|
||||
|
||||
```yaml qa-flow
|
||||
steps:
|
||||
- name: creates an animated GIF skill from a durable correction
|
||||
actions:
|
||||
- call: reset
|
||||
- call: runAgentPrompt
|
||||
args:
|
||||
- ref: env
|
||||
- sessionKey: agent:qa:skill-workshop-gif
|
||||
message:
|
||||
expr: config.prompt
|
||||
timeoutMs:
|
||||
expr: liveTurnTimeoutMs(env, 45000)
|
||||
- call: waitForCondition
|
||||
saveAs: skillText
|
||||
args:
|
||||
- lambda:
|
||||
async: true
|
||||
expr: |-
|
||||
await (async () => {
|
||||
const root = path.join(env.gateway.workspaceDir, 'skills');
|
||||
const names = await fs.readdir(root).catch(() => []);
|
||||
for (const name of names.toSorted()) {
|
||||
const text = await fs.readFile(path.join(root, name, 'SKILL.md'), 'utf8').catch(() => '');
|
||||
if (text.includes('record attribution') && text.toLowerCase().includes('animated')) {
|
||||
return text;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
})()
|
||||
- 15000
|
||||
- 200
|
||||
- call: waitForCondition
|
||||
args:
|
||||
- lambda:
|
||||
async: true
|
||||
expr: |-
|
||||
(await readSkillStatus(env)).some((skill) => {
|
||||
const haystack = `${skill.name ?? ''} ${skill.description ?? ''}`.toLowerCase();
|
||||
return skill.eligible && haystack.includes('gif');
|
||||
}) ? true : undefined
|
||||
- 15000
|
||||
- 200
|
||||
detailsExpr: skillText
|
||||
```
|
||||
@@ -1,129 +0,0 @@
|
||||
# Skill Workshop pending approval
|
||||
|
||||
```yaml qa-scenario
|
||||
id: skill-workshop-pending-approval
|
||||
title: Skill Workshop pending approval
|
||||
surface: plugins
|
||||
coverage:
|
||||
primary:
|
||||
- plugins.skill-workshop
|
||||
secondary:
|
||||
- plugins.plugin-tools
|
||||
- plugins.skills
|
||||
objective: Verify an explicit pending skill suggestion queues for review, then approval writes a workspace skill.
|
||||
plugins:
|
||||
- skill-workshop
|
||||
gatewayConfigPatch:
|
||||
tools:
|
||||
alsoAllow:
|
||||
- skill_workshop
|
||||
plugins:
|
||||
entries:
|
||||
skill-workshop:
|
||||
enabled: true
|
||||
config:
|
||||
autoCapture: true
|
||||
approvalPolicy: auto
|
||||
reviewMode: heuristic
|
||||
successCriteria:
|
||||
- A realistic screenshot asset workflow queues a pending skill suggestion.
|
||||
- The skill_workshop tool reports the pending item.
|
||||
- Applying the item writes the workspace skill and refreshes skill status.
|
||||
docsRefs:
|
||||
- docs/plugins/skill-workshop.md
|
||||
- docs/tools/skills.md
|
||||
codeRefs:
|
||||
- extensions/skill-workshop/src/tool.ts
|
||||
- extensions/skill-workshop/src/store.ts
|
||||
- extensions/qa-lab/src/suite-runtime-agent-tools.ts
|
||||
execution:
|
||||
kind: flow
|
||||
summary: Queue a pending screenshot workflow suggestion and approve it through the plugin tool.
|
||||
config:
|
||||
skillName: screenshot-asset-workflow
|
||||
proposalTitle: Verify screenshot asset replacements before final reply
|
||||
proposalReason: User established a repeatable screenshot asset update workflow.
|
||||
proposalDescription: Capture the repeatable checklist for app screenshot asset replacements.
|
||||
proposalBody: |-
|
||||
When updating an app screenshot asset, first identify the newest PNG in Desktop or Downloads if the user has not specified a file.
|
||||
Verify the image dimensions against the target asset before replacement.
|
||||
Preserve the expected asset size and aspect constraints, optimize the PNG after replacement, and run the relevant validation gate before reporting completion.
|
||||
```
|
||||
|
||||
```yaml qa-flow
|
||||
steps:
|
||||
- name: queues and applies a pending skill update
|
||||
actions:
|
||||
- call: reset
|
||||
- call: callPluginToolsMcp
|
||||
saveAs: suggestResult
|
||||
args:
|
||||
- env:
|
||||
ref: env
|
||||
toolName: skill_workshop
|
||||
args:
|
||||
action: suggest
|
||||
apply: false
|
||||
skillName:
|
||||
expr: config.skillName
|
||||
title:
|
||||
expr: config.proposalTitle
|
||||
reason:
|
||||
expr: config.proposalReason
|
||||
description:
|
||||
expr: config.proposalDescription
|
||||
body:
|
||||
expr: config.proposalBody
|
||||
- call: waitForCondition
|
||||
saveAs: pendingResult
|
||||
args:
|
||||
- lambda:
|
||||
async: true
|
||||
expr: |-
|
||||
(async () => {
|
||||
const result = await callPluginToolsMcp({
|
||||
env,
|
||||
toolName: 'skill_workshop',
|
||||
args: { action: 'list_pending' },
|
||||
});
|
||||
const text = JSON.stringify(result);
|
||||
return text.includes(config.skillName) ? result : undefined;
|
||||
})()
|
||||
- 15000
|
||||
- 500
|
||||
- set: pendingText
|
||||
value:
|
||||
expr: "JSON.stringify({ suggestResult, pendingResult })"
|
||||
- set: pendingId
|
||||
value:
|
||||
expr: "JSON.parse(pendingResult.content[0].text)[0].id"
|
||||
- call: callPluginToolsMcp
|
||||
saveAs: applyResult
|
||||
args:
|
||||
- env:
|
||||
ref: env
|
||||
toolName: skill_workshop
|
||||
args:
|
||||
action: apply
|
||||
id:
|
||||
ref: pendingId
|
||||
- set: skillPath
|
||||
value:
|
||||
expr: "path.join(env.gateway.workspaceDir, 'skills', config.skillName, 'SKILL.md')"
|
||||
- call: waitForCondition
|
||||
args:
|
||||
- lambda:
|
||||
async: true
|
||||
expr: "findSkill(await readSkillStatus(env), config.skillName)?.eligible ? true : undefined"
|
||||
- 15000
|
||||
- 200
|
||||
- call: fs.readFile
|
||||
saveAs: skillText
|
||||
args:
|
||||
- ref: skillPath
|
||||
- utf8
|
||||
- assert:
|
||||
expr: "skillText.includes('optimize the PNG') && JSON.stringify(applyResult).includes('applied')"
|
||||
message: expected approved skill text and applied result
|
||||
detailsExpr: "`PENDING:${pendingText}\\n${skillText}`"
|
||||
```
|
||||
@@ -1,92 +0,0 @@
|
||||
# Skill Workshop reviewer autonomous capture
|
||||
|
||||
```yaml qa-scenario
|
||||
id: skill-workshop-reviewer-autonomous
|
||||
title: Skill Workshop reviewer autonomous capture
|
||||
surface: plugins
|
||||
coverage:
|
||||
primary:
|
||||
- plugins.skill-workshop
|
||||
secondary:
|
||||
- plugins.skills
|
||||
- plugins.plugin-tools
|
||||
objective: Verify threshold review can turn a non-trivial workflow into a workspace skill without an explicit correction phrase.
|
||||
plugins:
|
||||
- skill-workshop
|
||||
gatewayConfigPatch:
|
||||
plugins:
|
||||
entries:
|
||||
skill-workshop:
|
||||
enabled: true
|
||||
config:
|
||||
autoCapture: true
|
||||
approvalPolicy: auto
|
||||
reviewMode: llm
|
||||
reviewInterval: 1
|
||||
reviewMinToolCalls: 1
|
||||
successCriteria:
|
||||
- The task asks for a reusable animated-media QA workflow without saying "next time" or "remember".
|
||||
- The reviewer creates or updates a workspace skill automatically.
|
||||
- The skill becomes visible through skills.status without restarting the gateway.
|
||||
docsRefs:
|
||||
- docs/plugins/skill-workshop.md
|
||||
- docs/tools/skills.md
|
||||
codeRefs:
|
||||
- extensions/skill-workshop/index.ts
|
||||
- extensions/skill-workshop/src/reviewer.ts
|
||||
- extensions/skill-workshop/src/workshop.ts
|
||||
execution:
|
||||
kind: flow
|
||||
summary: Trigger the LLM reviewer after one successful turn and verify it persists a reusable animated-media workflow.
|
||||
config:
|
||||
prompt: |-
|
||||
Build a compact QA checklist for accepting an externally sourced animated GIF asset in a product UI.
|
||||
|
||||
Include checks for true animation, dimensions, attribution, local copy policy, and a final verification step. Treat this as a workflow we will reuse on similar media tasks.
|
||||
```
|
||||
|
||||
```yaml qa-flow
|
||||
steps:
|
||||
- name: reviewer creates a reusable skill
|
||||
actions:
|
||||
- call: reset
|
||||
- call: runAgentPrompt
|
||||
args:
|
||||
- ref: env
|
||||
- sessionKey: agent:qa:skill-workshop-reviewer
|
||||
message:
|
||||
expr: config.prompt
|
||||
timeoutMs:
|
||||
expr: liveTurnTimeoutMs(env, 90000)
|
||||
- call: waitForCondition
|
||||
saveAs: skillText
|
||||
args:
|
||||
- lambda:
|
||||
async: true
|
||||
expr: |-
|
||||
(async () => {
|
||||
const root = path.join(env.gateway.workspaceDir, 'skills');
|
||||
const names = await fs.readdir(root).catch(() => []);
|
||||
for (const name of names.toSorted()) {
|
||||
const text = await fs.readFile(path.join(root, name, 'SKILL.md'), 'utf8').catch(() => '');
|
||||
if (text.includes('attribution') && text.toLowerCase().includes('animated')) {
|
||||
return text;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
})()
|
||||
- 30000
|
||||
- 500
|
||||
- call: waitForCondition
|
||||
args:
|
||||
- lambda:
|
||||
async: true
|
||||
expr: |-
|
||||
(await readSkillStatus(env)).some((skill) => {
|
||||
const haystack = `${skill.name ?? ''} ${skill.description ?? ''}`.toLowerCase();
|
||||
return skill.eligible && (haystack.includes('gif') || haystack.includes('animated'));
|
||||
}) ? true : undefined
|
||||
- 15000
|
||||
- 200
|
||||
detailsExpr: skillText
|
||||
```
|
||||
Reference in New Issue
Block a user