Skip to content

Conversation

@ashleytower
Copy link

@ashleytower ashleytower commented Nov 3, 2025

Motivation and Context

How Has This Been Tested?

Breaking Changes

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Summary by CodeRabbit

  • New Features

    • 16+ new skills added (design, ads research, document formats, file organizer, Gmail intelligence, image enhancement, iOS simulator testing, prompt engineering, NotebookLM, and more).
    • Plugin metadata updated (broader description, version bump, expanded keywords).
    • Skill packaging: added ZIP-generation and distribution support.
  • Documentation

    • Extensive skill docs and usage guides (document/OOXML reference, iOS testing, templates, examples, installation and regeneration instructions).

claude and others added 6 commits October 26, 2025 17:53
- Add playwright-browser-automation skill for browser testing
- Add ios-simulator-testing skill for iOS app automation
- Create ZIP files for all 22 skills for Claude Desktop installation
- Add create-skill-zips.sh script to regenerate ZIPs
- Update README with Automation skills section
- Bump version to 3.3.0
- Add installation instructions in skill-zips/README.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Add file-organizer skill for intelligent file/folder organization
- Includes duplicate detection and automated cleanup
- Source: ComposioHQ/awesome-claude-skills
- Create ZIP for file-organizer skill
- Regenerate all 23 skill ZIPs
- Update README with Productivity skills section
- Update plugin.json to v3.4.0
- Update skill-zips README to reflect 23 skills

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Add gmail-intelligence skill for email automation and analysis
- Add notion-template-processor skill for Notion database integration
- Both skills from ashleytower/claude-skills-collection
- Create ZIP files for both new skills
- Now 25 total skills (3 Productivity skills)
- Update README with new Productivity skills
- Update plugin.json to v3.5.0
- Update skill-zips README to reflect 25 skills

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Document Skills (4):
- docx - Word documents with tracked changes
- pdf - PDF extraction, creation, merging
- xlsx - Excel spreadsheets with formulas
- pptx - PowerPoint presentations

Creative & Media (5):
- canvas-design - Visual art in PNG/PDF
- image-enhancer - Image upscaling
- slack-gif-creator - Animated GIFs
- theme-factory - Professional themes
- video-downloader - Multi-platform downloads

Business & Research (3):
- lead-research-assistant - Lead qualification
- competitive-ads-extractor - Competitor analysis
- notebooklm - NotebookLM integration

All skills sourced from:
- anthropics/skills (official)
- ComposioHQ/awesome-claude-skills
- PleasePrompto/notebooklm-skill

Now 37 total skills with ZIP files
Updated README and docs
Bumped version to 3.6.0

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Comprehensive AI prompt engineering skill covering:
- Video generation: Veo3 with optimal 5-component structure
- Image generation: Midjourney V7, DALL-E 3, Flux.1, Stable Diffusion
- Conversational AI: Claude 4.x, ChatGPT/GPT-4, Gemini 2.5

Features:
- Platform-specific techniques and parameters
- Best practices from 2025 documentation
- Quick reference tables for platform selection
- Common mistakes and fixes
- Real-world impact metrics

Research sources:
- Official documentation (Anthropic, OpenAI, Google)
- Community guides and tutorials
- 2025 updates for latest model versions
@coderabbitai
Copy link

coderabbitai bot commented Nov 3, 2025

Walkthrough

Adds many new skills, extensive OOXML XSD schemas, Python tools for packing/unpacking/validating/editing Office files (DOCX/PPTX/XLSX), iOS simulator testing scripts, plugin metadata updates (version 3.2.3 → 3.7.0) and packaging tooling (skill ZIP generation), plus numerous skill documentation and font license files.

Changes

