mirror of
https://github.com/Z3Prover/z3
synced 2026-01-25 11:34:01 +00:00
[WIP] Update code convention analyzer for tuple patterns (#8306)
* Initial plan * Add tuple pattern detection to code conventions analyzer Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Clarify search pattern comment for tuple pattern detection Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Improve examples and search patterns based on code review feedback Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
parent
c73d623dfd
commit
736d5924e5
3 changed files with 535 additions and 224 deletions
4
.github/workflows/agentics-maintenance.yml
vendored
4
.github/workflows/agentics-maintenance.yml
vendored
|
|
@ -13,7 +13,7 @@
|
|||
# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \
|
||||
# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/
|
||||
#
|
||||
# This file was automatically generated by pkg/workflow/maintenance_workflow.go (v0.37.12). DO NOT EDIT.
|
||||
# This file was automatically generated by pkg/workflow/maintenance_workflow.go (v0.37.15). DO NOT EDIT.
|
||||
#
|
||||
# To regenerate this workflow, run:
|
||||
# gh aw compile
|
||||
|
|
@ -46,7 +46,7 @@ jobs:
|
|||
issues: write
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: githubnext/gh-aw/actions/setup@v0.37.12
|
||||
uses: githubnext/gh-aw/actions/setup@v0.37.15
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
|
||||
|
|
|
|||
621
.github/workflows/code-conventions-analyzer.lock.yml
generated
vendored
621
.github/workflows/code-conventions-analyzer.lock.yml
generated
vendored
|
|
@ -13,7 +13,7 @@
|
|||
# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \
|
||||
# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/
|
||||
#
|
||||
# This file was automatically generated by gh-aw (v0.36.0). DO NOT EDIT.
|
||||
# This file was automatically generated by gh-aw (v0.37.15). DO NOT EDIT.
|
||||
#
|
||||
# To update this file, edit the corresponding .md file and run:
|
||||
# gh aw compile
|
||||
|
|
@ -28,7 +28,7 @@ name: "Code Conventions Analyzer"
|
|||
# Friendly format: daily (scattered)
|
||||
workflow_dispatch:
|
||||
|
||||
permissions: read-all
|
||||
permissions: {}
|
||||
|
||||
concurrency:
|
||||
group: "gh-aw-${{ github.workflow }}"
|
||||
|
|
@ -45,7 +45,7 @@ jobs:
|
|||
comment_repo: ""
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: githubnext/gh-aw/actions/setup@a933c835b5e2d12ae4dead665a0fdba420a2d421 # v0.36.0
|
||||
uses: githubnext/gh-aw/actions/setup@v0.37.15
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Check workflow file timestamps
|
||||
|
|
@ -66,8 +66,12 @@ jobs:
|
|||
concurrency:
|
||||
group: "gh-aw-copilot-${{ github.workflow }}"
|
||||
env:
|
||||
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
|
||||
GH_AW_ASSETS_ALLOWED_EXTS: ""
|
||||
GH_AW_ASSETS_BRANCH: ""
|
||||
GH_AW_ASSETS_MAX_SIZE_KB: 0
|
||||
GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs
|
||||
GH_AW_SAFE_OUTPUTS: /tmp/gh-aw/safeoutputs/outputs.jsonl
|
||||
GH_AW_SAFE_OUTPUTS: /opt/gh-aw/safeoutputs/outputs.jsonl
|
||||
GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json
|
||||
GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json
|
||||
outputs:
|
||||
|
|
@ -75,9 +79,10 @@ jobs:
|
|||
model: ${{ steps.generate_aw_info.outputs.model }}
|
||||
output: ${{ steps.collect_output.outputs.output }}
|
||||
output_types: ${{ steps.collect_output.outputs.output_types }}
|
||||
secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }}
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: githubnext/gh-aw/actions/setup@a933c835b5e2d12ae4dead665a0fdba420a2d421 # v0.36.0
|
||||
uses: githubnext/gh-aw/actions/setup@v0.37.15
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Checkout repository
|
||||
|
|
@ -89,7 +94,7 @@ jobs:
|
|||
# Cache memory file share configuration from frontmatter processed below
|
||||
- name: Create cache-memory directory
|
||||
run: bash /opt/gh-aw/actions/create_cache_memory_dir.sh
|
||||
- name: Restore cache memory file share data
|
||||
- name: Restore cache-memory file share data
|
||||
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
|
||||
with:
|
||||
key: memory-${{ github.workflow }}-${{ github.run_id }}
|
||||
|
|
@ -122,28 +127,14 @@ jobs:
|
|||
const { main } = require('/opt/gh-aw/actions/checkout_pr_branch.cjs');
|
||||
await main();
|
||||
- name: Validate COPILOT_GITHUB_TOKEN secret
|
||||
run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN GitHub Copilot CLI https://githubnext.github.io/gh-aw/reference/engines/#github-copilot-default
|
||||
id: validate-secret
|
||||
run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://githubnext.github.io/gh-aw/reference/engines/#github-copilot-default
|
||||
env:
|
||||
COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
|
||||
- name: Install GitHub Copilot CLI
|
||||
run: |
|
||||
# Download official Copilot CLI installer script
|
||||
curl -fsSL https://raw.githubusercontent.com/github/copilot-cli/main/install.sh -o /tmp/copilot-install.sh
|
||||
|
||||
# Execute the installer with the specified version
|
||||
export VERSION=0.0.375 && sudo bash /tmp/copilot-install.sh
|
||||
|
||||
# Cleanup
|
||||
rm -f /tmp/copilot-install.sh
|
||||
|
||||
# Verify installation
|
||||
copilot --version
|
||||
run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.389
|
||||
- name: Install awf binary
|
||||
run: |
|
||||
echo "Installing awf via installer script (requested version: v0.8.2)"
|
||||
curl -sSL https://raw.githubusercontent.com/githubnext/gh-aw-firewall/main/install.sh | sudo AWF_VERSION=v0.8.2 bash
|
||||
which awf
|
||||
awf --version
|
||||
run: bash /opt/gh-aw/actions/install_awf_binary.sh v0.10.0
|
||||
- name: Determine automatic lockdown mode for GitHub MCP server
|
||||
id: determine-automatic-lockdown
|
||||
env:
|
||||
|
|
@ -154,8 +145,8 @@ jobs:
|
|||
script: |
|
||||
const determineAutomaticLockdown = require('/opt/gh-aw/actions/determine_automatic_lockdown.cjs');
|
||||
await determineAutomaticLockdown(github, context, core);
|
||||
- name: Downloading container images
|
||||
run: bash /opt/gh-aw/actions/download_docker_images.sh ghcr.io/github/github-mcp-server:v0.27.0
|
||||
- name: Download container images
|
||||
run: bash /opt/gh-aw/actions/download_docker_images.sh ghcr.io/github/github-mcp-server:v0.29.0 ghcr.io/githubnext/gh-aw-mcpg:v0.0.76 node:lts-alpine
|
||||
- name: Write Safe Outputs Config
|
||||
run: |
|
||||
mkdir -p /opt/gh-aw/safeoutputs
|
||||
|
|
@ -226,7 +217,7 @@ jobs:
|
|||
"name": "create_pull_request"
|
||||
},
|
||||
{
|
||||
"description": "Report that a tool or capability needed to complete the task is not available. Use this when you cannot accomplish what was requested because the required functionality is missing or access is restricted.",
|
||||
"description": "Report that a tool or capability needed to complete the task is not available, or share any information you deem important about missing functionality or limitations. Use this when you cannot accomplish what was requested because the required functionality is missing or access is restricted.",
|
||||
"inputSchema": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
|
|
@ -235,16 +226,15 @@ jobs:
|
|||
"type": "string"
|
||||
},
|
||||
"reason": {
|
||||
"description": "Explanation of why this tool is needed to complete the task (max 256 characters).",
|
||||
"description": "Explanation of why this tool is needed or what information you want to share about the limitation (max 256 characters).",
|
||||
"type": "string"
|
||||
},
|
||||
"tool": {
|
||||
"description": "Name or description of the missing tool or capability (max 128 characters). Be specific about what functionality is needed.",
|
||||
"description": "Optional: Name or description of the missing tool or capability (max 128 characters). Be specific about what functionality is needed.",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"tool",
|
||||
"reason"
|
||||
],
|
||||
"type": "object"
|
||||
|
|
@ -267,6 +257,33 @@ jobs:
|
|||
"type": "object"
|
||||
},
|
||||
"name": "noop"
|
||||
},
|
||||
{
|
||||
"description": "Report that data or information needed to complete the task is not available. Use this when you cannot accomplish what was requested because required data, context, or information is missing.",
|
||||
"inputSchema": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"alternatives": {
|
||||
"description": "Any workarounds, manual steps, or alternative approaches the user could take (max 256 characters).",
|
||||
"type": "string"
|
||||
},
|
||||
"context": {
|
||||
"description": "Additional context about the missing data or where it should come from (max 256 characters).",
|
||||
"type": "string"
|
||||
},
|
||||
"data_type": {
|
||||
"description": "Type or description of the missing data or information (max 128 characters). Be specific about what data is needed.",
|
||||
"type": "string"
|
||||
},
|
||||
"reason": {
|
||||
"description": "Explanation of why this data is needed to complete the task (max 256 characters).",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [],
|
||||
"type": "object"
|
||||
},
|
||||
"name": "missing_data"
|
||||
}
|
||||
]
|
||||
EOF
|
||||
|
|
@ -362,69 +379,96 @@ jobs:
|
|||
}
|
||||
}
|
||||
EOF
|
||||
- name: Setup MCPs
|
||||
- name: Generate Safe Outputs MCP Server Config
|
||||
id: safe-outputs-config
|
||||
run: |
|
||||
# Generate a secure random API key (360 bits of entropy, 40+ chars)
|
||||
API_KEY=""
|
||||
API_KEY=$(openssl rand -base64 45 | tr -d '/+=')
|
||||
PORT=3001
|
||||
|
||||
# Register API key as secret to mask it from logs
|
||||
echo "::add-mask::${API_KEY}"
|
||||
|
||||
# Set outputs for next steps
|
||||
{
|
||||
echo "safe_outputs_api_key=${API_KEY}"
|
||||
echo "safe_outputs_port=${PORT}"
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
echo "Safe Outputs MCP server will run on port ${PORT}"
|
||||
|
||||
- name: Start Safe Outputs MCP HTTP Server
|
||||
id: safe-outputs-start
|
||||
env:
|
||||
GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }}
|
||||
GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }}
|
||||
GH_AW_SAFE_OUTPUTS_TOOLS_PATH: /opt/gh-aw/safeoutputs/tools.json
|
||||
GH_AW_SAFE_OUTPUTS_CONFIG_PATH: /opt/gh-aw/safeoutputs/config.json
|
||||
GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs
|
||||
run: |
|
||||
# Environment variables are set above to prevent template injection
|
||||
export GH_AW_SAFE_OUTPUTS_PORT
|
||||
export GH_AW_SAFE_OUTPUTS_API_KEY
|
||||
export GH_AW_SAFE_OUTPUTS_TOOLS_PATH
|
||||
export GH_AW_SAFE_OUTPUTS_CONFIG_PATH
|
||||
export GH_AW_MCP_LOG_DIR
|
||||
|
||||
bash /opt/gh-aw/actions/start_safe_outputs_server.sh
|
||||
|
||||
- name: Start MCP gateway
|
||||
id: start-mcp-gateway
|
||||
env:
|
||||
GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }}
|
||||
GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }}
|
||||
GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }}
|
||||
GITHUB_MCP_LOCKDOWN: ${{ steps.determine-automatic-lockdown.outputs.lockdown == 'true' && '1' || '0' }}
|
||||
GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -eo pipefail
|
||||
mkdir -p /tmp/gh-aw/mcp-config
|
||||
|
||||
# Export gateway environment variables for MCP config and gateway script
|
||||
export MCP_GATEWAY_PORT="80"
|
||||
export MCP_GATEWAY_DOMAIN="host.docker.internal"
|
||||
MCP_GATEWAY_API_KEY=""
|
||||
MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=')
|
||||
export MCP_GATEWAY_API_KEY
|
||||
|
||||
# Register API key as secret to mask it from logs
|
||||
echo "::add-mask::${MCP_GATEWAY_API_KEY}"
|
||||
export GH_AW_ENGINE="copilot"
|
||||
export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e DEBUG="*" -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_LOCKDOWN -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/githubnext/gh-aw-mcpg:v0.0.76'
|
||||
|
||||
mkdir -p /home/runner/.copilot
|
||||
cat > /home/runner/.copilot/mcp-config.json << EOF
|
||||
cat << MCPCONFIG_EOF | bash /opt/gh-aw/actions/start_mcp_gateway.sh
|
||||
{
|
||||
"mcpServers": {
|
||||
"github": {
|
||||
"type": "local",
|
||||
"command": "docker",
|
||||
"args": [
|
||||
"run",
|
||||
"-i",
|
||||
"--rm",
|
||||
"-e",
|
||||
"GITHUB_PERSONAL_ACCESS_TOKEN",
|
||||
"-e",
|
||||
"GITHUB_READ_ONLY=1",
|
||||
"-e",
|
||||
"GITHUB_LOCKDOWN_MODE=$GITHUB_MCP_LOCKDOWN",
|
||||
"-e",
|
||||
"GITHUB_TOOLSETS=context,repos,issues,pull_requests",
|
||||
"ghcr.io/github/github-mcp-server:v0.27.0"
|
||||
],
|
||||
"tools": ["*"],
|
||||
"type": "stdio",
|
||||
"container": "ghcr.io/github/github-mcp-server:v0.29.0",
|
||||
"env": {
|
||||
"GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}"
|
||||
"GITHUB_LOCKDOWN_MODE": "$GITHUB_MCP_LOCKDOWN",
|
||||
"GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}",
|
||||
"GITHUB_READ_ONLY": "1",
|
||||
"GITHUB_TOOLSETS": "context,repos,issues,pull_requests"
|
||||
}
|
||||
},
|
||||
"safeoutputs": {
|
||||
"type": "local",
|
||||
"command": "node",
|
||||
"args": ["/opt/gh-aw/safeoutputs/mcp-server.cjs"],
|
||||
"tools": ["*"],
|
||||
"env": {
|
||||
"GH_AW_MCP_LOG_DIR": "\${GH_AW_MCP_LOG_DIR}",
|
||||
"GH_AW_SAFE_OUTPUTS": "\${GH_AW_SAFE_OUTPUTS}",
|
||||
"GH_AW_SAFE_OUTPUTS_CONFIG_PATH": "\${GH_AW_SAFE_OUTPUTS_CONFIG_PATH}",
|
||||
"GH_AW_SAFE_OUTPUTS_TOOLS_PATH": "\${GH_AW_SAFE_OUTPUTS_TOOLS_PATH}",
|
||||
"GH_AW_ASSETS_BRANCH": "\${GH_AW_ASSETS_BRANCH}",
|
||||
"GH_AW_ASSETS_MAX_SIZE_KB": "\${GH_AW_ASSETS_MAX_SIZE_KB}",
|
||||
"GH_AW_ASSETS_ALLOWED_EXTS": "\${GH_AW_ASSETS_ALLOWED_EXTS}",
|
||||
"GITHUB_REPOSITORY": "\${GITHUB_REPOSITORY}",
|
||||
"GITHUB_SERVER_URL": "\${GITHUB_SERVER_URL}",
|
||||
"GITHUB_SHA": "\${GITHUB_SHA}",
|
||||
"GITHUB_WORKSPACE": "\${GITHUB_WORKSPACE}",
|
||||
"DEFAULT_BRANCH": "\${DEFAULT_BRANCH}"
|
||||
"type": "http",
|
||||
"url": "http://host.docker.internal:$GH_AW_SAFE_OUTPUTS_PORT",
|
||||
"headers": {
|
||||
"Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"gateway": {
|
||||
"port": $MCP_GATEWAY_PORT,
|
||||
"domain": "${MCP_GATEWAY_DOMAIN}",
|
||||
"apiKey": "${MCP_GATEWAY_API_KEY}"
|
||||
}
|
||||
}
|
||||
EOF
|
||||
echo "-------START MCP CONFIG-----------"
|
||||
cat /home/runner/.copilot/mcp-config.json
|
||||
echo "-------END MCP CONFIG-----------"
|
||||
echo "-------/home/runner/.copilot-----------"
|
||||
find /home/runner/.copilot
|
||||
echo "HOME: $HOME"
|
||||
echo "GITHUB_COPILOT_CLI_MODE: $GITHUB_COPILOT_CLI_MODE"
|
||||
MCPCONFIG_EOF
|
||||
- name: Generate agentic run info
|
||||
id: generate_aw_info
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||
|
|
@ -437,8 +481,8 @@ jobs:
|
|||
engine_name: "GitHub Copilot CLI",
|
||||
model: process.env.GH_AW_MODEL_AGENT_COPILOT || "",
|
||||
version: "",
|
||||
agent_version: "0.0.375",
|
||||
cli_version: "v0.36.0",
|
||||
agent_version: "0.0.389",
|
||||
cli_version: "v0.37.15",
|
||||
workflow_name: "Code Conventions Analyzer",
|
||||
experimental: false,
|
||||
supports_tools_allowlist: true,
|
||||
|
|
@ -455,7 +499,8 @@ jobs:
|
|||
network_mode: "defaults",
|
||||
allowed_domains: [],
|
||||
firewall_enabled: true,
|
||||
awf_version: "v0.8.2",
|
||||
awf_version: "v0.10.0",
|
||||
awmg_version: "v0.0.76",
|
||||
steps: {
|
||||
firewall: "squid"
|
||||
},
|
||||
|
|
@ -476,13 +521,92 @@ jobs:
|
|||
script: |
|
||||
const { generateWorkflowOverview } = require('/opt/gh-aw/actions/generate_workflow_overview.cjs');
|
||||
await generateWorkflowOverview(core);
|
||||
- name: Create prompt
|
||||
- name: Create prompt with built-in context
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }}
|
||||
GH_AW_GITHUB_ACTOR: ${{ github.actor }}
|
||||
GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }}
|
||||
GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }}
|
||||
GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||
GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
|
||||
GH_AW_GITHUB_REPOSITORY: ${{ github.repository }}
|
||||
GH_AW_GITHUB_RUN_ID: ${{ github.run_id }}
|
||||
GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }}
|
||||
run: |
|
||||
bash /opt/gh-aw/actions/create_prompt_first.sh
|
||||
cat << 'PROMPT_EOF' > "$GH_AW_PROMPT"
|
||||
<system>
|
||||
PROMPT_EOF
|
||||
cat "/opt/gh-aw/prompts/temp_folder_prompt.md" >> "$GH_AW_PROMPT"
|
||||
cat "/opt/gh-aw/prompts/markdown.md" >> "$GH_AW_PROMPT"
|
||||
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
|
||||
|
||||
---
|
||||
|
||||
## Cache Folder Available
|
||||
|
||||
You have access to a persistent cache folder at `/tmp/gh-aw/cache-memory/` where you can read and write files to create memories and store information.
|
||||
|
||||
- **Read/Write Access**: You can freely read from and write to any files in this folder
|
||||
- **Persistence**: Files in this folder persist across workflow runs via GitHub Actions cache
|
||||
- **Last Write Wins**: If multiple processes write to the same file, the last write will be preserved
|
||||
- **File Share**: Use this as a simple file share - organize files as you see fit
|
||||
|
||||
Examples of what you can store:
|
||||
- `/tmp/gh-aw/cache-memory/notes.txt` - general notes and observations
|
||||
- `/tmp/gh-aw/cache-memory/preferences.json` - user preferences and settings
|
||||
- `/tmp/gh-aw/cache-memory/history.log` - activity history and logs
|
||||
- `/tmp/gh-aw/cache-memory/state/` - organized state files in subdirectories
|
||||
|
||||
Feel free to create, read, update, and organize files in this folder as needed for your tasks.
|
||||
|
||||
<safe-outputs>
|
||||
<description>GitHub API Access Instructions</description>
|
||||
<important>
|
||||
The gh CLI is NOT authenticated. Do NOT use gh commands for GitHub operations.
|
||||
</important>
|
||||
<instructions>
|
||||
To create or modify GitHub resources (issues, discussions, pull requests, etc.), you MUST call the appropriate safe output tool. Simply writing content will NOT work - the workflow requires actual tool calls.
|
||||
|
||||
**Available tools**: create_discussion, create_pull_request, missing_tool, noop
|
||||
|
||||
**Critical**: Tool calls write structured data that downstream jobs process. Without tool calls, follow-up actions will be skipped.
|
||||
</instructions>
|
||||
</safe-outputs>
|
||||
<github-context>
|
||||
The following GitHub context information is available for this workflow:
|
||||
{{#if __GH_AW_GITHUB_ACTOR__ }}
|
||||
- **actor**: __GH_AW_GITHUB_ACTOR__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_REPOSITORY__ }}
|
||||
- **repository**: __GH_AW_GITHUB_REPOSITORY__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_WORKSPACE__ }}
|
||||
- **workspace**: __GH_AW_GITHUB_WORKSPACE__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }}
|
||||
- **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }}
|
||||
- **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }}
|
||||
- **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }}
|
||||
- **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_RUN_ID__ }}
|
||||
- **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__
|
||||
{{/if}}
|
||||
</github-context>
|
||||
|
||||
PROMPT_EOF
|
||||
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
|
||||
</system>
|
||||
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.
|
||||
|
|
@ -504,9 +628,35 @@ jobs:
|
|||
- Boolean return + output parameter patterns (e.g., `bool get_value(T* out)`)
|
||||
- APIs that would benefit from explicit optional semantics
|
||||
|
||||
**Secondary Task:**
|
||||
**SECONDARY FOCUS: Create Pull Requests for Tuple Pattern (Structured Bindings) Refactoring**
|
||||
|
||||
Your secondary task is to identify and implement refactorings that use C++17 structured bindings instead of accessing `.first` and `.second`:
|
||||
|
||||
1. **Find tuple/pair access patterns** - Code accessing `.first` and `.second` members
|
||||
2. **Implement the refactoring** - Replace with structured bindings for clearer code
|
||||
3. **Create pull requests** - Automatically create a PR with your changes for tuple pattern improvements
|
||||
|
||||
**Focus Areas for Tuple Pattern Refactoring:**
|
||||
- Variables that access both `.first` and `.second` multiple times
|
||||
- Return values from functions that are immediately decomposed
|
||||
- Iterator dereferences accessing pair members (e.g., map iterators)
|
||||
- Code that would be clearer with meaningful variable names instead of `.first`/`.second`
|
||||
|
||||
**Example refactoring:**
|
||||
```cpp
|
||||
// Before: Using .first and .second
|
||||
auto x = f(y);
|
||||
return g(x.first, x.second);
|
||||
|
||||
// After: Using structured bindings
|
||||
auto [a, b] = f(y);
|
||||
return g(a, b);
|
||||
```
|
||||
|
||||
**Additional Task:**
|
||||
Additionally, conduct analysis of other coding conventions and modern C++ opportunities for discussion (not immediate implementation)
|
||||
|
||||
|
||||
## Workflow for std::optional Refactoring (PRIMARY)
|
||||
|
||||
### Step A: Find std::optional Refactoring Opportunities
|
||||
|
|
@ -800,6 +950,21 @@ jobs:
|
|||
- **ACTION**: Replace with `std::optional<T>` return values using the refactoring workflow above
|
||||
- **RESULT**: Create a pull request with the actual code changes (see "Workflow for std::optional Refactoring")
|
||||
|
||||
**Tuple/Pair Access Patterns:**
|
||||
- **SECONDARY TASK**: Code accessing `.first` and `.second` on pairs/tuples
|
||||
- **ACTION**: Replace with C++17 structured bindings for cleaner, more readable code
|
||||
- **RESULT**: Create a pull request with the actual code changes
|
||||
- **Example**:
|
||||
```cpp
|
||||
// Before
|
||||
auto x = f(y);
|
||||
return g(x.first, x.second);
|
||||
|
||||
// After
|
||||
auto [a, b] = f(y);
|
||||
return g(a, b);
|
||||
```
|
||||
|
||||
**Exception String Construction:**
|
||||
- Using `stringstream` to build exception messages
|
||||
- Unnecessary string copies when raising exceptions
|
||||
|
|
@ -860,6 +1025,8 @@ jobs:
|
|||
- 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
|
||||
PROMPT_EOF
|
||||
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
|
||||
- modernize-use-override
|
||||
- modernize-loop-convert (review carefully)
|
||||
- bugprone-* (selected high-signal checks)
|
||||
|
|
@ -902,12 +1069,6 @@ jobs:
|
|||
**Files Examined**: ~[number] files across key directories
|
||||
|
||||
## Executive Summary
|
||||
PROMPT_EOF
|
||||
- name: Append prompt (part 2)
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
run: |
|
||||
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
|
||||
|
||||
[Brief overview of key findings - 2-3 sentences]
|
||||
|
||||
|
|
@ -1133,30 +1294,89 @@ jobs:
|
|||
- **Examples**: File:line references with before/after code
|
||||
- **Output**: Pull request (not just discussion)
|
||||
|
||||
### 4.9 Exception String Construction
|
||||
### 4.9 Tuple Pattern (Structured Bindings) Modernization - **IMPLEMENT AS PULL REQUEST**
|
||||
|
||||
**This is a SECONDARY focus area - implement these changes directly:**
|
||||
|
||||
- **Current Pattern**: Accessing `.first` and `.second` on pairs/tuples
|
||||
- **Modern Pattern**: Use C++17 structured bindings for cleaner code
|
||||
- **Benefits**:
|
||||
- More readable variable names instead of `.first`/`.second`
|
||||
- Clearer intent of what values represent
|
||||
- Eliminates intermediate variables
|
||||
- Reduces chance of errors from swapping `.first`/`.second`
|
||||
- **Action**: Find and refactor tuple/pair access patterns:
|
||||
1. Search for patterns using `.first` and `.second`
|
||||
2. Identify cases where intermediate variable can be eliminated
|
||||
3. Refactor to use structured bindings
|
||||
4. Create a pull request with changes
|
||||
- **Example Pattern**:
|
||||
```cpp
|
||||
// Before: Using .first and .second
|
||||
auto x = f(y);
|
||||
return g(x.first, x.second);
|
||||
|
||||
// After: Using structured bindings
|
||||
auto [a, b] = f(y);
|
||||
return g(a, b);
|
||||
```
|
||||
- **Another Example**:
|
||||
```cpp
|
||||
// Before: Accessing pair members via iterator
|
||||
auto result = map.find(key);
|
||||
if (result != map.end()) {
|
||||
use_key(result->first);
|
||||
use_value(result->second);
|
||||
}
|
||||
|
||||
// After: Structured bindings to access pair
|
||||
auto it = map.find(key);
|
||||
if (it != map.end()) {
|
||||
auto& [k, v] = *it;
|
||||
use_key(k);
|
||||
use_value(v);
|
||||
}
|
||||
|
||||
// Or for range-based loops (eliminates iterator entirely):
|
||||
for (auto& [k, v] : map) {
|
||||
use_key(k);
|
||||
use_value(v);
|
||||
}
|
||||
```
|
||||
- **Search Patterns**: Look for code using `.first` or `.second` on:
|
||||
- Return values from functions returning `std::pair` or tuples
|
||||
- Iterator dereferences (especially map iterators)
|
||||
- Direct pair/tuple variable access
|
||||
- **Candidates**: Functions or code blocks that:
|
||||
- Call `.first` and `.second` on the same variable multiple times
|
||||
- Create intermediate variables just to access pair members
|
||||
- Have sequential uses of both `.first` and `.second`
|
||||
- **Output**: Pull request with refactored code
|
||||
|
||||
### 4.10 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.10 Array Parameter Modernization
|
||||
### 4.11 Array Parameter Modernization
|
||||
- **Current**: [Pointer + size parameter pairs]
|
||||
- **Modern**: [std::span usage opportunities]
|
||||
- **Type Safety**: [How span improves API safety]
|
||||
- **Examples**: [Function signatures to update]
|
||||
|
||||
### 4.11 Increment Operator Patterns
|
||||
### 4.12 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
|
||||
### 4.13 Exception Control Flow
|
||||
- **Current Usage**: [Exceptions used for normal control flow]
|
||||
- **Modern Alternatives**: [std::expected, std::optional, error codes]
|
||||
- **Performance**: [Impact of exception-based control flow]
|
||||
- **Refactoring Opportunities**: [Specific patterns to replace]
|
||||
|
||||
### 4.13 Inefficient Stream Output
|
||||
### 4.14 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]
|
||||
|
|
@ -1230,6 +1450,8 @@ jobs:
|
|||
- Date last verified
|
||||
|
||||
3. **Track analysis progress**:
|
||||
PROMPT_EOF
|
||||
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
|
||||
- Which directories/areas have been analyzed
|
||||
- Which analysis categories have been covered
|
||||
- Percentage of codebase examined
|
||||
|
|
@ -1323,12 +1545,6 @@ jobs:
|
|||
**Find constructors/destructors without noexcept:**
|
||||
```
|
||||
# Non-virtual destructors without noexcept in headers
|
||||
PROMPT_EOF
|
||||
- name: Append prompt (part 3)
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
run: |
|
||||
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
|
||||
grep pattern: "~[A-Za-z_]+\(\)(?!.*noexcept)(?!.*virtual)" glob: "src/**/*.h"
|
||||
|
||||
# Virtual destructors without noexcept
|
||||
|
|
@ -1398,6 +1614,28 @@ jobs:
|
|||
grep pattern: "bool.*\(.*\*.*\)|bool.*\(.*&" glob: "src/**/*.h"
|
||||
```
|
||||
|
||||
**Find tuple/pair access patterns (structured binding opportunities):**
|
||||
```
|
||||
# Find .first usage
|
||||
grep pattern: "\.first" glob: "src/**/*.{cpp,h}"
|
||||
|
||||
# Find .second usage
|
||||
grep pattern: "\.second" glob: "src/**/*.{cpp,h}"
|
||||
|
||||
# Find same variable used with both .first and .second on same line (high-value candidates)
|
||||
# Note: This only matches single-line patterns where the same var is used; use separate .first/.second searches for comprehensive coverage
|
||||
grep pattern: "([a-z_]+)\.first.*\1\.second" glob: "src/**/*.cpp"
|
||||
|
||||
# Find iterator dereferencing with .first or .second
|
||||
grep pattern: "->first|->second" glob: "src/**/*.cpp"
|
||||
|
||||
# Find return statements using .first and .second
|
||||
grep pattern: "return.*\.first.*\.second" glob: "src/**/*.cpp"
|
||||
|
||||
# Find function calls with .first and .second as arguments (focused pattern)
|
||||
grep pattern: "\([^)]*\.first[^)]*\.second[^)]*\)" glob: "src/**/*.cpp"
|
||||
```
|
||||
|
||||
**Find pointer + size parameters:**
|
||||
```
|
||||
grep pattern: "\([^,]+\*[^,]*,\s*size_t|, unsigned.*size\)" glob: "src/**/*.h"
|
||||
|
|
@ -1451,102 +1689,6 @@ jobs:
|
|||
- Provide actionable recommendations
|
||||
- Previous discussions created by this workflow will be automatically closed (using `close-older-discussions: true`)
|
||||
|
||||
PROMPT_EOF
|
||||
- name: Append XPIA security instructions to prompt
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
run: |
|
||||
cat "/opt/gh-aw/prompts/xpia_prompt.md" >> "$GH_AW_PROMPT"
|
||||
- name: Append temporary folder instructions to prompt
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
run: |
|
||||
cat "/opt/gh-aw/prompts/temp_folder_prompt.md" >> "$GH_AW_PROMPT"
|
||||
- name: Append cache memory instructions to prompt
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
run: |
|
||||
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
|
||||
|
||||
---
|
||||
|
||||
## Cache Folder Available
|
||||
|
||||
You have access to a persistent cache folder at `/tmp/gh-aw/cache-memory/` where you can read and write files to create memories and store information.
|
||||
|
||||
- **Read/Write Access**: You can freely read from and write to any files in this folder
|
||||
- **Persistence**: Files in this folder persist across workflow runs via GitHub Actions cache
|
||||
- **Last Write Wins**: If multiple processes write to the same file, the last write will be preserved
|
||||
- **File Share**: Use this as a simple file share - organize files as you see fit
|
||||
|
||||
Examples of what you can store:
|
||||
- `/tmp/gh-aw/cache-memory/notes.txt` - general notes and observations
|
||||
- `/tmp/gh-aw/cache-memory/preferences.json` - user preferences and settings
|
||||
- `/tmp/gh-aw/cache-memory/history.log` - activity history and logs
|
||||
- `/tmp/gh-aw/cache-memory/state/` - organized state files in subdirectories
|
||||
|
||||
Feel free to create, read, update, and organize files in this folder as needed for your tasks.
|
||||
PROMPT_EOF
|
||||
- name: Append safe outputs instructions to prompt
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
run: |
|
||||
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
|
||||
<safe-outputs>
|
||||
<description>GitHub API Access Instructions</description>
|
||||
<important>
|
||||
The gh CLI is NOT authenticated. Do NOT use gh commands for GitHub operations.
|
||||
</important>
|
||||
<instructions>
|
||||
To create or modify GitHub resources (issues, discussions, pull requests, etc.), you MUST call the appropriate safe output tool. Simply writing content will NOT work - the workflow requires actual tool calls.
|
||||
|
||||
**Available tools**: create_discussion, create_pull_request, missing_tool, noop
|
||||
|
||||
**Critical**: Tool calls write structured data that downstream jobs process. Without tool calls, follow-up actions will be skipped.
|
||||
</instructions>
|
||||
</safe-outputs>
|
||||
PROMPT_EOF
|
||||
- name: Append GitHub context to prompt
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
GH_AW_GITHUB_ACTOR: ${{ github.actor }}
|
||||
GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }}
|
||||
GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }}
|
||||
GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||
GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
|
||||
GH_AW_GITHUB_REPOSITORY: ${{ github.repository }}
|
||||
GH_AW_GITHUB_RUN_ID: ${{ github.run_id }}
|
||||
GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }}
|
||||
run: |
|
||||
cat << 'PROMPT_EOF' >> "$GH_AW_PROMPT"
|
||||
<github-context>
|
||||
The following GitHub context information is available for this workflow:
|
||||
{{#if __GH_AW_GITHUB_ACTOR__ }}
|
||||
- **actor**: __GH_AW_GITHUB_ACTOR__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_REPOSITORY__ }}
|
||||
- **repository**: __GH_AW_GITHUB_REPOSITORY__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_WORKSPACE__ }}
|
||||
- **workspace**: __GH_AW_GITHUB_WORKSPACE__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }}
|
||||
- **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }}
|
||||
- **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }}
|
||||
- **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }}
|
||||
- **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__
|
||||
{{/if}}
|
||||
{{#if __GH_AW_GITHUB_RUN_ID__ }}
|
||||
- **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__
|
||||
{{/if}}
|
||||
</github-context>
|
||||
|
||||
PROMPT_EOF
|
||||
- name: Substitute placeholders
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||
|
|
@ -1588,6 +1730,10 @@ jobs:
|
|||
setupGlobals(core, github, context, exec, io);
|
||||
const { main } = require('/opt/gh-aw/actions/interpolate_prompt.cjs');
|
||||
await main();
|
||||
- name: Validate prompt placeholders
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
run: bash /opt/gh-aw/actions/validate_prompt_placeholders.sh
|
||||
- name: Print prompt
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
|
|
@ -1625,7 +1771,7 @@ jobs:
|
|||
timeout-minutes: 20
|
||||
run: |
|
||||
set -o pipefail
|
||||
sudo -E awf --env-all --container-workdir "${GITHUB_WORKSPACE}" --mount /tmp:/tmp:rw --mount "${GITHUB_WORKSPACE}:${GITHUB_WORKSPACE}:rw" --mount /usr/bin/date:/usr/bin/date:ro --mount /usr/bin/gh:/usr/bin/gh:ro --mount /usr/bin/yq:/usr/bin/yq:ro --mount /usr/local/bin/copilot:/usr/local/bin/copilot:ro --mount /home/runner/.copilot:/home/runner/.copilot:rw --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,github.com,host.docker.internal,raw.githubusercontent.com,registry.npmjs.org --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --image-tag 0.8.2 \
|
||||
sudo -E awf --env-all --container-workdir "${GITHUB_WORKSPACE}" --mount /tmp:/tmp:rw --mount "${GITHUB_WORKSPACE}:${GITHUB_WORKSPACE}:rw" --mount /usr/bin/date:/usr/bin/date:ro --mount /usr/bin/gh:/usr/bin/gh:ro --mount /usr/bin/yq:/usr/bin/yq:ro --mount /usr/local/bin/copilot:/usr/local/bin/copilot:ro --mount /home/runner/.copilot:/home/runner/.copilot:rw --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,github.com,host.docker.internal,raw.githubusercontent.com,registry.npmjs.org --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --enable-host-access --image-tag 0.10.0 \
|
||||
-- /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 add:*)' --allow-tool 'shell(git branch:*)' --allow-tool 'shell(git checkout:*)' --allow-tool 'shell(git commit:*)' --allow-tool 'shell(git diff:*)' --allow-tool 'shell(git log:*)' --allow-tool 'shell(git merge:*)' --allow-tool 'shell(git rm:*)' --allow-tool 'shell(git show:*)' --allow-tool 'shell(git status)' --allow-tool 'shell(git switch:*)' --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:
|
||||
|
|
@ -1636,7 +1782,6 @@ jobs:
|
|||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }}
|
||||
GITHUB_HEAD_REF: ${{ github.head_ref }}
|
||||
GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
GITHUB_REF_NAME: ${{ github.ref_name }}
|
||||
GITHUB_STEP_SUMMARY: ${{ env.GITHUB_STEP_SUMMARY }}
|
||||
GITHUB_WORKSPACE: ${{ github.workspace }}
|
||||
|
|
@ -1658,6 +1803,15 @@ jobs:
|
|||
else
|
||||
echo "No session-state directory found at $SESSION_STATE_DIR"
|
||||
fi
|
||||
- name: Stop MCP gateway
|
||||
if: always()
|
||||
continue-on-error: true
|
||||
env:
|
||||
MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }}
|
||||
MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }}
|
||||
GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }}
|
||||
run: |
|
||||
bash /opt/gh-aw/actions/stop_mcp_gateway.sh "$GATEWAY_PID"
|
||||
- name: Redact secrets in logs
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||
|
|
@ -1720,12 +1874,25 @@ jobs:
|
|||
setupGlobals(core, github, context, exec, io);
|
||||
const { main } = require('/opt/gh-aw/actions/parse_copilot_log.cjs');
|
||||
await main();
|
||||
- name: Firewall summary
|
||||
- name: Parse MCP gateway logs for step summary
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||
with:
|
||||
script: |
|
||||
const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs');
|
||||
setupGlobals(core, github, context, exec, io);
|
||||
const { main } = require('/opt/gh-aw/actions/parse_mcp_gateway_log.cjs');
|
||||
await main();
|
||||
- name: Print firewall logs
|
||||
if: always()
|
||||
continue-on-error: true
|
||||
env:
|
||||
AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs
|
||||
run: awf logs summary >> $GITHUB_STEP_SUMMARY
|
||||
run: |
|
||||
# Fix permissions on firewall logs so they can be uploaded as artifacts
|
||||
# AWF runs with sudo, creating files owned by root
|
||||
sudo chmod -R a+r /tmp/gh-aw/sandbox/firewall/logs 2>/dev/null || true
|
||||
awf logs summary | tee -a "$GITHUB_STEP_SUMMARY"
|
||||
- name: Upload cache-memory data as artifact
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
if: always()
|
||||
|
|
@ -1767,7 +1934,7 @@ jobs:
|
|||
total_count: ${{ steps.missing_tool.outputs.total_count }}
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: githubnext/gh-aw/actions/setup@a933c835b5e2d12ae4dead665a0fdba420a2d421 # v0.36.0
|
||||
uses: githubnext/gh-aw/actions/setup@v0.37.15
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Debug job inputs
|
||||
|
|
@ -1821,6 +1988,37 @@ jobs:
|
|||
setupGlobals(core, github, context, exec, io);
|
||||
const { main } = require('/opt/gh-aw/actions/missing_tool.cjs');
|
||||
await main();
|
||||
- name: Handle Agent Failure
|
||||
id: handle_agent_failure
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_WORKFLOW_NAME: "Code Conventions Analyzer"
|
||||
GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }}
|
||||
GH_AW_SECRET_VERIFICATION_RESULT: ${{ needs.agent.outputs.secret_verification_result }}
|
||||
with:
|
||||
github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs');
|
||||
setupGlobals(core, github, context, exec, io);
|
||||
const { main } = require('/opt/gh-aw/actions/handle_agent_failure.cjs');
|
||||
await main();
|
||||
- name: Handle Create Pull Request Error
|
||||
id: handle_create_pr_error
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
CREATE_PR_ERROR_MESSAGE: ${{ needs.create_pull_request.outputs.error_message }}
|
||||
GH_AW_WORKFLOW_NAME: "Code Conventions Analyzer"
|
||||
GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
with:
|
||||
github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs');
|
||||
setupGlobals(core, github, context, exec, io);
|
||||
const { main } = require('/opt/gh-aw/actions/handle_create_pr_error.cjs');
|
||||
await main();
|
||||
- name: Update reaction comment with completion status
|
||||
id: conclusion
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||
|
|
@ -1852,7 +2050,7 @@ jobs:
|
|||
success: ${{ steps.parse_results.outputs.success }}
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: githubnext/gh-aw/actions/setup@a933c835b5e2d12ae4dead665a0fdba420a2d421 # v0.36.0
|
||||
uses: githubnext/gh-aw/actions/setup@v0.37.15
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Download agent artifacts
|
||||
|
|
@ -1931,22 +2129,12 @@ jobs:
|
|||
mkdir -p /tmp/gh-aw/threat-detection
|
||||
touch /tmp/gh-aw/threat-detection/detection.log
|
||||
- name: Validate COPILOT_GITHUB_TOKEN secret
|
||||
run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN GitHub Copilot CLI https://githubnext.github.io/gh-aw/reference/engines/#github-copilot-default
|
||||
id: validate-secret
|
||||
run: /opt/gh-aw/actions/validate_multi_secret.sh COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://githubnext.github.io/gh-aw/reference/engines/#github-copilot-default
|
||||
env:
|
||||
COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
|
||||
- name: Install GitHub Copilot CLI
|
||||
run: |
|
||||
# Download official Copilot CLI installer script
|
||||
curl -fsSL https://raw.githubusercontent.com/github/copilot-cli/main/install.sh -o /tmp/copilot-install.sh
|
||||
|
||||
# Execute the installer with the specified version
|
||||
export VERSION=0.0.375 && sudo bash /tmp/copilot-install.sh
|
||||
|
||||
# Cleanup
|
||||
rm -f /tmp/copilot-install.sh
|
||||
|
||||
# Verify installation
|
||||
copilot --version
|
||||
run: /opt/gh-aw/actions/install_copilot_cli.sh 0.0.389
|
||||
- name: Execute GitHub Copilot CLI
|
||||
id: agentic_execution
|
||||
# Copilot CLI tool arguments (sorted):
|
||||
|
|
@ -2015,7 +2203,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@a933c835b5e2d12ae4dead665a0fdba420a2d421 # v0.36.0
|
||||
uses: githubnext/gh-aw/actions/setup@v0.37.15
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Download agent output artifact
|
||||
|
|
@ -2047,19 +2235,20 @@ jobs:
|
|||
env:
|
||||
REPO_NAME: ${{ github.repository }}
|
||||
SERVER_URL: ${{ github.server_url }}
|
||||
GIT_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git config --global user.name "github-actions[bot]"
|
||||
# Re-authenticate git with GitHub token
|
||||
SERVER_URL_STRIPPED="${SERVER_URL#https://}"
|
||||
git remote set-url origin "https://x-access-token:${{ github.token }}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git"
|
||||
git remote set-url origin "https://x-access-token:${GIT_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git"
|
||||
echo "Git configured with standard GitHub Actions identity"
|
||||
- name: Process Safe Outputs
|
||||
id: process_safe_outputs
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_discussion\":{\"category\":\"Agentic Workflows\",\"close_older_discussions\":true,\"expires\":168,\"max\":1,\"title_prefix\":\"Code Conventions Analysis\"},\"create_pull_request\":{\"base_branch\":\"${{ github.ref_name }}\",\"draft\":true,\"if_no_changes\":\"ignore\",\"labels\":[\"code-quality\",\"automated\"],\"max\":1,\"max_patch_size\":1024,\"title_prefix\":\"[Conventions] \"}}"
|
||||
GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_discussion\":{\"category\":\"Agentic Workflows\",\"close_older_discussions\":true,\"expires\":168,\"max\":1,\"title_prefix\":\"Code Conventions Analysis\"},\"create_pull_request\":{\"base_branch\":\"${{ github.ref_name }}\",\"draft\":true,\"if_no_changes\":\"ignore\",\"labels\":[\"code-quality\",\"automated\"],\"max\":1,\"max_patch_size\":1024,\"title_prefix\":\"[Conventions] \"},\"missing_data\":{},\"missing_tool\":{}}"
|
||||
with:
|
||||
github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
|
|
@ -2077,7 +2266,7 @@ jobs:
|
|||
permissions: {}
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: githubnext/gh-aw/actions/setup@a933c835b5e2d12ae4dead665a0fdba420a2d421 # v0.36.0
|
||||
uses: githubnext/gh-aw/actions/setup@v0.37.15
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Download cache-memory artifact (default)
|
||||
|
|
|
|||
134
.github/workflows/code-conventions-analyzer.md
vendored
134
.github/workflows/code-conventions-analyzer.md
vendored
|
|
@ -53,9 +53,35 @@ Your primary task is to identify and **directly implement** refactorings that re
|
|||
- Boolean return + output parameter patterns (e.g., `bool get_value(T* out)`)
|
||||
- APIs that would benefit from explicit optional semantics
|
||||
|
||||
**Secondary Task:**
|
||||
**SECONDARY FOCUS: Create Pull Requests for Tuple Pattern (Structured Bindings) Refactoring**
|
||||
|
||||
Your secondary task is to identify and implement refactorings that use C++17 structured bindings instead of accessing `.first` and `.second`:
|
||||
|
||||
1. **Find tuple/pair access patterns** - Code accessing `.first` and `.second` members
|
||||
2. **Implement the refactoring** - Replace with structured bindings for clearer code
|
||||
3. **Create pull requests** - Automatically create a PR with your changes for tuple pattern improvements
|
||||
|
||||
**Focus Areas for Tuple Pattern Refactoring:**
|
||||
- Variables that access both `.first` and `.second` multiple times
|
||||
- Return values from functions that are immediately decomposed
|
||||
- Iterator dereferences accessing pair members (e.g., map iterators)
|
||||
- Code that would be clearer with meaningful variable names instead of `.first`/`.second`
|
||||
|
||||
**Example refactoring:**
|
||||
```cpp
|
||||
// Before: Using .first and .second
|
||||
auto x = f(y);
|
||||
return g(x.first, x.second);
|
||||
|
||||
// After: Using structured bindings
|
||||
auto [a, b] = f(y);
|
||||
return g(a, b);
|
||||
```
|
||||
|
||||
**Additional Task:**
|
||||
Additionally, conduct analysis of other coding conventions and modern C++ opportunities for discussion (not immediate implementation)
|
||||
|
||||
|
||||
## Workflow for std::optional Refactoring (PRIMARY)
|
||||
|
||||
### Step A: Find std::optional Refactoring Opportunities
|
||||
|
|
@ -349,6 +375,21 @@ Identify opportunities specific to Z3's architecture and coding patterns:
|
|||
- **ACTION**: Replace with `std::optional<T>` return values using the refactoring workflow above
|
||||
- **RESULT**: Create a pull request with the actual code changes (see "Workflow for std::optional Refactoring")
|
||||
|
||||
**Tuple/Pair Access Patterns:**
|
||||
- **SECONDARY TASK**: Code accessing `.first` and `.second` on pairs/tuples
|
||||
- **ACTION**: Replace with C++17 structured bindings for cleaner, more readable code
|
||||
- **RESULT**: Create a pull request with the actual code changes
|
||||
- **Example**:
|
||||
```cpp
|
||||
// Before
|
||||
auto x = f(y);
|
||||
return g(x.first, x.second);
|
||||
|
||||
// After
|
||||
auto [a, b] = f(y);
|
||||
return g(a, b);
|
||||
```
|
||||
|
||||
**Exception String Construction:**
|
||||
- Using `stringstream` to build exception messages
|
||||
- Unnecessary string copies when raising exceptions
|
||||
|
|
@ -676,30 +717,89 @@ For each opportunity, provide:
|
|||
- **Examples**: File:line references with before/after code
|
||||
- **Output**: Pull request (not just discussion)
|
||||
|
||||
### 4.9 Exception String Construction
|
||||
### 4.9 Tuple Pattern (Structured Bindings) Modernization - **IMPLEMENT AS PULL REQUEST**
|
||||
|
||||
**This is a SECONDARY focus area - implement these changes directly:**
|
||||
|
||||
- **Current Pattern**: Accessing `.first` and `.second` on pairs/tuples
|
||||
- **Modern Pattern**: Use C++17 structured bindings for cleaner code
|
||||
- **Benefits**:
|
||||
- More readable variable names instead of `.first`/`.second`
|
||||
- Clearer intent of what values represent
|
||||
- Eliminates intermediate variables
|
||||
- Reduces chance of errors from swapping `.first`/`.second`
|
||||
- **Action**: Find and refactor tuple/pair access patterns:
|
||||
1. Search for patterns using `.first` and `.second`
|
||||
2. Identify cases where intermediate variable can be eliminated
|
||||
3. Refactor to use structured bindings
|
||||
4. Create a pull request with changes
|
||||
- **Example Pattern**:
|
||||
```cpp
|
||||
// Before: Using .first and .second
|
||||
auto x = f(y);
|
||||
return g(x.first, x.second);
|
||||
|
||||
// After: Using structured bindings
|
||||
auto [a, b] = f(y);
|
||||
return g(a, b);
|
||||
```
|
||||
- **Another Example**:
|
||||
```cpp
|
||||
// Before: Accessing pair members via iterator
|
||||
auto result = map.find(key);
|
||||
if (result != map.end()) {
|
||||
use_key(result->first);
|
||||
use_value(result->second);
|
||||
}
|
||||
|
||||
// After: Structured bindings to access pair
|
||||
auto it = map.find(key);
|
||||
if (it != map.end()) {
|
||||
auto& [k, v] = *it;
|
||||
use_key(k);
|
||||
use_value(v);
|
||||
}
|
||||
|
||||
// Or for range-based loops (eliminates iterator entirely):
|
||||
for (auto& [k, v] : map) {
|
||||
use_key(k);
|
||||
use_value(v);
|
||||
}
|
||||
```
|
||||
- **Search Patterns**: Look for code using `.first` or `.second` on:
|
||||
- Return values from functions returning `std::pair` or tuples
|
||||
- Iterator dereferences (especially map iterators)
|
||||
- Direct pair/tuple variable access
|
||||
- **Candidates**: Functions or code blocks that:
|
||||
- Call `.first` and `.second` on the same variable multiple times
|
||||
- Create intermediate variables just to access pair members
|
||||
- Have sequential uses of both `.first` and `.second`
|
||||
- **Output**: Pull request with refactored code
|
||||
|
||||
### 4.10 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.10 Array Parameter Modernization
|
||||
### 4.11 Array Parameter Modernization
|
||||
- **Current**: [Pointer + size parameter pairs]
|
||||
- **Modern**: [std::span usage opportunities]
|
||||
- **Type Safety**: [How span improves API safety]
|
||||
- **Examples**: [Function signatures to update]
|
||||
|
||||
### 4.11 Increment Operator Patterns
|
||||
### 4.12 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
|
||||
### 4.13 Exception Control Flow
|
||||
- **Current Usage**: [Exceptions used for normal control flow]
|
||||
- **Modern Alternatives**: [std::expected, std::optional, error codes]
|
||||
- **Performance**: [Impact of exception-based control flow]
|
||||
- **Refactoring Opportunities**: [Specific patterns to replace]
|
||||
|
||||
### 4.13 Inefficient Stream Output
|
||||
### 4.14 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]
|
||||
|
|
@ -935,6 +1035,28 @@ grep pattern: "return.*nullptr.*&" glob: "src/**/*.{h,cpp}"
|
|||
grep pattern: "bool.*\(.*\*.*\)|bool.*\(.*&" glob: "src/**/*.h"
|
||||
```
|
||||
|
||||
**Find tuple/pair access patterns (structured binding opportunities):**
|
||||
```
|
||||
# Find .first usage
|
||||
grep pattern: "\.first" glob: "src/**/*.{cpp,h}"
|
||||
|
||||
# Find .second usage
|
||||
grep pattern: "\.second" glob: "src/**/*.{cpp,h}"
|
||||
|
||||
# Find same variable used with both .first and .second on same line (high-value candidates)
|
||||
# Note: This only matches single-line patterns where the same var is used; use separate .first/.second searches for comprehensive coverage
|
||||
grep pattern: "([a-z_]+)\.first.*\1\.second" glob: "src/**/*.cpp"
|
||||
|
||||
# Find iterator dereferencing with .first or .second
|
||||
grep pattern: "->first|->second" glob: "src/**/*.cpp"
|
||||
|
||||
# Find return statements using .first and .second
|
||||
grep pattern: "return.*\.first.*\.second" glob: "src/**/*.cpp"
|
||||
|
||||
# Find function calls with .first and .second as arguments (focused pattern)
|
||||
grep pattern: "\([^)]*\.first[^)]*\.second[^)]*\)" glob: "src/**/*.cpp"
|
||||
```
|
||||
|
||||
**Find pointer + size parameters:**
|
||||
```
|
||||
grep pattern: "\([^,]+\*[^,]*,\s*size_t|, unsigned.*size\)" glob: "src/**/*.h"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue