rf-agentskills 0.4.0__tar.gz
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.
- rf_agentskills-0.4.0/.gitignore +56 -0
- rf_agentskills-0.4.0/PKG-INFO +75 -0
- rf_agentskills-0.4.0/README.md +44 -0
- rf_agentskills-0.4.0/hatch_build.py +96 -0
- rf_agentskills-0.4.0/pyproject.toml +104 -0
- rf_agentskills-0.4.0/src/rf_agentskills/__init__.py +15 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/.claude-plugin/plugin.json +25 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/.mcp.json +11 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/agents/rf-debug-expert.md +130 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/agents/rf-keyword-consultant.md +137 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/agents/rf-migration-guide.md +126 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/agents/rf-test-architect.md +117 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/hooks/README.md +145 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/hooks/hooks.json +48 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/scripts/check_rf_environment.sh +101 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/scripts/keyword_builder.py +219 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/scripts/maybe_inject_rf_context.sh +86 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/scripts/maybe_remind_robot_tests.sh +66 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/scripts/resource_architect.py +148 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/scripts/rf_libdoc.py +322 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/scripts/rf_results.py +418 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/scripts/testcase_builder.py +125 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/scripts/validate_robot.sh +87 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/servers/rf-tools-server.py +697 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/settings.json +3 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/SKILL.md +341 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/assets/examples/android-basic.robot +147 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/assets/examples/device-actions.robot +286 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/assets/examples/gestures-example.robot +283 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/assets/examples/hybrid-app.robot +234 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/assets/examples/ios-basic.robot +194 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/references/android-specific.md +432 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/references/device-capabilities.md +405 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/references/gestures-touch.md +386 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/references/ios-specific.md +365 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/references/keywords-reference.md +362 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/references/locators-mobile.md +253 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/appium/references/troubleshooting.md +393 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/SKILL.md +309 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/assets/examples/authentication-flow.robot +221 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/assets/examples/basic-web-test.robot +91 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/assets/examples/file-operations.robot +244 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/assets/examples/form-handling.robot +163 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/assets/examples/iframe-shadow-dom.robot +178 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/references/assertion-engine.md +285 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/references/authentication-storage.md +398 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/references/browser-context-page.md +362 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/references/downloads-uploads.md +346 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/references/iframes-shadow-dom.md +293 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/references/keywords-reference.md +606 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/references/locators.md +263 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/references/tabs-windows.md +378 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/browser/references/troubleshooting.md +462 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/keyword-builder/SKILL.md +75 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/libdoc-explain/SKILL.md +34 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/libdoc-search/SKILL.md +29 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/SKILL.md +260 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/assets/examples/authentication-patterns.robot +228 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/assets/examples/basic-crud.robot +141 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/assets/examples/file-upload.robot +234 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/assets/examples/session-handling.robot +242 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/references/authentication.md +338 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/references/http-methods.md +246 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/references/keywords-reference.md +343 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/references/request-options.md +288 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/references/response-validation.md +318 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/requests/references/troubleshooting.md +408 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/resource-architect/SKILL.md +46 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/SKILL.md +379 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/assets/examples/basic-rest.robot +182 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/assets/examples/json-manipulation.robot +281 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/assets/examples/oauth-flow.robot +274 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/assets/examples/schema-validation.robot +234 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/references/authentication.md +357 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/references/json-handling.md +361 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/references/keywords-reference.md +524 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/references/schema-validation.md +517 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/restinstance/references/troubleshooting.md +466 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/SKILL.md +393 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/assets/examples/basic-web-test.robot +69 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/assets/examples/form-handling.robot +162 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/assets/examples/multi-window.robot +259 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/assets/examples/selenium-grid.robot +216 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/assets/examples/wait-patterns.robot +229 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/references/frames-windows.md +434 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/references/javascript-execution.md +427 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/references/keywords-reference.md +604 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/references/locators.md +345 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/references/screenshots-logs.md +353 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/references/troubleshooting.md +380 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/references/waiting-strategies.md +355 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/selenium/references/webdriver-setup.md +430 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets/skills/testcase-builder/SKILL.md +80 -0
- rf_agentskills-0.4.0/src/rf_agentskills/_assets.py +62 -0
- rf_agentskills-0.4.0/src/rf_agentskills/adapters/__init__.py +53 -0
- rf_agentskills-0.4.0/src/rf_agentskills/adapters/_base.py +172 -0
- rf_agentskills-0.4.0/src/rf_agentskills/adapters/claude_code.py +288 -0
- rf_agentskills-0.4.0/src/rf_agentskills/adapters/claude_desktop.py +199 -0
- rf_agentskills-0.4.0/src/rf_agentskills/adapters/codex.py +319 -0
- rf_agentskills-0.4.0/src/rf_agentskills/adapters/copilot.py +174 -0
- rf_agentskills-0.4.0/src/rf_agentskills/adapters/cursor.py +278 -0
- rf_agentskills-0.4.0/src/rf_agentskills/adapters/goose.py +336 -0
- rf_agentskills-0.4.0/src/rf_agentskills/adapters/opencode.py +232 -0
- rf_agentskills-0.4.0/src/rf_agentskills/cli.py +498 -0
- rf_agentskills-0.4.0/src/rf_agentskills/manifest.py +244 -0
- rf_agentskills-0.4.0/src/rf_agentskills/transforms.py +531 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
|
|
8
|
+
# Virtual environments
|
|
9
|
+
.venv/
|
|
10
|
+
venv/
|
|
11
|
+
env/
|
|
12
|
+
|
|
13
|
+
# Local secrets (do NOT commit) — use .env.example as template
|
|
14
|
+
.env
|
|
15
|
+
|
|
16
|
+
# Eval harness working state (generated, not committed)
|
|
17
|
+
eval/runs/
|
|
18
|
+
eval/reports/
|
|
19
|
+
results/
|
|
20
|
+
|
|
21
|
+
# Test output
|
|
22
|
+
.pytest_cache/
|
|
23
|
+
output.xml
|
|
24
|
+
log.html
|
|
25
|
+
report.html
|
|
26
|
+
*.png
|
|
27
|
+
|
|
28
|
+
# IDE
|
|
29
|
+
.idea/
|
|
30
|
+
.vscode/
|
|
31
|
+
*.swp
|
|
32
|
+
*.swo
|
|
33
|
+
|
|
34
|
+
# OS
|
|
35
|
+
.DS_Store
|
|
36
|
+
Thumbs.db
|
|
37
|
+
|
|
38
|
+
# Claude Flow state (local only)
|
|
39
|
+
.claude-flow/
|
|
40
|
+
.swarm/
|
|
41
|
+
|
|
42
|
+
# Cross-agent skill discovery symlinks (local only)
|
|
43
|
+
.codex/
|
|
44
|
+
.github/skills/
|
|
45
|
+
|
|
46
|
+
# VS Code extension build artifacts (generated by npm/vsce)
|
|
47
|
+
vscode-extension/node_modules/
|
|
48
|
+
vscode-extension/out/
|
|
49
|
+
vscode-extension/*.vsix
|
|
50
|
+
vscode-extension/skills/
|
|
51
|
+
|
|
52
|
+
# rf-agentskills installer: _assets/ is regenerated by the hatch build
|
|
53
|
+
# hook at `pip install` time from plugins/rf-agentskills/. Don't commit
|
|
54
|
+
# the duplicate. Developers run `pip install -e installer/` after clone
|
|
55
|
+
# to populate it.
|
|
56
|
+
installer/src/rf_agentskills/_assets/
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rf-agentskills
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: Cross-agent installer for Robot Framework agent skills (Claude Code, Copilot, Codex, Cursor, Goose, OpenCode, Claude Desktop)
|
|
5
|
+
Project-URL: Homepage, https://github.com/manykarim/robotframework-agentskills
|
|
6
|
+
Project-URL: Repository, https://github.com/manykarim/robotframework-agentskills
|
|
7
|
+
Project-URL: Issues, https://github.com/manykarim/robotframework-agentskills/issues
|
|
8
|
+
Author-email: Many Kasiriha <many.kasiriha@gmail.com>
|
|
9
|
+
License: Apache-2.0
|
|
10
|
+
Keywords: agent-skills,claude-code,cursor,github-copilot,goose,installer,openai-codex,opencode,robotframework
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Framework :: Robot Framework
|
|
13
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Software Development :: Testing
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Requires-Dist: pyyaml>=6.0
|
|
23
|
+
Requires-Dist: rich>=13.7
|
|
24
|
+
Requires-Dist: tomli-w>=1.0
|
|
25
|
+
Requires-Dist: tomli>=2.0; python_version < '3.11'
|
|
26
|
+
Provides-Extra: dev
|
|
27
|
+
Requires-Dist: pytest-cov>=5; extra == 'dev'
|
|
28
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
29
|
+
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
# rf-agentskills
|
|
33
|
+
|
|
34
|
+
Cross-agent installer for Robot Framework agent skills. Ships the
|
|
35
|
+
`plugins/rf-agentskills/` bundle (11 skills, 4 subagents, hooks,
|
|
36
|
+
helper scripts, MCP server) and writes it into the install paths of
|
|
37
|
+
seven coding agents:
|
|
38
|
+
|
|
39
|
+
| Agent | Status |
|
|
40
|
+
|---|---|
|
|
41
|
+
| Claude Code (CLI) | full native — skills, agents, hooks, MCP |
|
|
42
|
+
| GitHub Copilot (VS Code 1.108+) | full native (preview flags req'd) |
|
|
43
|
+
| OpenAI Codex | skills + MCP native; subagents transformed; hooks experimental |
|
|
44
|
+
| Cursor 1.7+ | skills→rules, hooks adapted, native MCP |
|
|
45
|
+
| OpenCode | subagents + MCP native; skills→commands; hooks deferred |
|
|
46
|
+
| Project Goose | MCP + persona text only |
|
|
47
|
+
| Claude Desktop | MCP only |
|
|
48
|
+
|
|
49
|
+
## Install
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
pipx install rf-agentskills
|
|
53
|
+
rf-agentskills install --agent claude-code
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Or for every detected agent in one shot:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
rf-agentskills install --all
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Subcommands
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
rf-agentskills install --agent <name> [--scope user|project] [--prefix DIR]
|
|
66
|
+
[--what skills,agents,hooks,mcp] [--dry-run] [--force]
|
|
67
|
+
rf-agentskills uninstall --agent <name>
|
|
68
|
+
rf-agentskills list # what's installed where, per the manifest
|
|
69
|
+
rf-agentskills targets # which agents are detected on this machine
|
|
70
|
+
rf-agentskills doctor # what works, what doesn't, what needs user action
|
|
71
|
+
rf-agentskills version
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
See `docs/installer/proposal.md` (in the parent repo) for the full
|
|
75
|
+
design, compatibility matrix, and per-agent install recipes.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# rf-agentskills
|
|
2
|
+
|
|
3
|
+
Cross-agent installer for Robot Framework agent skills. Ships the
|
|
4
|
+
`plugins/rf-agentskills/` bundle (11 skills, 4 subagents, hooks,
|
|
5
|
+
helper scripts, MCP server) and writes it into the install paths of
|
|
6
|
+
seven coding agents:
|
|
7
|
+
|
|
8
|
+
| Agent | Status |
|
|
9
|
+
|---|---|
|
|
10
|
+
| Claude Code (CLI) | full native — skills, agents, hooks, MCP |
|
|
11
|
+
| GitHub Copilot (VS Code 1.108+) | full native (preview flags req'd) |
|
|
12
|
+
| OpenAI Codex | skills + MCP native; subagents transformed; hooks experimental |
|
|
13
|
+
| Cursor 1.7+ | skills→rules, hooks adapted, native MCP |
|
|
14
|
+
| OpenCode | subagents + MCP native; skills→commands; hooks deferred |
|
|
15
|
+
| Project Goose | MCP + persona text only |
|
|
16
|
+
| Claude Desktop | MCP only |
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pipx install rf-agentskills
|
|
22
|
+
rf-agentskills install --agent claude-code
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or for every detected agent in one shot:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
rf-agentskills install --all
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Subcommands
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
rf-agentskills install --agent <name> [--scope user|project] [--prefix DIR]
|
|
35
|
+
[--what skills,agents,hooks,mcp] [--dry-run] [--force]
|
|
36
|
+
rf-agentskills uninstall --agent <name>
|
|
37
|
+
rf-agentskills list # what's installed where, per the manifest
|
|
38
|
+
rf-agentskills targets # which agents are detected on this machine
|
|
39
|
+
rf-agentskills doctor # what works, what doesn't, what needs user action
|
|
40
|
+
rf-agentskills version
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
See `docs/installer/proposal.md` (in the parent repo) for the full
|
|
44
|
+
design, compatibility matrix, and per-agent install recipes.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Hatch build hook: mirror plugins/rf-agentskills/ → src/rf_agentskills/_assets/.
|
|
2
|
+
|
|
3
|
+
The plugin tree is the source of truth (it's what the Claude Code
|
|
4
|
+
marketplace and the rf-skill-eval harness already use). The installer
|
|
5
|
+
needs the *same* tree shipped inside its Python wheel so importlib can
|
|
6
|
+
locate it at runtime via `files("rf_agentskills").joinpath("_assets")`.
|
|
7
|
+
|
|
8
|
+
Rather than maintaining a duplicate copy in the package source, this
|
|
9
|
+
hook copies the tree at build time. Editable installs (`pip install -e
|
|
10
|
+
installer/`) also fire the hook the first time, populating the assets
|
|
11
|
+
dir for development.
|
|
12
|
+
|
|
13
|
+
Hatch invokes ``initialize`` before the build target runs.
|
|
14
|
+
|
|
15
|
+
Reference: https://hatch.pypa.io/latest/plugins/build-hook/custom/
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import shutil
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any
|
|
23
|
+
|
|
24
|
+
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# The path layout assumed:
|
|
28
|
+
# <repo-root>/plugins/rf-agentskills/ ← canonical source
|
|
29
|
+
# <repo-root>/installer/ ← this package; hatch_build.py lives here
|
|
30
|
+
# <repo-root>/installer/src/rf_agentskills/_assets/ ← mirror destination
|
|
31
|
+
#
|
|
32
|
+
# Hatch sets ``self.root`` to the directory containing pyproject.toml,
|
|
33
|
+
# i.e. ``<repo-root>/installer``. The plugin tree therefore sits one
|
|
34
|
+
# level up.
|
|
35
|
+
PLUGIN_REL = Path("..") / "plugins" / "rf-agentskills"
|
|
36
|
+
ASSETS_REL = Path("src") / "rf_agentskills" / "_assets"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class CustomBuildHook(BuildHookInterface): # type: ignore[misc]
|
|
40
|
+
PLUGIN_NAME = "custom"
|
|
41
|
+
|
|
42
|
+
def initialize(self, version: str, build_data: dict[str, Any]) -> None:
|
|
43
|
+
plugin_src = (Path(self.root) / PLUGIN_REL).resolve()
|
|
44
|
+
assets_dst = (Path(self.root) / ASSETS_REL).resolve()
|
|
45
|
+
|
|
46
|
+
# Build flow:
|
|
47
|
+
# 1. sdist build — runs from the repo, finds ../plugins/, copies
|
|
48
|
+
# it into the package's _assets/ tree, and the
|
|
49
|
+
# sdist tarball includes _assets/ as part of
|
|
50
|
+
# the package contents.
|
|
51
|
+
# 2. wheel build — runs from an extracted sdist (no parent
|
|
52
|
+
# `plugins/` available). Here we *skip* the
|
|
53
|
+
# copy; _assets/ is already populated from
|
|
54
|
+
# the sdist contents and is what we want
|
|
55
|
+
# shipped in the wheel.
|
|
56
|
+
if not plugin_src.is_dir():
|
|
57
|
+
if assets_dst.is_dir() and any(assets_dst.rglob("SKILL.md")):
|
|
58
|
+
self.app.display_info(
|
|
59
|
+
f"rf-agentskills: plugin source not present at "
|
|
60
|
+
f"{plugin_src} but _assets/ is already populated "
|
|
61
|
+
f"({_count_files(assets_dst)} files) — assuming "
|
|
62
|
+
f"sdist→wheel build, skipping mirror step"
|
|
63
|
+
)
|
|
64
|
+
return
|
|
65
|
+
raise FileNotFoundError(
|
|
66
|
+
f"plugin source not found at {plugin_src} and no "
|
|
67
|
+
f"populated _assets/ tree at {assets_dst}; cannot build "
|
|
68
|
+
f"rf-agentskills wheel without the bundled assets"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Wipe the previous mirror so removed files don't linger in the
|
|
72
|
+
# wheel. Use ignore_errors=True because on some filesystems the
|
|
73
|
+
# dir might not exist yet.
|
|
74
|
+
if assets_dst.exists():
|
|
75
|
+
shutil.rmtree(assets_dst, ignore_errors=True)
|
|
76
|
+
|
|
77
|
+
shutil.copytree(
|
|
78
|
+
plugin_src,
|
|
79
|
+
assets_dst,
|
|
80
|
+
ignore=shutil.ignore_patterns(
|
|
81
|
+
"__pycache__",
|
|
82
|
+
"*.pyc",
|
|
83
|
+
".pytest_cache",
|
|
84
|
+
".mypy_cache",
|
|
85
|
+
".ruff_cache",
|
|
86
|
+
"*.egg-info",
|
|
87
|
+
),
|
|
88
|
+
)
|
|
89
|
+
self.app.display_info(
|
|
90
|
+
f"rf-agentskills: mirrored {plugin_src} → {assets_dst} "
|
|
91
|
+
f"({_count_files(assets_dst)} files)"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _count_files(root: Path) -> int:
|
|
96
|
+
return sum(1 for p in root.rglob("*") if p.is_file())
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# rf-agentskills installer package.
|
|
2
|
+
#
|
|
3
|
+
# This is a separate Python package from the repo-root rf-skill-eval
|
|
4
|
+
# evaluation harness. It bundles the plugin tree at
|
|
5
|
+
# plugins/rf-agentskills/ and writes it to a target coding agent's
|
|
6
|
+
# expected install paths (Claude Code, Copilot, Codex, Cursor, Goose,
|
|
7
|
+
# OpenCode, Claude Desktop) — see docs/installer/proposal.md for the
|
|
8
|
+
# full design.
|
|
9
|
+
|
|
10
|
+
[build-system]
|
|
11
|
+
requires = ["hatchling>=1.21"]
|
|
12
|
+
build-backend = "hatchling.build"
|
|
13
|
+
|
|
14
|
+
[project]
|
|
15
|
+
name = "rf-agentskills"
|
|
16
|
+
version = "0.4.0"
|
|
17
|
+
description = "Cross-agent installer for Robot Framework agent skills (Claude Code, Copilot, Codex, Cursor, Goose, OpenCode, Claude Desktop)"
|
|
18
|
+
readme = "README.md"
|
|
19
|
+
license = { text = "Apache-2.0" }
|
|
20
|
+
requires-python = ">=3.10"
|
|
21
|
+
authors = [{ name = "Many Kasiriha", email = "many.kasiriha@gmail.com" }]
|
|
22
|
+
keywords = [
|
|
23
|
+
"robotframework",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"github-copilot",
|
|
26
|
+
"openai-codex",
|
|
27
|
+
"cursor",
|
|
28
|
+
"goose",
|
|
29
|
+
"opencode",
|
|
30
|
+
"agent-skills",
|
|
31
|
+
"installer",
|
|
32
|
+
]
|
|
33
|
+
classifiers = [
|
|
34
|
+
"Development Status :: 4 - Beta",
|
|
35
|
+
"Framework :: Robot Framework",
|
|
36
|
+
"Programming Language :: Python :: 3",
|
|
37
|
+
"Programming Language :: Python :: 3.10",
|
|
38
|
+
"Programming Language :: Python :: 3.11",
|
|
39
|
+
"Programming Language :: Python :: 3.12",
|
|
40
|
+
"Programming Language :: Python :: 3.13",
|
|
41
|
+
"License :: OSI Approved :: Apache Software License",
|
|
42
|
+
"Operating System :: OS Independent",
|
|
43
|
+
"Topic :: Software Development :: Testing",
|
|
44
|
+
]
|
|
45
|
+
dependencies = [
|
|
46
|
+
# Keep transitive deps tiny — the installer reaches into the user's
|
|
47
|
+
# $HOME, so the smaller the supply-chain surface, the better.
|
|
48
|
+
"tomli >=2.0; python_version<'3.11'", # TOML reads on 3.10
|
|
49
|
+
"tomli-w >=1.0", # TOML round-trip writes (Codex config.toml)
|
|
50
|
+
"pyyaml >=6.0", # YAML round-trip (Goose config.yaml)
|
|
51
|
+
"rich >=13.7", # nicer doctor / list output
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
[project.optional-dependencies]
|
|
55
|
+
dev = [
|
|
56
|
+
"pytest >=8",
|
|
57
|
+
"pytest-cov >=5",
|
|
58
|
+
"ruff >=0.5",
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
[project.scripts]
|
|
62
|
+
rf-agentskills = "rf_agentskills.cli:main"
|
|
63
|
+
|
|
64
|
+
[project.urls]
|
|
65
|
+
Homepage = "https://github.com/manykarim/robotframework-agentskills"
|
|
66
|
+
Repository = "https://github.com/manykarim/robotframework-agentskills"
|
|
67
|
+
Issues = "https://github.com/manykarim/robotframework-agentskills/issues"
|
|
68
|
+
|
|
69
|
+
[tool.hatch.build]
|
|
70
|
+
# The build hook in hatch_build.py mirrors plugins/rf-agentskills/ into
|
|
71
|
+
# src/rf_agentskills/_assets/ before hatchling assembles the wheel, so
|
|
72
|
+
# the bundle ships inside the installable package without requiring
|
|
73
|
+
# duplicate maintenance of the asset tree.
|
|
74
|
+
include = [
|
|
75
|
+
"src/rf_agentskills/**",
|
|
76
|
+
"README.md",
|
|
77
|
+
"hatch_build.py",
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
[tool.hatch.build.targets.wheel]
|
|
81
|
+
packages = ["src/rf_agentskills"]
|
|
82
|
+
|
|
83
|
+
[tool.hatch.build.targets.sdist]
|
|
84
|
+
# `_assets/` is gitignored at the repo level (it's regenerated by the
|
|
85
|
+
# build hook from ../plugins/rf-agentskills/), but at sdist build time
|
|
86
|
+
# the hook has already populated it inside `src/rf_agentskills/`.
|
|
87
|
+
# The wildcard below picks up the now-populated tree so the sdist
|
|
88
|
+
# tarball is self-contained — wheel-build-from-sdist doesn't need
|
|
89
|
+
# access to ../plugins/ anymore.
|
|
90
|
+
include = [
|
|
91
|
+
"src/rf_agentskills/**",
|
|
92
|
+
"hatch_build.py",
|
|
93
|
+
"README.md",
|
|
94
|
+
"pyproject.toml",
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
[tool.hatch.build.hooks.custom]
|
|
98
|
+
# Custom build hook resolves to <package-root>/hatch_build.py per
|
|
99
|
+
# https://hatch.pypa.io/latest/plugins/build-hook/custom/.
|
|
100
|
+
path = "hatch_build.py"
|
|
101
|
+
|
|
102
|
+
[tool.pytest.ini_options]
|
|
103
|
+
testpaths = ["../tests/installer"]
|
|
104
|
+
asyncio_mode = "auto"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""rf-agentskills — cross-agent installer for Robot Framework agent skills.
|
|
2
|
+
|
|
3
|
+
The package bundles the plugin tree (skills, subagents, hooks, scripts,
|
|
4
|
+
MCP server) inside ``rf_agentskills/_assets/`` and provides per-agent
|
|
5
|
+
adapters that copy / transform that tree into each target's expected
|
|
6
|
+
install paths.
|
|
7
|
+
|
|
8
|
+
See ``docs/installer/proposal.md`` (in the source repo) for the full
|
|
9
|
+
design and compatibility matrix.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
__version__ = "0.4.0"
|
|
15
|
+
__all__ = ("__version__",)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "rf-agentskills",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Robot Framework agent skills for Claude Code - library references, test/keyword/resource generators, libdoc search, and results analysis",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "manykarim",
|
|
7
|
+
"email": "manykarim@users.noreply.github.com"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/manykarim/robotframework-agentskills",
|
|
10
|
+
"repository": "https://github.com/manykarim/robotframework-agentskills",
|
|
11
|
+
"license": "Apache-2.0",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"robotframework",
|
|
14
|
+
"testing",
|
|
15
|
+
"automation",
|
|
16
|
+
"web-testing",
|
|
17
|
+
"api-testing",
|
|
18
|
+
"mobile-testing",
|
|
19
|
+
"playwright",
|
|
20
|
+
"selenium",
|
|
21
|
+
"appium",
|
|
22
|
+
"requests",
|
|
23
|
+
"restinstance"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rf-debug-expert
|
|
3
|
+
description: Diagnose and resolve Robot Framework test failures, flaky tests, environment issues, and execution errors. Invoke when the user needs to analyze output.xml results, interpret error messages, debug locator failures, fix timing issues, or understand why a test suite is failing.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Robot Framework Debug Expert
|
|
7
|
+
|
|
8
|
+
You are an expert at diagnosing Robot Framework test failures. You combine deep knowledge of RF internals, browser/API/mobile automation pitfalls, and systematic debugging methodology to quickly isolate and resolve issues.
|
|
9
|
+
|
|
10
|
+
## Core Responsibilities
|
|
11
|
+
|
|
12
|
+
1. **Failure Analysis**: Parse output.xml to extract failure messages, keyword error chains, and timing anomalies.
|
|
13
|
+
2. **Root Cause Identification**: Distinguish between test bugs, application bugs, environment issues, and timing/flakiness problems.
|
|
14
|
+
3. **Locator Debugging**: Diagnose element-not-found errors across Browser Library, SeleniumLibrary, and AppiumLibrary.
|
|
15
|
+
4. **Timing Diagnosis**: Identify race conditions, insufficient waits, and flaky patterns.
|
|
16
|
+
5. **Environment Issues**: Detect missing dependencies, driver version mismatches, and configuration problems.
|
|
17
|
+
|
|
18
|
+
## Diagnostic Methodology
|
|
19
|
+
|
|
20
|
+
### Step 1: Gather Evidence
|
|
21
|
+
|
|
22
|
+
Use the `robotframework-results` skill to parse the output.xml:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Via MCP tool (preferred):
|
|
26
|
+
# Use the rf_results_analyze tool with sections="summary,errors"
|
|
27
|
+
|
|
28
|
+
# Via command line:
|
|
29
|
+
# Get failure summary
|
|
30
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/rf_results.py" --output output.xml --sections summary,errors --pretty
|
|
31
|
+
|
|
32
|
+
# Get detailed timing for slow tests
|
|
33
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/rf_results.py" --output output.xml --sections timing --include-keyword-timing --pretty
|
|
34
|
+
|
|
35
|
+
# Get full details including tag stats
|
|
36
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/rf_results.py" --output output.xml --sections all --pretty
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Step 2: Classify the Failure
|
|
40
|
+
|
|
41
|
+
| Failure Pattern | Category | Typical Cause |
|
|
42
|
+
|-----------------|----------|---------------|
|
|
43
|
+
| `ElementNotFound` / `Element not found` | Locator | Wrong selector, element not rendered, iframe/shadow DOM |
|
|
44
|
+
| `TimeoutError` / `timeout` | Timing | Page not loaded, AJAX pending, animation blocking |
|
|
45
|
+
| `AssertionError` / `!=` / `should be` | Assertion | Wrong expected value, stale data, race condition |
|
|
46
|
+
| `ConnectionError` / `refused` | Environment | Service down, wrong URL, firewall |
|
|
47
|
+
| `WebDriverException` / `session` | Driver | Driver crash, version mismatch, zombie process |
|
|
48
|
+
| `SKIP` with message | Precondition | Setup failed, dependency not met |
|
|
49
|
+
| Random pass/fail on same test | Flakiness | Timing, shared state, external dependency |
|
|
50
|
+
|
|
51
|
+
### Step 3: Investigate
|
|
52
|
+
|
|
53
|
+
#### For Locator Failures
|
|
54
|
+
|
|
55
|
+
1. Check if the locator strategy matches the library:
|
|
56
|
+
- Browser Library: CSS default, supports `text=`, `role=`, chained `>>`
|
|
57
|
+
- SeleniumLibrary: Requires prefix (`css=`, `xpath=`, `id=`)
|
|
58
|
+
- AppiumLibrary: Platform-specific (`accessibility_id=`, `android=`, `ios=`)
|
|
59
|
+
2. Check if the element is inside an iframe or Shadow DOM.
|
|
60
|
+
3. Check if the element is dynamically loaded (needs a wait).
|
|
61
|
+
4. Use `robotframework-libdoc-search` to verify keyword names are correct.
|
|
62
|
+
|
|
63
|
+
#### For Timing Failures
|
|
64
|
+
|
|
65
|
+
1. Look for `Sleep` calls (anti-pattern -- replace with proper waits).
|
|
66
|
+
2. Check if waits have adequate timeouts.
|
|
67
|
+
3. Look for assertions immediately after navigation without waiting.
|
|
68
|
+
4. For Browser Library: auto-wait usually suffices; check if custom `Wait For` is needed.
|
|
69
|
+
5. For SeleniumLibrary: explicit `Wait Until` keywords are mandatory.
|
|
70
|
+
|
|
71
|
+
#### For API Failures
|
|
72
|
+
|
|
73
|
+
1. Check status code expectations (`expected_status`, `Integer response status`).
|
|
74
|
+
2. Check if the response body structure matches assertions.
|
|
75
|
+
3. Verify authentication headers are set correctly.
|
|
76
|
+
4. Check if the API server is running and accessible.
|
|
77
|
+
|
|
78
|
+
### Step 4: Recommend Fix
|
|
79
|
+
|
|
80
|
+
Provide the fix as:
|
|
81
|
+
1. **Immediate fix**: The specific code change to resolve the failure.
|
|
82
|
+
2. **Preventive pattern**: A keyword or structure change to prevent recurrence.
|
|
83
|
+
3. **Monitoring suggestion**: Tags, documentation, or logging to improve future debugging.
|
|
84
|
+
|
|
85
|
+
## Flakiness Patterns and Solutions
|
|
86
|
+
|
|
87
|
+
### Common Flaky Test Patterns
|
|
88
|
+
|
|
89
|
+
| Pattern | Symptom | Solution |
|
|
90
|
+
|---------|---------|----------|
|
|
91
|
+
| AJAX race | Works locally, fails in CI | Add `Wait For Response` (Browser) or `Wait Until Element Is Visible` (Selenium) |
|
|
92
|
+
| Shared state | Test B fails only after Test A | Add proper Setup/Teardown, isolate browser contexts |
|
|
93
|
+
| Animation blocking | Random click failures | Wait for element stability, use `force=true` sparingly |
|
|
94
|
+
| Stale element | `StaleElementReferenceException` | Re-query element before interaction (Selenium) |
|
|
95
|
+
| Network latency | Timeouts in CI | Increase timeouts, add retry with `Wait Until Keyword Succeeds` |
|
|
96
|
+
| Parallel interference | Tests pass alone, fail together | Isolate test data, use unique identifiers |
|
|
97
|
+
|
|
98
|
+
## Available Skills
|
|
99
|
+
|
|
100
|
+
| Skill | Debug Use |
|
|
101
|
+
|-------|-----------|
|
|
102
|
+
| `robotframework-results` | Parse output.xml for failures, timing, errors |
|
|
103
|
+
| `robotframework-libdoc-search` | Verify keyword names exist in libraries |
|
|
104
|
+
| `robotframework-libdoc-explain` | Check correct arguments for a keyword |
|
|
105
|
+
| `robotframework-browser-skill` | Browser Library troubleshooting reference |
|
|
106
|
+
| `robotframework-selenium-skill` | SeleniumLibrary troubleshooting reference |
|
|
107
|
+
| `robotframework-appium-skill` | AppiumLibrary troubleshooting reference |
|
|
108
|
+
| `robotframework-requests-skill` | RequestsLibrary troubleshooting reference |
|
|
109
|
+
| `robotframework-restinstance-skill` | RESTinstance troubleshooting reference |
|
|
110
|
+
|
|
111
|
+
## Output Format
|
|
112
|
+
|
|
113
|
+
When reporting a diagnosis, structure it as:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
FAILURE: [test name]
|
|
117
|
+
CATEGORY: [Locator | Timing | Assertion | Environment | Driver | Flakiness]
|
|
118
|
+
ROOT CAUSE: [one-sentence explanation]
|
|
119
|
+
EVIDENCE: [relevant error message or timing data]
|
|
120
|
+
FIX: [specific code change]
|
|
121
|
+
PREVENTION: [pattern recommendation]
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Constraints
|
|
125
|
+
|
|
126
|
+
- Always start by parsing output.xml with the results skill before guessing.
|
|
127
|
+
- Never recommend `Sleep` as a fix; use proper wait mechanisms.
|
|
128
|
+
- When multiple tests fail, look for common root causes before analyzing individually.
|
|
129
|
+
- When the same test fails intermittently, classify as flakiness and recommend structural fixes, not just increased timeouts.
|
|
130
|
+
- Reference the appropriate library troubleshooting guide from the skill references when needed.
|