Compare commits

..

3 Commits

Author SHA1 Message Date
Carlos Polop
2113c7bf38 f 2026-02-11 11:37:04 +01:00
Carlos Polop
5ca4115a6b add auto master fix 2026-02-04 11:02:53 +01:00
Carlos Polop
c5a77725db Fix Systemd module generated vars metadata 2026-02-03 23:51:27 +01:00
6 changed files with 250 additions and 223 deletions

View File

@@ -1,4 +1,4 @@
name: CI-master Failure Chack-Agent PR name: CI-master Failure Codex PR
on: on:
workflow_run: workflow_run:
@@ -6,7 +6,7 @@ on:
types: [completed] types: [completed]
jobs: jobs:
chack_agent_fix_master_failure: codex_fix_master_failure:
if: > if: >
${{ github.event.workflow_run.conclusion == 'failure' && ${{ github.event.workflow_run.conclusion == 'failure' &&
github.event.workflow_run.head_branch == 'master' && github.event.workflow_run.head_branch == 'master' &&
@@ -19,8 +19,7 @@ jobs:
actions: read actions: read
env: env:
TARGET_BRANCH: master TARGET_BRANCH: master
FIX_BRANCH: chack-agent/ci-master-fix-${{ github.event.workflow_run.id }} FIX_BRANCH: codex/ci-master-fix-${{ github.event.workflow_run.id }}
CHACK_LOGS_HTTP_URL: ${{ secrets.CHACK_LOGS_HTTP_URL }}
steps: steps:
- name: Checkout failing commit - name: Checkout failing commit
uses: actions/checkout@v5 uses: actions/checkout@v5
@@ -28,12 +27,12 @@ jobs:
ref: ${{ github.event.workflow_run.head_sha }} ref: ${{ github.event.workflow_run.head_sha }}
fetch-depth: 0 fetch-depth: 0
persist-credentials: true persist-credentials: true
token: ${{ secrets.CHACK_AGENT_FIXER_TOKEN || github.token }} token: ${{ secrets.CODEX_FIXER_TOKEN }}
- name: Configure git author - name: Configure git author
run: | run: |
git config user.name "chack-agent" git config user.name "codex-action"
git config user.email "chack-agent@users.noreply.github.com" git config user.email "codex-action@users.noreply.github.com"
- name: Create fix branch - name: Create fix branch
run: git checkout -b "$FIX_BRANCH" run: git checkout -b "$FIX_BRANCH"
@@ -43,7 +42,7 @@ jobs:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}
RUN_ID: ${{ github.event.workflow_run.id }} RUN_ID: ${{ github.event.workflow_run.id }}
run: | run: |
failed_logs_file="$(pwd)/chack_failed_steps_logs.txt" failed_logs_file="$(pwd)/codex_failed_steps_logs.txt"
if gh run view "$RUN_ID" --repo "${{ github.repository }}" --log-failed > "$failed_logs_file"; then if gh run view "$RUN_ID" --repo "${{ github.repository }}" --log-failed > "$failed_logs_file"; then
if [ ! -s "$failed_logs_file" ]; then if [ ! -s "$failed_logs_file" ]; then
echo "No failed step logs were returned by gh run view --log-failed." > "$failed_logs_file" echo "No failed step logs were returned by gh run view --log-failed." > "$failed_logs_file"
@@ -71,11 +70,11 @@ jobs:
lines.append("") lines.append("")
summary = "\n".join(lines).strip() or "No failing job details found." summary = "\n".join(lines).strip() or "No failing job details found."
with open('chack_failure_summary.txt', 'w') as handle: with open('codex_failure_summary.txt', 'w') as handle:
handle.write(summary) handle.write(summary)
PY PY
- name: Create Chack Agent prompt - name: Create Codex prompt
env: env:
RUN_URL: ${{ github.event.workflow_run.html_url }} RUN_URL: ${{ github.event.workflow_run.html_url }}
HEAD_SHA: ${{ github.event.workflow_run.head_sha }} HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
@@ -87,7 +86,7 @@ jobs:
echo "The target branch for the final PR is: ${TARGET_BRANCH}" echo "The target branch for the final PR is: ${TARGET_BRANCH}"
echo "" echo ""
echo "Failure summary:" echo "Failure summary:"
cat chack_failure_summary.txt cat codex_failure_summary.txt
echo "" echo ""
echo "Failed-step logs file absolute path (local runner): ${FAILED_LOGS_PATH}" echo "Failed-step logs file absolute path (local runner): ${FAILED_LOGS_PATH}"
echo "Read that file to inspect the exact failing logs." echo "Read that file to inspect the exact failing logs."
@@ -95,34 +94,71 @@ jobs:
echo "Please identify the cause, apply an easy, simple and minimal fix, and update files accordingly." echo "Please identify the cause, apply an easy, simple and minimal fix, and update files accordingly."
echo "Run any fast checks you can locally (no network)." echo "Run any fast checks you can locally (no network)."
echo "Leave the repo in a state ready to commit; changes will be committed and pushed automatically." echo "Leave the repo in a state ready to commit; changes will be committed and pushed automatically."
} > chack_prompt.txt } > codex_prompt.txt
- name: Set up Node.js for Codex - name: Set up Python
uses: actions/setup-node@v5 uses: actions/setup-python@v5
with: with:
node-version: "20" python-version: "3.11"
- name: Install Codex CLI - name: Install chack-agent
run: | run: |
npm install -g @openai/codex python -m pip install --upgrade pip
codex --version python -m pip install -e chack-agent
- name: Run Chack Agent - name: Run Chack Agent
id: run_chack id: run_codex
uses: carlospolop/chack-agent@master env:
with: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
provider: codex INPUT_PROVIDER: openai
model_primary: CHEAP_BUT_QUALITY INPUT_MODEL_PRIMARY: gpt-5.2-codex
main_action: peass-ng INPUT_SYSTEM_PROMPT: You are an advanced research agent.
sub_action: CI-master Failure Chack-Agent PR run: |
system_prompt: | python - <<'PY' > chack_output.txt
Diagnose the failing gh actions workflow, propose the minimal and effective safe fix, and implement it. import os
Run only fast, local checks (no network). Leave the repo ready to commit. from chack_agent import (
prompt_file: chack_prompt.txt Chack,
tools_config_json: "{\"exec_enabled\": true}" ChackConfig,
session_config_json: "{\"long_term_memory_enabled\": false}" ModelConfig,
agent_config_json: "{\"self_critique_enabled\": false, \"require_task_list_init_first\": true}" AgentConfig,
openai_api_key: ${{ secrets.OPENAI_API_KEY }} SessionConfig,
ToolsConfig,
CredentialsConfig,
LoggingConfig,
)
with open("codex_prompt.txt", "r", encoding="utf-8") as handle:
user_prompt = handle.read()
config = ChackConfig(
model=ModelConfig(
primary=os.environ.get("INPUT_MODEL_PRIMARY", "gpt-5.2-codex"),
provider=os.environ.get("INPUT_PROVIDER", "openai"),
),
agent=AgentConfig(
main_action="github_action",
sub_action="run",
),
session=SessionConfig(),
tools=ToolsConfig(exec_enabled=True),
credentials=CredentialsConfig(
openai_api_key=os.environ.get("OPENAI_API_KEY", ""),
),
logging=LoggingConfig(level="INFO"),
system_prompt=os.environ.get("INPUT_SYSTEM_PROMPT", "You are an advanced research agent."),
env={},
)
agent = Chack(config)
result = agent.run(session_id="github-action", text=user_prompt)
print(result.output)
PY
{
echo "final-message<<EOF"
cat chack_output.txt
echo "EOF"
} >> "$GITHUB_OUTPUT"
- name: Commit and push fix branch if changed - name: Commit and push fix branch if changed
id: push_fix id: push_fix
@@ -133,51 +169,33 @@ jobs:
exit 0 exit 0
fi fi
rm -f chack_failure_summary.txt chack_prompt.txt chack_failed_steps_logs.txt rm -f codex_failure_summary.txt codex_prompt.txt codex_failed_steps_logs.txt chack_output.txt
git add -A git add -A
# Avoid workflow-file pushes with token scopes that cannot write workflows. git reset -- codex_failure_summary.txt codex_prompt.txt codex_failed_steps_logs.txt chack_output.txt
git reset -- .github/workflows || true
git checkout -- .github/workflows || true
git clean -fdx -- .github/workflows || true
git reset -- chack_failure_summary.txt chack_prompt.txt chack_failed_steps_logs.txt
if git diff --cached --name-only | grep -q '^.github/workflows/'; then
echo "Workflow-file changes are still staged; skipping push without workflows permission."
echo "pushed=false" >> "$GITHUB_OUTPUT"
exit 0
fi
if git diff --cached --quiet; then
echo "No committable changes left after filtering."
echo "pushed=false" >> "$GITHUB_OUTPUT"
exit 0
fi
git commit -m "Fix CI-master failures for run #${{ github.event.workflow_run.id }}" git commit -m "Fix CI-master failures for run #${{ github.event.workflow_run.id }}"
if ! git push origin HEAD:"$FIX_BRANCH"; then git push origin HEAD:"$FIX_BRANCH"
echo "Push failed (likely token workflow permission limits); skipping PR creation."
echo "pushed=false" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "pushed=true" >> "$GITHUB_OUTPUT" echo "pushed=true" >> "$GITHUB_OUTPUT"
- name: Create PR to master - name: Create PR to master
if: ${{ steps.push_fix.outputs.pushed == 'true' }} if: ${{ steps.push_fix.outputs.pushed == 'true' }}
id: create_pr id: create_pr
env: env:
GH_TOKEN: ${{ secrets.CHACK_AGENT_FIXER_TOKEN || github.token }} GH_TOKEN: ${{ secrets.CODEX_FIXER_TOKEN }}
RUN_URL: ${{ github.event.workflow_run.html_url }} RUN_URL: ${{ github.event.workflow_run.html_url }}
run: | run: |
pr_url=$(gh pr create \ pr_url=$(gh pr create \
--title "Fix CI-master_test failure (run #${{ github.event.workflow_run.id }})" \ --title "Fix CI-master_test failure (run #${{ github.event.workflow_run.id }})" \
--body "Automated Chack Agent fix for failing CI-master_test run: ${RUN_URL}" \ --body "Automated Codex fix for failing CI-master_test run: ${RUN_URL}" \
--base "$TARGET_BRANCH" \ --base "$TARGET_BRANCH" \
--head "$FIX_BRANCH") --head "$FIX_BRANCH")
echo "url=$pr_url" >> "$GITHUB_OUTPUT" echo "url=$pr_url" >> "$GITHUB_OUTPUT"
- name: Comment on created PR with Chack Agent result - name: Comment on created PR with Codex result
if: ${{ steps.push_fix.outputs.pushed == 'true' && steps.run_chack.outputs.final-message != '' }} if: ${{ steps.push_fix.outputs.pushed == 'true' && steps.run_codex.outputs.final-message != '' }}
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:
PR_URL: ${{ steps.create_pr.outputs.url }} PR_URL: ${{ steps.create_pr.outputs.url }}
CHACK_MESSAGE: ${{ steps.run_chack.outputs.final-message }} CODEX_MESSAGE: ${{ steps.run_codex.outputs.final-message }}
with: with:
github-token: ${{ github.token }} github-token: ${{ github.token }}
script: | script: |
@@ -191,5 +209,5 @@ jobs:
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
issue_number: Number(match[1]), issue_number: Number(match[1]),
body: process.env.CHACK_MESSAGE, body: process.env.CODEX_MESSAGE,
}); });

View File

@@ -1,4 +1,4 @@
name: Chack-Agent PR Triage name: Codex PR Triage
on: on:
workflow_run: workflow_run:
@@ -6,14 +6,12 @@ on:
types: [completed] types: [completed]
jobs: jobs:
chack_agent_triage: codex_triage:
if: ${{ github.event.workflow_run.conclusion == 'success' }} if: ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: write contents: write
pull-requests: write pull-requests: write
env:
CHACK_LOGS_HTTP_URL: ${{ secrets.CHACK_LOGS_HTTP_URL }}
outputs: outputs:
should_run: ${{ steps.gate.outputs.should_run }} should_run: ${{ steps.gate.outputs.should_run }}
pr_number: ${{ steps.gate.outputs.pr_number }} pr_number: ${{ steps.gate.outputs.pr_number }}
@@ -82,82 +80,110 @@ jobs:
${{ steps.gate.outputs.base_ref }} \ ${{ steps.gate.outputs.base_ref }} \
+refs/pull/${{ steps.gate.outputs.pr_number }}/head +refs/pull/${{ steps.gate.outputs.pr_number }}/head
- name: Set up Node.js for Codex - name: Set up Python
if: ${{ steps.gate.outputs.should_run == 'true' }} if: ${{ steps.gate.outputs.should_run == 'true' }}
uses: actions/setup-node@v5 uses: actions/setup-python@v5
with: with:
node-version: "20" python-version: "3.11"
- name: Install Codex CLI - name: Install chack-agent
if: ${{ steps.gate.outputs.should_run == 'true' }} if: ${{ steps.gate.outputs.should_run == 'true' }}
run: | run: |
npm install -g @openai/codex python -m pip install --upgrade pip
codex --version python -m pip install -e chack-agent
- name: Run Chack Agent - name: Run Chack Agent
id: run_chack id: run_codex
if: ${{ steps.gate.outputs.should_run == 'true' }} if: ${{ steps.gate.outputs.should_run == 'true' }}
uses: carlospolop/chack-agent@master env:
with: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
provider: codex INPUT_PROVIDER: openai
model_primary: CHEAP_BUT_QUALITY INPUT_MODEL_PRIMARY: gpt-5.2-codex
main_action: peass-ng INPUT_SYSTEM_PROMPT: You are an advanced research agent.
sub_action: Chack-Agent PR Triage run: |
system_prompt: | cat <<'EOF' > chack_prompt.txt
You are Chack Agent, an elite PR reviewer for PEASS-ng. You are reviewing PR #${{ steps.gate.outputs.pr_number }} for ${{ github.repository }}.
Be conservative: merge only if changes are simple, safe, and valuable accoding to the uers give guidelines.
If in doubt, comment with clear questions or concerns.
Remember taht you are an autonomouts agent, use the exec tool to run the needed commands to list, read, analyze, modify, test...
tools_config_json: "{\"exec_enabled\": true}"
session_config_json: "{\"long_term_memory_enabled\": false}"
agent_config_json: "{\"self_critique_enabled\": false, \"require_task_list_init_first\": true}"
output_schema_file: .github/chack-agent/pr-merge-schema.json
user_prompt: |
You are reviewing PR #${{ steps.gate.outputs.pr_number }} for ${{ github.repository }}.
Decide whether to merge or comment. Merge only if all of the following are true: Decide whether to merge or comment. Merge only if all of the following are true:
- Changes are simple and safe (no DoS, no long operations, no backdoors). - Changes are simple and safe (no DoS, no long operations, no backdoors).
- Changes follow common PEASS syntax and style without breaking anything and add useful checks or value. - Changes follow common PEASS syntax and style without breaking anything and add useful checks or value.
- Changes simplify code or add new useful checks without breaking anything. - Changes simplify code or add new useful checks without breaking anything.
If you don't have any doubts, and all the previous conditions are met, decide to merge. If you don't have any doubts, and all the previous conditions are met, decide to merge.
If you have serious doubts, choose "comment" and include your doubts or questions. If you have serious doubts, choose "comment" and include your doubts or questions.
If you decide to merge, include a short rationale. If you decide to merge, include a short rationale.
Pull request title and body: Pull request title and body:
---- ----
${{ steps.gate.outputs.pr_title }} ${{ steps.gate.outputs.pr_title }}
${{ steps.gate.outputs.pr_body }} ${{ steps.gate.outputs.pr_body }}
Review ONLY the changes introduced by the PR: Review ONLY the changes introduced by the PR:
git log --oneline ${{ steps.gate.outputs.base_sha }}...${{ steps.gate.outputs.head_sha }} git log --oneline ${{ steps.gate.outputs.base_sha }}...${{ steps.gate.outputs.head_sha }}
Output JSON only, following the provided schema: Output JSON only, following the provided schema:
.github/chack-agent/pr-merge-schema.json .github/codex/pr-merge-schema.json
openai_api_key: ${{ secrets.OPENAI_API_KEY }} EOF
- name: Parse Chack Agent decision python - <<'PY' > chack_output.txt
import os
from chack_agent import (
Chack,
ChackConfig,
ModelConfig,
AgentConfig,
SessionConfig,
ToolsConfig,
CredentialsConfig,
LoggingConfig,
)
with open("chack_prompt.txt", "r", encoding="utf-8") as handle:
user_prompt = handle.read()
config = ChackConfig(
model=ModelConfig(
primary=os.environ.get("INPUT_MODEL_PRIMARY", "gpt-5.2-codex"),
provider=os.environ.get("INPUT_PROVIDER", "openai"),
),
agent=AgentConfig(
main_action="github_action",
sub_action="run",
),
session=SessionConfig(),
tools=ToolsConfig(exec_enabled=True),
credentials=CredentialsConfig(
openai_api_key=os.environ.get("OPENAI_API_KEY", ""),
),
logging=LoggingConfig(level="INFO"),
system_prompt=os.environ.get("INPUT_SYSTEM_PROMPT", "You are an advanced research agent."),
env={},
)
agent = Chack(config)
result = agent.run(session_id="github-action", text=user_prompt)
print(result.output)
PY
{
echo "final-message<<EOF"
cat chack_output.txt
echo "EOF"
} >> "$GITHUB_OUTPUT"
- name: Parse Codex decision
id: parse id: parse
if: ${{ steps.gate.outputs.should_run == 'true' }} if: ${{ steps.gate.outputs.should_run == 'true' }}
env: env:
CHACK_MESSAGE: ${{ steps.run_chack.outputs.final-message }} CODEX_MESSAGE: ${{ steps.run_codex.outputs.final-message }}
run: | run: |
python3 - <<'PY' python3 - <<'PY'
import json import json
import os import os
raw = (os.environ.get('CHACK_MESSAGE', '') or '').strip() data = json.loads(os.environ.get('CODEX_MESSAGE', '') or '{}')
decision = 'comment' decision = data.get('decision', 'comment')
message = 'Chack Agent did not provide details.' message = data.get('message', '').strip() or 'Codex did not provide details.'
try:
data = json.loads(raw or '{}')
if isinstance(data, dict):
decision = data.get('decision', 'comment')
message = data.get('message', '').strip() or message
else:
message = raw or message
except Exception:
message = raw or message
with open(os.environ['GITHUB_OUTPUT'], 'a') as handle: with open(os.environ['GITHUB_OUTPUT'], 'a') as handle:
handle.write(f"decision={decision}\n") handle.write(f"decision={decision}\n")
handle.write("message<<EOF\n") handle.write("message<<EOF\n")
@@ -167,31 +193,31 @@ jobs:
merge_or_comment: merge_or_comment:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: chack_agent_triage needs: codex_triage
if: ${{ github.event.workflow_run.conclusion == 'success' && needs.chack_agent_triage.outputs.should_run == 'true' && needs.chack_agent_triage.outputs.decision != '' }} if: ${{ github.event.workflow_run.conclusion == 'success' && needs.codex_triage.outputs.should_run == 'true' && needs.codex_triage.outputs.decision != '' }}
permissions: permissions:
contents: write contents: write
pull-requests: write pull-requests: write
steps: steps:
- name: Merge PR when approved - name: Merge PR when approved
if: ${{ needs.chack_agent_triage.outputs.decision == 'merge' }} if: ${{ needs.codex_triage.outputs.decision == 'merge' }}
env: env:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}
PR_NUMBER: ${{ needs.chack_agent_triage.outputs.pr_number }} PR_NUMBER: ${{ needs.codex_triage.outputs.pr_number }}
run: | run: |
gh api \ gh api \
-X PUT \ -X PUT \
-H "Accept: application/vnd.github+json" \ -H "Accept: application/vnd.github+json" \
/repos/${{ github.repository }}/pulls/${PR_NUMBER}/merge \ /repos/${{ github.repository }}/pulls/${PR_NUMBER}/merge \
-f merge_method=squash \ -f merge_method=squash \
-f commit_title="Auto-merge PR #${PR_NUMBER} (Chack Agent)" -f commit_title="Auto-merge PR #${PR_NUMBER} (Codex)"
- name: Comment with doubts - name: Comment with doubts
if: ${{ needs.chack_agent_triage.outputs.decision == 'comment' }} if: ${{ needs.codex_triage.outputs.decision == 'comment' }}
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:
PR_NUMBER: ${{ needs.chack_agent_triage.outputs.pr_number }} PR_NUMBER: ${{ needs.codex_triage.outputs.pr_number }}
CHACK_MESSAGE: ${{ needs.chack_agent_triage.outputs.message }} CODEX_MESSAGE: ${{ needs.codex_triage.outputs.message }}
with: with:
github-token: ${{ github.token }} github-token: ${{ github.token }}
script: | script: |
@@ -199,5 +225,5 @@ jobs:
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
issue_number: Number(process.env.PR_NUMBER), issue_number: Number(process.env.PR_NUMBER),
body: process.env.CHACK_MESSAGE, body: process.env.CODEX_MESSAGE,
}); });

