diff --git a/.github/workflows/code-conventions-analyzer.lock.yml b/.github/workflows/code-conventions-analyzer.lock.yml index 34af7cecf..7fc97eb8b 100644 --- a/.github/workflows/code-conventions-analyzer.lock.yml +++ b/.github/workflows/code-conventions-analyzer.lock.yml @@ -13,13 +13,15 @@ # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ # -# This file was automatically generated by gh-aw (v0.37.32). DO NOT EDIT. +# This file was automatically generated by gh-aw (v0.38.5). DO NOT EDIT. # # To update this file, edit the corresponding .md file and run: # gh aw compile # For more information: https://github.com/githubnext/gh-aw/blob/main/.github/aw/github-agentic-workflows.md # # Analyzes Z3 codebase for consistent coding conventions and opportunities to use modern C++ features +# +# frontmatter-hash: aa3f5994d03e35fe32cff22f50920bae5835f544c8e8d5d20c87240cb723be38 name: "Code Conventions Analyzer" "on": @@ -44,7 +46,7 @@ jobs: comment_repo: "" steps: - name: Setup Scripts - uses: githubnext/gh-aw/actions/setup@v0.37.32 + uses: githubnext/gh-aw/actions/setup@v0.38.5 with: destination: /opt/gh-aw/actions - name: Check workflow file timestamps @@ -81,7 +83,7 @@ jobs: secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} steps: - name: Setup Scripts - uses: githubnext/gh-aw/actions/setup@v0.37.32 + uses: githubnext/gh-aw/actions/setup@v0.38.5 with: destination: /opt/gh-aw/actions - name: Checkout repository @@ -96,11 +98,12 @@ jobs: - name: Restore cache-memory file share data uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: - key: memory-${{ github.workflow }}-${{ github.run_id }} + key: conventions-cache-${{ github.workflow }}-${{ github.run_id }} path: /tmp/gh-aw/cache-memory restore-keys: | - memory-${{ github.workflow }}- - memory- + conventions-cache-${{ github.workflow }}- + conventions-cache- + conventions- - name: Configure Git credentials env: REPO_NAME: ${{ github.repository }} @@ -131,7 +134,7 @@ jobs: env: COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.395 + run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.399 - name: Install awf binary run: bash /opt/gh-aw/actions/install_awf_binary.sh v0.11.2 - name: Determine automatic lockdown mode for GitHub MCP server @@ -490,8 +493,8 @@ jobs: engine_name: "GitHub Copilot CLI", model: process.env.GH_AW_MODEL_AGENT_COPILOT || "", version: "", - agent_version: "0.0.395", - cli_version: "v0.37.32", + agent_version: "0.0.399", + cli_version: "v0.38.5", workflow_name: "Code Conventions Analyzer", experimental: false, supports_tools_allowlist: true, @@ -596,1039 +599,7 @@ jobs: PROMPT_EOF cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT" - # Code Conventions Analyzer - - You are an expert C++ code quality analyst specializing in the Z3 theorem prover codebase. Your mission is to examine the codebase for consistent coding conventions and identify opportunities to use modern C++ features (C++17, C++20) that can simplify and improve the code. - - ## Your Task - - **PRIMARY FOCUS: Create Issues for initializer_list Refactoring** - - Your primary task is to identify and implement refactorings that use `std::initializer_list` instead of array pointer + size parameters: - - 1. **Find array + size parameter patterns** - Functions taking `(unsigned sz, T* args)` or similar - 2. **Implement the refactoring** - Replace with `std::initializer_list` for cleaner APIs - 3. **Create issues** - Automatically create an issue with your changes for initializer_list improvements - - **Focus Areas for initializer_list Refactoring:** - - Functions with `unsigned sz/size/num, T* const* args` parameter pairs - - Call sites that create temporary arrays of constant length just to pass to these functions - - Internal APIs where changing the signature is safe and beneficial - - Functions where the size is always small and known at compile time - - **Example refactoring:** - ```cpp - // Before: Array + size parameters - R foo(unsigned sz, T const* args) { - for (unsigned i = 0; i < sz; ++i) { - use(args[i]); - } - } - - // Call site before: - T args1[2] = {1, 2}; - foo(2, args1); - - // After: Using initializer_list - R foo(std::initializer_list const& args) { - for (auto const& arg : args) { - use(arg); - } - } - - // Call site after: - foo({1, 2}); - ``` - - **Additional Task:** - Additionally, conduct analysis of other coding conventions and modern C++ opportunities for discussion (not immediate implementation) - - - ## Workflow for initializer_list Refactoring (PRIMARY) - - ### Step A: Find initializer_list Refactoring Opportunities - - 1. **Search for common patterns** that should use `std::initializer_list`: - ```bash - # Functions with unsigned + pointer parameter pairs (generic pattern) - grep pattern: "unsigned.*(sz|size|num|n).*\*" glob: "src/**/*.h" - - # Specific patterns like mk_ functions with sz + args - grep pattern: "mk_[a-z_]+\(unsigned.*\*" glob: "src/**/*.h" - - # Function declarations with sz/size/num + pointer (more specific, matches both single and double pointers) - grep pattern: "\\(unsigned (sz|size|num|n)[^,)]*,\\s*\\w+\\s*\\*(\\s*const)?\\s*\\*?" glob: "src/**/*.h" - ``` - - 2. **Analyze candidates** for refactoring: - - Use `view` to examine the function implementation - - Check call sites to see if they use temporary arrays - - Verify that the function is internal (not part of public C API) - - Ensure the array size is typically small and known at compile time - - Confirm that changing to initializer_list would simplify call sites - - 3. **Select 1-2 high-value targets** per run: - - Prefer internal helper functions over widely-used APIs - - Choose functions where call sites create temporary arrays - - Focus on functions that would benefit from simpler call syntax - - ### Step B: Implement the Refactoring - - For each selected function: - - 1. **Update the function signature** in header file: - ```cpp - // Before: - R foo(unsigned sz, T const* args); - // or - R foo(unsigned sz, T* const* args); - - // After: - R foo(std::initializer_list const& args); - ``` - - 2. **Update the function implementation**: - ```cpp - // Before: - R foo(unsigned sz, T const* args) { - for (unsigned i = 0; i < sz; ++i) { - process(args[i]); - } - } - - // After: - R foo(std::initializer_list const& args) { - for (auto const& arg : args) { - process(arg); - } - } - // Or access size with args.size() if needed - ``` - - 3. **Update all call sites** to use the new API: - ```cpp - // Before: - T args1[2] = {1, 2}; - foo(2, args1); - - // After: - foo({1, 2}); - ``` - - 4. **Add necessary includes**: - - Add `#include ` to header file if not already present - - 5. **Verify the changes**: - - Use `grep` to find any remaining call sites with the old pattern - - Check that the refactoring is complete - - Ensure no compilation errors would occur - - ### Step C: Create the Issue - - Use the `output.create-issue` tool to create an issue with: - - **Title**: "Refactor [function_name] to use std::initializer_list" - - **Description**: - - Explain what was changed - - Why initializer_list is better (cleaner call sites, type safety) - - List all modified files - - Note any caveats or considerations - - **Example issue description:** - ```markdown - # Refactor to use std::initializer_list - - This PR refactors the following functions to use `std::initializer_list` instead of array pointer + size parameters: - - - `mk_and(unsigned sz, expr* const* args)` in `src/ast/some_file.cpp` - - `mk_or(unsigned sz, expr* const* args)` in `src/ast/another_file.cpp` - - ## Benefits: - - Cleaner call sites: `mk_and({a, b, c})` instead of creating temporary arrays - - Type safety: Size is implicit, no mismatch possible - - Modern C++ idiom (std::initializer_list is C++11) - - Compile-time size verification - - ## Changes: - - Updated function signatures to take `std::initializer_list const&` - - Modified implementations to use range-based for loops or `.size()` - - Updated all call sites to use brace-initialization - - Added `#include ` where needed - - ## Testing: - - No functional changes to logic - - All existing call sites updated - - ## Considerations: - - Only applied to internal functions where call sites typically use small, fixed-size arrays - - Public C API functions were not modified to maintain compatibility - ``` - - ### Step D: Create Discussion for Other Findings - - If you identify other code quality issues, create a **discussion** with those findings. - - ## Step 1: Initialize or Resume Progress (Cache Memory) - - **Check your cache memory for:** - - List of code quality issues previously identified - - Current progress through the codebase analysis - - Any recommendations or work items from previous runs - - **Critical - Re-verify All Cached Issues:** - - Before including any previously cached issue in your report, you **MUST**: - - 1. **Re-verify each cached issue** against the current codebase - 2. **Check if the issue has been resolved** since the last run: - - Use `grep`, `glob`, `view`, or `bash` to inspect the relevant code - - Check git history with `git log` to see if the files were updated - - Verify that the pattern or issue still exists - 3. **Categorize each cached issue** as: - - ✅ **RESOLVED**: Code has been updated and issue no longer exists - - 🔄 **IN PROGRESS**: Partial fixes have been applied - - ❌ **UNRESOLVED**: Issue still exists unchanged - 4. **Remove resolved issues** from your cache and report - 5. **Update partially resolved issues** with current state - - **Important:** If this is your first run or memory is empty, initialize a new tracking structure. Focus on systematic coverage of the codebase over multiple runs rather than attempting to analyze everything at once. - - ## Analysis Areas - - ### 1. Coding Convention Consistency - - Examine the codebase for consistency in: - - - **Naming conventions**: Variables, functions, classes, namespaces - - Check consistency of `snake_case` vs `camelCase` vs `PascalCase` - - Examine member variable naming (e.g., `m_` prefix usage) - - Look at constant naming conventions - - - **Code formatting**: Alignment with `.clang-format` configuration - - Indentation (should be 4 spaces) - - Line length (max 120 characters) - - Brace placement - - Spacing around operators - - - **Documentation style**: Header comments, function documentation - - Copyright headers consistency - - Function/method documentation patterns - - Inline comment style - - - **Include patterns**: Header inclusion order and style - - System headers vs local headers - - Include guard vs `#pragma once` usage - - Forward declaration usage - - - **Error handling patterns**: Exceptions vs return codes - - Consistency in error reporting mechanisms - - Use of assertions and debug macros - - ### 2. Modern C++ Feature Opportunities - - Z3 uses C++20 (as specified in `.clang-format`). Look for opportunities to use: - - **C++11/14 features:** - - `auto` for type deduction (where it improves readability) - - Range-based for loops instead of iterator loops - - `nullptr` instead of `NULL` or `0` - - `override` and `final` keywords for virtual functions - - Smart pointers (`unique_ptr`) instead of raw pointers - - Move semantics and `std::move` - - Scoped enums (`enum class`) instead of plain enums - - `constexpr` for compile-time constants - - Delegating constructors - - In-class member initializers - - **C++17 features:** - - `if constexpr` for compile-time conditionals - - `std::string_view` for string parameters - - Fold expressions for variadic templates - - `[[nodiscard]]` and `[[maybe_unused]]` attributes - - **C++20 features:** - - Concepts for template constraints (where appropriate) - - `std::span` for array views (especially for array pointer + size parameters) - - Three-way comparison operator (`<=>`) - - Ranges library - - Coroutines (if beneficial) - - `std::format` for string formatting (replace stringstream for exceptions) - - ### 3. Common Library Function Usage - - Look for patterns where Z3 could better leverage standard library features: - - Custom implementations that duplicate `` functions - - Manual memory management that could use RAII - - Custom container implementations vs standard containers - - String manipulation that could use modern string APIs - - Use `std::clamp` to truncate values to min/max instead of manual comparisons - - ### 4. Z3-Specific Code Quality Improvements - - Identify opportunities specific to Z3's architecture and coding patterns: - - **Constructor/Destructor Optimization:** - - **Empty constructors**: Truly empty constructors that should use `= default` - - Distinguish between completely empty constructors (can use `= default`) - - Constructors with member initializers (may still be candidates for improvement) - - Constructors that only initialize members to default values - - **Empty destructors**: Trivial destructors that can be removed or use `= default` - - Destructors with empty body `~Class() {}` - - Non-virtual destructors that don't need to be explicitly defined - - Virtual destructors (keep explicit even if empty for polymorphic classes), - but remove empty overridden destructors since those are implicit - - **Non-virtual destructors**: Analyze consistency and correctness - - Classes with virtual functions but non-virtual destructors (potential issue) - - Base classes without virtual destructors (check if inheritance is intended) - - Non-virtual destructors missing `noexcept` (should be added) - - Leaf classes with unnecessary virtual destructors (minor overhead) - - Missing `noexcept` on non-default constructors and destructors - - Opportunities to use compiler-generated special members (`= default`, `= delete`) - - **Implementation Pattern Improvements:** - - `m_imp` (implementation pointer) pattern in classes used only within one file - - These should use anonymous namespace for implementation classes instead - - Look for classes only exported through builder/factory functions - - Examples: simplifiers, transformers, local utility classes - - **Memory Layout Optimization:** - - Classes that can be made POD (Plain Old Data) - - Field reordering to reduce padding and shrink class size - - Use `static_assert` and `sizeof` to verify size improvements - - Group fields by size (larger types first) for optimal packing - - **AST and Expression Optimization:** - - Redundant AST creation calls (rebuilding same expression multiple times) - - Opportunities to cache and reuse AST node references - - Use of temporaries instead of repeated construction - - **Nested API calls with non-deterministic argument evaluation** - - Detect expressions where multiple arguments to an API call are themselves API calls - - C++ does **not guarantee evaluation order of function arguments**, which can lead to: - - Platform-dependent performance differences - - Unintended allocation or reference-counting patterns - - Hard-to-reproduce profiling results - - Prefer storing intermediate results in temporaries to enforce evaluation order and improve clarity - - Example: - ```cpp - // Avoid - auto* v = m.mk_and(m.mk_or(a, b), m.mk_or(c, d)); - - // Prefer - auto* o1 = m.mk_or(a, b); - auto* o2 = m.mk_or(c, d); - auto* v = m.mk_and(o1, o2); - ``` - - **Hash Table Operations:** - - Double hash lookups (check existence + insert/retrieve) - - Opportunities to use single-lookup patterns supported by Z3's hash tables - - Example: `insert_if_not_there` or equivalent patterns - - **Smart Pointer Usage:** - - Manual deallocation of custom allocator pointers - - Opportunities to introduce custom smart pointers for automatic cleanup - - Wrapping allocator-managed objects in RAII wrappers - - **Move Semantics:** - - Places where `std::move` is needed but missing - - Incorrect usage of `std::move` (moving from const references, etc.) - - Return value optimization opportunities being blocked - - **Exception String Construction:** - - Using `stringstream` to build exception messages - - Unnecessary string copies when raising exceptions - - Replace with `std::format` for cleaner, more efficient code - - Constant arguments should be merged into the string - - Use `std::formatter` to avoid creating temporary strings - - **Bitfield Opportunities:** - - Structs with multiple boolean flags - - Small integer fields that could use bitfields - - Size reduction potential through bitfield packing - - **Array Parameter Patterns:** - - Functions taking pointer + size parameters - - Replace with `std::span` for type-safe array views - - Improves API safety and expressiveness - - **Increment Operators:** - - Usage of postfix `i++` where prefix `++i` would suffice - - Places where the result value isn't used - - Micro-optimization for iterator-heavy code - - **Exception Control Flow:** - - Using exceptions for normal control flow - - Alternatives: `std::expected`, error codes - - Performance and clarity improvements - - **Inefficient Stream Output:** - - Using strings to output single characters, such as << "X", - as well as using multiple consecutive constant strings such as << "Foo" << "Bar". - - Alternatives: << 'X' and << "Foo" "Bar" - - Performance improvement and binary size reduction - - ## Analysis Methodology - - 1. **Sample key directories** in the codebase: - - `src/util/` - Core utilities and data structures - - `src/ast/` - Abstract syntax tree implementations - - `src/smt/` - SMT solver core - - `src/sat/` - SAT solver components - - `src/api/` - Public API surface - - `src/tactic/` - Tactics and simplifiers (good for m_imp pattern analysis) - - Use `glob` to find representative source files - - **Prioritize areas** not yet analyzed (check cache memory) - - 2. **Re-verify previously identified issues** (if any exist in cache): - - For each cached issue, check current code state - - Use `git log` to see recent changes to relevant files - - Verify with `grep`, `glob`, or `view` that the issue still exists - - Mark issues as resolved, in-progress, or unresolved - - Only include unresolved issues in the new report - - 3. **Use code search tools** effectively: - - `grep` with patterns to find specific code constructs - - `glob` to identify file groups for analysis - - `view` to examine specific files in detail - - `bash` with git commands to check file history - - If compile_commands.json can be generated with clang, and clang-tidy - is available, run a targeted checkset on the selected files: - - modernize-use-nullptr - - modernize-use-override - - modernize-loop-convert (review carefully) - - bugprone-* (selected high-signal checks) - - performance-* (selected) - - 4. **Identify patterns** by examining multiple files: - - Look at 10-15 representative files per major area - - Note common patterns vs inconsistencies - - Check both header (.h) and implementation (.cpp) files - - Use `sizeof` and field alignment to analyze struct sizes - - 5. **Quantify findings**: - - Count occurrences of specific patterns - - Identify which areas are most affected - - Prioritize findings by impact and prevalence - - Measure potential size savings for memory layout optimizations - - ## Deliverables - - ### PRIMARY: Issues for Code Refactoring - - When you implement refactorings (initializer_list), create issues using `output.create-issue` with: - - Clear title indicating what was refactored - - Description of changes and benefits - - List of modified files and functions - - ### SECONDARY: Detailed Analysis Discussion - - PROMPT_EOF - cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT" - For other code quality findings, create a comprehensive discussion with your findings structured as follows: - - ### Discussion Title - "Code Conventions Analysis - [Date] - [Key Finding Summary]" - - ### Discussion Body Structure - - ```markdown - # Code Conventions Analysis Report - - **Analysis Date**: [Current Date] - **Files Examined**: ~[number] files across key directories - - ## Executive Summary - - [Brief overview of key findings - 2-3 sentences] - - ## Progress Tracking Summary - - **This section tracks work items across multiple runs:** - - ### Previously Identified Issues - Status Update - - **✅ RESOLVED Issues** (since last run): - - [List issues from cache that have been resolved, with brief description] - - [Include file references and what changed] - - [Note: Only include if re-verification confirms resolution] - - If none: "No previously identified issues have been resolved since the last run" - - **🔄 IN PROGRESS Issues** (partial fixes applied): - - [List issues where some improvements have been made but work remains] - - [Show what's been done and what's left] - - If none: "No issues are currently in progress" - - **❌ UNRESOLVED Issues** (still present): - - [Brief list of issues that remain from previous runs] - - [Will be detailed in sections below] - - If none or first run: "This is the first analysis run" or "All previous issues resolved" - - ### New Issues Identified in This Run - - [Count of new issues found in this analysis] - - ## 1. Coding Convention Consistency Findings - - ### 1.1 Naming Conventions - - **Current State**: [What you observed] - - **Inconsistencies Found**: [List specific examples with file:line references] - - **Status**: [New / Previously Identified - Unresolved] - - **Recommendation**: [Suggested standard to adopt] - - ### 1.2 Code Formatting - - **Alignment with .clang-format**: [Assessment] - - **Common Deviations**: [List patterns that deviate from style guide] - - **Status**: [New / Previously Identified - Unresolved] - - **Files Needing Attention**: [List specific files or patterns] - - ### 1.3 Documentation Style - - **Current Practices**: [Observed documentation patterns] - - **Inconsistencies**: [Examples of different documentation approaches] - - **Status**: [New / Previously Identified - Unresolved] - - **Recommendation**: [Suggested documentation standard] - - ### 1.4 Include Patterns - - **Header Guard Usage**: `#pragma once` vs traditional guards - - **Include Order**: [Observed patterns] - - **Status**: [New / Previously Identified - Unresolved] - - **Recommendations**: [Suggested improvements] - - ### 1.5 Error Handling - - **Current Approaches**: [Exception usage, return codes, assertions] - - **Consistency Assessment**: [Are patterns consistent across modules?] - - **Status**: [New / Previously Identified - Unresolved] - - **Recommendations**: [Suggested standards] - - ## 2. Modern C++ Feature Opportunities - - For each opportunity, provide: - - **Feature**: [Name of C++ feature] - - **Current Pattern**: [What's used now with examples] - - **Modern Alternative**: [How it could be improved] - - **Impact**: [Benefits: readability, safety, performance] - - **Example Locations**: [File:line references] - - **Status**: [New / Previously Identified - Unresolved] - - **Estimated Effort**: [Low/Medium/High] - - ### 2.1 C++11/14 Features - - #### Opportunity: [Feature Name] - - **Current**: `[code example]` in `src/path/file.cpp:123` - - **Modern**: `[improved code example]` - - **Benefit**: [Why this is better] - - **Prevalence**: Found in [number] locations - - **Status**: [New / Previously Identified - Unresolved] - - [Repeat for each opportunity] - - ### 2.2 C++17 Features - - [Same structure as above] - - ### 2.3 C++20 Features - - [Same structure as above] - - ## 3. Standard Library Usage Opportunities - - ### 3.1 Algorithm Usage - - **Custom Implementations**: [Examples of reinvented algorithms] - - **Standard Alternatives**: [Which std algorithms could be used] - - ### 3.2 Container Patterns - - **Current**: [Custom containers or patterns] - - **Standard**: [Standard library alternatives] - - ### 3.3 Memory Management - - **Manual Patterns**: [Raw pointers, manual new/delete] - - **RAII Opportunities**: [Where smart pointers could help] - - ### 3.4 Value Clamping - - **Current**: [Manual min/max comparisons] - - **Modern**: [`std::clamp` usage opportunities] - - ## 4. Z3-Specific Code Quality Opportunities - - ### 4.1 Constructor/Destructor Optimization - - #### 4.1.1 Empty Constructor Analysis - - **Truly Empty Constructors**: Constructors with completely empty bodies - - Count: [Number of `ClassName() {}` patterns] - - Recommendation: Replace with `= default` or remove if compiler can generate - - Examples: [File:line references] - - **Constructors with Only Member Initializers**: Constructors that could use in-class initializers - - Pattern: `ClassName() : m_member(value) {}` - - Recommendation: Move initialization to class member declaration if appropriate - - Examples: [File:line references] - - **Default Value Constructors**: Constructors that only set members to default values - - Pattern: Constructor setting pointers to nullptr, ints to 0, bools to false - - Recommendation: Use in-class member initializers and `= default` - - Examples: [File:line references] - - #### 4.1.2 Empty Destructor Analysis - - **Non-Virtual Empty Destructors**: Destructors with empty bodies in non-polymorphic classes - - Count: [Number of `~ClassName() {}` patterns without virtual] - - Recommendation: Remove or use `= default` to reduce binary size - - Examples: [File:line references] - - **Virtual Empty Destructors**: Empty virtual destructors in base classes - - Count: [Number found] - - Recommendation: Keep explicit (required for polymorphism), but ensure `= default` or add comment - - Examples: [File:line references] - - #### 4.1.3 Non-Virtual Destructor Safety Analysis - - **Classes with Virtual Methods but Non-Virtual Destructors**: Potential polymorphism issues - - Pattern: Class has virtual methods but destructor is not virtual - - Risk: If used polymorphically, may cause undefined behavior - - Count: [Number of classes] - - Examples: [File:line references with class hierarchy info] - - **Base Classes without Virtual Destructors**: Classes that might be inherited from - - Check: Does class have derived classes in codebase? - - Recommendation: Add virtual destructor if inheritance is intended, or mark class `final` - - Examples: [File:line references] - - **Leaf Classes with Unnecessary Virtual Destructors**: Final classes with virtual destructors - - Pattern: Class marked `final` but has `virtual ~ClassName()` - - Recommendation: Remove `virtual` keyword (minor optimization) - - Examples: [File:line references] - - #### 4.1.4 Missing noexcept Analysis - - **Non-Default Constructors without noexcept**: Constructors that don't throw - - Pattern: Explicit constructors without `noexcept` specification - - Recommendation: Add `noexcept` if constructor doesn't throw - - Count: [Number found] - - Examples: [File:line references] - - **Non-Virtual Destructors without noexcept**: Destructors should be noexcept by default - - Pattern: Non-virtual destructors without explicit `noexcept` - - Recommendation: Add explicit `noexcept` for clarity (or rely on implicit) - - Note: Destructors are implicitly noexcept, but explicit is clearer - - Count: [Number found] - - Examples: [File:line references] - - **Virtual Destructors without noexcept**: Virtual destructors that should be noexcept - - Pattern: `virtual ~ClassName()` without `noexcept` - - Recommendation: Add `noexcept` for exception safety guarantees - - Count: [Number found] - - Examples: [File:line references] - - #### 4.1.5 Compiler-Generated Special Members - - **Classes with Explicit Rule of 3/5**: Classes that define some but not all special members - - Rule of 5: Constructor, Destructor, Copy Constructor, Copy Assignment, Move Constructor, Move Assignment - - Recommendation: Either define all or use `= default`/`= delete` appropriately - - Examples: [File:line references] - - **Impact**: [Code size reduction potential, compile time improvements] - - ### 4.2 Implementation Pattern (m_imp) Analysis - - **Current Usage**: [Files using m_imp pattern for internal-only classes] - - **Opportunity**: [Classes that could use anonymous namespace instead] - - **Criteria**: Classes only exported through builder/factory functions - - **Examples**: [Specific simplifiers, transformers, utility classes] - - ### 4.3 Memory Layout Optimization - - **POD Candidates**: [Classes that can be made POD] - - **Field Reordering**: [Classes with padding that can be reduced] - - **Size Analysis**: [Use static_assert + sizeof results] - - **Bitfield Opportunities**: [Structs with bool flags or small integers] - - **Estimated Savings**: [Total size reduction across codebase] - - ### 4.4 AST Creation Efficiency and Determinism - - **Redundant Creation**: [Examples of rebuilding same expression multiple times] - - **Temporary Usage**: [Places where temporaries could be cached and order of creation determinized] - - **Impact**: [Performance improvement potential and determinism across platforms] - - ### 4.5 Hash Table Operation Optimization - - **Double Lookups**: [Check existence + insert/get patterns] - - **Single Lookup Pattern**: [How to use Z3's hash table APIs efficiently] - - **Examples**: [Specific files and patterns] - - **Performance Impact**: [Lookup reduction potential] - - ### 4.6 Custom Smart Pointer Opportunities - - **Manual Deallocation**: [Code manually calling custom allocator free] - - **RAII Wrapper Needed**: [Where custom smart pointer would help] - - **Simplification**: [Code that would be cleaner with auto cleanup] - - ### 4.7 Move Semantics Analysis - - **Missing std::move**: [Returns/assignments that should use move] - - **Incorrect std::move**: [Move from const, unnecessary moves] - - **Return Value Optimization**: [Places where RVO is blocked] - - ### 4.8 Exception String Construction - - **Current**: [stringstream usage for building exception messages] - - **Modern**: [std::format and std::formater opportunities] - - **String Copies**: [Unnecessary copies when raising exceptions] - - **Examples**: [Specific exception construction sites] - - ### 4.9 Array Parameter Modernization (std::span) - - **Current**: [Pointer + size parameter pairs for runtime-sized arrays] - - **Modern**: [std::span usage opportunities] - - **Type Safety**: [How span improves API safety] - - **Examples**: [Function signatures to update] - - ### 4.10 Array Parameter Modernization (std::initializer_list) - **IMPLEMENT AS ISSUE** - - **This is the PRIMARY focus area - implement these changes directly:** - - - **Current Pattern**: Functions with `unsigned sz, T* args` or `unsigned sz, T* const* args` parameters - - **Modern Pattern**: Use `std::initializer_list` for functions called with compile-time constant arrays - - **Benefits**: - - Cleaner call sites: `foo({1, 2, 3})` instead of creating temporary arrays - - No size/pointer mismatch possible - - Type safety with implicit size - - More readable and concise - - **Action**: Find and refactor array + size parameter patterns: - 1. Search for functions with `unsigned sz/size/num` + pointer parameters - 2. Identify functions where call sites use temporary arrays of constant size - 3. Refactor to use `std::initializer_list const&` - 4. Create an issue with changes - - **Example Pattern**: - ```cpp - // Before: Array + size parameters - R foo(unsigned sz, T const* args) { - for (unsigned i = 0; i < sz; ++i) { - process(args[i]); - } - } - - // Call site before: - T args1[2] = {1, 2}; - foo(2, args1); - - // After: Using initializer_list - R foo(std::initializer_list const& args) { - for (auto const& arg : args) { - process(arg); - } - } - - // Call site after: - foo({1, 2}); - ``` - - **Search Patterns**: Look for: - - Function signatures with `unsigned sz/size/num/n` followed by pointer parameter - - Common Z3 patterns like `mk_and(unsigned sz, expr* const* args)` - - Internal helper functions (not public C API) - - Functions where typical call sites use small, fixed arrays - - **Candidates**: Functions that: - - Are called with temporary arrays created at call site - - Have small, compile-time known array sizes - - Are internal APIs (not part of public C interface) - - Would benefit from simpler call syntax - - **Output**: Issue with refactored code - - **Note**: Only apply to internal C++ APIs, not to public C API functions that need C compatibility - - ### 4.11 Increment Operator Patterns - - **Postfix Usage**: [Count of i++ where result is unused] - - **Prefix Preference**: [Places to use ++i instead] - - **Iterator Loops**: [Heavy iterator usage areas] - - ### 4.12 Exception Control Flow - - **Current Usage**: [Exceptions used for normal control flow] - - **Modern Alternatives**: [std::expected or error codes] - - **Performance**: [Impact of exception-based control flow] - - **Refactoring Opportunities**: [Specific patterns to replace] - - ### 4.13 Inefficient Stream Output - - **Current Usage**: [string stream output operator used for single characters] - - **Modern Alternatives**: [use char output operator] - - **Performance**: [Reduce code size and improve performance] - - **Refactoring Opportunities**: [<< "X"] - - ## 5. Priority Recommendations - - Ranked list of improvements by impact and effort: - - 1. **[Recommendation Title]** - [Impact: High/Medium/Low] - [Effort: High/Medium/Low] - - Description: [What to do] - - Rationale: [Why this matters] - - Affected Areas: [Where to apply] - - [Continue ranking...] - - ## 6. Sample Refactoring Examples - - Provide 3-5 concrete examples of recommended refactorings: - - ### Example 1: [Title] - **Location**: `src/path/file.cpp:123-145` - - **Current Code**: - \`\`\`cpp - [Show current implementation] - \`\`\` - - **Modernized Code**: - \`\`\`cpp - [Show improved implementation] - \`\`\` - - **Benefits**: [List improvements] - - [Repeat for other examples] - - ## 7. Next Steps - - - [ ] Review and prioritize these recommendations - - [ ] Create focused issues for high-priority items - - [ ] Consider updating coding standards documentation - - [ ] Plan incremental refactoring efforts - - [ ] Consider running automated refactoring tools (e.g., clang-tidy) - - ## Appendix: Analysis Statistics - - - **Total files examined**: [number] - - **Source directories covered**: [list] - - **Lines of code reviewed**: ~[estimate] - - **Pattern occurrences counted**: [key patterns with counts] - - **Issues resolved since last run**: [number] - - **New issues identified**: [number] - - **Total unresolved issues**: [number] - ``` - - ## Step 2: Update Cache Memory After Analysis - - After completing your analysis and creating the discussion, **update your cache memory** with: - - 1. **Remove resolved issues** from the cache: - - Delete any issues that have been verified as resolved - - Do not carry forward stale information - - 2. **Store only unresolved issues** for next run: - - Each issue should include: - - Description of the issue - - File locations (paths and line numbers if applicable) - - Pattern or code example - - Recommendation for fix - - Date last verified - - 3. **Track analysis progress**: - - Which directories/areas have been analyzed - - Which analysis categories have been covered - - Percentage of codebase examined - - Next areas to focus on - - 4. **Store summary statistics**: - - Total issues identified (cumulative) - - Total issues resolved - - Current unresolved count - - Analysis run count - - **Critical:** Keep your cache clean and current. The cache should only contain: - - Unresolved issues verified in the current run - - Areas not yet analyzed - - Progress tracking information - - Do NOT perpetuate resolved issues in the cache. Always verify before storing. - - ## Important Guidelines - - - **Track progress across runs**: Use cache memory to maintain state between runs - - **Always re-verify cached issues**: Check that previously identified issues still exist before reporting them - - **Report resolved work items**: Acknowledge when issues have been fixed to show progress - - **Be thorough but focused**: Examine a representative sample, not every file - - **Provide specific examples**: Always include file paths and line numbers - - **Balance idealism with pragmatism**: Consider the effort required for changes - - **Respect existing patterns**: Z3 has evolved over time; some patterns exist for good reasons - - **Focus on high-impact changes**: Prioritize improvements that enhance: - - Code maintainability - - Type safety - - Readability - - Performance (where measurable) - - Binary size (constructor/destructor removal, memory layout) - - Memory efficiency (POD classes, field reordering, bitfields) - - **Be constructive**: Frame findings as opportunities, not criticisms - - **Quantify when possible**: Use numbers to show prevalence of patterns - - **Consider backward compatibility**: Z3 is a mature project with many users - PROMPT_EOF - cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT" - - **Measure size improvements**: Use `static_assert` and `sizeof` to verify memory layout optimizations - - **Prioritize safety**: Smart pointers and `std::span` improve type safety - - **Consider performance**: Hash table optimizations and AST caching have measurable impact - - **Keep cache current**: Remove resolved issues from cache, only store verified unresolved items - - ## Code Search Examples - - **Find raw pointer usage:** - ``` - grep pattern: "new [A-Za-z_]" glob: "src/**/*.cpp" - ``` - - **Find NULL usage (should be nullptr):** - ``` - grep pattern: "== NULL|!= NULL| NULL;" glob: "src/**/*.{cpp,h}" - ``` - - **Find traditional for loops that could be range-based:** - ``` - grep pattern: "for.*::iterator" glob: "src/**/*.cpp" - ``` - - **Find manual memory management:** - ``` - grep pattern: "delete |delete\[\]" glob: "src/**/*.cpp" - ``` - - **Find enum (non-class) declarations:** - ``` - grep pattern: "^[ ]*enum [^c]" glob: "src/**/*.h" - ``` - - **Find empty/trivial constructors and destructors:** - ``` - # Empty constructors in implementation files - grep pattern: "[A-Za-z_]+::[A-Za-z_]+\(\)\s*\{\s*\}" glob: "src/**/*.cpp" - - # Empty constructors in header files - grep pattern: "[A-Za-z_]+\(\)\s*\{\s*\}" glob: "src/**/*.h" - - # Empty destructors in implementation files - grep pattern: "[A-Za-z_]+::~[A-Za-z_]+\(\)\s*\{\s*\}" glob: "src/**/*.cpp" - - # Empty destructors in header files - grep pattern: "~[A-Za-z_]+\(\)\s*\{\s*\}" glob: "src/**/*.h" - - # Constructors with only member initializer lists (candidates for in-class init) - grep pattern: "[A-Za-z_]+\(\)\s*:\s*[a-z_]+\([^)]*\)\s*\{\s*\}" glob: "src/**/*.cpp" - - # Virtual destructors (to distinguish from non-virtual) - grep pattern: "virtual\s+~[A-Za-z_]+" glob: "src/**/*.h" - ``` - - **Find constructors/destructors without noexcept:** - ``` - # Non-virtual destructors without noexcept in headers - grep pattern: "~[A-Za-z_]+\(\)(?!.*noexcept)(?!.*virtual)" glob: "src/**/*.h" - - # Virtual destructors without noexcept - grep pattern: "virtual\s+~[A-Za-z_]+\(\)(?!.*noexcept)" glob: "src/**/*.h" - - # Explicit constructors without noexcept - grep pattern: "explicit\s+[A-Za-z_]+\([^)]*\)(?!.*noexcept)" glob: "src/**/*.h" - - # Non-default constructors without noexcept - grep pattern: "[A-Za-z_]+\([^)]+\)(?!.*noexcept)(?!.*=\s*default)" glob: "src/**/*.h" - ``` - - **Find potential non-virtual destructor safety issues:** - ``` - # Classes with virtual functions (candidates to check destructor) - grep pattern: "class\s+[A-Za-z_]+.*\{.*virtual\s+" glob: "src/**/*.h" - - # Classes marked final (can have non-virtual destructors) - grep pattern: "class\s+[A-Za-z_]+.*final" glob: "src/**/*.h" - - # Base classes that might need virtual destructors - grep pattern: "class\s+[A-Za-z_]+\s*:\s*public" glob: "src/**/*.h" - - # Non-virtual destructors in classes with virtual methods - grep pattern: "class.*\{.*virtual.*~[A-Za-z_]+\(\)(?!.*virtual)" multiline: true glob: "src/**/*.h" - ``` - - **Find m_imp pattern usage:** - ``` - grep pattern: "m_imp|m_impl" glob: "src/**/*.{h,cpp}" - grep pattern: "class.*_imp[^a-z]" glob: "src/**/*.cpp" - ``` - - **Find potential POD struct candidates:** - ``` - grep pattern: "struct [A-Za-z_]+ \{" glob: "src/**/*.h" - ``` - - **Find potential bitfield opportunities (multiple bools):** - ``` - grep pattern: "bool [a-z_]+;.*bool [a-z_]+;" glob: "src/**/*.h" - ``` - - **Find redundant AST creation:** - ``` - grep pattern: "mk_[a-z_]+\(.*mk_[a-z_]+\(" glob: "src/**/*.cpp" - ``` - - **Find double hash lookups:** - ``` - grep pattern: "contains\(.*\).*insert\(|find\(.*\).*insert\(" glob: "src/**/*.cpp" - ``` - - **Find manual deallocation:** - ``` - grep pattern: "dealloc\(|deallocate\(" glob: "src/**/*.cpp" - ``` - - **Find missing std::move in returns:** - ``` - grep pattern: "return [a-z_]+;" glob: "src/**/*.cpp" - ``` - - **Find functions returning null with output parameters:** - ``` - grep pattern: "return.*nullptr.*&" glob: "src/**/*.{h,cpp}" - grep pattern: "bool.*\(.*\*.*\)|bool.*\(.*&" glob: "src/**/*.h" - ``` - - **Find pointer + size parameters:** - ``` - grep pattern: "\([^,]+\*[^,]*,\s*size_t|, unsigned.*size\)" glob: "src/**/*.h" - ``` - - **Find array + size parameters (initializer_list opportunities):** - ``` - # Functions with unsigned sz/size/num + pointer parameter pairs (matches both single and double pointers) - grep pattern: "\\(unsigned (sz|size|num|n)[^,)]*,\\s*\\w+\\s*\\*(\\s*const)?\\s*\\*?" glob: "src/**/*.h" - - # Common Z3 patterns like mk_ functions - grep pattern: "mk_[a-z_]+\(unsigned.*\*" glob: "src/**/*.h" - - # Function declarations with size + pointer combinations (broader pattern) - grep pattern: "unsigned.*(sz|size|num|n).*\*" glob: "src/**/*.h" - - # Call sites creating temporary arrays - grep pattern: "\w+\s+\w+\[[0-9]+\]\s*=\s*\{.*\};" glob: "src/**/*.cpp" - ``` - - **Find postfix increment:** - ``` - grep pattern: "[a-z_]+\+\+\s*[;\)]" glob: "src/**/*.cpp" - ``` - - **Find std::clamp opportunities:** - ``` - grep pattern: "std::min\(.*std::max\(|std::max\(.*std::min\(" glob: "src/**/*.cpp" - grep pattern: "if.*<.*\{.*=|if.*>.*\{.*=" glob: "src/**/*.cpp" - ``` - - **Find exceptions used for control flow:** - ``` - grep pattern: "try.*\{.*for\(|try.*\{.*while\(" glob: "src/**/*.cpp" - grep pattern: "catch.*continue|catch.*break" glob: "src/**/*.cpp" - ``` - - **Find inefficient output string operations using constant strings:** - ``` - grep pattern: "<<\s*\".\"" glob: "src/**/*.cpp" - grep pattern: "<<\s*\".*\"\s*<<\s*\".*\"" glob: "src/**/*.cpp" - ``` - - ## Security and Safety - - - Never execute untrusted code - - Use `bash` only for safe operations (git, grep patterns) - - **For code refactoring (initializer_list)**: Use the `edit` tool to modify files directly - - **For other findings**: Create discussions only (no code modifications) - - All code changes will be reviewed through the issue process - - ## Output Requirements - - **Two types of outputs:** - - 1. **Issue** (for refactorings like initializer_list): - - Use `output.create-issue` to create an issue - - Include clear title and description - - List all modified files - - Explain the refactoring and its benefits - - 2. **Discussion** (for other code quality findings): - - Create exactly ONE comprehensive discussion with all findings - - Use the structured format above - - Include specific file references for all examples - - Provide actionable recommendations - - Previous discussions created by this workflow will be automatically closed (using `close-older-discussions: true`) - + {{#runtime-import workflows/code-conventions-analyzer.md}} PROMPT_EOF - name: Substitute placeholders uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 @@ -1707,9 +678,10 @@ jobs: timeout-minutes: 20 run: | set -o pipefail - GH_AW_TOOL_BINS=""; [ -n "$GOROOT" ] && GH_AW_TOOL_BINS="$GOROOT/bin:$GH_AW_TOOL_BINS"; [ -n "$JAVA_HOME" ] && GH_AW_TOOL_BINS="$JAVA_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$CARGO_HOME" ] && GH_AW_TOOL_BINS="$CARGO_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$GEM_HOME" ] && GH_AW_TOOL_BINS="$GEM_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$CONDA" ] && GH_AW_TOOL_BINS="$CONDA/bin:$GH_AW_TOOL_BINS"; [ -n "$PIPX_BIN_DIR" ] && GH_AW_TOOL_BINS="$PIPX_BIN_DIR:$GH_AW_TOOL_BINS"; [ -n "$SWIFT_PATH" ] && GH_AW_TOOL_BINS="$SWIFT_PATH:$GH_AW_TOOL_BINS"; [ -n "$DOTNET_ROOT" ] && GH_AW_TOOL_BINS="$DOTNET_ROOT:$GH_AW_TOOL_BINS"; export GH_AW_TOOL_BINS - sudo -E awf --env-all --env 'ANDROID_HOME=${ANDROID_HOME}' --env 'ANDROID_NDK=${ANDROID_NDK}' --env 'ANDROID_NDK_HOME=${ANDROID_NDK_HOME}' --env 'ANDROID_NDK_LATEST_HOME=${ANDROID_NDK_LATEST_HOME}' --env 'ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT}' --env 'ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}' --env 'AZURE_EXTENSION_DIR=${AZURE_EXTENSION_DIR}' --env 'CARGO_HOME=${CARGO_HOME}' --env 'CHROMEWEBDRIVER=${CHROMEWEBDRIVER}' --env 'CONDA=${CONDA}' --env 'DOTNET_ROOT=${DOTNET_ROOT}' --env 'EDGEWEBDRIVER=${EDGEWEBDRIVER}' --env 'GECKOWEBDRIVER=${GECKOWEBDRIVER}' --env 'GEM_HOME=${GEM_HOME}' --env 'GEM_PATH=${GEM_PATH}' --env 'GOPATH=${GOPATH}' --env 'GOROOT=${GOROOT}' --env 'HOMEBREW_CELLAR=${HOMEBREW_CELLAR}' --env 'HOMEBREW_PREFIX=${HOMEBREW_PREFIX}' --env 'HOMEBREW_REPOSITORY=${HOMEBREW_REPOSITORY}' --env 'JAVA_HOME=${JAVA_HOME}' --env 'JAVA_HOME_11_X64=${JAVA_HOME_11_X64}' --env 'JAVA_HOME_17_X64=${JAVA_HOME_17_X64}' --env 'JAVA_HOME_21_X64=${JAVA_HOME_21_X64}' --env 'JAVA_HOME_25_X64=${JAVA_HOME_25_X64}' --env 'JAVA_HOME_8_X64=${JAVA_HOME_8_X64}' --env 'NVM_DIR=${NVM_DIR}' --env 'PIPX_BIN_DIR=${PIPX_BIN_DIR}' --env 'PIPX_HOME=${PIPX_HOME}' --env 'RUSTUP_HOME=${RUSTUP_HOME}' --env 'SELENIUM_JAR_PATH=${SELENIUM_JAR_PATH}' --env 'SWIFT_PATH=${SWIFT_PATH}' --env 'VCPKG_INSTALLATION_ROOT=${VCPKG_INSTALLATION_ROOT}' --env 'GH_AW_TOOL_BINS=$GH_AW_TOOL_BINS' --container-workdir "${GITHUB_WORKSPACE}" --mount /tmp:/tmp:rw --mount "${GITHUB_WORKSPACE}:${GITHUB_WORKSPACE}:rw" --mount /usr/bin/cat:/usr/bin/cat:ro --mount /usr/bin/curl:/usr/bin/curl:ro --mount /usr/bin/date:/usr/bin/date:ro --mount /usr/bin/find:/usr/bin/find:ro --mount /usr/bin/gh:/usr/bin/gh:ro --mount /usr/bin/grep:/usr/bin/grep:ro --mount /usr/bin/jq:/usr/bin/jq:ro --mount /usr/bin/yq:/usr/bin/yq:ro --mount /usr/bin/cp:/usr/bin/cp:ro --mount /usr/bin/cut:/usr/bin/cut:ro --mount /usr/bin/diff:/usr/bin/diff:ro --mount /usr/bin/head:/usr/bin/head:ro --mount /usr/bin/ls:/usr/bin/ls:ro --mount /usr/bin/mkdir:/usr/bin/mkdir:ro --mount /usr/bin/rm:/usr/bin/rm:ro --mount /usr/bin/sed:/usr/bin/sed:ro --mount /usr/bin/sort:/usr/bin/sort:ro --mount /usr/bin/tail:/usr/bin/tail:ro --mount /usr/bin/wc:/usr/bin/wc:ro --mount /usr/bin/which:/usr/bin/which:ro --mount /usr/local/bin/copilot:/usr/local/bin/copilot:ro --mount /home/runner/.copilot:/home/runner/.copilot:rw --mount /opt/hostedtoolcache:/opt/hostedtoolcache:ro --mount /opt/gh-aw:/opt/gh-aw:ro --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --enable-host-access --image-tag 0.11.2 --agent-image act \ - -- 'export PATH="$GH_AW_TOOL_BINS$(find /opt/hostedtoolcache -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH" && /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --add-dir "${GITHUB_WORKSPACE}" --disable-builtin-mcps --allow-tool github --allow-tool safeoutputs --allow-tool '\''shell(cat)'\'' --allow-tool '\''shell(clang-format --version)'\'' --allow-tool '\''shell(date)'\'' --allow-tool '\''shell(echo)'\'' --allow-tool '\''shell(git diff:*)'\'' --allow-tool '\''shell(git log:*)'\'' --allow-tool '\''shell(git show:*)'\'' --allow-tool '\''shell(grep)'\'' --allow-tool '\''shell(head)'\'' --allow-tool '\''shell(ls)'\'' --allow-tool '\''shell(pwd)'\'' --allow-tool '\''shell(sort)'\'' --allow-tool '\''shell(tail)'\'' --allow-tool '\''shell(uniq)'\'' --allow-tool '\''shell(wc)'\'' --allow-tool '\''shell(yq)'\'' --allow-tool write --add-dir /tmp/gh-aw/cache-memory/ --allow-all-paths --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_COPILOT:+ --model "$GH_AW_MODEL_AGENT_COPILOT"}' \ + GH_AW_TOOL_BINS=""; command -v go >/dev/null 2>&1 && GH_AW_TOOL_BINS="$(go env GOROOT)/bin:$GH_AW_TOOL_BINS"; [ -n "$JAVA_HOME" ] && GH_AW_TOOL_BINS="$JAVA_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$CARGO_HOME" ] && GH_AW_TOOL_BINS="$CARGO_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$GEM_HOME" ] && GH_AW_TOOL_BINS="$GEM_HOME/bin:$GH_AW_TOOL_BINS"; [ -n "$CONDA" ] && GH_AW_TOOL_BINS="$CONDA/bin:$GH_AW_TOOL_BINS"; [ -n "$PIPX_BIN_DIR" ] && GH_AW_TOOL_BINS="$PIPX_BIN_DIR:$GH_AW_TOOL_BINS"; [ -n "$SWIFT_PATH" ] && GH_AW_TOOL_BINS="$SWIFT_PATH:$GH_AW_TOOL_BINS"; [ -n "$DOTNET_ROOT" ] && GH_AW_TOOL_BINS="$DOTNET_ROOT:$GH_AW_TOOL_BINS"; export GH_AW_TOOL_BINS + mkdir -p "$HOME/.cache" + sudo -E awf --env-all --env "ANDROID_HOME=${ANDROID_HOME}" --env "ANDROID_NDK=${ANDROID_NDK}" --env "ANDROID_NDK_HOME=${ANDROID_NDK_HOME}" --env "ANDROID_NDK_LATEST_HOME=${ANDROID_NDK_LATEST_HOME}" --env "ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT}" --env "ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}" --env "AZURE_EXTENSION_DIR=${AZURE_EXTENSION_DIR}" --env "CARGO_HOME=${CARGO_HOME}" --env "CHROMEWEBDRIVER=${CHROMEWEBDRIVER}" --env "CONDA=${CONDA}" --env "DOTNET_ROOT=${DOTNET_ROOT}" --env "EDGEWEBDRIVER=${EDGEWEBDRIVER}" --env "GECKOWEBDRIVER=${GECKOWEBDRIVER}" --env "GEM_HOME=${GEM_HOME}" --env "GEM_PATH=${GEM_PATH}" --env "GOPATH=${GOPATH}" --env "GOROOT=${GOROOT}" --env "HOMEBREW_CELLAR=${HOMEBREW_CELLAR}" --env "HOMEBREW_PREFIX=${HOMEBREW_PREFIX}" --env "HOMEBREW_REPOSITORY=${HOMEBREW_REPOSITORY}" --env "JAVA_HOME=${JAVA_HOME}" --env "JAVA_HOME_11_X64=${JAVA_HOME_11_X64}" --env "JAVA_HOME_17_X64=${JAVA_HOME_17_X64}" --env "JAVA_HOME_21_X64=${JAVA_HOME_21_X64}" --env "JAVA_HOME_25_X64=${JAVA_HOME_25_X64}" --env "JAVA_HOME_8_X64=${JAVA_HOME_8_X64}" --env "NVM_DIR=${NVM_DIR}" --env "PIPX_BIN_DIR=${PIPX_BIN_DIR}" --env "PIPX_HOME=${PIPX_HOME}" --env "RUSTUP_HOME=${RUSTUP_HOME}" --env "SELENIUM_JAR_PATH=${SELENIUM_JAR_PATH}" --env "SWIFT_PATH=${SWIFT_PATH}" --env "VCPKG_INSTALLATION_ROOT=${VCPKG_INSTALLATION_ROOT}" --env "GH_AW_TOOL_BINS=$GH_AW_TOOL_BINS" --container-workdir "${GITHUB_WORKSPACE}" --mount /tmp:/tmp:rw --mount "${HOME}/.cache:${HOME}/.cache:rw" --mount "${GITHUB_WORKSPACE}:${GITHUB_WORKSPACE}:rw" --mount /usr/bin/cat:/usr/bin/cat:ro --mount /usr/bin/curl:/usr/bin/curl:ro --mount /usr/bin/date:/usr/bin/date:ro --mount /usr/bin/find:/usr/bin/find:ro --mount /usr/bin/gh:/usr/bin/gh:ro --mount /usr/bin/grep:/usr/bin/grep:ro --mount /usr/bin/jq:/usr/bin/jq:ro --mount /usr/bin/yq:/usr/bin/yq:ro --mount /usr/bin/cp:/usr/bin/cp:ro --mount /usr/bin/cut:/usr/bin/cut:ro --mount /usr/bin/diff:/usr/bin/diff:ro --mount /usr/bin/head:/usr/bin/head:ro --mount /usr/bin/ls:/usr/bin/ls:ro --mount /usr/bin/mkdir:/usr/bin/mkdir:ro --mount /usr/bin/rm:/usr/bin/rm:ro --mount /usr/bin/sed:/usr/bin/sed:ro --mount /usr/bin/sort:/usr/bin/sort:ro --mount /usr/bin/tail:/usr/bin/tail:ro --mount /usr/bin/wc:/usr/bin/wc:ro --mount /usr/bin/which:/usr/bin/which:ro --mount /usr/local/bin/copilot:/usr/local/bin/copilot:ro --mount /home/runner/.copilot:/home/runner/.copilot:rw --mount /opt/hostedtoolcache:/opt/hostedtoolcache:ro --mount /opt/gh-aw:/opt/gh-aw:ro --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --enable-host-access --image-tag 0.11.2 --agent-image act \ + -- 'source /opt/gh-aw/actions/sanitize_path.sh "$GH_AW_TOOL_BINS$(find /opt/hostedtoolcache -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH" && /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --add-dir "${GITHUB_WORKSPACE}" --disable-builtin-mcps --allow-tool github --allow-tool safeoutputs --allow-tool '\''shell(cat)'\'' --allow-tool '\''shell(clang-format --version)'\'' --allow-tool '\''shell(date)'\'' --allow-tool '\''shell(echo)'\'' --allow-tool '\''shell(git diff:*)'\'' --allow-tool '\''shell(git log:*)'\'' --allow-tool '\''shell(git show:*)'\'' --allow-tool '\''shell(grep)'\'' --allow-tool '\''shell(head)'\'' --allow-tool '\''shell(ls)'\'' --allow-tool '\''shell(pwd)'\'' --allow-tool '\''shell(sort)'\'' --allow-tool '\''shell(tail)'\'' --allow-tool '\''shell(uniq)'\'' --allow-tool '\''shell(wc)'\'' --allow-tool '\''shell(yq)'\'' --allow-tool write --add-dir /tmp/gh-aw/cache-memory/ --allow-all-paths --share /tmp/gh-aw/sandbox/agent/logs/conversation.md --prompt "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)"${GH_AW_MODEL_AGENT_COPILOT:+ --model "$GH_AW_MODEL_AGENT_COPILOT"}' \ 2>&1 | tee /tmp/gh-aw/agent-stdio.log env: COPILOT_AGENT_RUNNER_TYPE: STANDALONE @@ -1870,7 +842,7 @@ jobs: total_count: ${{ steps.missing_tool.outputs.total_count }} steps: - name: Setup Scripts - uses: githubnext/gh-aw/actions/setup@v0.37.32 + uses: githubnext/gh-aw/actions/setup@v0.38.5 with: destination: /opt/gh-aw/actions - name: Debug job inputs @@ -1971,7 +943,7 @@ jobs: success: ${{ steps.parse_results.outputs.success }} steps: - name: Setup Scripts - uses: githubnext/gh-aw/actions/setup@v0.37.32 + uses: githubnext/gh-aw/actions/setup@v0.38.5 with: destination: /opt/gh-aw/actions - name: Download agent artifacts @@ -2055,7 +1027,7 @@ jobs: env: COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} - name: Install GitHub Copilot CLI - run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.395 + run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.399 - name: Execute GitHub Copilot CLI id: agentic_execution # Copilot CLI tool arguments (sorted): @@ -2122,7 +1094,7 @@ jobs: process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} steps: - name: Setup Scripts - uses: githubnext/gh-aw/actions/setup@v0.37.32 + uses: githubnext/gh-aw/actions/setup@v0.38.5 with: destination: /opt/gh-aw/actions - name: Download agent output artifact @@ -2159,7 +1131,7 @@ jobs: permissions: {} steps: - name: Setup Scripts - uses: githubnext/gh-aw/actions/setup@v0.37.32 + uses: githubnext/gh-aw/actions/setup@v0.38.5 with: destination: /opt/gh-aw/actions - name: Download cache-memory artifact (default) @@ -2171,6 +1143,6 @@ jobs: - name: Save cache-memory to cache (default) uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: - key: memory-${{ github.workflow }}-${{ github.run_id }} + key: conventions-cache-${{ github.workflow }}-${{ github.run_id }} path: /tmp/gh-aw/cache-memory diff --git a/.github/workflows/code-conventions-analyzer.md b/.github/workflows/code-conventions-analyzer.md index 35f1f209e..68c433ef9 100644 --- a/.github/workflows/code-conventions-analyzer.md +++ b/.github/workflows/code-conventions-analyzer.md @@ -6,7 +6,8 @@ on: workflow_dispatch: permissions: read-all tools: - cache-memory: true + cache-memory: + key: conventions-cache-${{ github.workflow }}-${{ github.run_id }} github: toolsets: [default] view: {}