Initial commit
This commit is contained in:
210
skills/documentation-wizard/scripts/sync_docs.py
Executable file
210
skills/documentation-wizard/scripts/sync_docs.py
Executable file
@@ -0,0 +1,210 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Documentation Synchronization Script
|
||||
|
||||
Syncs documentation from Oracle knowledge, Summoner MCDs, and Style Master guides.
|
||||
|
||||
Usage:
|
||||
python sync_docs.py --source oracle
|
||||
python sync_docs.py --source summoner
|
||||
python sync_docs.py --source style-master
|
||||
python sync_docs.py --source all
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
def find_oracle_root():
|
||||
"""Find .oracle directory."""
|
||||
current = Path.cwd()
|
||||
while current != current.parent:
|
||||
oracle_path = current / '.oracle'
|
||||
if oracle_path.exists():
|
||||
return oracle_path
|
||||
current = current.parent
|
||||
return None
|
||||
|
||||
|
||||
def sync_from_oracle(oracle_path, output_dir):
|
||||
"""Sync documentation from Oracle knowledge base."""
|
||||
print(" Syncing from Oracle knowledge base...")
|
||||
|
||||
knowledge_dir = oracle_path / 'knowledge'
|
||||
if not knowledge_dir.exists():
|
||||
print(" [WARNING] No Oracle knowledge found")
|
||||
return
|
||||
|
||||
patterns_file = knowledge_dir / 'patterns.json'
|
||||
gotchas_file = knowledge_dir / 'gotchas.json'
|
||||
|
||||
sections = []
|
||||
|
||||
# Load patterns
|
||||
if patterns_file.exists():
|
||||
with open(patterns_file, 'r') as f:
|
||||
patterns = json.load(f)
|
||||
|
||||
if patterns:
|
||||
sections.append("## Architecture Patterns\n")
|
||||
sections.append("*From Oracle knowledge base*\n\n")
|
||||
|
||||
for pattern in patterns[:10]: # Top 10
|
||||
title = pattern.get('title', 'Untitled')
|
||||
content = pattern.get('content', '')
|
||||
sections.append(f"### {title}\n\n{content}\n\n")
|
||||
|
||||
# Load gotchas
|
||||
if gotchas_file.exists():
|
||||
with open(gotchas_file, 'r') as f:
|
||||
gotchas = json.load(f)
|
||||
|
||||
if gotchas:
|
||||
sections.append("## Known Issues & Gotchas\n")
|
||||
sections.append("*From Oracle knowledge base*\n\n")
|
||||
|
||||
for gotcha in gotchas[:10]:
|
||||
title = gotcha.get('title', 'Untitled')
|
||||
content = gotcha.get('content', '')
|
||||
priority = gotcha.get('priority', 'medium')
|
||||
emoji = {'critical': '', 'high': '', 'medium': '', 'low': ''}.get(priority, '')
|
||||
sections.append(f"### {emoji} {title}\n\n{content}\n\n")
|
||||
|
||||
if sections:
|
||||
# Write to ARCHITECTURE.md
|
||||
output_file = output_dir / 'ARCHITECTURE.md'
|
||||
with open(output_file, 'w') as f:
|
||||
f.write(f"# Architecture Documentation\n\n")
|
||||
f.write(f"*Last updated: {datetime.now().strftime('%Y-%m-%d %H:%M')}*\n\n")
|
||||
f.write(''.join(sections))
|
||||
|
||||
print(f" [OK] Created {output_file}")
|
||||
print(f" [NOTE] Synced {len(patterns if patterns_file.exists() else [])} patterns, {len(gotchas if gotchas_file.exists() else [])} gotchas")
|
||||
else:
|
||||
print(" [WARNING] No patterns or gotchas to sync")
|
||||
|
||||
|
||||
def sync_from_style_master(project_path, output_dir):
|
||||
"""Sync from Style Master style guide."""
|
||||
print(" Syncing from Style Master...")
|
||||
|
||||
style_guide = project_path / 'STYLEGUIDE.md'
|
||||
if style_guide.exists():
|
||||
# Copy style guide to docs
|
||||
output_file = output_dir / 'STYLEGUIDE.md'
|
||||
with open(style_guide, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
with open(output_file, 'w') as f:
|
||||
f.write(content)
|
||||
|
||||
print(f" [OK] Synced {output_file}")
|
||||
else:
|
||||
print(" [WARNING] No STYLEGUIDE.md found")
|
||||
|
||||
|
||||
def sync_from_summoner(project_path, output_dir):
|
||||
"""Sync from Summoner Mission Control Documents."""
|
||||
print(" Syncing from Summoner MCDs...")
|
||||
|
||||
# Look for mission-*.md files
|
||||
mcds = list(project_path.glob('mission-*.md'))
|
||||
|
||||
if not mcds:
|
||||
print(" [WARNING] No Summoner MCDs found")
|
||||
return
|
||||
|
||||
adr_dir = output_dir / 'adr'
|
||||
adr_dir.mkdir(exist_ok=True)
|
||||
|
||||
for mcd in mcds:
|
||||
print(f" Processing {mcd.name}")
|
||||
|
||||
with open(mcd, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Extract decisions from MCD
|
||||
if '## Decisions' in content:
|
||||
decisions_section = content.split('## Decisions')[1].split('\n\n')[0]
|
||||
|
||||
# Create ADR
|
||||
adr_num = len(list(adr_dir.glob('*.md'))) + 1
|
||||
adr_file = adr_dir / f'{adr_num:03d}-from-{mcd.stem}.md'
|
||||
|
||||
adr_content = f"""# ADR-{adr_num:03d}: Decisions from {mcd.stem}
|
||||
|
||||
Date: {datetime.now().strftime('%Y-%m-%d')}
|
||||
Status: Accepted
|
||||
Source: Summoner MCD {mcd.name}
|
||||
|
||||
## Context
|
||||
|
||||
From Mission Control Document: {mcd.name}
|
||||
|
||||
## Decisions
|
||||
|
||||
{decisions_section}
|
||||
|
||||
## Links
|
||||
|
||||
- Source MCD: {mcd.name}
|
||||
"""
|
||||
|
||||
with open(adr_file, 'w') as f:
|
||||
f.write(adr_content)
|
||||
|
||||
print(f" [OK] Created ADR: {adr_file.name}")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Sync documentation from various sources'
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
'--source',
|
||||
choices=['oracle', 'summoner', 'style-master', 'all'],
|
||||
default='all',
|
||||
help='Source to sync from'
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
'--output',
|
||||
type=str,
|
||||
default='docs',
|
||||
help='Output directory (default: docs/)'
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
project_path = Path.cwd()
|
||||
output_dir = project_path / args.output
|
||||
output_dir.mkdir(exist_ok=True)
|
||||
|
||||
print(f" Syncing documentation to {output_dir}\n")
|
||||
|
||||
if args.source in ['oracle', 'all']:
|
||||
oracle_path = find_oracle_root()
|
||||
if oracle_path:
|
||||
sync_from_oracle(oracle_path, output_dir)
|
||||
else:
|
||||
print("[WARNING] Oracle not initialized for this project")
|
||||
print()
|
||||
|
||||
if args.source in ['style-master', 'all']:
|
||||
sync_from_style_master(project_path, output_dir)
|
||||
print()
|
||||
|
||||
if args.source in ['summoner', 'all']:
|
||||
sync_from_summoner(project_path, output_dir)
|
||||
print()
|
||||
|
||||
print("[OK] Documentation sync complete!")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user