View File

@@ -1,4 +1,4 @@
name: PR Failure Chack-Agent Dispatch name: PR Failure Codex Dispatch
on: on:
workflow_run: workflow_run:
@@ -41,8 +41,8 @@ jobs:
pr_labels=$(gh api -H "Accept: application/vnd.github+json" \ pr_labels=$(gh api -H "Accept: application/vnd.github+json" \
/repos/${{ github.repository }}/issues/${PR_NUMBER} \ /repos/${{ github.repository }}/issues/${PR_NUMBER} \
--jq '.labels[].name') --jq '.labels[].name')
if echo "$pr_labels" | grep -q "^chack-agent-fix-attempted$"; then if echo "$pr_labels" | grep -q "^codex-fix-attempted$"; then
echo "chack-agent fix already attempted for PR #${PR_NUMBER}; skipping." echo "codex fix already attempted for PR #${PR_NUMBER}; skipping."
should_run=false should_run=false
else else
should_run=true should_run=true
@@ -55,7 +55,7 @@ jobs:
echo "should_run=${should_run}" echo "should_run=${should_run}"
} >> "$GITHUB_OUTPUT" } >> "$GITHUB_OUTPUT"
chack_agent_on_failure: codex_on_failure:
needs: resolve_pr_context needs: resolve_pr_context
if: ${{ needs.resolve_pr_context.outputs.author == 'carlospolop' && needs.resolve_pr_context.outputs.should_run == 'true' }} if: ${{ needs.resolve_pr_context.outputs.author == 'carlospolop' && needs.resolve_pr_context.outputs.should_run == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -64,8 +64,6 @@ jobs:
pull-requests: write pull-requests: write
issues: write issues: write
actions: read actions: read
env:
CHACK_LOGS_HTTP_URL: ${{ secrets.CHACK_LOGS_HTTP_URL }}
steps: steps:
- name: Comment on PR with failure info - name: Comment on PR with failure info
uses: actions/github-script@v7 uses: actions/github-script@v7
@@ -77,7 +75,7 @@ jobs:
github-token: ${{ github.token }} github-token: ${{ github.token }}
script: | script: |
const prNumber = Number(process.env.PR_NUMBER); const prNumber = Number(process.env.PR_NUMBER);
const body = `PR #${prNumber} had a failing workflow "${process.env.WORKFLOW_NAME}".\n\nRun: ${process.env.RUN_URL}\n\nLaunching Chack Agent to attempt a fix.`; const body = `PR #${prNumber} had a failing workflow "${process.env.WORKFLOW_NAME}".\n\nRun: ${process.env.RUN_URL}\n\nLaunching Codex to attempt a fix.`;
await github.rest.issues.createComment({ await github.rest.issues.createComment({
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
@@ -92,7 +90,7 @@ jobs:
run: | run: |
gh api -X POST -H "Accept: application/vnd.github+json" \ gh api -X POST -H "Accept: application/vnd.github+json" \
/repos/${{ github.repository }}/issues/${PR_NUMBER}/labels \ /repos/${{ github.repository }}/issues/${PR_NUMBER}/labels \
-f labels[]=chack-agent-fix-attempted -f labels[]=codex-fix-attempted
- name: Checkout PR head - name: Checkout PR head
uses: actions/checkout@v5 uses: actions/checkout@v5
@@ -101,12 +99,12 @@ jobs:
ref: ${{ github.event.workflow_run.head_sha }} ref: ${{ github.event.workflow_run.head_sha }}
fetch-depth: 0 fetch-depth: 0
persist-credentials: true persist-credentials: true
token: ${{ secrets.CHACK_AGENT_FIXER_TOKEN || github.token }} token: ${{ secrets.CODEX_FIXER_TOKEN }}
- name: Configure git author - name: Configure git author
run: | run: |
git config user.name "chack-agent" git config user.name "codex-action"
git config user.email "chack-agent@users.noreply.github.com" git config user.email "codex-action@users.noreply.github.com"
- name: Fetch failure summary - name: Fetch failure summary
env: env:
@@ -131,11 +129,11 @@ jobs:
lines.append("") lines.append("")
summary = "\n".join(lines).strip() or "No failing job details found." summary = "\n".join(lines).strip() or "No failing job details found."
with open('chack_failure_summary.txt', 'w') as handle: with open('codex_failure_summary.txt', 'w') as handle:
handle.write(summary) handle.write(summary)
PY PY
- name: Create Chack Agent prompt - name: Create Codex prompt
env: env:
PR_NUMBER: ${{ needs.resolve_pr_context.outputs.number }} PR_NUMBER: ${{ needs.resolve_pr_context.outputs.number }}
RUN_URL: ${{ github.event.workflow_run.html_url }} RUN_URL: ${{ github.event.workflow_run.html_url }}
@@ -147,40 +145,76 @@ jobs:
echo "The PR branch is: ${HEAD_BRANCH}" echo "The PR branch is: ${HEAD_BRANCH}"
echo "" echo ""
echo "Failure summary:" echo "Failure summary:"
cat chack_failure_summary.txt cat codex_failure_summary.txt
echo "" echo ""
echo "Please identify the cause, apply a easy, simple and minimal fix, and update files accordingly." echo "Please identify the cause, apply a easy, simple and minimal fix, and update files accordingly."
echo "Run any fast checks you can locally (no network)." echo "Run any fast checks you can locally (no network)."
echo "Leave the repo in a state ready to commit as when you finish, it'll be automatically committed and pushed." echo "Leave the repo in a state ready to commit as when you finish, it'll be automatically committed and pushed."
} > chack_prompt.txt } > codex_prompt.txt
- name: Set up Node.js for Codex - name: Set up Python
uses: actions/setup-node@v5 uses: actions/setup-python@v5
with: with:
node-version: "20" python-version: "3.11"
- name: Install Codex CLI - name: Install chack-agent
run: | run: |
npm install -g @openai/codex python -m pip install --upgrade pip
codex --version python -m pip install -e chack-agent
- name: Run Chack Agent - name: Run Chack Agent
id: run_chack id: run_codex
uses: carlospolop/chack-agent@master env:
with: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
provider: codex INPUT_PROVIDER: openai
model_primary: CHEAP_BUT_QUALITY INPUT_MODEL_PRIMARY: gpt-5.2-codex
main_action: peass-ng INPUT_SYSTEM_PROMPT: You are an advanced research agent.
sub_action: PR Failure Chack-Agent Dispatch run: |
system_prompt: | python - <<'PY' > chack_output.txt
You are Chack Agent, an elite CI-fix engineer. import os
Diagnose the failing workflow, propose the minimal safe fix, and implement it. from chack_agent import (
Run only fast, local checks (no network). Leave the repo ready to commit. Chack,
prompt_file: chack_prompt.txt ChackConfig,
tools_config_json: "{\"exec_enabled\": true}" ModelConfig,
session_config_json: "{\"long_term_memory_enabled\": false}" AgentConfig,
agent_config_json: "{\"self_critique_enabled\": false, \"require_task_list_init_first\": true}" SessionConfig,
openai_api_key: ${{ secrets.OPENAI_API_KEY }} ToolsConfig,
CredentialsConfig,
LoggingConfig,
)
with open("codex_prompt.txt", "r", encoding="utf-8") as handle:
user_prompt = handle.read()
config = ChackConfig(
model=ModelConfig(
primary=os.environ.get("INPUT_MODEL_PRIMARY", "gpt-5.2-codex"),
provider=os.environ.get("INPUT_PROVIDER", "openai"),
),
agent=AgentConfig(
main_action="github_action",
sub_action="run",
),
session=SessionConfig(),
tools=ToolsConfig(exec_enabled=True),
credentials=CredentialsConfig(
openai_api_key=os.environ.get("OPENAI_API_KEY", ""),
),
logging=LoggingConfig(level="INFO"),
system_prompt=os.environ.get("INPUT_SYSTEM_PROMPT", "You are an advanced research agent."),
env={},
)
agent = Chack(config)
result = agent.run(session_id="github-action", text=user_prompt)
print(result.output)
PY
{
echo "final-message<<EOF"
cat chack_output.txt
echo "EOF"
} >> "$GITHUB_OUTPUT"
- name: Commit and push if changed - name: Commit and push if changed
env: env:
@@ -191,33 +225,18 @@ jobs:
echo "No changes to commit." echo "No changes to commit."
exit 0 exit 0
fi fi
rm -f chack_failure_summary.txt chack_prompt.txt rm -f codex_failure_summary.txt codex_prompt.txt chack_output.txt
git add -A git add -A
# Avoid workflow-file pushes with token scopes that cannot write workflows. git reset -- codex_failure_summary.txt codex_prompt.txt chack_output.txt
git reset -- .github/workflows || true
git checkout -- .github/workflows || true
git clean -fdx -- .github/workflows || true
git reset -- chack_failure_summary.txt chack_prompt.txt
if git diff --cached --name-only | grep -q '^.github/workflows/'; then
echo "Workflow-file changes are still staged; skipping push without workflows permission."
exit 0
fi
if git diff --cached --quiet; then
echo "No committable changes left after filtering."
exit 0
fi
git commit -m "Fix CI failures for PR #${PR_NUMBER}" git commit -m "Fix CI failures for PR #${PR_NUMBER}"
if ! git push origin HEAD:${TARGET_BRANCH}; then git push origin HEAD:${TARGET_BRANCH}
echo "Push failed (likely token workflow permission limits); leaving run successful without push."
exit 0
fi
- name: Comment with Chack Agent result - name: Comment with Codex result
if: ${{ steps.run_chack.outputs.final-message != '' }} if: ${{ steps.run_codex.outputs.final-message != '' }}
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:
PR_NUMBER: ${{ needs.resolve_pr_context.outputs.number }} PR_NUMBER: ${{ needs.resolve_pr_context.outputs.number }}
CHACK_MESSAGE: ${{ steps.run_chack.outputs.final-message }} CODEX_MESSAGE: ${{ steps.run_codex.outputs.final-message }}
with: with:
github-token: ${{ github.token }} github-token: ${{ github.token }}
script: | script: |
@@ -225,5 +244,5 @@ jobs:
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
issue_number: Number(process.env.PR_NUMBER), issue_number: Number(process.env.PR_NUMBER),
body: process.env.CHACK_MESSAGE, body: process.env.CODEX_MESSAGE,
}); });

