skill-seekers 2.7.3__py3-none-any.whl
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.
- skill_seekers/__init__.py +22 -0
- skill_seekers/cli/__init__.py +39 -0
- skill_seekers/cli/adaptors/__init__.py +120 -0
- skill_seekers/cli/adaptors/base.py +221 -0
- skill_seekers/cli/adaptors/claude.py +485 -0
- skill_seekers/cli/adaptors/gemini.py +453 -0
- skill_seekers/cli/adaptors/markdown.py +269 -0
- skill_seekers/cli/adaptors/openai.py +503 -0
- skill_seekers/cli/ai_enhancer.py +310 -0
- skill_seekers/cli/api_reference_builder.py +373 -0
- skill_seekers/cli/architectural_pattern_detector.py +525 -0
- skill_seekers/cli/code_analyzer.py +1462 -0
- skill_seekers/cli/codebase_scraper.py +1225 -0
- skill_seekers/cli/config_command.py +563 -0
- skill_seekers/cli/config_enhancer.py +431 -0
- skill_seekers/cli/config_extractor.py +871 -0
- skill_seekers/cli/config_manager.py +452 -0
- skill_seekers/cli/config_validator.py +394 -0
- skill_seekers/cli/conflict_detector.py +528 -0
- skill_seekers/cli/constants.py +72 -0
- skill_seekers/cli/dependency_analyzer.py +757 -0
- skill_seekers/cli/doc_scraper.py +2332 -0
- skill_seekers/cli/enhance_skill.py +488 -0
- skill_seekers/cli/enhance_skill_local.py +1096 -0
- skill_seekers/cli/enhance_status.py +194 -0
- skill_seekers/cli/estimate_pages.py +433 -0
- skill_seekers/cli/generate_router.py +1209 -0
- skill_seekers/cli/github_fetcher.py +534 -0
- skill_seekers/cli/github_scraper.py +1466 -0
- skill_seekers/cli/guide_enhancer.py +723 -0
- skill_seekers/cli/how_to_guide_builder.py +1267 -0
- skill_seekers/cli/install_agent.py +461 -0
- skill_seekers/cli/install_skill.py +178 -0
- skill_seekers/cli/language_detector.py +614 -0
- skill_seekers/cli/llms_txt_detector.py +60 -0
- skill_seekers/cli/llms_txt_downloader.py +104 -0
- skill_seekers/cli/llms_txt_parser.py +150 -0
- skill_seekers/cli/main.py +558 -0
- skill_seekers/cli/markdown_cleaner.py +132 -0
- skill_seekers/cli/merge_sources.py +806 -0
- skill_seekers/cli/package_multi.py +77 -0
- skill_seekers/cli/package_skill.py +241 -0
- skill_seekers/cli/pattern_recognizer.py +1825 -0
- skill_seekers/cli/pdf_extractor_poc.py +1166 -0
- skill_seekers/cli/pdf_scraper.py +617 -0
- skill_seekers/cli/quality_checker.py +519 -0
- skill_seekers/cli/rate_limit_handler.py +438 -0
- skill_seekers/cli/resume_command.py +160 -0
- skill_seekers/cli/run_tests.py +230 -0
- skill_seekers/cli/setup_wizard.py +93 -0
- skill_seekers/cli/split_config.py +390 -0
- skill_seekers/cli/swift_patterns.py +560 -0
- skill_seekers/cli/test_example_extractor.py +1081 -0
- skill_seekers/cli/test_unified_simple.py +179 -0
- skill_seekers/cli/unified_codebase_analyzer.py +572 -0
- skill_seekers/cli/unified_scraper.py +932 -0
- skill_seekers/cli/unified_skill_builder.py +1605 -0
- skill_seekers/cli/upload_skill.py +162 -0
- skill_seekers/cli/utils.py +432 -0
- skill_seekers/mcp/__init__.py +33 -0
- skill_seekers/mcp/agent_detector.py +316 -0
- skill_seekers/mcp/git_repo.py +273 -0
- skill_seekers/mcp/server.py +231 -0
- skill_seekers/mcp/server_fastmcp.py +1249 -0
- skill_seekers/mcp/server_legacy.py +2302 -0
- skill_seekers/mcp/source_manager.py +285 -0
- skill_seekers/mcp/tools/__init__.py +115 -0
- skill_seekers/mcp/tools/config_tools.py +251 -0
- skill_seekers/mcp/tools/packaging_tools.py +826 -0
- skill_seekers/mcp/tools/scraping_tools.py +842 -0
- skill_seekers/mcp/tools/source_tools.py +828 -0
- skill_seekers/mcp/tools/splitting_tools.py +212 -0
- skill_seekers/py.typed +0 -0
- skill_seekers-2.7.3.dist-info/METADATA +2027 -0
- skill_seekers-2.7.3.dist-info/RECORD +79 -0
- skill_seekers-2.7.3.dist-info/WHEEL +5 -0
- skill_seekers-2.7.3.dist-info/entry_points.txt +19 -0
- skill_seekers-2.7.3.dist-info/licenses/LICENSE +21 -0
- skill_seekers-2.7.3.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Multi-Skill Packager
|
|
4
|
+
|
|
5
|
+
Package multiple skills at once. Useful for packaging router + sub-skills together.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import argparse
|
|
9
|
+
import subprocess
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def package_skill(skill_dir: Path) -> bool:
|
|
15
|
+
"""Package a single skill"""
|
|
16
|
+
try:
|
|
17
|
+
result = subprocess.run(
|
|
18
|
+
[sys.executable, str(Path(__file__).parent / "package_skill.py"), str(skill_dir)],
|
|
19
|
+
capture_output=True,
|
|
20
|
+
text=True,
|
|
21
|
+
)
|
|
22
|
+
return result.returncode == 0
|
|
23
|
+
except Exception as e:
|
|
24
|
+
print(f"ā Error packaging {skill_dir}: {e}")
|
|
25
|
+
return False
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def main():
|
|
29
|
+
parser = argparse.ArgumentParser(
|
|
30
|
+
description="Package multiple skills at once",
|
|
31
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
32
|
+
epilog="""
|
|
33
|
+
Examples:
|
|
34
|
+
# Package all godot skills
|
|
35
|
+
python3 package_multi.py output/godot*/
|
|
36
|
+
|
|
37
|
+
# Package specific skills
|
|
38
|
+
python3 package_multi.py output/godot-2d/ output/godot-3d/ output/godot-scripting/
|
|
39
|
+
""",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
parser.add_argument("skill_dirs", nargs="+", help="Skill directories to package")
|
|
43
|
+
|
|
44
|
+
args = parser.parse_args()
|
|
45
|
+
|
|
46
|
+
print(f"\n{'=' * 60}")
|
|
47
|
+
print("MULTI-SKILL PACKAGER")
|
|
48
|
+
print(f"{'=' * 60}\n")
|
|
49
|
+
|
|
50
|
+
skill_dirs = [Path(d) for d in args.skill_dirs]
|
|
51
|
+
success_count = 0
|
|
52
|
+
total_count = len(skill_dirs)
|
|
53
|
+
|
|
54
|
+
for skill_dir in skill_dirs:
|
|
55
|
+
if not skill_dir.exists():
|
|
56
|
+
print(f"ā ļø Skipping (not found): {skill_dir}")
|
|
57
|
+
continue
|
|
58
|
+
|
|
59
|
+
if not (skill_dir / "SKILL.md").exists():
|
|
60
|
+
print(f"ā ļø Skipping (no SKILL.md): {skill_dir}")
|
|
61
|
+
continue
|
|
62
|
+
|
|
63
|
+
print(f"š¦ Packaging: {skill_dir.name}")
|
|
64
|
+
if package_skill(skill_dir):
|
|
65
|
+
success_count += 1
|
|
66
|
+
print(" ā
Success")
|
|
67
|
+
else:
|
|
68
|
+
print(" ā Failed")
|
|
69
|
+
print("")
|
|
70
|
+
|
|
71
|
+
print(f"{'=' * 60}")
|
|
72
|
+
print(f"SUMMARY: {success_count}/{total_count} skills packaged")
|
|
73
|
+
print(f"{'=' * 60}\n")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if __name__ == "__main__":
|
|
77
|
+
main()
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Simple Skill Packager
|
|
4
|
+
Packages a skill directory into a .zip file for Claude.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
skill-seekers package output/steam-inventory/
|
|
8
|
+
skill-seekers package output/react/
|
|
9
|
+
skill-seekers package output/react/ --no-open # Don't open folder
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import argparse
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
# Import utilities
|
|
18
|
+
try:
|
|
19
|
+
from quality_checker import SkillQualityChecker, print_report
|
|
20
|
+
from utils import (
|
|
21
|
+
format_file_size,
|
|
22
|
+
open_folder,
|
|
23
|
+
print_upload_instructions,
|
|
24
|
+
validate_skill_directory,
|
|
25
|
+
)
|
|
26
|
+
except ImportError:
|
|
27
|
+
# If running from different directory, add cli to path
|
|
28
|
+
sys.path.insert(0, str(Path(__file__).parent))
|
|
29
|
+
from quality_checker import SkillQualityChecker, print_report
|
|
30
|
+
from utils import (
|
|
31
|
+
format_file_size,
|
|
32
|
+
open_folder,
|
|
33
|
+
print_upload_instructions,
|
|
34
|
+
validate_skill_directory,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def package_skill(skill_dir, open_folder_after=True, skip_quality_check=False, target="claude"):
|
|
39
|
+
"""
|
|
40
|
+
Package a skill directory into platform-specific format
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
skill_dir: Path to skill directory
|
|
44
|
+
open_folder_after: Whether to open the output folder after packaging
|
|
45
|
+
skip_quality_check: Skip quality checks before packaging
|
|
46
|
+
target: Target LLM platform ('claude', 'gemini', 'openai', 'markdown')
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
tuple: (success, package_path) where success is bool and package_path is Path or None
|
|
50
|
+
"""
|
|
51
|
+
skill_path = Path(skill_dir)
|
|
52
|
+
|
|
53
|
+
# Validate skill directory
|
|
54
|
+
is_valid, error_msg = validate_skill_directory(skill_path)
|
|
55
|
+
if not is_valid:
|
|
56
|
+
print(f"ā Error: {error_msg}")
|
|
57
|
+
return False, None
|
|
58
|
+
|
|
59
|
+
# Run quality checks (unless skipped)
|
|
60
|
+
if not skip_quality_check:
|
|
61
|
+
print("\n" + "=" * 60)
|
|
62
|
+
print("QUALITY CHECK")
|
|
63
|
+
print("=" * 60)
|
|
64
|
+
|
|
65
|
+
checker = SkillQualityChecker(skill_path)
|
|
66
|
+
report = checker.check_all()
|
|
67
|
+
|
|
68
|
+
# Print report
|
|
69
|
+
print_report(report, verbose=False)
|
|
70
|
+
|
|
71
|
+
# If there are errors or warnings, ask user to confirm
|
|
72
|
+
if report.has_errors or report.has_warnings:
|
|
73
|
+
print("=" * 60)
|
|
74
|
+
response = input("\nContinue with packaging? (y/n): ").strip().lower()
|
|
75
|
+
if response != "y":
|
|
76
|
+
print("\nā Packaging cancelled by user")
|
|
77
|
+
return False, None
|
|
78
|
+
print()
|
|
79
|
+
else:
|
|
80
|
+
print("=" * 60)
|
|
81
|
+
print()
|
|
82
|
+
|
|
83
|
+
# Get platform-specific adaptor
|
|
84
|
+
try:
|
|
85
|
+
from skill_seekers.cli.adaptors import get_adaptor
|
|
86
|
+
|
|
87
|
+
adaptor = get_adaptor(target)
|
|
88
|
+
except (ImportError, ValueError) as e:
|
|
89
|
+
print(f"ā Error: {e}")
|
|
90
|
+
return False, None
|
|
91
|
+
|
|
92
|
+
# Create package using adaptor
|
|
93
|
+
skill_name = skill_path.name
|
|
94
|
+
output_dir = skill_path.parent
|
|
95
|
+
|
|
96
|
+
print(f"š¦ Packaging skill: {skill_name}")
|
|
97
|
+
print(f" Target: {adaptor.PLATFORM_NAME}")
|
|
98
|
+
print(f" Source: {skill_path}")
|
|
99
|
+
|
|
100
|
+
try:
|
|
101
|
+
package_path = adaptor.package(skill_path, output_dir)
|
|
102
|
+
print(f" Output: {package_path}")
|
|
103
|
+
except Exception as e:
|
|
104
|
+
print(f"ā Error creating package: {e}")
|
|
105
|
+
return False, None
|
|
106
|
+
|
|
107
|
+
# Get package size
|
|
108
|
+
package_size = package_path.stat().st_size
|
|
109
|
+
print(f"\nā
Package created: {package_path}")
|
|
110
|
+
print(f" Size: {package_size:,} bytes ({format_file_size(package_size)})")
|
|
111
|
+
|
|
112
|
+
# Open folder in file browser
|
|
113
|
+
if open_folder_after:
|
|
114
|
+
print(f"\nš Opening folder: {package_path.parent}")
|
|
115
|
+
open_folder(package_path.parent)
|
|
116
|
+
|
|
117
|
+
# Print upload instructions
|
|
118
|
+
print_upload_instructions(package_path)
|
|
119
|
+
|
|
120
|
+
return True, package_path
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def main():
|
|
124
|
+
parser = argparse.ArgumentParser(
|
|
125
|
+
description="Package a skill directory into a .zip file for Claude",
|
|
126
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
127
|
+
epilog="""
|
|
128
|
+
Examples:
|
|
129
|
+
# Package skill with quality checks (recommended)
|
|
130
|
+
skill-seekers package output/react/
|
|
131
|
+
|
|
132
|
+
# Package skill without opening folder
|
|
133
|
+
skill-seekers package output/react/ --no-open
|
|
134
|
+
|
|
135
|
+
# Skip quality checks (faster, but not recommended)
|
|
136
|
+
skill-seekers package output/react/ --skip-quality-check
|
|
137
|
+
|
|
138
|
+
# Package and auto-upload to Claude
|
|
139
|
+
skill-seekers package output/react/ --upload
|
|
140
|
+
|
|
141
|
+
# Get help
|
|
142
|
+
skill-seekers package --help
|
|
143
|
+
""",
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
parser.add_argument("skill_dir", help="Path to skill directory (e.g., output/react/)")
|
|
147
|
+
|
|
148
|
+
parser.add_argument(
|
|
149
|
+
"--no-open", action="store_true", help="Do not open the output folder after packaging"
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
parser.add_argument(
|
|
153
|
+
"--skip-quality-check", action="store_true", help="Skip quality checks before packaging"
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
parser.add_argument(
|
|
157
|
+
"--target",
|
|
158
|
+
choices=["claude", "gemini", "openai", "markdown"],
|
|
159
|
+
default="claude",
|
|
160
|
+
help="Target LLM platform (default: claude)",
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
parser.add_argument(
|
|
164
|
+
"--upload",
|
|
165
|
+
action="store_true",
|
|
166
|
+
help="Automatically upload after packaging (requires platform API key)",
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
args = parser.parse_args()
|
|
170
|
+
|
|
171
|
+
success, package_path = package_skill(
|
|
172
|
+
args.skill_dir,
|
|
173
|
+
open_folder_after=not args.no_open,
|
|
174
|
+
skip_quality_check=args.skip_quality_check,
|
|
175
|
+
target=args.target,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
if not success:
|
|
179
|
+
sys.exit(1)
|
|
180
|
+
|
|
181
|
+
# Auto-upload if requested
|
|
182
|
+
if args.upload:
|
|
183
|
+
try:
|
|
184
|
+
from skill_seekers.cli.adaptors import get_adaptor
|
|
185
|
+
|
|
186
|
+
# Get adaptor for target platform
|
|
187
|
+
adaptor = get_adaptor(args.target)
|
|
188
|
+
|
|
189
|
+
# Get API key from environment
|
|
190
|
+
api_key = os.environ.get(adaptor.get_env_var_name(), "").strip()
|
|
191
|
+
|
|
192
|
+
if not api_key:
|
|
193
|
+
# No API key - show helpful message but DON'T fail
|
|
194
|
+
print("\n" + "=" * 60)
|
|
195
|
+
print("š” Automatic Upload")
|
|
196
|
+
print("=" * 60)
|
|
197
|
+
print()
|
|
198
|
+
print(f"To enable automatic upload to {adaptor.PLATFORM_NAME}:")
|
|
199
|
+
print(" 1. Get API key from the platform")
|
|
200
|
+
print(f" 2. Set: export {adaptor.get_env_var_name()}=...")
|
|
201
|
+
print(" 3. Run package command with --upload flag")
|
|
202
|
+
print()
|
|
203
|
+
print("For now, use manual upload (instructions above) āļø")
|
|
204
|
+
print("=" * 60)
|
|
205
|
+
# Exit successfully - packaging worked!
|
|
206
|
+
sys.exit(0)
|
|
207
|
+
|
|
208
|
+
# API key exists - try upload
|
|
209
|
+
print("\n" + "=" * 60)
|
|
210
|
+
print(f"š¤ Uploading to {adaptor.PLATFORM_NAME}...")
|
|
211
|
+
print("=" * 60)
|
|
212
|
+
|
|
213
|
+
result = adaptor.upload(package_path, api_key)
|
|
214
|
+
|
|
215
|
+
if result["success"]:
|
|
216
|
+
print(f"\nā
{result['message']}")
|
|
217
|
+
if result["url"]:
|
|
218
|
+
print(f" View at: {result['url']}")
|
|
219
|
+
print("=" * 60)
|
|
220
|
+
sys.exit(0)
|
|
221
|
+
else:
|
|
222
|
+
print(f"\nā Upload failed: {result['message']}")
|
|
223
|
+
print()
|
|
224
|
+
print("š” Try manual upload instead (instructions above) āļø")
|
|
225
|
+
print("=" * 60)
|
|
226
|
+
# Exit successfully - packaging worked even if upload failed
|
|
227
|
+
sys.exit(0)
|
|
228
|
+
|
|
229
|
+
except ImportError as e:
|
|
230
|
+
print(f"\nā Error: {e}")
|
|
231
|
+
print("Install required dependencies for this platform")
|
|
232
|
+
sys.exit(1)
|
|
233
|
+
except Exception as e:
|
|
234
|
+
print(f"\nā Upload error: {e}")
|
|
235
|
+
sys.exit(1)
|
|
236
|
+
|
|
237
|
+
sys.exit(0)
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
if __name__ == "__main__":
|
|
241
|
+
main()
|