mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-10 08:04:56 +03:00
feat(crossplatform): add Python 3 ports for all 58 PS1 skill scripts
Add cross-platform Python alternatives alongside existing PowerShell scripts. PS1 remains the default runtime; Python is opt-in via switch scripts. All parameters are identical between runtimes. New files: - 58 Python scripts in .claude/skills/*/scripts/*.py - scripts/switch-to-python.py and switch-to-powershell.py - docs/python-porting-guide.md - __pycache__/ added to .gitignore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env python3
|
||||
# switch-to-powershell v1.1 — Switch skill .md files back to PowerShell scripts
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
"""Replaces python invocations with powershell.exe in all .md files under .claude/skills/."""
|
||||
import os, re, glob, sys
|
||||
|
||||
def main():
|
||||
repo_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
skills_dir = os.path.join(repo_root, '.claude', 'skills')
|
||||
|
||||
# Collect all .md files in skill directories (SKILL.md, json-dsl.md, etc.)
|
||||
md_files = sorted(glob.glob(os.path.join(skills_dir, '*', '*.md')))
|
||||
if not md_files:
|
||||
print(f"Error: no .md files found in {skills_dir}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
rx = re.compile(r'python\s+(\'?\.claude/skills/[^\s\']+?)\.py')
|
||||
switched = 0
|
||||
warnings = []
|
||||
|
||||
for md_path in md_files:
|
||||
with open(md_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
matches = rx.findall(content)
|
||||
if not matches:
|
||||
continue
|
||||
|
||||
# Check that .ps1 files exist for all matches
|
||||
all_exist = True
|
||||
for m in matches:
|
||||
ps1_path = m.lstrip("'") + '.ps1'
|
||||
ps1_full = os.path.join(repo_root, ps1_path)
|
||||
if not os.path.isfile(ps1_full):
|
||||
skill_name = os.path.basename(os.path.dirname(md_path))
|
||||
md_name = os.path.basename(md_path)
|
||||
warnings.append(f" SKIP: {ps1_path} not found (referenced in {skill_name}/{md_name})")
|
||||
all_exist = False
|
||||
|
||||
if not all_exist:
|
||||
continue
|
||||
|
||||
new_content = rx.sub(r'powershell.exe -NoProfile -File \1.ps1', content)
|
||||
if new_content != content:
|
||||
with open(md_path, 'w', encoding='utf-8') as f:
|
||||
f.write(new_content)
|
||||
skill_name = os.path.basename(os.path.dirname(md_path))
|
||||
md_name = os.path.basename(md_path)
|
||||
print(f" [OK] {skill_name}/{md_name}")
|
||||
switched += 1
|
||||
|
||||
print(f"\nSwitched {switched} file(s) to PowerShell.")
|
||||
if warnings:
|
||||
print("\nSkipped (missing .ps1 files):")
|
||||
for w in warnings:
|
||||
print(w)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env python3
|
||||
# switch-to-python v1.1 — Switch skill .md files to use Python scripts
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
"""Replaces powershell.exe invocations with python in all .md files under .claude/skills/."""
|
||||
import os, re, glob, sys
|
||||
|
||||
def main():
|
||||
repo_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
skills_dir = os.path.join(repo_root, '.claude', 'skills')
|
||||
|
||||
# Collect all .md files in skill directories (SKILL.md, json-dsl.md, etc.)
|
||||
md_files = sorted(glob.glob(os.path.join(skills_dir, '*', '*.md')))
|
||||
if not md_files:
|
||||
print(f"Error: no .md files found in {skills_dir}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
rx = re.compile(r'powershell\.exe\s+(?:-NoProfile\s+)?-File\s+(.+?)\.ps1')
|
||||
switched = 0
|
||||
warnings = []
|
||||
|
||||
for md_path in md_files:
|
||||
with open(md_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
matches = rx.findall(content)
|
||||
if not matches:
|
||||
continue
|
||||
|
||||
# Check that .py files exist
|
||||
for m in matches:
|
||||
clean_path = m.lstrip("'")
|
||||
py_path = clean_path + '.py'
|
||||
py_full = os.path.join(repo_root, py_path)
|
||||
if not os.path.isfile(py_full):
|
||||
skill_name = os.path.basename(os.path.dirname(md_path))
|
||||
md_name = os.path.basename(md_path)
|
||||
warnings.append(f" WARN: {py_path} not found (referenced in {skill_name}/{md_name})")
|
||||
|
||||
new_content = rx.sub(r'python \1.py', content)
|
||||
if new_content != content:
|
||||
with open(md_path, 'w', encoding='utf-8') as f:
|
||||
f.write(new_content)
|
||||
skill_name = os.path.basename(os.path.dirname(md_path))
|
||||
md_name = os.path.basename(md_path)
|
||||
print(f" [OK] {skill_name}/{md_name}")
|
||||
switched += 1
|
||||
|
||||
print(f"\nSwitched {switched} file(s) to Python.")
|
||||
if warnings:
|
||||
print("\nWarnings (missing .py files):")
|
||||
for w in warnings:
|
||||
print(w)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user