View File

@@ -1,36 +0,0 @@
# Title: Users Information - subuid/subgid mappings
# ID: UG_Subuid_subgid_mappings
# Author: Carlos Polop
# Last Update: 13-02-2026
# Description: Show delegated user namespace ID ranges from /etc/subuid and /etc/subgid.
# License: GNU GPL
# Version: 1.0
# Functions Used: print_2title
# Global Variables: $MACPEAS
# Initial Functions:
# Generated Global Variables:
# Fat linpeas: 0
# Small linpeas: 1
print_2title "User namespace mappings (subuid/subgid)"
if [ "$MACPEAS" ]; then
echo "Not applicable on macOS"
else
if [ -r /etc/subuid ]; then
echo "subuid:"
grep -v -E '^\s*#|^\s*$' /etc/subuid 2>/dev/null
else
echo "/etc/subuid not readable or not present"
fi
if [ -r /etc/subgid ]; then
echo ""
echo "subgid:"
grep -v -E '^\s*#|^\s*$' /etc/subgid 2>/dev/null
else
echo "/etc/subgid not readable or not present"
fi
fi
echo ""

View File

@@ -46,7 +46,7 @@ class LinpeasBuilder:
def build(self): def build(self):
print("[+] Building variables...") print("[+] Building variables...")
variables = self.__generate_variabless() variables = self.__generate_variables()
self.__replace_mark(PEAS_VARIABLES_MARKUP, variables, "") self.__replace_mark(PEAS_VARIABLES_MARKUP, variables, "")
if len(re.findall(r"PSTORAGE_[a-zA-Z0-9_]+", self.linpeas_sh)) > 1: #Only add storages if there are storages (PSTORAGE_BACKUPS is always there so it doesn't count) if len(re.findall(r"PSTORAGE_[a-zA-Z0-9_]+", self.linpeas_sh)) > 1: #Only add storages if there are storages (PSTORAGE_BACKUPS is always there so it doesn't count)