Cohort / File(s) Summary
Plugin config & packaging
/.claude-plugin/plugin.json, README.md, create-skill-zips.sh, skill-zips/README.md
Bumped plugin version to 3.7.0, expanded description and keywords, updated README with many new skills, added create-skill-zips.sh and skill-zips/README.md for generating and documenting skill ZIPs.
Canvas design skill & fonts
skills/canvas-design/SKILL.md, skills/canvas-design/LICENSE.txt, skills/canvas-design/canvas-fonts/*-OFL.txt
Added canvas-design skill with workflow and production constraints; added Apache 2.0 LICENSE and many SIL OFL v1.1 font license files.
New skills docs (productivity/creative/business)
skills/file-organizer/SKILL.md, skills/gmail-intelligence/SKILL.md, skills/image-enhancer/SKILL.md, ...
Added multiple SKILL.md documents describing new skills (file-organizer, gmail-intelligence, image-enhancer, and others listed in README).
iOS simulator testing
skills/ios-simulator-testing/SKILL.md, skills/ios-simulator-testing/scripts/*.py, skills/ios-simulator-testing/examples/login_flow.py
New iOS simulator testing skill, accessibility audit, app launcher, app state capture, utilities and example login flow script; CLI entrypoints and auditing/reporting logic.
DOCX high-level API & templates
skills/docx/scripts/document.py, skills/docx/scripts/utilities.py, skills/docx/scripts/__init__.py, skills/docx/scripts/templates/*
Added Document and DocxXMLEditor APIs for comment insertion, tracked-change manipulation, RSID/author handling, XML editing helpers and templates (comments.*, people.xml).
DOCX/OFFICE scripts (pack/unpack/validate)
skills/docx/ooxml/scripts/pack.py, unpack.py, validate.py
Added pack/unpack/validate utilities: pack directory→.docx/.pptx/.xlsx, pretty-print/unpack, and validation CLI selecting validators by extension.
Validation framework
skills/docx/ooxml/scripts/validation/__init__.py, base.py, docx.py, pptx.py, redlining.py
Added BaseSchemaValidator and format-specific validators (DOCX, PPTX) plus RedliningValidator to check tracked changes, relationships, IDs, content-types, whitespace rules, and schema/XSD validation.
OOXML schemas — ISO/IEC 29500 (large set)
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/*.xsd
Added many DrawingML, chart, diagram, picture, spreadsheet/wordprocessing/presentation, math, shared types, relationship/reference and related XSDs introducing numerous public complex/simple types and elements.
OOXML schemas — ECMA / Microsoft / VML / OPC
skills/docx/ooxml/schemas/ecma/fouth-edition/*.xsd, mce/mc.xsd, microsoft/*.xsd, vml-*.xsd
Added OPC content-types/core properties/relationships/digSig schemas and many Microsoft Word/VML/Presentation/Spreadsheet extension XSDs (Word 2010–2018/2020 fragments, comments/extensions, VML office schemas, etc.).
DOCX validation & packaging utilities added to package
skills/docx/ooxml/scripts/validation/*, skills/docx/ooxml/scripts/*
New validation package exports, schema-driven checks, and helpers used by validate and pack scripts.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant DocumentAPI as Document API
    participant XMLEditor
    participant Validators
    participant Pack as Pack/Zip

    User->>DocumentAPI: initialize(unpacked_dir, author)
    DocumentAPI->>XMLEditor: open("word/document.xml")
    User->>DocumentAPI: add_comment(start, end, text)
    DocumentAPI->>XMLEditor: locate nodes & insert w:commentRange / w:commentReference
    XMLEditor-->>DocumentAPI: updated XML parts
    DocumentAPI->>DocumentAPI: update comments.xml / commentsIds / commentsExtensible
    User->>DocumentAPI: save(destination, validate=True)
    DocumentAPI->>Validators: run Base + DOCX + Redlining
    Validators->>Validators: XML, namespaces, IDs, relationships, XSD, redlining diff
    alt all validators pass
        DocumentAPI->>Pack: condense XML & zip to .docx
        Pack-->>User: saved file
    else any validator fails
        Validators-->>User: validation errors (fail save)
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Areas requiring extra attention:

  • skills/docx/scripts/document.py — tracked-changes, multi-file comment sync, RSID/author propagation.
  • skills/docx/ooxml/scripts/validation/* — XSD integration, relationship ID checks, redlining diff logic.
  • skills/docx/scripts/utilities.py — SAX line-tracking parser, fragment parsing and namespace preservation.
  • Large XSD files under ISO-IEC29500-4_2016 and vml/* — correctness, inter-schema imports and target namespaces.
  • skills/ios-simulator-testing scripts — subprocess handling, simctl/parsing robustness.
  • create-skill-zips.sh — file selection, SKILL.md presence checks, ZIP creation error paths.

Poem

🐇
With schemas sprouting, fonts in rows,
I hop through docs where tracked-change grows.
I tuck a comment, pack a zip,
Audit pixels, launch an app — and skip.
Hooray — new skills to nuzzle, nibble, show!

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Title check ⚠️ Warning The PR title is a cryptic string of random characters and letters that provides no meaningful information about the changeset's purpose or main changes. Replace with a clear, descriptive title summarizing the main change, such as 'Add canvas design skill with OOXML schemas and document editing' or 'Expand skills and add DOCX/PPTX document manipulation capabilities'.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 21

🧹 Nitpick comments (17)
skills/competitive-ads-extractor/SKILL.md (1)

1-285: Add Prerequisites/Requirements and Limitations sections.

The documentation would benefit from explicitly stating what's needed to use this skill:

  • Prerequisites: Which ad libraries are supported (Facebook Ad Library, LinkedIn, TikTok, etc.), any required API keys, authentication setup, rate limits.
  • Limitations: Geographical restrictions, data freshness, supported date ranges, accuracy caveats, platform-specific constraints.

This helps set realistic expectations for users. The Legal & Ethical section is good, but a Limitations section (e.g., "Currently supports Facebook and LinkedIn; TikTok support coming soon") would improve clarity.

Consider adding these sections after the "When to Use This Skill" section:

## Prerequisites

- API access to supported ad libraries (Facebook Ad Library, LinkedIn Campaign Manager)
- Appropriate authentication credentials
- Rate limits: [specify if applicable]
- Geographic availability: [list any restrictions]

## Limitations

- Currently supports Facebook Ad Library and LinkedIn
- Data reflects only publicly available ads
- Screenshots and analysis are point-in-time snapshots
- No real-time engagement metrics available
create-skill-zips.sh (1)

17-45: Add pre-flight check for SKILLS_DIR.

While line 44 handles failure to cd into SKILLS_DIR, it would be clearer to validate the directory exists upfront before beginning ZIP creation.

Add an early validation check:

if [ ! -d "$SKILLS_DIR" ]; then
    echo "ERROR: SKILLS_DIR does not exist: $SKILLS_DIR" >&2
    exit 1
fi

This provides immediate, explicit feedback if the skills directory is misconfigured.

skills/file-organizer/SKILL.md (1)

33-33: Add language identifiers to all fenced code blocks for proper syntax highlighting.

Multiple code blocks lack language specification. This improves readability and enables syntax highlighting in rendered documentation. Most blocks appear to be shell commands/examples—specify these as bash or shell code blocks where appropriate.

For example, line 33 and other command-heavy sections should use:

-```
+```bash
 cd ~
-```
+```

Apply this consistently across the file for better documentation rendering.

Also applies to: 39-39, 43-43, 47-47, 53-53, 57-57, 61-61, 65-65, 178-178, 260-260, 328-328, 344-344, 361-361, 368-368, 374-374, 380-380, 386-386, 392-392

skills/canvas-design/SKILL.md (1)

23-23: Minor wordiness and hyphenation improvements.

Line 23: Replace "taken into account, but used" with a more concise phrasing:

- Some subtle input or instructions by the user that should be taken into account, but used as a foundation;
+ Some subtle input or instructions by the user that should inform, but not constrain,

Line 106: Add hyphen to form compound adjective:

- To create museum or magazine quality work,
+ To create museum or magazine-quality work,

These are minor style refinements that improve readability.

Also applies to: 106-106

skills/gmail-intelligence/SKILL.md (3)

54-54: Wrap bare URLs in markdown link syntax.

Lines 54, 193, 194 contain bare URLs that should be wrapped in markdown links for better rendering and accessibility:

- This skill works with:
- - **RUBE MCP**: Real Gmail access via Composio
+ This skill works with:
+ - **RUBE MCP**: [Real Gmail access via Composio](https://composio.dev)

Apply similar formatting to other bare URLs in the document. This improves document readability and provides proper link formatting.

Also applies to: 193-193, 194-194


61-61: Add language identifiers to fenced code blocks.

Lines 61, 66, 71 contain code blocks without language specification. These appear to be plain text/pseudo-code; specify the language or use generic formatting:

-```
+```text
 1. Use RUBE_SEARCH_TOOLS to find relevant Gmail tools
-```
+```

This enables proper syntax highlighting and document rendering consistency.

Also applies to: 66-66, 71-71


14-14: Minor text redundancy: simplify "Find specific details".

Line 14 uses redundant phrasing. Refactor to:

-   - Find specific details from client communications
+   - Extract details from client communications

This is a minor improvement for conciseness.

skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd (1)

11-18: Consider adding documentation annotations.

The schema lacks xsd:annotation and xsd:documentation elements. Adding documentation would improve maintainability and help developers understand the purpose of each element and attribute, especially for attributes like intelligentPlaceholder.

Example documentation structure:

<xsd:complexType name="CT_CommentExtensible">
  <xsd:annotation>
    <xsd:documentation>Defines an individual extensible comment with durable ID and optional metadata.</xsd:documentation>
  </xsd:annotation>
  <xsd:sequence>
    <xsd:element name="extLst" type="w16:CT_ExtensionList" minOccurs="0" maxOccurs="1"/>
  </xsd:sequence>
  <xsd:attribute name="durableId" type="w:ST_LongHexNumber" use="required">
    <xsd:annotation>
      <xsd:documentation>Unique identifier for the comment that persists across document versions.</xsd:documentation>
    </xsd:annotation>
  </xsd:attribute>
  <xsd:attribute name="dateUtc" type="w:ST_DateTime" use="optional">
    <xsd:annotation>
      <xsd:documentation>UTC timestamp when the comment was created or modified.</xsd:documentation>
    </xsd:annotation>
  </xsd:attribute>
  <xsd:attribute name="intelligentPlaceholder" type="s:ST_OnOff" use="optional">
    <xsd:annotation>
      <xsd:documentation>Indicates whether the comment uses intelligent placeholder features.</xsd:documentation>
    </xsd:annotation>
  </xsd:attribute>
</xsd:complexType>
skills/ios-simulator-testing/examples/login_flow.py (3)

26-32: Consider adding a timeout for resilience.

The command execution lacks a timeout parameter, which could cause the script to hang indefinitely if an external script becomes unresponsive.

Apply this diff to add a timeout:

-def run_command(cmd: list) -> tuple:
+def run_command(cmd: list, timeout: int = 30) -> tuple:
     """Run command and return (success, output)."""
     try:
-        result = subprocess.run(cmd, capture_output=True, text=True, check=True)
+        result = subprocess.run(cmd, capture_output=True, text=True, check=True, timeout=timeout)
         return (True, result.stdout.strip())
     except subprocess.CalledProcessError as e:
         return (False, e.stderr.strip())
+    except subprocess.TimeoutExpired:
+        return (False, f"Command timed out after {timeout} seconds")

Note: The S603 static analysis warning is a false positive in this context, as commands are constructed from known script paths.


64-64: Consider polling instead of fixed sleeps for more robust timing.

Fixed sleep calls (lines 64, 130, 154) make the script fragile - too short causes failures, too long wastes time. Polling the screen state until expected conditions appear would be more reliable.

Example polling approach:

def wait_for_screen(expected_text: str, timeout: int = 10) -> bool:
    """Poll screen until expected text appears."""
    start = time.time()
    while time.time() - start < timeout:
        success, output = run_command(["python", str(scripts_dir / "screen_mapper.py")])
        if success and expected_text in output:
            return True
        time.sleep(0.5)
    return False

Also applies to: 130-130, 154-154


168-176: Consider logging full exception details for better debugging.

The bare Exception catch at line 174 suppresses valuable traceback information. For an example script, showing the full error would help users debug issues.

Apply this diff to preserve error context:

     except Exception as e:
-        print(f"\n\nError: {e}")
+        import traceback
+        print(f"\n\nError: {e}")
+        print("\nTraceback:")
+        traceback.print_exc()
         sys.exit(1)
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd (1)

8-10: ST_RelationshipId is unrestricted - consider if pattern constraint is needed.

The ST_RelationshipId type is defined as an unrestricted string. Depending on the OOXML specification requirements, relationship IDs might need a more specific pattern (e.g., "rId" prefix followed by digits).

Verify that unrestricted strings are correct per the OOXML spec. If relationship IDs follow a pattern, consider adding it:

<xsd:simpleType name="ST_RelationshipId">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="rId[0-9]+"/>
  </xsd:restriction>
</xsd:simpleType>
skills/docx/ooxml.md (1)

276-283: Clarify the actual skills mount path for users.

The documentation uses /mnt/skills as an example path, with a note that users should check their context. Consider making this more explicit about how users should determine their actual skills path.

Consider adding a more specific example:

 # Search for document.py to locate the skill root
-# Note: /mnt/skills is used here as an example; check your context for the actual location
-find /mnt/skills -name "document.py" -path "*/docx/scripts/*" 2>/dev/null | head -1
+# Note: Replace /mnt/skills with your actual skills directory
+# Common locations: /mnt/skills, ./skills, /opt/skills
+find /mnt/skills -name "document.py" -path "*/docx/scripts/*" 2>/dev/null | head -1
 # Example output: /mnt/skills/docx/scripts/document.py
 # Skill root is: /mnt/skills/docx
skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd (1)

7-10: Consider updating Dublin Core schemas to current versions.

The 2003-04-02 Dublin Core XSD schemas are still publicly available and hosted at the referenced URLs, so immediate validation issues are unlikely. However, these schemas are marked as "previously recommended" and superseded by the 2008 QDC set, which is the current recommendation.

While external URL dependencies work today, consider:

  1. Updating to the current 2008 Dublin Core schemas for long-term stability
  2. If updating is not feasible, caching or bundling local copies to guard against future deprecation or URL changes
skills/docx/scripts/utilities.py (1)

69-72: Preserve the original XML encoding instead of assuming UTF-8

Right now we only differentiate between explicit encoding="ascii" and “everything else → UTF-8”. Several OOXML parts (themes, charts, custom XML) still ship with declarations such as UTF-16 or ISO-8859-1. Rewriting them as UTF-8 can introduce unnecessary binary diffs and, in the worst case, break downstream tooling that validates the part’s declared encoding. Please parse whatever encoding is declared and reuse it when serializing.

Apply this diff:

@@
-import html
+import html
+import re
@@
-        self.encoding = "ascii" if 'encoding="ascii"' in header else "utf-8"
+        match = re.search(r'encoding="([^"]+)"', header, flags=re.IGNORECASE)
+        self.encoding = match.group(1) if match else "utf-8"
skills/docx/ooxml/scripts/unpack.py (1)

10-12: Consider more user-friendly error messaging.

The assertion provides usage information but could be more helpful with a try-except pattern that allows for cleaner error handling.

Apply this diff for improved error handling:

-# Get command line arguments
-assert len(sys.argv) == 3, "Usage: python unpack.py <office_file> <output_dir>"
-input_file, output_dir = sys.argv[1], sys.argv[2]
+# Get command line arguments
+if len(sys.argv) != 3:
+    print("Usage: python unpack.py <office_file> <output_dir>", file=sys.stderr)
+    sys.exit(1)
+input_file, output_dir = sys.argv[1], sys.argv[2]
skills/docx/docx-js.md (1)

220-224: Use proper heading syntax instead of bold text.

Line 220 uses bold emphasis for what should be a heading. This affects document structure and accessibility.

Apply this diff:

-**IMPORTANT: Table Width & Borders**
+### IMPORTANT: Table Width & Borders
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b187e75 and e83049f.

⛔ Files ignored due to path filters (92)
  • skill-zips/brainstorming.zip is excluded by !**/*.zip
  • skill-zips/canvas-design.zip is excluded by !**/*.zip
  • skill-zips/competitive-ads-extractor.zip is excluded by !**/*.zip
  • skill-zips/condition-based-waiting.zip is excluded by !**/*.zip
  • skill-zips/defense-in-depth.zip is excluded by !**/*.zip
  • skill-zips/dispatching-parallel-agents.zip is excluded by !**/*.zip
  • skill-zips/docx.zip is excluded by !**/*.zip
  • skill-zips/executing-plans.zip is excluded by !**/*.zip
  • skill-zips/file-organizer.zip is excluded by !**/*.zip
  • skill-zips/finishing-a-development-branch.zip is excluded by !**/*.zip
  • skill-zips/gmail-intelligence.zip is excluded by !**/*.zip
  • skill-zips/image-enhancer.zip is excluded by !**/*.zip
  • skill-zips/ios-simulator-testing.zip is excluded by !**/*.zip
  • skill-zips/lead-research-assistant.zip is excluded by !**/*.zip
  • skill-zips/notebooklm.zip is excluded by !**/*.zip
  • skill-zips/notion-template-processor.zip is excluded by !**/*.zip
  • skill-zips/pdf.zip is excluded by !**/*.zip
  • skill-zips/playwright-browser-automation.zip is excluded by !**/*.zip
  • skill-zips/pptx.zip is excluded by !**/*.zip
  • skill-zips/prompt-engineer.zip is excluded by !**/*.zip
  • skill-zips/receiving-code-review.zip is excluded by !**/*.zip
  • skill-zips/requesting-code-review.zip is excluded by !**/*.zip
  • skill-zips/root-cause-tracing.zip is excluded by !**/*.zip
  • skill-zips/sharing-skills.zip is excluded by !**/*.zip
  • skill-zips/slack-gif-creator.zip is excluded by !**/*.zip
  • skill-zips/subagent-driven-development.zip is excluded by !**/*.zip
  • skill-zips/systematic-debugging.zip is excluded by !**/*.zip
  • skill-zips/test-driven-development.zip is excluded by !**/*.zip
  • skill-zips/testing-anti-patterns.zip is excluded by !**/*.zip
  • skill-zips/testing-skills-with-subagents.zip is excluded by !**/*.zip
  • skill-zips/theme-factory.zip is excluded by !**/*.zip
  • skill-zips/using-git-worktrees.zip is excluded by !**/*.zip
  • skill-zips/using-superpowers.zip is excluded by !**/*.zip
  • skill-zips/verification-before-completion.zip is excluded by !**/*.zip
  • skill-zips/video-downloader.zip is excluded by !**/*.zip
  • skill-zips/writing-plans.zip is excluded by !**/*.zip
  • skill-zips/writing-skills.zip is excluded by !**/*.zip
  • skill-zips/xlsx.zip is excluded by !**/*.zip
  • skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/DMMono-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Gloock-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Italiana-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Jura-Light.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Jura-Medium.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Lora-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Lora-Italic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Lora-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Outfit-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Outfit-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Tektur-Medium.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/Tektur-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf is excluded by !**/*.ttf
  • skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf is excluded by !**/*.ttf
📒 Files selected for processing (98)
  • .claude-plugin/plugin.json (1 hunks)
  • README.md (2 hunks)
  • create-skill-zips.sh (1 hunks)
  • skill-zips/README.md (1 hunks)
  • skills/canvas-design/LICENSE.txt (1 hunks)
  • skills/canvas-design/SKILL.md (1 hunks)
  • skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/Boldonse-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/DMMono-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/EricaOne-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/GeistMono-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/Gloock-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/Italiana-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/Jura-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/Lora-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/NationalPark-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/Outfit-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/Tektur-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/WorkSans-OFL.txt (1 hunks)
  • skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt (1 hunks)
  • skills/competitive-ads-extractor/SKILL.md (1 hunks)
  • skills/docx/LICENSE.txt (1 hunks)
  • skills/docx/SKILL.md (1 hunks)
  • skills/docx/docx-js.md (1 hunks)
  • skills/docx/ooxml.md (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd (1 hunks)
  • skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd (1 hunks)
  • skills/docx/ooxml/schemas/mce/mc.xsd (1 hunks)
  • skills/docx/ooxml/schemas/microsoft/wml-2010.xsd (1 hunks)
  • skills/docx/ooxml/schemas/microsoft/wml-2012.xsd (1 hunks)
  • skills/docx/ooxml/schemas/microsoft/wml-2018.xsd (1 hunks)
  • skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd (1 hunks)
  • skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd (1 hunks)
  • skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd (1 hunks)
  • skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd (1 hunks)
  • skills/docx/ooxml/scripts/pack.py (1 hunks)
  • skills/docx/ooxml/scripts/unpack.py (1 hunks)
  • skills/docx/ooxml/scripts/validate.py (1 hunks)
  • skills/docx/ooxml/scripts/validation/__init__.py (1 hunks)
  • skills/docx/ooxml/scripts/validation/base.py (1 hunks)
  • skills/docx/ooxml/scripts/validation/docx.py (1 hunks)
  • skills/docx/ooxml/scripts/validation/pptx.py (1 hunks)
  • skills/docx/ooxml/scripts/validation/redlining.py (1 hunks)
  • skills/docx/scripts/__init__.py (1 hunks)
  • skills/docx/scripts/document.py (1 hunks)
  • skills/docx/scripts/templates/comments.xml (1 hunks)
  • skills/docx/scripts/templates/commentsExtended.xml (1 hunks)
  • skills/docx/scripts/templates/commentsExtensible.xml (1 hunks)
  • skills/docx/scripts/templates/commentsIds.xml (1 hunks)
  • skills/docx/scripts/templates/people.xml (1 hunks)
  • skills/docx/scripts/utilities.py (1 hunks)
  • skills/file-organizer/SKILL.md (1 hunks)
  • skills/gmail-intelligence/SKILL.md (1 hunks)
  • skills/image-enhancer/SKILL.md (1 hunks)
  • skills/ios-simulator-testing/SKILL.md (1 hunks)
  • skills/ios-simulator-testing/examples/login_flow.py (1 hunks)
  • skills/ios-simulator-testing/scripts/accessibility_audit.py (1 hunks)
  • skills/ios-simulator-testing/scripts/app_launcher.py (1 hunks)
  • skills/ios-simulator-testing/scripts/app_state_capture.py (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (4)
skills/ios-simulator-testing/examples/login_flow.py (3)
skills/ios-simulator-testing/scripts/navigator.py (2)
  • description (86-89)
  • main (289-393)
skills/ios-simulator-testing/scripts/app_launcher.py (1)
  • main (220-308)
skills/ios-simulator-testing/scripts/screen_mapper.py (1)
  • main (248-278)
skills/ios-simulator-testing/scripts/accessibility_audit.py (1)
skills/ios-simulator-testing/scripts/common/idb_utils.py (2)
  • flatten_tree (71-116)
  • get_accessibility_tree (22-68)
skills/ios-simulator-testing/scripts/app_state_capture.py (1)
skills/ios-simulator-testing/scripts/common/idb_utils.py (2)
  • count_elements (119-143)
  • get_accessibility_tree (22-68)
skills/ios-simulator-testing/scripts/app_launcher.py (1)
skills/ios-simulator-testing/scripts/common/device_utils.py (1)
  • build_simctl_command (16-60)
🪛 LanguageTool
skill-zips/README.md

[style] ~97-~97: Consider shortening or rephrasing this to strengthen your wording.
Context: ...ed to regenerate these ZIP files (after making changes to skills): ```bash cd /home/user/superpo...

(MAKE_CHANGES)

skills/gmail-intelligence/SKILL.md

[style] ~14-~14: This phrase is redundant. Consider writing “details”.
Context: ...ex pick a black or wood bar?" - Find specific details from client communications - Search ...

(SPECIFIC_DETAILS)

skills/file-organizer/SKILL.md

[style] ~128-~128: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ...ent year/month - Previous years - Very old (archive candidates) 4. **Find Duplica...

(EN_WEAK_ADJECTIVE)

skills/docx/LICENSE.txt

[uncategorized] ~21-~21: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...nse, or transfer these materials to any third party - Make, offer to sell, sell, or import ...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

skills/canvas-design/SKILL.md

[style] ~23-~23: ‘taken into account’ might be wordy. Consider a shorter alternative.
Context: ...instructions by the user that should be taken into account, but used as a foundation; it should no...

(EN_WORDINESS_PREMIUM_TAKEN_INTO_ACCOUNT)


[grammar] ~106-~106: Use a hyphen to join words.
Context: ...r amateur. To create museum or magazine quality work, use the design philosophy ...

(QB_NEW_EN_HYPHEN)


[grammar] ~106-~106: Use a hyphen to join words.
Context: ...phy as the foundation. Create one single page, highly visual, design-forward PDF ...

(QB_NEW_EN_HYPHEN)

skills/docx/SKILL.md

[uncategorized] ~77-~77: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...lan comprehensive tracked changes using markdown before implementing them in OOXML. **CR...

(MARKDOWN_NNP)


[uncategorized] ~95-~95: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...n representation**: Convert document to markdown with tracked changes preserved: ```b...

(MARKDOWN_NNP)


[uncategorized] ~144-~144: Did you mean the formatting language “Markdown” (= proper noun)?
Context: ...ocument: - Convert final document to markdown: ```bash pandoc --track-chang...

(MARKDOWN_NNP)

skills/canvas-design/LICENSE.txt

[style] ~162-~162: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...ge, computer failure or malfunction, or any and all other commercial damages or losse...

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)

skills/ios-simulator-testing/SKILL.md

[style] ~379-~379: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ... pull to refresh ``` Use when: You need to navigate using gestures (scrolling list...

(REP_NEED_TO_VB)


[style] ~424-~424: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...ssed home button ``` Use when: You need to enter text or press buttons (including ...

(REP_NEED_TO_VB)


[style] ~468-~468: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...p (v1.0.0) ... ``` Use when: You need to control app lifecycle or manage app ins...

(REP_NEED_TO_VB)


[style] ~578-~578: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ... trees per step) ``` Use when: You need to document test execution with visual pro...

(REP_NEED_TO_VB)


[style] ~623-~623: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...(human-readable) ``` Use when: You need to capture the complete state for debuggin...

(REP_NEED_TO_VB)


[style] ~921-~921: Consider replacing ‘only’ with a different word to let your writing stand out.
Context: ...ll standard workflows. Raw tools should only be used for edge cases not covered: ``...

(ONLY_EXCLUSIVELY_STYLE)

🪛 markdownlint-cli2 (0.18.1)
skills/gmail-intelligence/SKILL.md

54-54: Bare URL used

(MD034, no-bare-urls)


61-61: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


66-66: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


71-71: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


193-193: Bare URL used

(MD034, no-bare-urls)


194-194: Bare URL used

(MD034, no-bare-urls)

skills/file-organizer/SKILL.md

33-33: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


39-39: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


43-43: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


47-47: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


53-53: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


57-57: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


61-61: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


65-65: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


178-178: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


260-260: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


328-328: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


344-344: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


361-361: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


368-368: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


374-374: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


380-380: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


386-386: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


392-392: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

skills/docx/docx-js.md

220-220: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)

skills/ios-simulator-testing/SKILL.md

157-157: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


162-162: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


175-175: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


251-251: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


296-296: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


338-338: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


373-373: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


418-418: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


459-459: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


490-490: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


529-529: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


570-570: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


598-598: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


613-613: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


646-646: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


756-756: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


811-811: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🪛 Ruff (0.14.3)
skills/ios-simulator-testing/examples/login_flow.py

29-29: subprocess call: check for execution of untrusted input

(S603)


174-174: Do not catch blind exception: Exception

(BLE001)

skills/docx/ooxml/scripts/validation/redlining.py

34-34: Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents

(S314)


59-61: try-except-pass detected, consider logging the exception

(S110)


59-59: Do not catch blind exception: Exception

(BLE001)


71-71: Do not catch blind exception: Exception

(BLE001)


86-86: Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents

(S314)


88-88: Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents

(S314)


153-153: subprocess call: check for execution of untrusted input

(S603)


154-163: Starting a process with a partial executable path

(S607)


185-185: subprocess call: check for execution of untrusted input

(S603)


186-194: Starting a process with a partial executable path

(S607)


211-213: try-except-pass detected, consider logging the exception

(S110)


211-211: Do not catch blind exception: Exception

(BLE001)


279-279: Avoid specifying long messages outside the exception class

(TRY003)

skills/docx/ooxml/scripts/pack.py

60-60: Avoid specifying long messages outside the exception class

(TRY003)


62-62: Avoid specifying long messages outside the exception class

(TRY003)


103-103: subprocess call: check for execution of untrusted input

(S603)


104-112: Starting a process with a partial executable path

(S607)


121-121: Consider moving this statement to an else block

(TRY300)


128-128: Do not catch blind exception: Exception

(BLE001)

skills/docx/scripts/__init__.py

1-1: The file is executable but no shebang is present

(EXE002)

skills/ios-simulator-testing/scripts/accessibility_audit.py

40-45: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


48-51: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


54-57: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


245-245: Do not catch blind exception: Exception

(BLE001)

skills/docx/ooxml/scripts/validation/base.py

17-38: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


42-42: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


45-67: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


85-85: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


88-104: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


140-140: Do not catch blind exception: Exception

(BLE001)


143-143: Use explicit conversion flag

Replace with conversion flag

(RUF010)


262-262: Do not catch blind exception: Exception

(BLE001)


359-359: Do not catch blind exception: Exception

(BLE001)


471-471: Do not catch blind exception: Exception

(BLE001)


604-605: try-except-continue detected, consider logging the exception

(S112)


604-604: Do not catch blind exception: Exception

(BLE001)


626-626: Do not catch blind exception: Exception

(BLE001)


728-728: Parenthesize a and b expressions when chaining and and or together, to make the precedence clear

Parenthesize the and subexpression

(RUF021)


866-866: Do not catch blind exception: Exception

(BLE001)


901-901: Unpacked variable is_valid is never used

Prefix it with an underscore or any other dummy variable pattern

(RUF059)


951-951: Avoid specifying long messages outside the exception class

(TRY003)

skills/ios-simulator-testing/scripts/app_state_capture.py

47-47: subprocess call: check for execution of untrusted input

(S603)


48-48: Consider moving this statement to an else block

(TRY300)


64-64: Do not catch blind exception: Exception

(BLE001)


97-97: subprocess call: check for execution of untrusted input

(S603)


131-131: subprocess call: check for execution of untrusted input

(S603)


148-148: Consider moving this statement to an else block

(TRY300)


286-286: Do not catch blind exception: Exception

(BLE001)

skills/docx/ooxml/scripts/unpack.py

28-28: Standard pseudo-random generators are not suitable for cryptographic purposes

(S311)

skills/docx/scripts/document.py

297-300: Avoid specifying long messages outside the exception class

(TRY003)


378-381: Avoid specifying long messages outside the exception class

(TRY003)


501-501: Avoid specifying long messages outside the exception class

(TRY003)


537-537: Avoid specifying long messages outside the exception class

(TRY003)


593-593: Avoid specifying long messages outside the exception class

(TRY003)


604-604: Standard pseudo-random generators are not suitable for cryptographic purposes

(S311)


609-609: Standard pseudo-random generators are not suitable for cryptographic purposes

(S311)


637-637: Avoid specifying long messages outside the exception class

(TRY003)


706-706: Avoid specifying long messages outside the exception class

(TRY003)


784-784: Avoid specifying long messages outside the exception class

(TRY003)


855-855: Avoid specifying long messages outside the exception class

(TRY003)


857-857: Avoid specifying long messages outside the exception class

(TRY003)


960-960: Unused method argument: path

(ARG002)


972-972: Unused method argument: path

(ARG002)


988-988: Unused method argument: path

(ARG002)


1069-1069: Unused method argument: author

(ARG002)


1069-1069: Unused method argument: initials

(ARG002)


1069-1069: Unused method argument: timestamp

(ARG002)


1187-1187: Avoid specifying long messages outside the exception class

(TRY003)

skills/ios-simulator-testing/scripts/app_launcher.py

44-44: subprocess call: check for execution of untrusted input

(S603)


53-53: Consider moving this statement to an else block

(TRY300)


70-70: subprocess call: check for execution of untrusted input

(S603)


71-71: Consider moving this statement to an else block

(TRY300)


88-88: subprocess call: check for execution of untrusted input

(S603)


89-89: Consider moving this statement to an else block

(TRY300)


106-106: subprocess call: check for execution of untrusted input

(S603)


107-107: Consider moving this statement to an else block

(TRY300)


124-124: subprocess call: check for execution of untrusted input

(S603)


125-125: Consider moving this statement to an else block

(TRY300)


139-139: subprocess call: check for execution of untrusted input

(S603)


146-146: subprocess call: check for execution of untrusted input

(S603)


175-175: Consider moving this statement to an else block

(TRY300)


193-193: subprocess call: check for execution of untrusted input

(S603)


196-196: Consider moving this statement to an else block

(TRY300)

skills/docx/ooxml/scripts/validation/docx.py

22-22: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


109-109: Do not catch blind exception: Exception

(BLE001)


158-158: Do not catch blind exception: Exception

(BLE001)


187-187: Do not catch blind exception: Exception

(BLE001)


211-211: Do not catch blind exception: Exception

(BLE001)


248-248: Do not catch blind exception: Exception

(BLE001)


274-274: Avoid specifying long messages outside the exception class

(TRY003)

skills/docx/scripts/utilities.py

67-67: Avoid specifying long messages outside the exception class

(TRY003)


175-175: Avoid specifying long messages outside the exception class

(TRY003)


177-180: Avoid specifying long messages outside the exception class

(TRY003)

skills/docx/ooxml/scripts/validation/pptx.py

19-26: Mutable class attributes should be annotated with typing.ClassVar

(RUF012)


106-106: Do not catch blind exception: Exception

(BLE001)


185-185: Do not catch blind exception: Exception

(BLE001)


228-228: Do not catch blind exception: Exception

(BLE001)


285-285: Do not catch blind exception: Exception

(BLE001)


297-297: Loop control variable slide_name not used within loop body

(B007)


315-315: Avoid specifying long messages outside the exception class

(TRY003)

Comment on lines +4 to +6
SKILLS_DIR="/home/user/superpowers/skills"
OUTPUT_DIR="/home/user/superpowers/skill-zips"

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Hardcoded paths prevent portability and CI/CD integration.

The script hardcodes absolute paths for SKILLS_DIR and OUTPUT_DIR tied to a specific development machine (/home/user/superpowers), making the script unusable in different environments, CI/CD pipelines, or by other team members.

Use environment variables with defaults to enable portability:

#!/bin/bash
SKILLS_DIR="${SKILLS_DIR:-./skills}"
OUTPUT_DIR="${OUTPUT_DIR:-./skill-zips}"

Alternatively, accept paths as command-line arguments:

#!/bin/bash
SKILLS_DIR="${1:-./ skills}"
OUTPUT_DIR="${2:-./skill-zips}"

This allows users to either set environment variables or pass arguments when invoking the script.

🤖 Prompt for AI Agents
In create-skill-zips.sh around lines 4 to 6 the SKILLS_DIR and OUTPUT_DIR are
hardcoded to a single developer's absolute paths which breaks portability and
CI; update the script to accept environment variables with sensible defaults or
command-line arguments (use parameter expansion to default to ./skills and
./skill-zips or read $1 and $2 with fallbacks) and ensure any downstream
references use those variables so the script can run in CI and on other
machines.

Comment on lines +1 to +42
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns="http://schemas.openxmlformats.org/package/2006/content-types"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://schemas.openxmlformats.org/package/2006/content-types"
elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all">

<xs:element name="Types" type="CT_Types"/>
<xs:element name="Default" type="CT_Default"/>
<xs:element name="Override" type="CT_Override"/>

<xs:complexType name="CT_Types">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="Default"/>
<xs:element ref="Override"/>
</xs:choice>
</xs:complexType>

<xs:complexType name="CT_Default">
<xs:attribute name="Extension" type="ST_Extension" use="required"/>
<xs:attribute name="ContentType" type="ST_ContentType" use="required"/>
</xs:complexType>

<xs:complexType name="CT_Override">
<xs:attribute name="ContentType" type="ST_ContentType" use="required"/>
<xs:attribute name="PartName" type="xs:anyURI" use="required"/>
</xs:complexType>

<xs:simpleType name="ST_ContentType">
<xs:restriction base="xs:string">
<xs:pattern
value="(((([\p{IsBasicLatin}-[\p{Cc}&#127;\(\)&lt;&gt;@,;:\\&quot;/\[\]\?=\{\}\s\t]])+))/((([\p{IsBasicLatin}-[\p{Cc}&#127;\(\)&lt;&gt;@,;:\\&quot;/\[\]\?=\{\}\s\t]])+))((\s+)*;(\s+)*(((([\p{IsBasicLatin}-[\p{Cc}&#127;\(\)&lt;&gt;@,;:\\&quot;/\[\]\?=\{\}\s\t]])+))=((([\p{IsBasicLatin}-[\p{Cc}&#127;\(\)&lt;&gt;@,;:\\&quot;/\[\]\?=\{\}\s\t]])+)|(&quot;(([\p{IsLatin-1Supplement}\p{IsBasicLatin}-[\p{Cc}&#127;&quot;\n\r]]|(\s+))|(\\[\p{IsBasicLatin}]))*&quot;))))*)"
/>
</xs:restriction>
</xs:simpleType>

<xs:simpleType name="ST_Extension">
<xs:restriction base="xs:string">
<xs:pattern
value="([!$&amp;'\(\)\*\+,:=]|(%[0-9a-fA-F][0-9a-fA-F])|[:@]|[a-zA-Z0-9\-_~])+"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Fix directory name typo: "fouth-edition" should be "fourth-edition".

The directory path contains "fouth-edition" which appears to be a typo for "fourth-edition". This typo affects multiple files in this PR.

Run this script to verify all affected files and check if this is intentional:

#!/bin/bash
# Find all files under the fouth-edition directory
echo "Files in fouth-edition directory:"
fd -t f . skills/docx/ooxml/schemas/ecma/fouth-edition 2>/dev/null

# Check if there's also a correctly spelled fourth-edition directory
echo -e "\nChecking for fourth-edition directory:"
fd -t d "fourth-edition" skills/docx/ooxml/schemas/ecma 2>/dev/null || echo "No fourth-edition directory found"

# Search for references to this path in code
echo -e "\nReferences to fouth-edition in code:"
rg -n "fouth-edition" --type py --type md 2>/dev/null || echo "No references found in Python/Markdown files"
🤖 Prompt for AI Agents
skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd lines 1-42:
the directory name "fouth-edition" is a typo and should be "fourth-edition";
rename the directory to "fourth-edition" (use git mv to preserve history), move
all contained files, and update any path references in the repo (search and
replace occurrences like "fouth-edition" → "fourth-edition" in code, docs, and
build scripts); after renaming, run the provided verification checks to ensure
no remaining references and confirm there is no intentional duplicate directory.

Comment on lines +1 to +9
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://schemas.openxmlformats.org/package/2006/digital-signature"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://schemas.openxmlformats.org/package/2006/digital-signature"
elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all">

<xsd:element name="SignatureTime" type="CT_SignatureTime"/>
<xsd:element name="RelationshipReference" type="CT_RelationshipReference"/>
<xsd:element name="RelationshipsGroupReference" type="CT_RelationshipsGroupReference"/>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Fix spelling error in file path.

The directory name contains a typo: fouth-edition should be fourth-edition. This spelling error could cause issues with documentation references, imports, or automated tooling that expects the correct spelling.

Rename the directory from:

skills/docx/ooxml/schemas/ecma/fouth-edition/

To:

skills/docx/ooxml/schemas/ecma/fourth-edition/
🤖 Prompt for AI Agents
In skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd around lines 1 to
9, the directory name contains a typo ("fouth-edition"); rename the directory to
"fourth-edition" and update any file paths/imports/references accordingly (move
the file to skills/docx/ooxml/schemas/ecma/fourth-edition/opc-digSig.xsd and
search/replace project references to use the corrected path).

Comment on lines +16 to +25
<xsd:complexType name="CT_Relationship">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="TargetMode" type="ST_TargetMode" use="optional"/>
<xsd:attribute name="Target" type="xsd:anyURI" use="required"/>
<xsd:attribute name="Type" type="xsd:anyURI" use="required"/>
<xsd:attribute name="Id" type="xsd:ID" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

CT_Relationship simpleContent may be incorrect.

The CT_Relationship complex type extends xsd:string for simpleContent (Lines 17-18), which allows text content inside <Relationship> elements. However, in the OPC specification, Relationship elements typically have no content—only attributes.

Verify against the OOXML specification. If Relationship elements should be empty, change to:

<xsd:complexType name="CT_Relationship">
  <xsd:attribute name="TargetMode" type="ST_TargetMode" use="optional"/>
  <xsd:attribute name="Target" type="xsd:anyURI" use="required"/>
  <xsd:attribute name="Type" type="xsd:anyURI" use="required"/>
  <xsd:attribute name="Id" type="xsd:ID" use="required"/>
</xsd:complexType>

Check the OPC specification to confirm:

OOXML OPC Relationship element schema definition content model
🤖 Prompt for AI Agents
In skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd around
lines 16 to 25, the CT_Relationship type currently uses xsd:simpleContent
extending xsd:string which allows element text content; change it to an empty
complexType with only the four attributes (TargetMode optional, Target required
anyURI, Type required anyURI, Id required xsd:ID) so Relationship elements are
empty with attributes only, and update/remove the simpleContent/extension nodes
accordingly; confirm against the OPC/OOXML relationship element definition and
adjust namespace/type references if needed.

Comment on lines +8 to +21
<xsd:complexType name="CT_PictureNonVisual">
<xsd:sequence>
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="CT_Picture">
<xsd:sequence minOccurs="1" maxOccurs="1">
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Restore optional extension and style elements for pictures.
CT_Picture and CT_PictureNonVisual in ISO/IEC 29500 include optional a:style and a:extLst children; leaving them out here will cause valid DOCX/DrawingML content (e.g., pictures with styles or extension data) to fail validation or round‑trip incorrectly. Please add the missing optional elements back.

Apply this diff:

   <xsd:complexType name="CT_PictureNonVisual">
     <xsd:sequence>
       <xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
       <xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
         maxOccurs="1"/>
+      <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
     </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="CT_Picture">
     <xsd:sequence minOccurs="1" maxOccurs="1">
       <xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
       <xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
       <xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
+      <xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
     </xsd:sequence>
   </xsd:complexType>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<xsd:complexType name="CT_PictureNonVisual">
<xsd:sequence>
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="CT_Picture">
<xsd:sequence minOccurs="1" maxOccurs="1">
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="CT_PictureNonVisual">
<xsd:sequence>
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
maxOccurs="1"/>
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="CT_Picture">
<xsd:sequence minOccurs="1" maxOccurs="1">
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
🤖 Prompt for AI Agents
In skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd around lines
8–21, CT_PictureNonVisual and CT_Picture are missing the optional a:style and
a:extLst children required by ISO/IEC 29500; add optional elements named a:style
(type a:CT_ShapeStyle) and a:extLst (type a:CT_OfficeArtExtensionList or the
schema's extLst type) to CT_PictureNonVisual (after cNvPicPr) and to CT_Picture
(after spPr) with minOccurs="0" so pictures with styles or extension data
validate and round‑trip correctly.

@@ -0,0 +1 @@
# Make scripts directory a package for relative imports in tests
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Remove executable permission from this file.

The static analysis correctly identifies that this file has executable permissions but no shebang. Since __init__.py files are imported rather than executed directly, the executable bit should be removed.

Run this command to fix:

#!/bin/bash
chmod -x skills/docx/scripts/__init__.py
🧰 Tools
🪛 Ruff (0.14.3)

1-1: The file is executable but no shebang is present

(EXE002)

🤖 Prompt for AI Agents
In skills/docx/scripts/__init__.py around line 1, this __init__.py has the
executable bit set but is not a script; remove the executable permission (e.g.
run chmod -x on that file) and commit the permission change so the file is no
longer executable.

Comment on lines +801 to +809
parent_start_elem, self._comment_range_start_xml(comment_id)
)
parent_ref_run = parent_ref_elem.parentNode
self._document.insert_after(
parent_ref_run, f'<w:commentRangeEnd w:id="{comment_id}"/>'
)
self._document.insert_after(
parent_ref_run, self._comment_ref_run_xml(comment_id)
)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Fix misplaced comment range markers in replies

Calling insert_after twice with parent_ref_run causes the reply’s <w:commentRangeEnd> to land after the new <w:commentReference> run, so the reply’s range now extends over the reference run itself. Word treats that as malformed markup and the highlight bleeds into the reference glyph instead of covering only the intended text. Insert the range end before the existing reference run and then append the reply’s reference after that newly inserted node to keep the order commentRangeEnd → commentReference, matching the required WordprocessingML structure.

-        self._document.insert_after(
-            parent_ref_run, f'<w:commentRangeEnd w:id="{comment_id}"/>'
-        )
-        self._document.insert_after(
-            parent_ref_run, self._comment_ref_run_xml(comment_id)
-        )
+        end_nodes = self._document.insert_before(
+            parent_ref_run, f'<w:commentRangeEnd w:id="{comment_id}"/>'
+        )
+        self._document.insert_after(
+            end_nodes[-1], self._comment_ref_run_xml(comment_id)
+        )

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In skills/docx/scripts/document.py around lines 801 to 809, the code currently
calls insert_after twice with the same parent_ref_run which causes the inserted
<w:commentRangeEnd> to end up after the new <w:commentReference>, producing
incorrect WordprocessingML order; change the sequence so you insert the
<w:commentRangeEnd> before the existing reference run (use insert_before or call
insert_after on the node's previous sibling) and then append/insert the reply’s
<w:commentReference> after that newly inserted range-end node, ensuring the
final node order is commentRangeEnd → commentReference.

"--find-type",
"SecureTextField",
"--enter-text",
"password123",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Avoid hardcoding credentials in example code.

The hardcoded password demonstrates poor security practices. Even in example code, it's better to show secure patterns like reading from environment variables or configuration files.

Apply this diff to use an environment variable instead:

+import os
+
 # ... (in main function)
         [
             "python",
             str(scripts_dir / "navigator.py"),
             "--find-type",
             "SecureTextField",
             "--enter-text",
-            "password123",
+            os.environ.get("TEST_PASSWORD", "password123"),
         ]

Then update the docstring to mention setting TEST_PASSWORD environment variable.

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +96 to +123
# Check warnings (skip if critical issues found)
if not issues:
for rule_name, rule_func in self.WARNING_RULES.items():
if rule_func(element):
issues.append(
Issue(
severity="warning",
rule=rule_name,
element_type=element.get("type", "Unknown"),
issue=self._get_issue_description(rule_name),
fix=self._get_fix_suggestion(rule_name),
)
)

# Check info level (only if verbose or no other issues)
if not issues:
for rule_name, rule_func in self.INFO_RULES.items():
if rule_func(element):
issues.append(
Issue(
severity="info",
rule=rule_name,
element_type=element.get("type", "Unknown"),
issue=self._get_issue_description(rule_name),
fix=self._get_fix_suggestion(rule_name),
)
)

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Wire up the small-touch-target warning.

The “small touch target” rule is never evaluated: _is_small_target is unused, WARNING_RULES lacks the entry, yet docs and descriptions promise this warning. As a result, undersized controls slip through the audit. Hook the helper into the warning branch so we actually emit the advertised issue.

         # Check warnings (skip if critical issues found)
         if not issues:
             for rule_name, rule_func in self.WARNING_RULES.items():
                 if rule_func(element):
                     issues.append(
                         Issue(
                             severity="warning",
                             rule=rule_name,
                             element_type=element.get("type", "Unknown"),
                             issue=self._get_issue_description(rule_name),
                             fix=self._get_fix_suggestion(rule_name),
                         )
                     )
+
+            if element.get("type") in {"Button", "Link", "TextField", "Switch"} and self._is_small_target(
+                element
+            ):
+                issues.append(
+                    Issue(
+                        severity="warning",
+                        rule="small_touch_target",
+                        element_type=element.get("type", "Unknown"),
+                        issue=self._get_issue_description("small_touch_target"),
+                        fix=self._get_fix_suggestion("small_touch_target"),
+                    )
+                )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Check warnings (skip if critical issues found)
if not issues:
for rule_name, rule_func in self.WARNING_RULES.items():
if rule_func(element):
issues.append(
Issue(
severity="warning",
rule=rule_name,
element_type=element.get("type", "Unknown"),
issue=self._get_issue_description(rule_name),
fix=self._get_fix_suggestion(rule_name),
)
)
# Check info level (only if verbose or no other issues)
if not issues:
for rule_name, rule_func in self.INFO_RULES.items():
if rule_func(element):
issues.append(
Issue(
severity="info",
rule=rule_name,
element_type=element.get("type", "Unknown"),
issue=self._get_issue_description(rule_name),
fix=self._get_fix_suggestion(rule_name),
)
)
# Check warnings (skip if critical issues found)
if not issues:
for rule_name, rule_func in self.WARNING_RULES.items():
if rule_func(element):
issues.append(
Issue(
severity="warning",
rule=rule_name,
element_type=element.get("type", "Unknown"),
issue=self._get_issue_description(rule_name),
fix=self._get_fix_suggestion(rule_name),
)
)
if element.get("type") in {"Button", "Link", "TextField", "Switch"} and self._is_small_target(
element
):
issues.append(
Issue(
severity="warning",
rule="small_touch_target",
element_type=element.get("type", "Unknown"),
issue=self._get_issue_description("small_touch_target"),
fix=self._get_fix_suggestion("small_touch_target"),
)
)
# Check info level (only if verbose or no other issues)
if not issues:
for rule_name, rule_func in self.INFO_RULES.items():
if rule_func(element):
issues.append(
Issue(
severity="info",
rule=rule_name,
element_type=element.get("type", "Unknown"),
issue=self._get_issue_description(rule_name),
fix=self._get_fix_suggestion(rule_name),
)
)
🤖 Prompt for AI Agents
In skills/ios-simulator-testing/scripts/accessibility_audit.py around lines 96
to 123, the small-touch-target rule is implemented but never added to
WARNING_RULES so it is never evaluated; add an entry mapping the advertised rule
name (e.g., "small-touch-target" or the existing rule key used elsewhere) to the
helper (self._is_small_target) inside the WARNING_RULES dict so the warning
branch will call it, and ensure the helper method name matches (or make it a
static/function reference) and is importable in this class so the warning is
actually emitted when the helper returns True.

Comment on lines +124 to +150
cmd = ["xcrun", "simctl", "list", "devices", "booted"]

if self.udid:
# Specific device info
cmd = ["xcrun", "simctl", "list", "devices"]

try:
result = subprocess.run(cmd, capture_output=True, text=True, check=True)

# Parse output for device info (simplified)
lines = result.stdout.split("\n")
device_info = {}

for line in lines:
if "iPhone" in line or "iPad" in line:
# Extract device name and state
parts = line.strip().split("(")
if parts:
device_info["name"] = parts[0].strip()
if len(parts) > 2:
device_info["udid"] = parts[1].replace(")", "").strip()
device_info["state"] = parts[2].replace(")", "").strip()
break

return device_info
except subprocess.CalledProcessError:
return {}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Fix UDID-specific device detection bug.

With a UDID supplied, capture_device_info() still breaks on the first iPhone/iPad line emitted by simctl, so it reports whichever simulator happens to appear first rather than the requested device. In a multi-simulator environment this produces the wrong UDID/state and misleads downstream tooling. Filter the listing for the requested UDID before parsing.

     cmd = ["xcrun", "simctl", "list", "devices", "booted"]
 
     if self.udid:
-        # Specific device info
-        cmd = ["xcrun", "simctl", "list", "devices"]
+        # Need full device list to locate the requested UDID
+        cmd = ["xcrun", "simctl", "list", "devices"]
 
     try:
         result = subprocess.run(cmd, capture_output=True, text=True, check=True)
 
         # Parse output for device info (simplified)
         lines = result.stdout.split("\n")
         device_info = {}
 
-        for line in lines:
-            if "iPhone" in line or "iPad" in line:
-                # Extract device name and state
-                parts = line.strip().split("(")
-                if parts:
-                    device_info["name"] = parts[0].strip()
-                    if len(parts) > 2:
-                        device_info["udid"] = parts[1].replace(")", "").strip()
-                        device_info["state"] = parts[2].replace(")", "").strip()
-                break
+        target_udid = self.udid
+        for line in lines:
+            if target_udid and target_udid not in line:
+                continue
+            if "iPhone" not in line and "iPad" not in line:
+                continue
+            parts = line.strip().split("(")
+            if parts:
+                device_info["name"] = parts[0].strip()
+                if len(parts) > 1:
+                    device_info["udid"] = parts[1].replace(")", "").strip()
+                if len(parts) > 2:
+                    device_info["state"] = parts[2].replace(")", "").strip()
+                break

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Ruff (0.14.3)

131-131: subprocess call: check for execution of untrusted input

(S603)


148-148: Consider moving this statement to an else block

(TRY300)

🤖 Prompt for AI Agents
In skills/ios-simulator-testing/scripts/app_state_capture.py around lines
124-150, the function still selects the first iPhone/iPad line even when
self.udid is set; change the parsing so that when self.udid is provided you
first filter the simctl output lines to the one that contains that UDID (match
the UDID string, e.g. the hex in parentheses), then parse that specific line to
extract name, udid and state; if no matching line is found return {} as now.
Keep using the existing cmd selection (booted vs all), but ensure you search for
the UDID before the generic "iPhone"/"iPad" logic and only fall back to the
first device when self.udid is not set.

claude and others added 2 commits November 3, 2025 17:22
- Move ZIP from skills/ to skill-zips/ (correct location)
- Add landing-page-expert skill folder to skills/
- Fix ZIP structure (was mnt/skills/user/*, now landing-page-expert/*)

The skill includes:
- Landing page expertise from multiple frameworks
- Alex Hormozi, Russell Brunson, Caleb Ralston frameworks
- Selection engine for choosing optimal approach
- Framework combination strategies
Updated terminology for email search tools and improved clarity.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (6)
skills/gmail-intelligence/SKILL.md (6)

6-44: Minor redundancy in line 14.

Line 14 contains a redundant phrase. Consider simplifying "Find specific details" to "Find details" for conciseness.

-   - Find specific details from client communications
+   - Find details from client communications

49-49: Bare URL should be wrapped in markdown link syntax.

Line 49 contains a bare email address that should be formatted as a markdown link or code block to comply with markdown standards.

-**Email**: info@mtlcraftcocktails.com
+**Email**: `info@mtlcraftcocktails.com`

68-73: Add language identifier to fenced code block.

Line 68 starts a fenced code block without a language specifier. This improves syntax highlighting and readability.

-```
+```plaintext
 1. Use SEARCH_TOOLS to find relevant Gmail tools

96-104: Add language identifier to fenced code block.

Line 96 starts a fenced code block without a language specifier.

-```
+```plaintext
 Lead: [Name]

114-120: Add language identifier to fenced code block.

Line 114 starts a fenced code block without a language specifier.

-```
+```plaintext
 1. Analyze the incoming email context

210-227: Add language identifiers to fenced code blocks and fix bare URLs.

Lines 210 and 218 contain fenced code blocks without language specifiers. Additionally, line 210 references email addresses and identifiers that should be evaluated for whether they need formatting adjustments.

-1. Use RUBE_SEARCH_TOOLS → GMAIL_SEARCH_PEOPLE for "Alex Curtis"
+1. Use RUBE_SEARCH_TOOLS → GMAIL_SEARCH_PEOPLE for `Alex Curtis`
 2. Find email addresses: alexandercurtis@icloud.com, alexandercurtis@me.com
 3. Use GMAIL_FETCH_EMAILS with query: `from:alexandercurtis (bar OR black OR wood)`
 4. Analyze email content for bar color mention
 5. Extract: "black bar with light wood top" from August 24-25 emails
 6. Store in Mem0: "Alex Curtis - October 18 wedding - black bar with wood top"
 7. Return confident answer with source citations

 **Response**:
-```
+```plaintext
 Alex Curtis chose the BLACK bar with light wood top for his October 18, 2025 wedding.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e83049f and 378a35b.

⛔ Files ignored due to path filters (1)
  • skill-zips/landing-page-expert.zip is excluded by !**/*.zip
