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.
Files changed (79) hide show
  1. skill_seekers/__init__.py +22 -0
  2. skill_seekers/cli/__init__.py +39 -0
  3. skill_seekers/cli/adaptors/__init__.py +120 -0
  4. skill_seekers/cli/adaptors/base.py +221 -0
  5. skill_seekers/cli/adaptors/claude.py +485 -0
  6. skill_seekers/cli/adaptors/gemini.py +453 -0
  7. skill_seekers/cli/adaptors/markdown.py +269 -0
  8. skill_seekers/cli/adaptors/openai.py +503 -0
  9. skill_seekers/cli/ai_enhancer.py +310 -0
  10. skill_seekers/cli/api_reference_builder.py +373 -0
  11. skill_seekers/cli/architectural_pattern_detector.py +525 -0
  12. skill_seekers/cli/code_analyzer.py +1462 -0
  13. skill_seekers/cli/codebase_scraper.py +1225 -0
  14. skill_seekers/cli/config_command.py +563 -0
  15. skill_seekers/cli/config_enhancer.py +431 -0
  16. skill_seekers/cli/config_extractor.py +871 -0
  17. skill_seekers/cli/config_manager.py +452 -0
  18. skill_seekers/cli/config_validator.py +394 -0
  19. skill_seekers/cli/conflict_detector.py +528 -0
  20. skill_seekers/cli/constants.py +72 -0
  21. skill_seekers/cli/dependency_analyzer.py +757 -0
  22. skill_seekers/cli/doc_scraper.py +2332 -0
  23. skill_seekers/cli/enhance_skill.py +488 -0
  24. skill_seekers/cli/enhance_skill_local.py +1096 -0
  25. skill_seekers/cli/enhance_status.py +194 -0
  26. skill_seekers/cli/estimate_pages.py +433 -0
  27. skill_seekers/cli/generate_router.py +1209 -0
  28. skill_seekers/cli/github_fetcher.py +534 -0
  29. skill_seekers/cli/github_scraper.py +1466 -0
  30. skill_seekers/cli/guide_enhancer.py +723 -0
  31. skill_seekers/cli/how_to_guide_builder.py +1267 -0
  32. skill_seekers/cli/install_agent.py +461 -0
  33. skill_seekers/cli/install_skill.py +178 -0
  34. skill_seekers/cli/language_detector.py +614 -0
  35. skill_seekers/cli/llms_txt_detector.py +60 -0
  36. skill_seekers/cli/llms_txt_downloader.py +104 -0
  37. skill_seekers/cli/llms_txt_parser.py +150 -0
  38. skill_seekers/cli/main.py +558 -0
  39. skill_seekers/cli/markdown_cleaner.py +132 -0
  40. skill_seekers/cli/merge_sources.py +806 -0
  41. skill_seekers/cli/package_multi.py +77 -0
  42. skill_seekers/cli/package_skill.py +241 -0
  43. skill_seekers/cli/pattern_recognizer.py +1825 -0
  44. skill_seekers/cli/pdf_extractor_poc.py +1166 -0
  45. skill_seekers/cli/pdf_scraper.py +617 -0
  46. skill_seekers/cli/quality_checker.py +519 -0
  47. skill_seekers/cli/rate_limit_handler.py +438 -0
  48. skill_seekers/cli/resume_command.py +160 -0
  49. skill_seekers/cli/run_tests.py +230 -0
  50. skill_seekers/cli/setup_wizard.py +93 -0
  51. skill_seekers/cli/split_config.py +390 -0
  52. skill_seekers/cli/swift_patterns.py +560 -0
  53. skill_seekers/cli/test_example_extractor.py +1081 -0
  54. skill_seekers/cli/test_unified_simple.py +179 -0
  55. skill_seekers/cli/unified_codebase_analyzer.py +572 -0
  56. skill_seekers/cli/unified_scraper.py +932 -0
  57. skill_seekers/cli/unified_skill_builder.py +1605 -0
  58. skill_seekers/cli/upload_skill.py +162 -0
  59. skill_seekers/cli/utils.py +432 -0
  60. skill_seekers/mcp/__init__.py +33 -0
  61. skill_seekers/mcp/agent_detector.py +316 -0
  62. skill_seekers/mcp/git_repo.py +273 -0
  63. skill_seekers/mcp/server.py +231 -0
  64. skill_seekers/mcp/server_fastmcp.py +1249 -0
  65. skill_seekers/mcp/server_legacy.py +2302 -0
  66. skill_seekers/mcp/source_manager.py +285 -0
  67. skill_seekers/mcp/tools/__init__.py +115 -0
  68. skill_seekers/mcp/tools/config_tools.py +251 -0
  69. skill_seekers/mcp/tools/packaging_tools.py +826 -0
  70. skill_seekers/mcp/tools/scraping_tools.py +842 -0
  71. skill_seekers/mcp/tools/source_tools.py +828 -0
  72. skill_seekers/mcp/tools/splitting_tools.py +212 -0
  73. skill_seekers/py.typed +0 -0
  74. skill_seekers-2.7.3.dist-info/METADATA +2027 -0
  75. skill_seekers-2.7.3.dist-info/RECORD +79 -0
  76. skill_seekers-2.7.3.dist-info/WHEEL +5 -0
  77. skill_seekers-2.7.3.dist-info/entry_points.txt +19 -0
  78. skill_seekers-2.7.3.dist-info/licenses/LICENSE +21 -0
  79. 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()