From 78e42d8b1f0c5d66af6c9dd5fceb00ad6539d3f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20Pe=CC=81rez?= Date: Wed, 14 Jan 2026 03:30:10 +0000 Subject: [PATCH] chore: remove py --- scripts/add-code-block-languages.py | 106 ------------------ scripts/fix-closing-fences.py | 79 ------------- scripts/fix-markdown-lint-v2.py | 159 --------------------------- scripts/fix-markdown-lint.py | 127 --------------------- scripts/fix-remaining-docs.py | 148 ------------------------- scripts/restore-correct-languages.py | 144 ------------------------ 6 files changed, 763 deletions(-) delete mode 100644 scripts/add-code-block-languages.py delete mode 100644 scripts/fix-closing-fences.py delete mode 100644 scripts/fix-markdown-lint-v2.py delete mode 100644 scripts/fix-markdown-lint.py delete mode 100644 scripts/fix-remaining-docs.py delete mode 100644 scripts/restore-correct-languages.py diff --git a/scripts/add-code-block-languages.py b/scripts/add-code-block-languages.py deleted file mode 100644 index e40ed3a..0000000 --- a/scripts/add-code-block-languages.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python3 -"""Add language specifiers to opening code fences only. -Never touch closing fences - closing fences MUST remain as just ``` -""" - -import re -import sys -from pathlib import Path - -def add_code_block_languages(content): - """Add language specifier to opening code fences without one (MD040). - - Logic: - - Find ``` at start of line followed by newline (no language) - - Add 'text' as default language - - NEVER modify closing fences - - This is done carefully: - 1. Split into lines - 2. Track whether we're inside a code block - 3. For opening fences without language: add 'text' - 4. Leave closing fences untouched - """ - lines = content.split('\n') - fixed_lines = [] - in_code_block = False - - for line in lines: - # Check if this is a code fence line - if line.startswith('```'): - # Extract what's after the backticks - fence_content = line[3:] - - if not in_code_block: - # This is an OPENING fence - if not fence_content.strip(): - # Opening fence with no language - add 'text' - fixed_lines.append('```text') - in_code_block = True - else: - # Already has a language specifier - fixed_lines.append(line) - in_code_block = True - else: - # This is a CLOSING fence - # MUST remain as just ``` - never add language - fixed_lines.append('```') - in_code_block = False - else: - fixed_lines.append(line) - - return '\n'.join(fixed_lines) - -def fix_file(filepath): - """Fix code block languages in a single file.""" - try: - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - - fixed_content = add_code_block_languages(content) - - with open(filepath, 'w', encoding='utf-8') as f: - f.write(fixed_content) - - return True - except Exception as e: - print(f"Error processing {filepath}: {e}", file=sys.stderr) - return False - -def main(): - """Add language specifiers to all AI documentation files.""" - docs_root = Path('provisioning/docs/src') - - # All AI files - ai_files = [ - 'ai/ai-agents.md', - 'ai/ai-assisted-forms.md', - 'ai/architecture.md', - 'ai/config-generation.md', - 'ai/configuration.md', - 'ai/cost-management.md', - 'ai/mcp-integration.md', - 'ai/natural-language-config.md', - 'ai/rag-system.md', - 'ai/README.md', - 'ai/security-policies.md', - 'ai/troubleshooting-with-ai.md', - ] - - success_count = 0 - for filepath_rel in ai_files: - filepath = docs_root / filepath_rel - if filepath.exists(): - if fix_file(filepath): - print(f"✓ Fixed {filepath_rel}") - success_count += 1 - else: - print(f"✗ Failed to fix {filepath_rel}") - else: - print(f"⚠ File not found: {filepath_rel}") - - print(f"\n✓ Added code block languages to {success_count}/{len(ai_files)} files") - return 0 if success_count == len(ai_files) else 1 - -if __name__ == '__main__': - sys.exit(main()) diff --git a/scripts/fix-closing-fences.py b/scripts/fix-closing-fences.py deleted file mode 100644 index 1300be8..0000000 --- a/scripts/fix-closing-fences.py +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env python3 -"""Fix malformed closing fences - remove language specifiers from closing ```.""" - -import re -import sys -from pathlib import Path - -def fix_closing_fences(content): - """Fix malformed closing code fences: ```text -> ```""" - # Match closing fence lines that have language specifiers - # Pattern: line starts with ``` followed by word characters (language) - # This must be on a line by itself (possibly with whitespace) - pattern = r'^```\w+\s*$' - - lines = content.split('\n') - fixed_lines = [] - - for line in lines: - # If this line is a closing fence with language specifier, remove it - if re.match(pattern, line): - fixed_lines.append('```') - else: - fixed_lines.append(line) - - return '\n'.join(fixed_lines) - -def fix_file(filepath): - """Fix all malformed closing fences in a single file.""" - try: - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - - fixed_content = fix_closing_fences(content) - - with open(filepath, 'w', encoding='utf-8') as f: - f.write(fixed_content) - - return True - except Exception as e: - print(f"Error processing {filepath}: {e}", file=sys.stderr) - return False - -def main(): - """Fix malformed closing fences in all AI documentation files.""" - docs_root = Path('provisioning/docs/src') - - # All AI files - ai_files = [ - 'ai/ai-agents.md', - 'ai/ai-assisted-forms.md', - 'ai/architecture.md', - 'ai/config-generation.md', - 'ai/configuration.md', - 'ai/cost-management.md', - 'ai/mcp-integration.md', - 'ai/natural-language-config.md', - 'ai/rag-system.md', - 'ai/README.md', - 'ai/security-policies.md', - 'ai/troubleshooting-with-ai.md', - ] - - success_count = 0 - for filepath_rel in ai_files: - filepath = docs_root / filepath_rel - if filepath.exists(): - if fix_file(filepath): - print(f"✓ Fixed {filepath_rel}") - success_count += 1 - else: - print(f"✗ Failed to fix {filepath_rel}") - else: - print(f"⚠ File not found: {filepath_rel}") - - print(f"\n✓ Fixed malformed closing fences in {success_count}/{len(ai_files)} files") - return 0 if success_count == len(ai_files) else 1 - -if __name__ == '__main__': - sys.exit(main()) diff --git a/scripts/fix-markdown-lint-v2.py b/scripts/fix-markdown-lint-v2.py deleted file mode 100644 index 94a823b..0000000 --- a/scripts/fix-markdown-lint-v2.py +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/env python3 -"""Fix markdown linting errors: MD040, MD013, MD060, MD034.""" - -import re -import sys -from pathlib import Path - -def fix_code_block_languages(content): - """Add language specifier to code blocks without one (MD040).""" - # Pattern: opening fence with no language specifier (``` followed by newline) - pattern = r'(^```)\n' - fixed = re.sub(pattern, r'\1text\n', content, flags=re.MULTILINE) - return fixed - -def fix_line_length(content): - """Break long lines to fit 150 character limit (MD013).""" - lines = content.split('\n') - fixed_lines = [] - - for line in lines: - # Skip code blocks, tables, headings with formatting - if line.startswith('```') or line.startswith('|') or line.startswith('>'): - fixed_lines.append(line) - continue - - # If line is longer than 150 chars - if len(line) > 150: - # For paragraphs, break at word boundaries - if not line.startswith('#') and not line.startswith('-') and not line.startswith('*'): - words = line.split(' ') - current_line = '' - for word in words: - test_line = current_line + (' ' if current_line else '') + word - if len(test_line) <= 150: - current_line = test_line - else: - if current_line: - fixed_lines.append(current_line) - current_line = word - if current_line: - fixed_lines.append(current_line) - continue - - fixed_lines.append(line) - - return '\n'.join(fixed_lines) - -def fix_table_formatting(content): - """Fix table formatting: ensure spaces around all pipes (MD060).""" - lines = content.split('\n') - fixed_lines = [] - - i = 0 - while i < len(lines): - line = lines[i] - - # Check if this is a table line (contains pipes) - if '|' in line: - # For markdown tables, we need to ensure: - # 1. Each cell has space after opening | and before closing | - # 2. Header separator is properly formatted - - # Split by pipes - cells = line.split('|') - - # Rebuild with proper spacing - # First element might be empty (if line starts with |) - fixed_cells = [] - for j, cell in enumerate(cells): - # For separator rows (containing dashes), just trim and preserve - if '-' in cell and not any(c.isalnum() for c in cell.replace('-', '').replace(' ', '')): - # This is a separator cell - ensure it's proper format: --- - trimmed = cell.strip() - if trimmed and all(c == '-' or c == ':' for c in trimmed): - fixed_cells.append(' ' + trimmed + ' ') - else: - fixed_cells.append(' ' + cell.strip() + ' ') - else: - # Regular cell - ensure spaces - trimmed = cell.strip() - if trimmed: - fixed_cells.append(' ' + trimmed + ' ') - else: - fixed_cells.append(' ') - - fixed_line = '|' + '|'.join(fixed_cells) + '|' - fixed_lines.append(fixed_line) - else: - fixed_lines.append(line) - - i += 1 - - return '\n'.join(fixed_lines) - -def fix_bare_urls(content): - """Convert bare URLs to markdown links (MD034).""" - # Pattern: URL not already in markdown link or code block - # This is conservative - only fixes obvious cases - pattern = r'([^[])(https?://[^\s\)]+)' - fixed = re.sub(pattern, r'\1[\2](\2)', content) - return fixed - -def fix_file(filepath): - """Fix all markdown linting errors in a single file.""" - try: - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - - # Apply fixes in order - content = fix_code_block_languages(content) - content = fix_line_length(content) - content = fix_table_formatting(content) - content = fix_bare_urls(content) - - with open(filepath, 'w', encoding='utf-8') as f: - f.write(content) - - return True - except Exception as e: - print(f"Error processing {filepath}: {e}", file=sys.stderr) - return False - -def main(): - """Fix markdown linting errors in all AI documentation files.""" - docs_root = Path('provisioning/docs/src') - - # All AI files (complete list) - ai_files = [ - 'ai/ai-agents.md', - 'ai/ai-assisted-forms.md', - 'ai/architecture.md', - 'ai/config-generation.md', - 'ai/configuration.md', - 'ai/cost-management.md', - 'ai/mcp-integration.md', - 'ai/natural-language-config.md', - 'ai/rag-system.md', - 'ai/README.md', - 'ai/security-policies.md', - 'ai/troubleshooting-with-ai.md', - ] - - success_count = 0 - for filepath_rel in ai_files: - filepath = docs_root / filepath_rel - if filepath.exists(): - if fix_file(filepath): - print(f"✓ Fixed {filepath_rel}") - success_count += 1 - else: - print(f"✗ Failed to fix {filepath_rel}") - else: - print(f"⚠ File not found: {filepath_rel}") - - print(f"\n✓ Fixed {success_count}/{len(ai_files)} AI files") - return 0 if success_count == len(ai_files) else 1 - -if __name__ == '__main__': - sys.exit(main()) diff --git a/scripts/fix-markdown-lint.py b/scripts/fix-markdown-lint.py deleted file mode 100644 index d0871ea..0000000 --- a/scripts/fix-markdown-lint.py +++ /dev/null @@ -1,127 +0,0 @@ -#!/usr/bin/env python3 -"""Fix markdown linting errors: MD040 (code blocks), MD013 (line length), MD060 (tables).""" - -import re -import sys -from pathlib import Path - -def fix_code_block_languages(content): - """Add language specifier to code blocks without one (MD040).""" - # Pattern: opening fence with no language specifier (``` followed by newline or whitespace) - pattern = r'(^```)\n' - # Replace with ```text\n (default language for unspecified blocks) - fixed = re.sub(pattern, r'\1text\n', content, flags=re.MULTILINE) - return fixed - -def fix_line_length(content): - """Break long lines to fit 150 character limit (MD013).""" - lines = content.split('\n') - fixed_lines = [] - - for line in lines: - # Skip code blocks, tables, and links (these have different rules) - if line.startswith('```') or line.startswith('|') or line.startswith('>'): - fixed_lines.append(line) - continue - - # If line is longer than 150 chars and not a special case - if len(line) > 150: - # For paragraphs, try to break at word boundaries - if not line.startswith('#') and not line.startswith('-') and not line.startswith('*'): - words = line.split(' ') - current_line = '' - for word in words: - test_line = current_line + (' ' if current_line else '') + word - if len(test_line) <= 150: - current_line = test_line - else: - if current_line: - fixed_lines.append(current_line) - current_line = word - if current_line: - fixed_lines.append(current_line) - continue - - fixed_lines.append(line) - - return '\n'.join(fixed_lines) - -def fix_table_formatting(content): - """Fix table formatting: add spaces around pipes (MD060).""" - lines = content.split('\n') - fixed_lines = [] - - for line in lines: - # Check if this is a table line (contains pipes) - if '|' in line: - # Fix spacing: |text| -> | text |, but preserve already-correct spacing - # Match: | followed immediately by non-space or non-space followed immediately by | - fixed_line = line - - # Fix cases like |column| -> | column | - fixed_line = re.sub(r'\|\s*([^\s|][^|]*?[^\s|])\s*\|', r'| \1 |', fixed_line) - # Fix edge case of single character: |a| -> | a | - fixed_line = re.sub(r'\|\s*([^\s|])\s*\|', r'| \1 |', fixed_line) - # Fix leading pipe spacing: |text -> | text - fixed_line = re.sub(r'^\|\s*([^\s|])', r'| \1', fixed_line) - # Fix trailing pipe spacing: text| -> text | - fixed_line = re.sub(r'([^\s|])\s*\|$', r'\1 |', fixed_line) - - fixed_lines.append(fixed_line) - else: - fixed_lines.append(line) - - return '\n'.join(fixed_lines) - -def fix_file(filepath): - """Fix all markdown linting errors in a single file.""" - try: - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - - # Apply fixes in order - content = fix_code_block_languages(content) - content = fix_line_length(content) - content = fix_table_formatting(content) - - with open(filepath, 'w', encoding='utf-8') as f: - f.write(content) - - return True - except Exception as e: - print(f"Error processing {filepath}: {e}", file=sys.stderr) - return False - -def main(): - """Fix markdown linting errors in all AI documentation files.""" - docs_root = Path('provisioning/docs/src/ai') - - files_to_fix = [ - 'ai-assisted-forms.md', - 'architecture.md', - 'config-generation.md', - 'configuration.md', - 'cost-management.md', - 'mcp-integration.md', - 'natural-language-config.md', - 'rag-system.md', - 'security-policies.md', - ] - - success_count = 0 - for filename in files_to_fix: - filepath = docs_root / filename - if filepath.exists(): - if fix_file(filepath): - print(f"✓ Fixed {filename}") - success_count += 1 - else: - print(f"✗ Failed to fix {filename}") - else: - print(f"⚠ File not found: {filename}") - - print(f"\n✓ Fixed {success_count}/{len(files_to_fix)} files") - return 0 if success_count == len(files_to_fix) else 1 - -if __name__ == '__main__': - sys.exit(main()) diff --git a/scripts/fix-remaining-docs.py b/scripts/fix-remaining-docs.py deleted file mode 100644 index 702f6a4..0000000 --- a/scripts/fix-remaining-docs.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 -"""Fix remaining markdown errors WITHOUT creating malformed closing fences. - -CRITICAL: Opening fences get language, closing fences NEVER get language. -Use stateful tracking to know inside/outside fence. -""" - -import re -import sys -from pathlib import Path - -def fix_file(filepath): - """Fix markdown errors in a file while preserving fence correctness.""" - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - - lines = content.split('\n') - fixed_lines = [] - in_fence = False - fence_lang = '' - - for line in lines: - # CRITICAL: Handle code fences with state tracking - if line.startswith('```'): - if not in_fence: - # OPENING FENCE - may need language - after_fence = line[3:] - if not after_fence.strip(): - # No language specified - add 'text' - fixed_lines.append('```text') - else: - # Already has language - fixed_lines.append(line) - in_fence = True - fence_lang = after_fence - else: - # CLOSING FENCE - MUST stay as just ``` - fixed_lines.append('```') - in_fence = False - else: - # NOT a fence line - fix other issues - - # MD013: Line too long - break at word boundaries - if len(line) > 150 and not in_fence: - # Only break lines outside fences - if not line.startswith('|') and not line.startswith('>'): - # Paragraph line - break at words - words = line.split(' ') - current = '' - for word in words: - test = current + (' ' if current else '') + word - if len(test) <= 150: - current = test - else: - if current: - fixed_lines.append(current) - current = word - if current: - fixed_lines.append(current) - continue - - # MD060: Table formatting - fix spacing around pipes - if '|' in line and not in_fence: - # This might be a table line - cells = line.split('|') - fixed_cells = [] - for cell in cells: - # Trim and re-add spacing - trimmed = cell.strip() - if trimmed: - fixed_cells.append(' ' + trimmed + ' ') - else: - fixed_cells.append(' ') - fixed_line = '|' + '|'.join(fixed_cells) + '|' - fixed_lines.append(fixed_line) - else: - # MD034: Bare URLs - wrap in markdown link or backticks - # Only fix non-code-fence lines - if not in_fence: - # Check for bare URLs (not already in links or code) - if 'https://' in line or 'http://' in line: - # Check if already in markdown link format [url](url) - if not re.search(r'\[.*\]\(https?://.*\)', line): - # Try to wrap in backticks if it looks like email - if '@' in line and re.search(r'\w+@\w+\.\w+', line): - line = re.sub(r'(\w+@\w+\.\w+)', r'`\1`', line) - # For actual URLs, wrap in link format - else: - line = re.sub( - r'(https?://[^\s\)]+)', - r'[\1](\1)', - line - ) - fixed_lines.append(line) - - result = '\n'.join(fixed_lines) - - with open(filepath, 'w', encoding='utf-8') as f: - f.write(result) - - return True - -def main(): - """Fix all remaining documentation errors.""" - docs_root = Path('provisioning/docs/src') - - # ADR files with errors - adr_files = [ - 'architecture/adr/adr-016-schema-driven-accessor-generation.md', - 'architecture/adr/adr-017-plugin-wrapper-abstraction-framework.md', - 'architecture/adr/adr-018-help-system-fluent-integration.md', - 'architecture/adr/adr-019-configuration-loader-modularization.md', - 'architecture/adr/adr-020-command-handler-domain-splitting.md', - ] - - # Getting started files with errors - getting_started_files = [ - 'getting-started/setup-profiles.md', - 'getting-started/setup.md', - ] - - # Other files with errors - other_files = [ - 'guides/internationalization-system.md', - 'roadmap/ai-integration.md', - 'roadmap/nickel-workflows.md', - ] - - all_files = adr_files + getting_started_files + other_files - success_count = 0 - - for filepath_rel in all_files: - filepath = docs_root / filepath_rel - if filepath.exists(): - try: - fix_file(filepath) - print(f"✓ Fixed {filepath_rel}") - success_count += 1 - except Exception as e: - print(f"✗ Error fixing {filepath_rel}: {e}") - else: - print(f"⚠ File not found: {filepath_rel}") - - print(f"\n✓ Fixed {success_count}/{len(all_files)} files") - return 0 if success_count == len(all_files) else 1 - -if __name__ == '__main__': - sys.exit(main()) diff --git a/scripts/restore-correct-languages.py b/scripts/restore-correct-languages.py deleted file mode 100644 index e70e14f..0000000 --- a/scripts/restore-correct-languages.py +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env python3 -"""Restore correct code block languages by comparing with archived originals.""" - -import re -import sys -from pathlib import Path - -def extract_code_blocks(content): - """Extract all code blocks with line numbers and languages.""" - blocks = [] - lines = content.split('\n') - in_block = False - block_start = 0 - block_lang = '' - - for i, line in enumerate(lines): - if line.startswith('```'): - if not in_block: - # Opening fence - block_start = i - block_lang = line[3:].strip() - in_block = True - else: - # Closing fence - blocks.append({ - 'start': block_start, - 'end': i, - 'language': block_lang, - 'content': '\n'.join(lines[block_start+1:i]) - }) - in_block = False - - return blocks - -def find_matching_block(current_content, original_blocks, block_index): - """Find matching block in current content by comparing content.""" - current_blocks = extract_code_blocks(current_content) - - if block_index < len(current_blocks) and block_index < len(original_blocks): - current = current_blocks[block_index] - original = original_blocks[block_index] - - # Compare content to verify it's the same block - if current['content'].strip() == original['content'].strip(): - return original['language'] - - return None - -def restore_languages(current_content, original_content): - """Restore original code block languages.""" - original_blocks = extract_code_blocks(original_content) - - if not original_blocks: - return current_content - - lines = current_content.split('\n') - in_block = False - block_index = 0 - block_start = 0 - - for i, line in enumerate(lines): - if line.startswith('```'): - if not in_block: - # Opening fence - restore original language if we have it - if block_index < len(original_blocks): - original_lang = original_blocks[block_index]['language'] - if original_lang: - lines[i] = '```' + original_lang - block_start = i - in_block = True - else: - # Closing fence - keep as just ``` - lines[i] = '```' - block_index += 1 - in_block = False - - return '\n'.join(lines) - -def process_file(current_path, original_path): - """Process a single file pair.""" - try: - with open(current_path, 'r', encoding='utf-8') as f: - current_content = f.read() - - if not original_path.exists(): - print(f"⚠ Original not found: {original_path.name}") - return False - - with open(original_path, 'r', encoding='utf-8') as f: - original_content = f.read() - - fixed_content = restore_languages(current_content, original_content) - - with open(current_path, 'w', encoding='utf-8') as f: - f.write(fixed_content) - - return True - except Exception as e: - print(f"✗ Error: {e}", file=sys.stderr) - return False - -def main(): - """Restore correct code block languages.""" - current_root = Path('provisioning/docs/src') - original_root = Path('.coder/archive/docs-pre-audit/stubs') - - # All AI files to restore - ai_files = [ - 'ai/ai-agents.md', - 'ai/ai-assisted-forms.md', - 'ai/architecture.md', - 'ai/config-generation.md', - 'ai/configuration.md', - 'ai/cost-management.md', - 'ai/mcp-integration.md', - 'ai/natural-language-config.md', - 'ai/rag-system.md', - 'ai/README.md', - 'ai/security-policies.md', - 'ai/troubleshooting-with-ai.md', - ] - - success_count = 0 - for filepath_rel in ai_files: - current_path = current_root / filepath_rel - original_path = original_root / filepath_rel - - if current_path.exists() and original_path.exists(): - if process_file(current_path, original_path): - print(f"✓ Restored {filepath_rel}") - success_count += 1 - else: - print(f"✗ Failed to restore {filepath_rel}") - else: - if not current_path.exists(): - print(f"⚠ Current not found: {filepath_rel}") - if not original_path.exists(): - print(f"⚠ Original not found: {filepath_rel}") - - print(f"\n✓ Restored {success_count}/{len(ai_files)} files") - return 0 if success_count == len(ai_files) else 1 - -if __name__ == '__main__': - sys.exit(main())