diff --git a/CHANGELOG.md b/CHANGELOG.md index 46c9a70..d94e76e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,11 +11,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Project `.cora.yaml` can no longer redirect your API key.** `provider.base_url` from a discovered project config is ignored unless `CORA_TRUST_PROJECT_CONFIG=1`; `base_url` must be `https` (plain `http` only for loopback); LLM error bodies echoed to the terminal are length-capped (#563). - **Hardened `cora upgrade` and `install.sh`.** Checksums are matched by exact filename; downloads go to a random 0700 temp dir; only the single `cora` binary entry is extracted (symlink/hardlink entries are rejected); every request has a timeout and a size cap; the version probe does not follow redirects and the tag is validated. `CORA_UPGRADE_SKIP_CHECKSUM` now also requires `CORA_UPGRADE_I_UNDERSTAND=1`. `install.sh` fails closed when the checksums file or entry is missing (opt out with `CORA_SKIP_CHECKSUM=1`) and falls back to `shasum -a 256` (#572). +- **`install.sh` requests now have timeouts and size caps.** Every `curl` call sets `--connect-timeout`, `--max-time` and `--max-filesize` (256 MiB archive, 1 MiB checksums/API JSON), matching `cora upgrade`, so a stalled or hostile server cannot hang or flood the installer (#580). - **Hardened LLM response handling.** Review and scan system prompts tell the model to treat diff content as untrusted data; the diff fence is longer than any backtick run in the diff; the SSE stream errors on a line over 1 MiB or more than 16 MiB of content (#573). - **Secrets in test and doc files are no longer invisible to the static security scanner.** Test and doc paths still skip the noisy general rules but now run high-confidence checks (AWS keys, private-key headers, GitHub/Slack/Stripe live tokens; values containing `EXAMPLE` are ignored) (#573). ### Fixed +- **`cora watch` reindexed every source file on each cycle.** Change detection now reindexes only files that changed, and `--filter` restricts what is indexed instead of only gating the trigger (#578, #584). +- **Secrets in test, fixture and example files were skipped entirely by the secrets scanner.** High-confidence secrets are now reported in those paths too (#579, #583). +- **`cora findings list --severity` never matched, and severity colouring never applied.** Both are now case-insensitive (#586, #588). +- **Unit tests wrote to the real data directory and could block on the global vector index lock.** Tests are isolated from the real data dir, and the lock wait is bounded (#587, #589). - **`cora affected` never matched naming-convention tests.** The CLI took the file extension (`rs`) as the file stem. CLI and MCP now share one query, with escaped `LIKE` wildcards, batched queries and one deduplicated pattern list (`{stem}_test`, `test_{stem}`, `{stem}.test`, `{stem}.spec`, `tests/{stem}`, `__tests__/{stem}`). MCP dead-code now honors `analysis.entry_point_patterns` like the CLI (#575). - **`cora --config serve` ignored `--config`.** The global option is now passed through (#576). - **MCP `brain_search` ignored the configured embedding backend.** It now resolves the backend from the project config (#576). @@ -34,7 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Patterns without a `/` also match by basename, in `cora scan --include/--exclude` and `watch --filter` too. - An invalid glob matches literally instead of being dropped (#577). - **`cora index --watch` now runs the same watcher as `cora watch`.** It checks every 500 ms (was 2 s), skips hidden directories, and prints `Reindexed: ...` (#576). -- **Internal refactors with no CLI change:** one seam for opening the index (`IndexBridge`, #574), one index-session module (#576), and review split into a deterministic stage testable without an LLM (#577). +- **Internal refactors with no CLI change:** one seam for opening the index (`IndexBridge`, #574), one index-session module (#576), and review split into a deterministic stage testable without an LLM (#577), LLM parse/repair/retry policy unified behind one `Transport` seam (#582), and review-history SQL owned by a single `review_store` module (#585). ## [0.15.0] - 2026-08-31 diff --git a/install.sh b/install.sh index 9f56f08..c83ac67 100755 --- a/install.sh +++ b/install.sh @@ -50,7 +50,7 @@ detect_arch() { # Fallback: the GitHub REST API (subject to 60 req/hour anonymous limit). get_latest_version() { # Try the web redirect first — does not count against the API rate limit. - VERSION=$(curl -sI "https://github.com/${REPO}/releases/latest" \ + VERSION=$(curl -sI --connect-timeout 10 --max-time 30 "https://github.com/${REPO}/releases/latest" \ | grep -i '^location:' \ | sed -E 's|.*/tag/([^[:space:]]+).*|\1|' \ | tr -d '\r') @@ -58,7 +58,7 @@ get_latest_version() { # Fallback to the REST API if the redirect didn't yield a tag. if [ -z "$VERSION" ]; then warn "Redirect lookup failed, falling back to GitHub API..." - VERSION=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" \ + VERSION=$(curl -fsSL --connect-timeout 10 --max-time 30 --max-filesize 1048576 "https://api.github.com/repos/${REPO}/releases/latest" \ | grep '"tag_name":' \ | sed -E 's/.*"([^"]+)".*/\1/') fi @@ -104,7 +104,7 @@ install() { CHECKSUM_FILE="${TEMP_DIR}/checksums-sha256.txt" info "Downloading from: $DOWNLOAD_URL" - if ! curl -fsSL "$DOWNLOAD_URL" -o "$ARCHIVE"; then + if ! curl -fsSL --connect-timeout 10 --max-time 600 --max-filesize 268435456 "$DOWNLOAD_URL" -o "$ARCHIVE"; then error "Failed to download ${ARCHIVE_NAME}" fi @@ -115,7 +115,7 @@ install() { warn "CORA_SKIP_CHECKSUM=1 set - checksum verification DISABLED. The binary is NOT verified." else info "Downloading checksums..." - if ! curl -fsSL "$CHECKSUMS_URL" -o "$CHECKSUM_FILE"; then + if ! curl -fsSL --connect-timeout 10 --max-time 30 --max-filesize 1048576 "$CHECKSUMS_URL" -o "$CHECKSUM_FILE"; then error "Failed to download checksums. Refusing to install an unverified binary (set CORA_SKIP_CHECKSUM=1 to override, unsafe)." fi info "Verifying SHA256 checksum..."