refactor: remove skill workshop plugin package

This commit is contained in:
Shakker
2026-05-30 14:54:40 +01:00
committed by Shakker
parent c5af09e378
commit 308fdbe7fb
29 changed files with 0 additions and 3603 deletions

View File

@@ -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
```

View File

@@ -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}`"
```

View File

@@ -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
```