Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
160 commits
Select commit Hold shift + click to select a range
78849c2
fix: use String for issue_type to handle LLM output variations
May 30, 2026
b7c9f43
Merge pull request #22 from ajianaz/fix/issue-type-parsing
ajianaz May 30, 2026
e71de9c
fix: use ~/.cora/ as config dir instead of ~/.config/cora
May 30, 2026
a9293a6
Merge pull request #23 from ajianaz/fix/use-dot-cora-dir
ajianaz May 30, 2026
0226293
feat: implement all v0.1.x open issues (#14-#21)
May 30, 2026
caf41b5
Merge pull request #24 from ajianaz/feat/all-open-issues
ajianaz May 30, 2026
fe0d8bf
feat: add website, upgrade CI/CD workflows
May 30, 2026
08c075c
Merge branch 'develop' into feat/ci-website-deploy
May 30, 2026
c94dbc0
Merge pull request #25 from ajianaz/feat/ci-website-deploy
ajianaz May 30, 2026
3ead2cb
fix: resolve clippy warnings and fmt issues
May 30, 2026
565f08a
Merge pull request #26 from ajianaz/fix/clippy-fmt-warnings
ajianaz May 30, 2026
f586cd9
feat: complete website redesign — Linear-inspired dark theme + animat…
May 30, 2026
b6888f6
Merge pull request #27 from ajianaz/feat/website-redesign
ajianaz May 30, 2026
9c649c6
feat: website v3 — design-engineering spec, oklch tokens, proper spacing
May 30, 2026
7d1f263
Merge pull request #28 from ajianaz/feat/website-v3-design-eng
ajianaz May 30, 2026
c8a8231
feat: add sticky header nav, fix spacing, add 4 docs pages
May 30, 2026
baf1edb
Merge pull request #29 from ajianaz/feat/header-nav-spacing-docs
ajianaz May 30, 2026
d5f24c6
fix: remove self-hosted docs page — CLI is local by default
May 30, 2026
e035d43
Merge pull request #30 from ajianaz/fix/remove-self-hosted-docs
ajianaz May 30, 2026
95dc6b9
fix: QA minor findings — touch targets, terminal width, table mobile
May 30, 2026
4bcddb0
Merge pull request #31 from ajianaz/fix/qa-minor-findings
ajianaz May 30, 2026
0b5f9d4
refactor: convert all inline styles to Tailwind responsive classes
May 30, 2026
5fa9556
Merge pull request #32 from ajianaz/feat/mobile-responsive-tailwind
ajianaz May 30, 2026
f398f8a
fix: adopt 8px grid spacing system based on Linear/Supabase/Vercel re…
May 30, 2026
9cae258
Merge branch 'fix/8px-spacing-system' into develop
May 30, 2026
9191fb6
Merge pull request #33 from ajianaz/fix/8px-spacing-system
ajianaz May 30, 2026
8f07439
refactor: remove all 327 inline styles, convert to Tailwind/CSS classes
May 30, 2026
8456142
Merge pull request #34 from ajianaz/refactor/remove-all-inline-styles
ajianaz May 30, 2026
e89cf5b
fix: QA — remove stale max-width media queries, fix spacing scale refs
May 30, 2026
e7f1e44
Merge pull request #35 from ajianaz/fix/qa-remaining-issues
ajianaz May 30, 2026
537d547
chore: rename crate to cora-cli (crates.io name conflict)
May 30, 2026
8e6cc5d
Merge pull request #36 from ajianaz/chore/rename-crate
ajianaz May 30, 2026
b73b1b0
fix(ci): add id-token write permission for Infisical OIDC
May 30, 2026
d67613c
Merge pull request #37 from ajianaz/fix/oidc-permission
ajianaz May 30, 2026
0e0f102
fix: update README banner to cora-cli branding
May 30, 2026
d42d999
Merge pull request #38 from ajianaz/fix/readme-branding
ajianaz May 30, 2026
a166302
fix: revert README subtitle to original
May 30, 2026
3b6739c
Merge pull request #39 from ajianaz/fix/revert-subtitle
ajianaz May 30, 2026
b36a5a4
feat: replace ASCII art with cinematic eye icon in README
May 30, 2026
3080ed9
merge: resolve conflict with origin/develop
May 30, 2026
6cb4c54
Merge pull request #40 from ajianaz/feat/readme-icon
ajianaz May 30, 2026
bd1d9af
chore: bump version to 0.1.1
May 30, 2026
b03122b
Merge pull request #41 from ajianaz/chore/v0.1.1
ajianaz May 30, 2026
16c8822
fix(ci): add --allow-dirty to cargo publish (Cargo.lock mismatch on t…
May 30, 2026
1caeab1
Merge pull request #42 from ajianaz/fix/publish-allow-dirty
ajianaz May 30, 2026
cd26703
feat: add missing CLI flags + fix all documentation
May 30, 2026
90ff275
fix: resolve clippy format_in_format_args + cargo fmt
May 30, 2026
0bfe809
Merge pull request #43 from ajianaz/feat/docs-fix-and-missing-flags
ajianaz May 30, 2026
2801f59
feat(ci): add cora AI review job to CI pipeline
May 30, 2026
1c59cd9
fix: SARIF schema compliance for GitHub Code Scanning
May 30, 2026
c6eeb2f
Merge pull request #44 from ajianaz/feat/ci-cora-review
ajianaz May 30, 2026
bee45f1
fix(ci): address cora self-review findings
May 30, 2026
207239f
refactor(ci): extract cora review into composite action
May 30, 2026
c58df39
fix(ci): remove || true and cargo build stderr suppress
May 30, 2026
2b4d7c8
Merge pull request #46 from ajianaz/feat/cora-composite-action
ajianaz May 30, 2026
ee822fb
perf: remove unused deps + replace deprecated serde_yaml
May 30, 2026
7696ef7
fix: replace serde_yml (deprecated) with serde_yaml_ng
May 30, 2026
2785246
Merge pull request #48 from ajianaz/chore/deps-audit
ajianaz May 30, 2026
226ab12
fix(ci): normalize release binary naming + sync action (#51)
ajianaz May 31, 2026
a5dc105
chore: bump version to v0.1.2 (#52)
ajianaz May 31, 2026
9820d14
docs: add CI setup guide, cora-review-simple action, website link
May 31, 2026
b3c7e97
Merge pull request #53 from ajianaz/docs/ci-setup-guide
ajianaz May 31, 2026
3ab248f
docs: use cora.ajianaz.dev as website link
May 31, 2026
d9e2860
Merge pull request #54 from ajianaz/docs/website-link-fix
ajianaz May 31, 2026
0cb9f8a
fix: OG tags use cora.ajianaz.dev instead of .com
May 31, 2026
1becc96
Merge pull request #55 from ajianaz/fix/og-url-domain
ajianaz May 31, 2026
6d4774e
feat: add OG image + fix OG tags domain (#56)
ajianaz May 31, 2026
8e10a77
docs: fix all documentation issues — schema, flags, URLs, env vars, s…
ajianaz May 31, 2026
3bf8dc6
docs: add CHANGELOG.md with v0.1.0–v0.1.2 history (#59)
ajianaz May 31, 2026
c607e74
feat: config redesign + severity comparison fix (#61)
ajianaz May 31, 2026
8f4ee4b
chore: prepare v0.1.3 release — docs, website, release workflow (#63)
ajianaz May 31, 2026
4751d18
fix: clippy unnecessary_map_or + update README binary download refs t…
Jun 1, 2026
680e152
Merge pull request #64 from ajianaz/fix/v0.1.3-release
ajianaz Jun 1, 2026
742a53c
fix: release workflow — changelog sed v-prefix + semver validation + …
Jun 1, 2026
45717a1
Merge pull request #65 from ajianaz/fix/release-changelog-extract
ajianaz Jun 1, 2026
67b67e3
fix: hardcoded Infisical identity-id + branding footer on no-issues (…
Jun 1, 2026
1b97a79
Merge pull request #66 from ajianaz/chore/security-and-branding
ajianaz Jun 1, 2026
e12e630
fix: repair invalid LLM JSON escapes + retry on parse failure
Jun 1, 2026
7b343a1
Merge pull request #67 from ajianaz/fix/llm-json-repair-retry
ajianaz Jun 1, 2026
91b221b
release: v0.1.4 — LLM JSON repair, release workflow fixes
Jun 1, 2026
b2f47e3
Merge pull request #68 from ajianaz/release/v0.1.4
ajianaz Jun 1, 2026
1889dea
release: v0.1.5 — critical security & bug fixes from audit
Jun 1, 2026
46ce8d2
Merge pull request #91 from ajianaz/release/v0.1.5
ajianaz Jun 1, 2026
a47f511
feat: enhance default system prompts with anti-hallucination constraints
Jun 1, 2026
cb1303f
feat: inject valid file paths into prompt + post-parse filtering
Jun 1, 2026
502ecae
fix: tighten file path extraction and validation
Jun 1, 2026
d557e8e
fix: use basename match instead of suffix match for file path validation
Jun 1, 2026
0967b79
fix: use exact-only match for file path validation
Jun 1, 2026
2c0b0c7
feat: add response_format and custom system prompt config support
Jun 1, 2026
d48b6ce
test: add tests for response_format and custom system prompt features
Jun 1, 2026
301f265
style: fix formatting (rustfmt)
Jun 1, 2026
c0a85d7
fix: add path traversal guard for system_prompt_file
Jun 1, 2026
d6fb05c
fix: explicit canonicalize error handling + remove duplicate line
Jun 1, 2026
c9eb9ad
fix: canonicalize project root to prevent symlink bypass
Jun 1, 2026
946ba8a
release: v0.1.6
Jun 1, 2026
348a68f
Merge pull request #96 from ajianaz/release/v0.1.6
ajianaz Jun 1, 2026
c931f02
feat: add sha2 dependency for diff-hash caching (#100)
Jun 1, 2026
f4833bc
feat: add LLM config section (temperature, max_tokens, timeout, cache…
Jun 1, 2026
dcee412
feat: use shared HTTP client + config temperature/max_tokens (#98 #99…
Jun 1, 2026
32c4b99
fix: replace expect() with unwrap_or_else fallback in shared HTTP client
Jun 1, 2026
26e33c5
feat: add diff-hash caching for review responses (#100)
Jun 1, 2026
7639c17
feat: wire cache into review pipeline + add --no-cache flag (#100)
Jun 1, 2026
ab16a4a
feat: validate git refs to prevent injection and path traversal (#73)
Jun 1, 2026
379445a
feat: add --no-cache flag to review CLI command (#100)
Jun 1, 2026
dea18b3
fix: save cache after post-processing, not before
Jun 1, 2026
d18ef93
fix: per-request timeout + cache key includes model/temperature
Jun 1, 2026
bca318f
chore: remove unused Duration import
Jun 1, 2026
f78420c
fix: resilient version resolution in composite actions (#102)
Jun 1, 2026
5e9c39d
release: v0.1.7
Jun 1, 2026
58340a9
Merge pull request #103 from ajianaz/release/v0.1.7
ajianaz Jun 1, 2026
2410208
docs: update for v0.1.7 — caching, LLM params, custom prompts, anti-h…
Jun 1, 2026
ace1905
Merge pull request #104 from ajianaz/docs/v0.1.7-update
ajianaz Jun 1, 2026
40832e2
docs: update AGENT.md test count + design decisions
Jun 1, 2026
b0686c4
Merge pull request #105 from ajianaz/chore/agent-update
ajianaz Jun 1, 2026
4e21db7
refactor: extract cora-review to standalone workflow + harden action …
ajianaz Jun 1, 2026
0a13218
fix: v0.1.8 patch batch — 8 quality/security/bug fixes (#109)
ajianaz Jun 1, 2026
52651c6
chore: update logo & favicon to official CodeCora brand assets (#110)
ajianaz Jun 1, 2026
592cda7
release: v0.1.8 (#111)
ajianaz Jun 2, 2026
ed412a9
feat: v0.2 batch — 6 issues + review fixes (#106 #79 #85 #80 #74 #108)
ajianaz Jun 2, 2026
770a365
release: v0.2.0
ajianaz Jun 2, 2026
f38b403
chore: update all repo URLs to codecoradev/cora-cli (#137)
ajianaz Jun 2, 2026
853de51
fix: resolve 104 clippy::pedantic warnings (175→71) (#138)
ajianaz Jun 2, 2026
3d9371a
fix: resolve all remaining clippy pedantic warnings (71→0) (#139)
ajianaz Jun 2, 2026
d11694c
docs: clarify match arm merge in IssueType::from_str (#141)
ajianaz Jun 2, 2026
3d6d457
chore(ci): bump actions & add Node 24 readiness
Jun 2, 2026
1f1e323
fix(ci): fail cora-review job when LLM API fails
Jun 2, 2026
d83964d
Merge pull request #142 from codecoradev/chore/ci-action-updates
ajianaz Jun 2, 2026
925170c
feat: migrate engine layer to thiserror with CoraError enum
Jun 2, 2026
13cb6c8
Merge pull request #143 from codecoradev/feat/thiserror-migration
ajianaz Jun 2, 2026
01d625c
feat: add cora config validate subcommand (#88)
Jun 2, 2026
215eb2f
Merge pull request #144 from codecoradev/feat/config-validate
ajianaz Jun 2, 2026
699ae9a
feat: inject static analysis context into review prompt (#140)
Jun 2, 2026
35f75a2
fix: address cora review findings on static analysis module
Jun 2, 2026
16783f5
fix: use wait_with_output in thread, fix formatting
Jun 2, 2026
c5349ff
fix: block_in_place wrapper, unused_mut, process leak docs
Jun 2, 2026
2b5c76e
Merge pull request #145 from codecoradev/feat/static-analysis-context
ajianaz Jun 2, 2026
a7663c1
release: v0.3.0
Jun 2, 2026
424eb5e
Merge pull request #146 from codecoradev/release/v0.3.0
ajianaz Jun 2, 2026
68ed857
feat: Phase 1 — diff parser + rule engine foundation
Jun 3, 2026
70906e3
feat: Phase 2+3 — file bundling + context chain modules
Jun 3, 2026
32ecbe9
feat: integrate context chain into review pipeline
Jun 3, 2026
eb6f802
fix: clippy lint fixes — dead code suppression, redundant patterns
Jun 3, 2026
b648f81
docs: CHANGELOG — v0.4 features (rules, bundling, context chain)
Jun 3, 2026
f6e3f7e
fix: show deterministic rule findings even when LLM fails
Jun 3, 2026
e103f13
fix: CI compliance — clippy -D warnings + cargo fmt
Jun 3, 2026
c9832fc
feat: default SARIF upload ON + CodeCora branding
Jun 3, 2026
f1558b5
Merge pull request #148 from codecoradev/feat/v0.4-engine
ajianaz Jun 3, 2026
bd7211f
release: v0.4.0
Jun 3, 2026
5c0b35f
Merge pull request #150 from codecoradev/release/v0.4.0
ajianaz Jun 3, 2026
cd74413
feat: on_violation config + --ci mode for hard gating
Jun 3, 2026
946e3b0
fix: cargo fmt — align format! args
Jun 3, 2026
9712741
feat: install.sh + README update — Quick Install, on_violation, --ci …
Jun 3, 2026
397cbe5
Merge pull request #152 from codecoradev/feat/hook-violation-ci-mode
ajianaz Jun 3, 2026
9aa8e99
fix: skip SARIF upload when no findings (avoids CodeCora fail on clea…
Jun 3, 2026
08ad15c
Merge pull request #153 from codecoradev/fix/conditional-sarif-upload
ajianaz Jun 3, 2026
ced1f76
feat: release branch setup + install.sh checksum + release sync
Jun 4, 2026
abcc0f9
fix: address CodeCora review — gate sync-main, add needs, document fo…
Jun 4, 2026
67643bc
Merge pull request #154 from codecoradev/feat/install-improvements
ajianaz Jun 4, 2026
7adf7f8
fix: enable Cora Review on PRs to main branch
Jun 4, 2026
7918db3
Merge pull request #156 from codecoradev/fix/cora-review-main
ajianaz Jun 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
231 changes: 231 additions & 0 deletions .github/actions/cora-review-simple/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
name: 'Cora AI Code Review'
description: 'Run cora AI code review on a PR diff — posts a PR comment. Uses GitHub Secrets directly (no Infisical required). SARIF upload is optional.'

inputs:
base-branch:
description: 'Base branch to compare against (default: origin/develop)'
required: false
default: 'origin/develop'
severity:
description: 'Minimum severity to report (info, minor, major, critical)'
required: false
default: 'major'
cora-version:
description: 'cora-cli version tag (default: latest release)'
required: false
default: 'latest'
upload-sarif:
description: 'Upload SARIF to GitHub Code Scanning (default: false)'
required: false
default: 'false'
cora-api-key:
description: 'LLM API key (from secrets.CORA_API_KEY)'
required: true
cora-base-url:
description: 'LLM API base URL (from secrets.CORA_BASE_URL)'
required: true
cora-model:
description: 'LLM model ID (from secrets.CORA_MODEL)'
required: true
github-token:
description: 'GitHub token for PR comments and SARIF upload'
required: true

runs:
using: 'composite'
steps:
- name: Resolve cora-cli version
id: resolve
shell: bash
run: |
if [ "${{ inputs.cora-version }}" = "latest" ]; then
# Try up to 3 times with delay
for i in 1 2 3; do
VERSION=$(curl -sfL --connect-timeout 10 \
https://api.github.com/repos/codecoradev/cora-cli/releases/latest \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('tag_name', ''))" 2>/dev/null)
if [ -n "$VERSION" ]; then
break
fi
echo "Attempt $i failed, retrying..."
sleep 5
done
# Fallback to a known good version if all retries fail
if [ -z "$VERSION" ]; then
echo "::warning::Failed to resolve latest cora-cli version from GitHub API, using fallback"
VERSION="v0.1.6"
fi
else
VERSION="${{ inputs.cora-version }}"
fi
echo "VERSION=$VERSION" >> "$GITHUB_OUTPUT"
echo "Resolved cora-cli version: $VERSION"

- name: Install cora-cli
shell: bash
run: |
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then
ASSET="cora-x86_64-unknown-linux-gnu"
elif [ "$ARCH" = "aarch64" ]; then
ASSET="cora-aarch64-unknown-linux-gnu"
else
echo "Unsupported architecture: $ARCH"
exit 1
fi
curl -sL "https://github.com/codecoradev/cora-cli/releases/download/${{ steps.resolve.outputs.VERSION }}/${ASSET}-${{ steps.resolve.outputs.VERSION }}.tar.gz" | tar xz -C /usr/local/bin cora
chmod +x /usr/local/bin/cora
cora --version

- name: Run cora review
id: review
shell: bash
env:
CORA_API_KEY: ${{ inputs.cora-api-key }}
CORA_BASE_URL: ${{ inputs.cora-base-url }}
CORA_MODEL: ${{ inputs.cora-model }}
run: |
cora review \
--base ${{ inputs.base-branch }} \
--format sarif \
--severity ${{ inputs.severity }} \
--quiet \
> cora-results.sarif 2>/dev/null
echo "Cora review complete ($(wc -c < cora-results.sarif) bytes)"

- name: Check SARIF for findings
id: sarif-check
if: inputs.upload-sarif == 'true'
shell: bash
run: |
RESULTS=$(python3 -c "
import json, sys
try:
data = json.load(open('cora-results.sarif'))
results = data.get('runs', [{}])[0].get('results', [])
print(len(results))
except:
print(0)
" 2>/dev/null || echo "0")
echo "results=$RESULTS" >> "$GITHUB_OUTPUT"
if [ "$RESULTS" -gt 0 ]; then
echo "SARIF contains $RESULTS finding(s) — will upload."
else
echo "SARIF has no findings — skipping upload."
fi

- name: Upload SARIF to GitHub Code Scanning
if: inputs.upload-sarif == 'true' && steps.sarif-check.outputs.results > 0
continue-on-error: true
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: cora-results.sarif
category: cora-review

- name: Post PR comment
if: always() && github.event_name == 'pull_request'
uses: actions/github-script@v7
env:
GH_TOKEN: ${{ inputs.github-token }}
with:
script: |
const fs = require('fs');

let sarifContent;
try {
sarifContent = JSON.parse(fs.readFileSync('cora-results.sarif', 'utf8'));
} catch (e) {
sarifContent = null;
}

let body;
if (!sarifContent || !sarifContent.runs || sarifContent.runs.length === 0) {
body = `## 🔍 Cora AI Code Review\n\n✅ **No issues found.** Code looks good!`;
} else {
const results = sarifContent.runs[0].results || [];
if (results.length === 0) {
body = `## 🔍 Cora AI Code Review\n\n✅ **No issues found.** Code looks good!`;
} else {
const grouped = {};
for (const r of results) {
const sev = (r.level || 'note').charAt(0).toUpperCase() + (r.level || 'note').slice(1);
if (!grouped[sev]) grouped[sev] = [];
grouped[sev].push(r);
}

const severityOrder = ['Error', 'Warning', 'Note'];
let table = '';

for (const sev of severityOrder) {
if (!grouped[sev]) continue;
const icon = sev === 'Error' ? '🔴' : sev === 'Warning' ? '🟡' : '🔵';
table += `\n### ${icon} ${sev} (${grouped[sev].length})\n\n`;
for (const r of grouped[sev]) {
const loc = r.locations?.[0]?.physicalLocation;
const file = loc?.artifactLocation?.uri || 'unknown';
const line = loc?.region?.startLine || '?';
const msg = r.message?.text || r.message?.markdown || 'No message';
table += `- \`${file}:${line}\` — ${msg}\n`;
}
}

const hasErrors = (grouped['Error'] || []).length > 0;
const hasWarnings = (grouped['Warning'] || []).length > 0;
const status = hasErrors ? '❌ **Blocked** — critical issues found.' :
hasWarnings ? '⚠️ **Review recommended** — warnings found.' :
'✅ **Passed** — only informational notes.';

body = `## 🔍 Cora AI Code Review\n\n${status}\n${table}\n---\n_Review powered by [cora-cli](https://github.com/codecoradev/cora-cli) · BYOK · MIT_`;
}
}

// Find existing cora comment and update it, or create new
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});

const existing = comments.find(c =>
c.user.login === 'github-actions[bot]' &&
c.body.startsWith('## 🔍 Cora AI Code Review')
);

if (existing) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existing.id,
body,
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body,
});
}

- name: Check for blocking issues
if: always()
shell: bash
run: |
if [ -f cora-results.sarif ]; then
ERRORS=$(python3 -c "
import json, sys
try:
data = json.load(open('cora-results.sarif'))
results = data.get('runs', [{}])[0].get('results', [])
errors = [r for r in results if r.get('level') == 'error']
print(len(errors))
except:
print(0)
" 2>/dev/null || echo "0")

if [ "$ERRORS" -gt 0 ]; then
echo "::error::Cora found $ERRORS blocking issue(s)."
exit 1
fi
fi
echo "No blocking issues."
Loading