@weavetab/skills 1.0.1 → 2.5.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -50
- package/ROUTER.md +43 -0
- package/bin/cli.js +232 -132
- package/browser/dom-strategy.md +119 -0
- package/browser/form-automation.md +87 -0
- package/browser/interaction-pipeline.md +216 -0
- package/browser/tab-and-window.md +136 -0
- package/desktop/desktop-targeting.md +85 -0
- package/desktop/electron-discovery.md +115 -0
- package/developer/github-forensics.md +74 -0
- package/dist/bundled/weavetab-all.md +1905 -0
- package/dist/bundled/weavetab-browser.md +501 -0
- package/dist/bundled/weavetab-desktop.md +176 -0
- package/dist/bundled/weavetab-developer.md +67 -0
- package/dist/bundled/weavetab-documents.md +142 -0
- package/dist/bundled/weavetab-memory.md +359 -0
- package/dist/bundled/weavetab-network-and-perf.md +223 -0
- package/dist/bundled/weavetab-plugins.md +78 -0
- package/dist/bundled/weavetab-resilience.md +216 -0
- package/dist/bundled/weavetab-security.md +87 -0
- package/dist/granular/browser_dom-strategy.md +119 -0
- package/dist/granular/browser_form-automation.md +87 -0
- package/dist/granular/browser_interaction-pipeline.md +216 -0
- package/dist/granular/browser_tab-and-window.md +136 -0
- package/dist/granular/desktop_desktop-targeting.md +85 -0
- package/dist/granular/desktop_electron-discovery.md +115 -0
- package/dist/granular/developer_github-forensics.md +74 -0
- package/dist/granular/documents_canvas-and-visual-capture.md +103 -0
- package/dist/granular/documents_office-document-ingestion.md +63 -0
- package/dist/granular/memory_selector-memory-system.md +127 -0
- package/dist/granular/memory_session-trail.md +95 -0
- package/dist/granular/memory_site-learning.md +180 -0
- package/dist/granular/network-and-perf_device-and-environment.md +87 -0
- package/dist/granular/network-and-perf_network-intercept-and-mock.md +84 -0
- package/dist/granular/network-and-perf_performance-and-vitals.md +84 -0
- package/dist/granular/plugins_hooks-and-overrides.md +36 -0
- package/dist/granular/plugins_plugin-runtime.md +60 -0
- package/dist/granular/resilience_loop-breaker.md +67 -0
- package/dist/granular/resilience_session-time-travel.md +131 -0
- package/dist/granular/resilience_stale-ref-recovery.md +53 -0
- package/dist/granular/security_rbac-and-policies.md +47 -0
- package/dist/granular/security_secret-containment-protocol.md +59 -0
- package/documents/canvas-and-visual-capture.md +103 -0
- package/documents/office-document-ingestion.md +63 -0
- package/evals/evaluator.js +146 -0
- package/evals/scenarios.json +238 -0
- package/memory/selector-memory-system.md +127 -0
- package/memory/session-trail.md +95 -0
- package/memory/site-learning.md +180 -0
- package/network-and-perf/device-and-environment.md +87 -0
- package/network-and-perf/network-intercept-and-mock.md +84 -0
- package/network-and-perf/performance-and-vitals.md +84 -0
- package/package.json +73 -42
- package/plugins/hooks-and-overrides.md +36 -0
- package/plugins/plugin-runtime.md +60 -0
- package/resilience/loop-breaker.md +67 -0
- package/resilience/session-time-travel.md +131 -0
- package/resilience/stale-ref-recovery.md +53 -0
- package/security/rbac-and-policies.md +47 -0
- package/security/secret-containment-protocol.md +59 -0
- package/skills.json +431 -308
- package/src/api.js +239 -128
- package/.github/FUNDING.yml +0 -2
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -28
- package/.github/ISSUE_TEMPLATE/skill_request.md +0 -24
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -23
- package/CONTRIBUTING.md +0 -34
- package/SECURITY.md +0 -26
- package/advanced/README.md +0 -2
- package/automation/README.md +0 -2
- package/general/captcha-evasion.md +0 -13
- package/general/context-awareness.md +0 -13
- package/general/cookie-consent.md +0 -13
- package/general/data-extraction.md +0 -13
- package/general/dynamic-interaction.md +0 -13
- package/general/error-recovery.md +0 -13
- package/general/file-upload.md +0 -13
- package/general/form-filling.md +0 -16
- package/general/guardrails.md +0 -13
- package/general/iframe-handling.md +0 -13
- package/general/infinite-scroll.md +0 -13
- package/general/login-flow.md +0 -16
- package/general/multi-tab-management.md +0 -13
- package/general/spa-navigation.md +0 -13
- package/general/table-scraping.md +0 -13
- package/scripts/build.js +0 -48
package/src/api.js
CHANGED
|
@@ -1,128 +1,239 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
fs.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
fs.writeFileSync(path.join(
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
const packageRoot = path.join(__dirname, '..');
|
|
5
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
|
|
6
|
+
const WEAVETAB_VERSION = pkg.version;
|
|
7
|
+
const skillsJsonPath = path.join(packageRoot, 'skills.json');
|
|
8
|
+
const routerPath = path.join(packageRoot, 'ROUTER.md');
|
|
9
|
+
const distBundledDir = path.join(packageRoot, 'dist', 'bundled');
|
|
10
|
+
|
|
11
|
+
const ALL_DOMAINS = [
|
|
12
|
+
'browser',
|
|
13
|
+
'desktop',
|
|
14
|
+
'memory',
|
|
15
|
+
'resilience',
|
|
16
|
+
'security',
|
|
17
|
+
'plugins',
|
|
18
|
+
'network-and-perf',
|
|
19
|
+
'documents',
|
|
20
|
+
'developer'
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Read the pre-compiled skills catalog.
|
|
25
|
+
*/
|
|
26
|
+
function getSkills() {
|
|
27
|
+
if (!fs.existsSync(skillsJsonPath)) {
|
|
28
|
+
throw new Error("skills.json not found. Run 'npm run build' first.");
|
|
29
|
+
}
|
|
30
|
+
return JSON.parse(fs.readFileSync(skillsJsonPath, 'utf8'));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Retrieve a specific skill by its ID.
|
|
35
|
+
*/
|
|
36
|
+
function getSkill(id) {
|
|
37
|
+
const data = getSkills();
|
|
38
|
+
return data.skills.find(s => s.id === id) || null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Retrieve all skills belonging to a domain.
|
|
43
|
+
*/
|
|
44
|
+
function getSkillsByDomain(domain) {
|
|
45
|
+
const data = getSkills();
|
|
46
|
+
return data.skills.filter(s => s.domain === domain);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Read the universal intent decision matrix (ROUTER.md).
|
|
51
|
+
*/
|
|
52
|
+
function getRouterMatrix() {
|
|
53
|
+
if (!fs.existsSync(routerPath)) return "";
|
|
54
|
+
return fs.readFileSync(routerPath, 'utf8');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Programmatically install Weavetab MCP skills into a target project.
|
|
59
|
+
*
|
|
60
|
+
* @param {Object} options
|
|
61
|
+
* @param {string} options.targetFramework - '.agents', '.cursor', '.clinerules', '.windsurf', '.openclaw', '.roocode', '.aider', or 'generic'
|
|
62
|
+
* @param {string[]} [options.domains] - Domains to install (e.g. ['browser', 'security']). Defaults to all domains.
|
|
63
|
+
* @param {string} [options.projectRoot] - Root directory to install into (defaults to process.cwd())
|
|
64
|
+
* @param {boolean} [options.includeRouter=true] - Whether to include the Step-0 ROUTER.md matrix.
|
|
65
|
+
* @returns {Promise<string>} - Confirmation message and target path.
|
|
66
|
+
*/
|
|
67
|
+
async function installSkills({
|
|
68
|
+
targetFramework,
|
|
69
|
+
domains = ALL_DOMAINS,
|
|
70
|
+
projectRoot = process.cwd(),
|
|
71
|
+
includeRouter = true
|
|
72
|
+
}) {
|
|
73
|
+
if (!targetFramework) {
|
|
74
|
+
throw new Error("targetFramework is required (e.g. '.agents', '.cursor', '.clinerules').");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!domains || domains.length === 0) {
|
|
78
|
+
domains = ALL_DOMAINS;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const routerContent = getRouterMatrix();
|
|
82
|
+
|
|
83
|
+
// Load domain bundled content
|
|
84
|
+
const domainBundles = {};
|
|
85
|
+
for (const domain of domains) {
|
|
86
|
+
const bundleFile = path.join(distBundledDir, `weavetab-${domain}.md`);
|
|
87
|
+
if (fs.existsSync(bundleFile)) {
|
|
88
|
+
domainBundles[domain] = fs.readFileSync(bundleFile, 'utf8');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 1. Antigravity & Standard Agent Tree (.agent/skills/<skill-name>/SKILL.md)
|
|
93
|
+
if (targetFramework === '.agents' || targetFramework === '.agent') {
|
|
94
|
+
const baseSkillsDir = path.join(projectRoot, '.agent', 'skills');
|
|
95
|
+
fs.mkdirSync(baseSkillsDir, { recursive: true });
|
|
96
|
+
|
|
97
|
+
if (includeRouter) {
|
|
98
|
+
const routerDir = path.join(baseSkillsDir, 'weavetab-router');
|
|
99
|
+
fs.mkdirSync(routerDir, { recursive: true });
|
|
100
|
+
const routerFrontmatter = [
|
|
101
|
+
"---",
|
|
102
|
+
"name: weavetab-router",
|
|
103
|
+
"description: Step-0 Universal Intent Decision Matrix for Weavetab MCP automation",
|
|
104
|
+
"---",
|
|
105
|
+
"",
|
|
106
|
+
routerContent
|
|
107
|
+
].join('\n');
|
|
108
|
+
fs.writeFileSync(path.join(routerDir, 'SKILL.md'), routerFrontmatter);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
for (const [domain, content] of Object.entries(domainBundles)) {
|
|
112
|
+
const skillDir = path.join(baseSkillsDir, `weavetab-${domain}`);
|
|
113
|
+
fs.mkdirSync(skillDir, { recursive: true });
|
|
114
|
+
const frontmatter = [
|
|
115
|
+
"---",
|
|
116
|
+
`name: weavetab-${domain}`,
|
|
117
|
+
`description: Operational guidance for Weavetab MCP ${domain} domain automation and tool protocols.`,
|
|
118
|
+
"---",
|
|
119
|
+
"",
|
|
120
|
+
content
|
|
121
|
+
].join('\n');
|
|
122
|
+
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), frontmatter);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return `Successfully installed ${domains.length} domain skills to ${baseSkillsDir}`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// 2. Cursor IDE (.cursor/rules/weavetab-<domain>.mdc)
|
|
129
|
+
else if (targetFramework === '.cursor') {
|
|
130
|
+
const cursorRulesDir = path.join(projectRoot, '.cursor', 'rules');
|
|
131
|
+
fs.mkdirSync(cursorRulesDir, { recursive: true });
|
|
132
|
+
|
|
133
|
+
if (includeRouter) {
|
|
134
|
+
const routerMdc = [
|
|
135
|
+
"---",
|
|
136
|
+
"description: Universal Agent Intent Decision Matrix for Weavetab MCP",
|
|
137
|
+
"globs: *",
|
|
138
|
+
"alwaysApply: false",
|
|
139
|
+
"---",
|
|
140
|
+
"",
|
|
141
|
+
routerContent
|
|
142
|
+
].join('\n');
|
|
143
|
+
fs.writeFileSync(path.join(cursorRulesDir, 'weavetab-router.mdc'), routerMdc);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
for (const [domain, content] of Object.entries(domainBundles)) {
|
|
147
|
+
const mdcContent = [
|
|
148
|
+
"---",
|
|
149
|
+
`description: Weavetab MCP operational rules for ${domain}`,
|
|
150
|
+
"globs: *",
|
|
151
|
+
"alwaysApply: false",
|
|
152
|
+
"---",
|
|
153
|
+
"",
|
|
154
|
+
content
|
|
155
|
+
].join('\n');
|
|
156
|
+
fs.writeFileSync(path.join(cursorRulesDir, `weavetab-${domain}.mdc`), mdcContent);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return `Successfully installed ${domains.length} Cursor rules to ${cursorRulesDir}`;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// 3. Cline (.clinerules single file)
|
|
163
|
+
else if (targetFramework === '.clinerules') {
|
|
164
|
+
const clineFile = path.join(projectRoot, '.clinerules');
|
|
165
|
+
let combined = `\n\n# ====================================================\n# Weavetab MCP Skills (v${WEAVETAB_VERSION})\n# ====================================================\n\n`;
|
|
166
|
+
if (includeRouter) {
|
|
167
|
+
combined += routerContent + "\n\n";
|
|
168
|
+
}
|
|
169
|
+
for (const [domain, content] of Object.entries(domainBundles)) {
|
|
170
|
+
combined += `\n\n# --- DOMAIN: ${domain.toUpperCase()} ---\n\n${content}\n`;
|
|
171
|
+
}
|
|
172
|
+
fs.appendFileSync(clineFile, combined);
|
|
173
|
+
return `Successfully appended ${domains.length} domains to ${clineFile}`;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// 4. Windsurf IDE (.windsurf/rules/weavetab-<domain>.md)
|
|
177
|
+
else if (targetFramework === '.windsurf') {
|
|
178
|
+
const windsurfDir = path.join(projectRoot, '.windsurf', 'rules');
|
|
179
|
+
fs.mkdirSync(windsurfDir, { recursive: true });
|
|
180
|
+
|
|
181
|
+
if (includeRouter) {
|
|
182
|
+
fs.writeFileSync(path.join(windsurfDir, 'weavetab-router.md'), routerContent);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
for (const [domain, content] of Object.entries(domainBundles)) {
|
|
186
|
+
fs.writeFileSync(path.join(windsurfDir, `weavetab-${domain}.md`), content);
|
|
187
|
+
}
|
|
188
|
+
return `Successfully installed ${domains.length} rules to ${windsurfDir}`;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// 5. OpenClaw (.openclaw/skills/weavetab-<domain>/SKILL.md)
|
|
192
|
+
else if (targetFramework === '.openclaw') {
|
|
193
|
+
const openClawDir = path.join(projectRoot, '.openclaw', 'skills');
|
|
194
|
+
fs.mkdirSync(openClawDir, { recursive: true });
|
|
195
|
+
|
|
196
|
+
for (const [domain, content] of Object.entries(domainBundles)) {
|
|
197
|
+
const dir = path.join(openClawDir, `weavetab-${domain}`);
|
|
198
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
199
|
+
fs.writeFileSync(path.join(dir, 'SKILL.md'), content);
|
|
200
|
+
}
|
|
201
|
+
return `Successfully installed ${domains.length} skills to ${openClawDir}`;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// 6. RooCode (.roocode/rules/weavetab-<domain>.md)
|
|
205
|
+
else if (targetFramework === '.roocode') {
|
|
206
|
+
const rooDir = path.join(projectRoot, '.roocode', 'rules');
|
|
207
|
+
fs.mkdirSync(rooDir, { recursive: true });
|
|
208
|
+
|
|
209
|
+
for (const [domain, content] of Object.entries(domainBundles)) {
|
|
210
|
+
fs.writeFileSync(path.join(rooDir, `weavetab-${domain}.md`), content);
|
|
211
|
+
}
|
|
212
|
+
return `Successfully installed ${domains.length} rules to ${rooDir}`;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// 7. Generic / Raw Markdown
|
|
216
|
+
else {
|
|
217
|
+
const genericDir = path.join(projectRoot, 'weavetab-skills');
|
|
218
|
+
fs.mkdirSync(genericDir, { recursive: true });
|
|
219
|
+
|
|
220
|
+
if (includeRouter) {
|
|
221
|
+
fs.writeFileSync(path.join(genericDir, 'ROUTER.md'), routerContent);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
for (const [domain, content] of Object.entries(domainBundles)) {
|
|
225
|
+
fs.writeFileSync(path.join(genericDir, `weavetab-${domain}.md`), content);
|
|
226
|
+
}
|
|
227
|
+
return `Successfully installed ${domains.length} domain bundles to ${genericDir}`;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
module.exports = {
|
|
232
|
+
WEAVETAB_VERSION,
|
|
233
|
+
installSkills,
|
|
234
|
+
getSkills,
|
|
235
|
+
getSkill,
|
|
236
|
+
getSkillsByDomain,
|
|
237
|
+
getRouterMatrix,
|
|
238
|
+
ALL_DOMAINS
|
|
239
|
+
};
|
package/.github/FUNDING.yml
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Bug Report
|
|
3
|
-
about: Report a broken or misbehaving skill
|
|
4
|
-
title: "[BUG] "
|
|
5
|
-
labels: bug
|
|
6
|
-
assignees: fy2ne
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
**Which skill is affected?**
|
|
10
|
-
e.g. `general/login-flow.md`
|
|
11
|
-
|
|
12
|
-
**Describe the bug**
|
|
13
|
-
A clear and concise description of what went wrong.
|
|
14
|
-
|
|
15
|
-
**Weavetab MCP version**
|
|
16
|
-
e.g. v2.5.0
|
|
17
|
-
|
|
18
|
-
**AI Agent being used**
|
|
19
|
-
e.g. Antigravity, Cursor, Cline
|
|
20
|
-
|
|
21
|
-
**To Reproduce**
|
|
22
|
-
Steps to reproduce the behavior.
|
|
23
|
-
|
|
24
|
-
**Expected behavior**
|
|
25
|
-
What you expected the agent to do.
|
|
26
|
-
|
|
27
|
-
**Additional context**
|
|
28
|
-
Any logs, screenshots, or notes.
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Skill Request
|
|
3
|
-
about: Request a new skill to be added to the library
|
|
4
|
-
title: "[SKILL] "
|
|
5
|
-
labels: enhancement
|
|
6
|
-
assignees: fy2ne
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
**What task pattern should this skill cover?**
|
|
10
|
-
e.g. "Handling cookie consent banners automatically"
|
|
11
|
-
|
|
12
|
-
**Which category should it go in?**
|
|
13
|
-
- [ ] General (Tier 1)
|
|
14
|
-
- [ ] Automation (Tier 2)
|
|
15
|
-
- [ ] Advanced (Tier 3)
|
|
16
|
-
|
|
17
|
-
**Which Weavetab MCP tools would it use?**
|
|
18
|
-
e.g. `browser_click`, `browser_find`
|
|
19
|
-
|
|
20
|
-
**Describe the skill behavior**
|
|
21
|
-
What should the agent do when this skill is active?
|
|
22
|
-
|
|
23
|
-
**Why is this useful?**
|
|
24
|
-
Who would benefit from this skill?
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Pull Request
|
|
3
|
-
about: Contribute a new skill or fix
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## What does this PR do?
|
|
7
|
-
|
|
8
|
-
- [ ] Adds a new skill
|
|
9
|
-
- [ ] Fixes an existing skill
|
|
10
|
-
- [ ] Improves the CLI installer
|
|
11
|
-
- [ ] Other (describe below)
|
|
12
|
-
|
|
13
|
-
## Skill file(s) changed
|
|
14
|
-
|
|
15
|
-
List the files you added or modified:
|
|
16
|
-
- `general/your-skill.md`
|
|
17
|
-
|
|
18
|
-
## Checklist
|
|
19
|
-
|
|
20
|
-
- [ ] Frontmatter includes `weavetab: ">=2.5.0"`
|
|
21
|
-
- [ ] Ran `npm run build` and `skills.json` is updated
|
|
22
|
-
- [ ] Skill is focused on a single task pattern
|
|
23
|
-
- [ ] No emojis in skill content
|
package/CONTRIBUTING.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# Contributing to Weavetab MCP Skills
|
|
2
|
-
|
|
3
|
-
Thank you for your interest in contributing! Here is how you can help.
|
|
4
|
-
|
|
5
|
-
## Adding a New Skill
|
|
6
|
-
|
|
7
|
-
1. Fork the repository.
|
|
8
|
-
2. Create a new `.md` file in the appropriate category folder (`general/`, `automation/`, `advanced/`).
|
|
9
|
-
3. Use the following frontmatter at the top of your file:
|
|
10
|
-
|
|
11
|
-
```yaml
|
|
12
|
-
---
|
|
13
|
-
id: your-skill-name
|
|
14
|
-
tier: general
|
|
15
|
-
triggers: [keyword1, keyword2]
|
|
16
|
-
tools: [browser_navigate, browser_click]
|
|
17
|
-
weavetab: ">=2.5.0"
|
|
18
|
-
---
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
4. Write clear, concise instructions for the AI agent below the frontmatter.
|
|
22
|
-
5. Run `npm run build` to regenerate `skills.json`.
|
|
23
|
-
6. Open a Pull Request with a description of what your skill does.
|
|
24
|
-
|
|
25
|
-
## Rules
|
|
26
|
-
|
|
27
|
-
- Skills must be specifically for **Weavetab MCP** — not generic AI instructions.
|
|
28
|
-
- Skills must require **Weavetab MCP v2.5.0+**.
|
|
29
|
-
- Keep skill files focused on a single task pattern.
|
|
30
|
-
- No emojis in skill content (keep it clean and professional).
|
|
31
|
-
|
|
32
|
-
## Code of Conduct
|
|
33
|
-
|
|
34
|
-
Be respectful and constructive. This is a community project.
|
package/SECURITY.md
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# Security Policy
|
|
2
|
-
|
|
3
|
-
## Supported Versions
|
|
4
|
-
|
|
5
|
-
| Version | Supported |
|
|
6
|
-
| ------- | --------- |
|
|
7
|
-
| 1.0.x | Yes |
|
|
8
|
-
|
|
9
|
-
## Reporting a Vulnerability
|
|
10
|
-
|
|
11
|
-
If you discover a security vulnerability in this project, **please do not open a public GitHub issue.**
|
|
12
|
-
|
|
13
|
-
Instead, contact the maintainer directly:
|
|
14
|
-
|
|
15
|
-
- **GitHub:** [@fy2ne](https://github.com/fy2ne)
|
|
16
|
-
|
|
17
|
-
Please include:
|
|
18
|
-
- A clear description of the vulnerability
|
|
19
|
-
- Steps to reproduce it
|
|
20
|
-
- Any relevant logs or screenshots
|
|
21
|
-
|
|
22
|
-
You can expect a response within **48 hours**. If the issue is confirmed, a patch will be released as soon as possible.
|
|
23
|
-
|
|
24
|
-
## Scope
|
|
25
|
-
|
|
26
|
-
This repository contains only **Markdown skill files** and a lightweight CLI installer. The attack surface is minimal, but we take any supply-chain or code injection concerns seriously.
|
package/advanced/README.md
DELETED
package/automation/README.md
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: captcha-evasion
|
|
3
|
-
tier: general
|
|
4
|
-
triggers: ["captcha", "recaptcha", "hcaptcha", "bot check", "verification"]
|
|
5
|
-
tools: ["browser_wait", "browser_click", "browser_map", "browser_snapshot", "browser_ask"]
|
|
6
|
-
weavetab: ">=2.5.0"
|
|
7
|
-
---
|
|
8
|
-
# 🤖 Bot Challenge Handling
|
|
9
|
-
**Core Philosophy:** You will encounter anti-bot systems. Handle them gracefully.
|
|
10
|
-
|
|
11
|
-
- **Identify the Threat:** If a page suddenly looks weird, check for Cloudflare, reCAPTCHA, or hCaptcha challenge screens.
|
|
12
|
-
- **Attempt Resolution:** Some captchas are simple "Click to verify you are human" checkboxes. You can often `browser_click` these successfully.
|
|
13
|
-
- **Know Your Limits:** If you hit a complex image grid captcha, do not guess blindly. Use `browser_ask` to prompt the user for help, or wait and see if the challenge resolves itself. You are autonomous, but you know when to ask for human assistance.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: context-awareness
|
|
3
|
-
tier: general
|
|
4
|
-
triggers: ["analyze page", "understand context", "what is on the page", "read page", "visualize"]
|
|
5
|
-
tools: ["browser_snapshot", "browser_map", "browser_evaluate"]
|
|
6
|
-
weavetab: ">=2.5.0"
|
|
7
|
-
---
|
|
8
|
-
# 👁️ Deep Context Awareness
|
|
9
|
-
**Core Philosophy:** Don't just look at the DOM; understand the semantic meaning of the page.
|
|
10
|
-
|
|
11
|
-
- **Holistic Understanding:** Before taking action on a complex page, take a moment to understand its structure. Where is the navigation? Where is the main content? Where is the sidebar?
|
|
12
|
-
- **Visual vs. Semantic:** Remember that what is visually prominent might be buried deep in the DOM. Use `browser_snapshot` to reconcile the visual layout with the structural DOM.
|
|
13
|
-
- **Read Between the Lines:** If a user asks you to "buy the cheapest item", you need to autonomously scan the page, extract prices, compare them, and then take action. Be smart.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: cookie-consent
|
|
3
|
-
tier: general
|
|
4
|
-
triggers: ["cookie banner", "consent", "gdpr", "accept cookies", "popup", "overlay"]
|
|
5
|
-
tools: ["browser_find", "browser_click", "browser_map"]
|
|
6
|
-
weavetab: ">=2.5.0"
|
|
7
|
-
---
|
|
8
|
-
# 🍪 Autonomous Consent Handling
|
|
9
|
-
**Core Philosophy:** Cookie banners and popups are the bane of web automation. Destroy them.
|
|
10
|
-
|
|
11
|
-
- **Detect and Destroy:** When you land on a new site, the very first thing you should look for is a giant overlay blocking the content.
|
|
12
|
-
- **Accept or Reject:** If the user hasn't specified a preference, you have the autonomy to click "Accept All", "Got it", or "Reject All" just to get the banner out of the way so you can do your actual job.
|
|
13
|
-
- **Don't Let Them Stop You:** If a modal overlay prevents you from clicking the element you actually want, prioritize dismissing the modal first.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: data-extraction
|
|
3
|
-
tier: general
|
|
4
|
-
triggers: ["extract", "scrape", "get data", "read data", "fetch info", "parse"]
|
|
5
|
-
tools: ["browser_scrape", "browser_evaluate", "browser_snapshot", "browser_map"]
|
|
6
|
-
weavetab: ">=2.5.0"
|
|
7
|
-
---
|
|
8
|
-
# 🗃️ Intelligent Data Extraction
|
|
9
|
-
**Core Philosophy:** You are a master of transforming messy web pages into structured data.
|
|
10
|
-
|
|
11
|
-
- **Go Beyond the Surface:** Don't just scrape text. Look for hidden metadata, `aria-labels`, and data attributes that might contain cleaner information.
|
|
12
|
-
- **Use JavaScript:** If the DOM is too chaotic to scrape cleanly using standard tools, you have the autonomy to use `browser_evaluate` to run a custom JavaScript snippet to extract exactly what you need.
|
|
13
|
-
- **Synthesize:** If the user asks for a summary of a product, don't just dump the raw description. Extract the price, the reviews, the specs, and synthesize it into a clean, easy-to-read report.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: dynamic-interaction
|
|
3
|
-
tier: general
|
|
4
|
-
triggers: ["hover", "drag", "complex interaction", "dropdown", "menu", "slider"]
|
|
5
|
-
tools: ["browser_pointer", "browser_map", "browser_click", "browser_evaluate"]
|
|
6
|
-
weavetab: ">=2.5.0"
|
|
7
|
-
---
|
|
8
|
-
# 🖱️ Complex UI Interactions
|
|
9
|
-
**Core Philosophy:** Modern web apps require more than just clicking and typing.
|
|
10
|
-
|
|
11
|
-
- **Hover States:** Mega-menus and tooltips require hovering. Use `browser_pointer` to move the mouse over elements to reveal hidden interactions.
|
|
12
|
-
- **Drag and Drop:** Sliders, kanban boards, and reorderable lists require drag-and-drop. Calculate the coordinates and execute smooth pointer movements.
|
|
13
|
-
- **Be Human-Like:** When interacting with highly dynamic UI components, sometimes it helps to pause briefly between actions to allow animations and transitions to complete.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: error-recovery
|
|
3
|
-
tier: general
|
|
4
|
-
triggers: ["error", "fail", "timeout", "crash", "not found", "stuck", "fix"]
|
|
5
|
-
tools: ["browser_snapshot", "browser_map", "browser_console", "browser_wait"]
|
|
6
|
-
weavetab: ">=2.5.0"
|
|
7
|
-
---
|
|
8
|
-
# 🚑 Autonomous Error Recovery
|
|
9
|
-
**Core Philosophy:** Errors are inevitable. Your strength is in how you recover from them.
|
|
10
|
-
|
|
11
|
-
- **Don't Panic:** If a tool call fails (e.g., element not found, timeout), do not immediately give up and ask the user.
|
|
12
|
-
- **Investigate:** Take a `browser_snapshot` to see what the page actually looks like. Check the `browser_console` for JavaScript errors that might explain why the page is broken.
|
|
13
|
-
- **Pivot and Retry:** Did the page layout change? Find the new selector. Did a modal pop up and steal focus? Close it. You have the autonomy to troubleshoot and try alternative approaches before admitting defeat.
|
package/general/file-upload.md
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: file-upload
|
|
3
|
-
tier: general
|
|
4
|
-
triggers: ["upload", "file upload", "attach file", "drag and drop", "input file"]
|
|
5
|
-
tools: ["browser_upload", "browser_map", "browser_click", "browser_find"]
|
|
6
|
-
weavetab: ">=2.5.0"
|
|
7
|
-
---
|
|
8
|
-
# 📤 Resilient File Uploading
|
|
9
|
-
**Core Philosophy:** File uploads can be triggered via hidden inputs, drag-and-drop zones, or complex JS widgets.
|
|
10
|
-
|
|
11
|
-
- **Find the Real Input:** Often, the visible "Upload" button is just a styled div. You need to find the actual `<input type="file">`. Use `browser_find` or `browser_map` to hunt it down.
|
|
12
|
-
- **Use the Native Tool:** Once found, use `browser_upload` to attach the file directly to the input element.
|
|
13
|
-
- **Creative Fallbacks:** If `browser_upload` fails because the input is deeply obscured, look for alternative ways to upload (e.g., providing a URL if the site allows it, or alerting the user that manual intervention is needed for this specific widget).
|
package/general/form-filling.md
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: form-filling
|
|
3
|
-
tier: general
|
|
4
|
-
triggers: ["fill form", "submit form", "form", "input", "textarea", "dropdown", "select", "checkbox"]
|
|
5
|
-
tools: ["browser_map", "browser_fill", "browser_type", "browser_select", "browser_click"]
|
|
6
|
-
weavetab: ">=2.5.0"
|
|
7
|
-
---
|
|
8
|
-
# 📝 Dynamic Form Handling
|
|
9
|
-
**Core Philosophy:** Forms are often dynamic, fragile, and aggressively validated. Handle them with care and intelligence.
|
|
10
|
-
|
|
11
|
-
- **Map and Plan:** Use `browser_map({ scope: "form" })` to get the lay of the land. Plan your data entry.
|
|
12
|
-
- **Adapt to the UI:**
|
|
13
|
-
- For standard fields, `browser_fill` is fast and efficient.
|
|
14
|
-
- For tricky rich-text editors or masked inputs, fall back to `browser_type`.
|
|
15
|
-
- Use `browser_select` for dropdowns, but be prepared to use `browser_click` if it's a custom div-based dropdown.
|
|
16
|
-
- **Validation Awareness:** Pay attention to the DOM! If a field turns red, stop and fix it. Don't blindly submit a form with errors. If you see a disabled submit button, figure out which required field you missed.
|