📒 Files selected for processing (1)
  • skills/gmail-intelligence/SKILL.md (1 hunks)
🧰 Additional context used
🪛 LanguageTool
skills/gmail-intelligence/SKILL.md

[style] ~14-~14: This phrase is redundant. Consider writing “details”.
Context: ...ex pick a black or wood bar?" - Find specific details from client communications - Search ...

(SPECIFIC_DETAILS)

🪛 markdownlint-cli2 (0.18.1)
skills/gmail-intelligence/SKILL.md

49-49: Bare URL used

(MD034, no-bare-urls)


68-68: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


96-96: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


114-114: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


210-210: Bare URL used

(MD034, no-bare-urls)


210-210: Bare URL used

(MD034, no-bare-urls)


218-218: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (1)
skills/gmail-intelligence/SKILL.md (1)

1-4: Frontmatter looks good.

The YAML metadata is properly structured and aligns with the skill documentation standards.

Comment on lines +193 to +202
This SKILL.md provides core instructions (~5k tokens). Additional detailed references load as needed:

- `references/lead-scoring.md` - Detailed scoring algorithm
- `references/brand-voice.md` - Complete style guide
- `references/email-templates.md` - Response templates
- `references/pricing-packages.md` - Full pricing structure
- `references/business-queries.md` - BI report templates
- `references/cocktail-menu.md` - Complete drink menu and recipes

Load these files when specific tasks require their detailed information.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Verify that referenced external files exist.

This section declares progressive disclosure dependencies on multiple reference files (references/lead-scoring.md, references/brand-voice.md, etc.). Ensure these files are included in the PR or repository.


🏁 Script executed:

#!/bin/bash
# Description: Verify that all referenced external files exist in the repository

# Expected reference files from the SKILL.md
EXPECTED_FILES=(
  "skills/gmail-intelligence/references/lead-scoring.md"
  "skills/gmail-intelligence/references/brand-voice.md"
  "skills/gmail-intelligence/references/email-templates.md"
  "skills/gmail-intelligence/references/pricing-packages.md"
  "skills/gmail-intelligence/references/business-queries.md"
  "skills/gmail-intelligence/references/cocktail-menu.md"
)

echo "Checking for required reference files..."
for file in "${EXPECTED_FILES[@]}"; do
  if [ -f "$file" ]; then
    echo "✓ Found: $file"
  else
    echo "✗ Missing: $file"
  fi
done

Length of output: 435


All referenced files in the references/ directory are missing.

The SKILL.md declares dependencies on 6 reference files (lead-scoring.md, brand-voice.md, email-templates.md, pricing-packages.md, business-queries.md, cocktail-menu.md), but none of these files exist in the repository. This breaks the progressive disclosure pattern described in lines 193-202. Either create these files or remove the references and update the documentation accordingly.

🤖 Prompt for AI Agents
In skills/gmail-intelligence/SKILL.md around lines 193 to 202 the document
references six files in references/ (lead-scoring.md, brand-voice.md,
email-templates.md, pricing-packages.md, business-queries.md, cocktail-menu.md)
that do not exist, breaking the progressive disclosure pattern; fix by either
creating those six reference files under skills/gmail-intelligence/references/
with the referenced contents (placeholders acceptable but must match filenames
and include the detailed sections called out) or remove the references from
SKILL.md and update the text to reflect the actual documentation available,
ensuring internal links are valid and the progressive disclosure statement is
corrected.

@obra obra closed this Nov 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants