fix(install): validate git/glibc upfront and tighten Gemini hook checks - #54
Conversation
…not run Harden installers so Ubuntu 20.04/WSL2 glibc mismatches and missing git are caught before reporting success. Tighten Gemini hook status checks and restart guidance so attribution gaps are easier to diagnose. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
🔴 Autter review in progress — running security, correctness & dependency checks on this PR. Follow live step-by-step progress on the autter/review-gate check in the merge box. Merge is blocked until the gate completes; Autter approves automatically when the review comes back clean, and releases this hold with a neutral review when it finds non-blocking issues.
|
|
||
| function checkGit() { | ||
| try { | ||
| execFileSync('git', ['--version'], { encoding: 'utf8', timeout: 10_000, stdio: 'pipe' }); |
There was a problem hiding this comment.
🟠 [ai] Git prerequisite check does not enforce the minimum supported version — Risk: 74/100
checkGit() runs git --version but does not parse its output or reject versions older than the documented Git 2.22 minimum. A runnable unsupported Git installation therefore passes the installer prerequisite check. Parse the reported version and emit the existing actionable install message when it is below 2.22.
⚠ Downstream affected — if this fails, it cascades to the usage that depends on this file:
- Functions/symbols:
fetchBuffer,ensureBinary,verifyChecksum,reportInstallPing,binaryDest,installDir - Dependent files:
npm/bin/autter.js,node:crypto,node:fs,node:os,node:path,node:child_process,npm/package.json - Scopes:
@autter/cli
🛠 AI fix prompt (copy & paste into your coding agent)
Either parse the reported version and compare it against the required minimum, or make the prerequisite check consistent with the rest of the installer by failing fast when the detected version is below 2.22.
Flagged by Autter security & observability checks.
🚦 Pre-merge checks ·
|
| Check | Status | Explanation |
|---|---|---|
| Silent exception swallowing | 1 potential issue(s) detected (max risk 68/100): npm/install.js:128. | |
| Idempotency key not detected | 1 potential issue(s) detected (max risk 60/100): npm/install.js:242. | |
| Rate limiting not detected | 1 potential issue(s) detected (max risk 64/100): npm/install.js:256. | |
| Batch size limit not detected | 1 potential issue(s) detected (max risk 56/100): src/commands/install_hooks.rs:489. | |
| Infrastructure missing access logging | 1 potential issue(s) detected (max risk 26/100): src/commands/install_hooks.rs:745. | |
| PII in logs | 1 potential issue(s) detected (max risk 34/100): src/commands/install_hooks.rs:800. | |
| Missing linked tracker issue | 2 potential issue(s) detected (max risk 50/100): npm/install.js:104, README.md:57. | |
| Missing CODEOWNERS reviewer approval | 4 potential issue(s) detected (max risk 79/100): npm/install.js:104, install.sh:280, install.ps1:338, src/commands/install_hooks.rs:556. | |
| Source changes without matching tests | 7 potential issue(s) detected (max risk 73/100): npm/install.js:104, src/commands/install_hooks.rs:489, src/mdm/agents/gemini.rs:24, install.ps1:338, install.sh:280. | |
| Migration missing rollback / down step | 1 potential issue(s) detected (max risk 41/100): install.sh:280. | |
| Inconsistent error handling | 1 potential issue(s) detected (max risk 74/100): npm/install.js:151. | |
| Unhandled edge case (null / empty / zero / boundary) | 1 potential issue(s) detected (max risk 74/100): npm/install.js:128. | |
| OAuth callback / redirect handling changed | 1 potential issue(s) detected (max risk 8/100): src/mdm/agents/gemini.rs:24. | |
| Code correctness issue | 1 finding(s) on changed lines. | |
| Runtime error risk | 2 finding(s) on changed lines. | |
| Simplifiable code | 1 finding(s) on changed lines. | |
| Code duplication / DRY violation | 2 finding(s) on changed lines. | |
| Complexity Guard | 3 finding(s) on changed lines. | |
| Bundle Size Monitor | 2 finding(s) on changed lines. | |
| Release Notes Curator | 4 finding(s) on changed lines. |
✅ Passed checks (150)
| Check | Status | Explanation |
|---|---|---|
| Too many files changed | ✅ Passed | Changed 7 file(s), within the limit of 50. |
| Too many lines changed | ✅ Passed | Changed 353 line(s), within the limit of 1000. |
| Too many unrelated chapters | ✅ Passed | 4 chapter(s) detected, within the limit of 6. |
| Generated files hiding real changes | ✅ Passed | Generated-file volume (0 lines) does not obscure the 353 hand-written line(s). |
| Missing PR context | ✅ Passed | PR context looks sufficient. |
| Mixed concerns (refactor + behavior change) | ✅ Passed | This PR is a cohesive installer/hook hardening change: prerequisite validation, binary execution checks, Gemini hook-status tightening, and docs updates all align around making installation and setup fail earlier and more accurately. It does not look like a refactor bundled with an unrelated behavior change. |
| Migration + app logic + UI combined in one PR | ✅ Passed | No database migration is present, so this guard cannot trip. |
| Sensitive data in logs | ✅ Passed | No sensitive data in logs issues detected. |
| Log injection | ✅ Passed | No log injection issues detected. |
| Missing audit logging | ✅ Passed | No missing audit logging issues detected. |
| Removed observability | ✅ Passed | No removed observability issues detected. |
| Unhandled promise rejection | ✅ Passed | No unhandled promise rejection issues detected. |
| Circuit breaker not detected | ✅ Passed | No circuit breaker not detected issues detected. |
| Stack trace leakage | ✅ Passed | No stack trace leakage issues detected. |
| Multi-write without detected transaction | ✅ Passed | No multi-write without detected transaction issues detected. |
| Possible TOCTOU in critical path | ✅ Passed | No possible toctou in critical path issues detected. |
| Possible non-atomic read-modify-write | ✅ Passed | No possible non-atomic read-modify-write issues detected. |
| Optimistic locking not detected | ✅ Passed | No optimistic locking not detected issues detected. |
| Rate limiting removed | ✅ Passed | No rate limiting removed issues detected. |
| Pagination not detected | ✅ Passed | No pagination not detected issues detected. |
| Publicly exposed storage | ✅ Passed | No publicly exposed storage issues detected. |
| Over-permissive IAM policy | ✅ Passed | No over-permissive iam policy issues detected. |
| Security group open to the internet | ✅ Passed | No security group open to the internet issues detected. |
| Unencrypted storage at rest | ✅ Passed | No unencrypted storage at rest issues detected. |
| Hardcoded secret in IaC | ✅ Passed | No hardcoded secret in iac issues detected. |
| Infrastructure misconfiguration | ✅ Passed | No infrastructure misconfiguration issues detected. |
| Deprecated Kubernetes API version | ✅ Passed | No deprecated kubernetes api version issues detected. |
| Compound IaC attack chain | ✅ Passed | No compound iac attack chain issues detected. |
| Prompt injection risk | ✅ Passed | No LLM/AI-integration code touched by this diff. |
| LLM output used in a dangerous sink | ✅ Passed | No LLM/AI-integration code touched by this diff. |
| Sensitive data in prompt or system-prompt leakage | ✅ Passed | No LLM/AI-integration code touched by this diff. |
| Over-privileged LLM tool / excessive agency | ✅ Passed | No LLM/AI-integration code touched by this diff. |
| Missing validation on an LLM-driven decision | ✅ Passed | No LLM/AI-integration code touched by this diff. |
| Unbounded LLM usage (denial-of-wallet) | ✅ Passed | No LLM/AI-integration code touched by this diff. |
| Table exposed without row-level security | ✅ Passed | No row-level-security-related code touched by this diff. |
| Over-broad row-level security policy | ✅ Passed | No row-level-security-related code touched by this diff. |
| Code path that bypasses row-level security | ✅ Passed | No row-level-security-related code touched by this diff. |
| Privileged database credential reachable from the client | ✅ Passed | No row-level-security-related code touched by this diff. |
| Privileged query without row-level scoping | ✅ Passed | No row-level-security-related code touched by this diff. |
| Template-default gradient styling | ✅ Passed | No added frontend pages or design-slop markers in this diff. |
| Interchangeable AI marketing copy | ✅ Passed | No added frontend pages or design-slop markers in this diff. |
| Placeholder content shipped to users | ✅ Passed | No added frontend pages or design-slop markers in this diff. |
| Emoji standing in for an icon system | ✅ Passed | No added frontend pages or design-slop markers in this diff. |
| Call-to-action that goes nowhere | ✅ Passed | No added frontend pages or design-slop markers in this diff. |
| Templated page composition | ✅ Passed | No added frontend pages or design-slop markers in this diff. |
| Merge-blocking marker left in the change | ✅ Passed | No pending-work markers added by this diff. |
| Known-defect marker shipped in code | ✅ Passed | No pending-work markers added by this diff. |
| Untracked TODO without an issue reference | ✅ Passed | No pending-work markers added by this diff. |
| Test disabled or left pending | ✅ Passed | No pending-work markers added by this diff. |
| PII or internals leaked in error response | ✅ Passed | No pii or internals leaked in error response issues detected. |
| PII stored without application-level encryption | ✅ Passed | No pii stored without application-level encryption issues detected. |
| User data stored without retention controls | ✅ Passed | No user data stored without retention controls issues detected. |
| PII sent to external / cross-border destination | ✅ Passed | No pii sent to external / cross-border destination issues detected. |
| Lockfile resolution / integrity tampered | ✅ Passed | No lockfile resolution / integrity tampered issues detected. |
| Dependency runs install-time lifecycle script | ✅ Passed | No dependency runs install-time lifecycle script issues detected. |
| Possible dependency-confusion attack | ✅ Passed | No possible dependency-confusion attack issues detected. |
| Lockfile resolves a dependency the manifest does not declare | ✅ Passed | No lockfile resolves a dependency the manifest does not declare issues detected. |
| Checked-in build artefact modified without source change | ✅ Passed | No checked-in build artefact modified without source change issues detected. |
| Dockerfile build-step is insecure | ✅ Passed | No dockerfile build-step is insecure issues detected. |
| External artefact pulled in without integrity pinning | ✅ Passed | No external artefact pulled in without integrity pinning issues detected. |
| Changed export, importer not updated | ✅ Passed | No changed export with an un-updated importer detected. |
| Missing security-team review on sensitive path | ✅ Passed | No missing security-team review on sensitive path issues detected. |
| Frontend importing database client directly | ✅ Passed | No frontend importing database client directly issues detected. |
| Route handler bypassing service layer | ✅ Passed | No route handler bypassing service layer issues detected. |
| Backend service importing UI module | ✅ Passed | No backend service importing ui module issues detected. |
| Cross-context internals import | ✅ Passed | No cross-context internals import issues detected. |
| Workspace package rule violation | ✅ Passed | No workspace package rule violation issues detected. |
| Inconsistent logging pattern | ✅ Passed | No inconsistent logging pattern issues detected. |
| Endpoint missing input validation | ✅ Passed | No endpoint missing input validation issues detected. |
| Multi-write without transaction wrapper | ✅ Passed | No multi-write without transaction wrapper issues detected. |
| New feature shipped without feature flag | ✅ Passed | No new feature shipped without feature flag issues detected. |
| Module placed in the wrong workspace package | ✅ Passed | No module placed in the wrong workspace package issues detected. |
| Direct env-var access bypasses config module | ✅ Passed | No direct env-var access bypasses config module issues detected. |
| Hallucinated import (package not installed) | ✅ Passed | No hallucinated import (package not installed) issues detected. |
| Nonexistent package (not found in registry) | ✅ Passed | No nonexistent package (not found in registry) issues detected. |
| Call to function that does not exist | ✅ Passed | No call to function that does not exist issues detected. |
| Generic placeholder identifier in production logic | ✅ Passed | No generic placeholder identifier in production logic issues detected. |
| Repetitive boilerplate (duplicated block) | ✅ Passed | No repetitive boilerplate (duplicated block) issues detected. |
| Overbroad try/catch swallowing all exceptions | ✅ Passed | No overbroad try/catch swallowing all exceptions issues detected. |
| TODO / FIXME on critical path | ✅ Passed | No todo / fixme on critical path issues detected. |
| Comment contradicts or fabricates code behaviour | ✅ Passed | No comment contradicts or fabricates code behaviour issues detected. |
| Abstraction defined but never used | ✅ Passed | No abstraction defined but never used issues detected. |
| Code style differs from rest of codebase | ✅ Passed | No code style differs from rest of codebase issues detected. |
| Established pattern ignored | ✅ Passed | No established pattern ignored issues detected. |
| Doc-copy code with insecure defaults | ✅ Passed | No doc-copy code with insecure defaults issues detected. |
| Dead code (defined but never referenced) | ✅ Passed | No dead code (defined but never referenced) issues detected. |
| Deprecated API call | ✅ Passed | No deprecated api call issues detected. |
| API pattern from wrong library version | ✅ Passed | No api pattern from wrong library version issues detected. |
| API endpoint removed | ✅ Passed | No api endpoint removed issues detected. |
| HTTP method changed (GET ↔ POST etc.) | ✅ Passed | No http method changed (get ↔ post etc.) issues detected. |
| New required field added to request | ✅ Passed | No new required field added to request issues detected. |
| Field removed from response schema | ✅ Passed | No field removed from response schema issues detected. |
| Response field type changed | ✅ Passed | No response field type changed issues detected. |
| HTTP status code changed | ✅ Passed | No http status code changed issues detected. |
| Auth requirement added / removed / changed | ✅ Passed | No auth requirement added / removed / changed issues detected. |
| Error response shape changed | ✅ Passed | No error response shape changed issues detected. |
| Pagination behaviour changed | ✅ Passed | No pagination behaviour changed issues detected. |
| Outbound webhook payload schema changed | ✅ Passed | No outbound webhook payload schema changed issues detected. |
| GraphQL field removed without deprecation | ✅ Passed | No graphql field removed without deprecation issues detected. |
| GraphQL enum value removed | ✅ Passed | No graphql enum value removed issues detected. |
| SQL injection | ✅ Passed | No sql injection issues detected. |
| Cross-site scripting (XSS) | ✅ Passed | No cross-site scripting (xss) issues detected. |
| Path traversal | ✅ Passed | No path traversal issues detected. |
| Command injection | ✅ Passed | No command injection issues detected. |
| Insecure deserialization | ✅ Passed | No insecure deserialization issues detected. |
| Weak cryptography | ✅ Passed | No weak cryptography issues detected. |
| Hardcoded secret | ✅ Passed | No hardcoded secret issues detected. |
| Insecure randomness for security material | ✅ Passed | No insecure randomness for security material issues detected. |
| Unsafe file upload | ✅ Passed | No unsafe file upload issues detected. |
| Missing input validation | ✅ Passed | No missing input validation issues detected. |
| Unsafe CORS configuration | ✅ Passed | No unsafe cors configuration issues detected. |
| Unsafe / open redirect | ✅ Passed | No unsafe / open redirect issues detected. |
| Missing CSRF protection | ✅ Passed | No missing csrf protection issues detected. |
| Unsafe cookie / session settings | ✅ Passed | No unsafe cookie / session settings issues detected. |
| Sensitive data exposure | ✅ Passed | No sensitive data exposure issues detected. |
| API key in source | ✅ Passed | No api key in source detected. |
| Access token in source | ✅ Passed | No access token in source detected. |
| Private key in source | ✅ Passed | No private key in source detected. |
| Database connection URL with embedded credentials | ✅ Passed | No database connection url with embedded credentials detected. |
| Cloud credential in source | ✅ Passed | No cloud credential in source detected. |
| Webhook signing secret in source | ✅ Passed | No webhook signing secret in source detected. |
| OAuth client secret in source | ✅ Passed | No oauth client secret in source detected. |
| JWT signing secret in source | ✅ Passed | No jwt signing secret in source detected. |
| Hardcoded password | ✅ Passed | No hardcoded password detected. |
| Auth middleware removed from route | ✅ Passed | No auth middleware removed from route issues detected. |
| Route protection changed (protected → public) | ✅ Passed | No route protection changed (protected → public) issues detected. |
| Permission / RBAC check removed | ✅ Passed | No permission / rbac check removed issues detected. |
| Required role weakened | ✅ Passed | No required role weakened issues detected. |
| Admin-only route exposed to lower privilege | ✅ Passed | No admin-only route exposed to lower privilege issues detected. |
| Token validation skipped in middleware chain | ✅ Passed | No token validation skipped in middleware chain issues detected. |
| JWT verification weakened or changed | ✅ Passed | No jwt verification weakened or changed issues detected. |
| Session expiration / TTL changed | ✅ Passed | No session expiration / ttl changed issues detected. |
| Password reset flow changed | ✅ Passed | No password reset flow changed issues detected. |
| Webhook endpoint missing signature verification | ✅ Passed | No webhook endpoint missing signature verification issues detected. |
| Public route touches private/PII data | ✅ Passed | No public route touches private/pii data issues detected. |
| Frontend performance issue | ✅ Passed | No additional explanation was reported. |
| Frontend security issue | ✅ Passed | No additional explanation was reported. |
| Frontend correctness issue | ✅ Passed | No additional explanation was reported. |
| Accessibility issue | ✅ Passed | No additional explanation was reported. |
| Frontend maintainability issue | ✅ Passed | No additional explanation was reported. |
| Resource leak risk | ✅ Passed | No additional explanation was reported. |
| Data integrity risk | ✅ Passed | No additional explanation was reported. |
| Maintainability issue | ✅ Passed | No additional explanation was reported. |
| Co-change coupling | ✅ Passed | No additional explanation was reported. |
| Redundant alias / duplicate import | ✅ Passed | No additional explanation was reported. |
| Redundant type construct | ✅ Passed | No additional explanation was reported. |
| Unnecessary type assertion | ✅ Passed | No additional explanation was reported. |
| Module smell | ✅ Passed | No additional explanation was reported. |
| Excessive complexity | ✅ Passed | No additional explanation was reported. |
| Dead export (no callers) | ✅ Passed | No additional explanation was reported. |
This comment is updated automatically whenever Autter reviews a new PR revision.
|
There was a problem hiding this comment.
Autter completed PR review for #54: 3 finding(s) remain below the merge-blocking bar, so this review stays neutral rather than approving. (Also detected: 35 finding(s) dismissed as likely false positives by verification.) See the findings below; the task checklist follows as the review's final comment.
🤖 Release Notes CuratorImpact: patch — Improves installation prerequisite checks and ensures Gemini hook setup is correctly detected. Changelog: Improved installer compatibility validation and Gemini hook detection to prevent unsupported setups and ensure required hooks are active. Custom agent · runs after review · configured in Autter |
| fi | ||
|
|
||
| # Verify the binary runs before reporting success (catches glibc mismatches, etc.). | ||
| INSTALLED_VERSION=$(verify_binary_runs "${INSTALL_DIR}/autter") |
There was a problem hiding this comment.
🔴 [ai] Preserve the prior CLI when runtime validation fails — Risk: 88/100
The installer atomically replaces ~/.autter/bin/autter before running the new executable. If --version then fails (for example, an OS/CPU loader incompatibility not identified by the glibc preflight, a corrupt local-binary override, or a quarantine/signing failure), verify_binary_runs deletes that newly installed path and exits. This also removes the only prior working CLI and leaves the existing ~/.local/bin/autter symlink dangling, so a failed upgrade converts a usable installation into a broken one. Validation needs to happen on the temporary artifact, or the displaced binary must be retained and restored on failure.
⚠ Downstream affected — if this fails, it cascades to the usage that depends on this file:
- Dependent files:
install.sh
🛠 AI fix prompt (copy & paste into your coding agent)
Before replacing the installed executable, validate the downloaded temporary artifact (including executable mode) or move the existing executable to a backup. If validation fails, remove only the candidate and restore the backup; only update the installed path and symlinks after successful validation.
Flagged by Autter security & observability checks.
| $installedVersion = & $finalExe --version 2>&1 | Out-String | ||
| $installedVersion = $installedVersion.Trim() | ||
| if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($installedVersion)) { | ||
| Remove-Item -Force -ErrorAction SilentlyContinue $finalExe |
There was a problem hiding this comment.
🔴 [ai] Restore the previous Windows executable on validation failure — Risk: 88/100
Move-Item -Force overwrites the prior autter.exe before the new --version validation. When that command fails or returns blank output, both failure branches delete $finalExe and exit rather than rolling back. Thus an incompatible or otherwise non-runnable release removes a functioning Autter CLI; moreover, when a git.exe shim already exists it is not refreshed because execution stops, leaving the install directory with the old shim but no autter.exe. The failure is detected but the multi-step replacement is not recovered.
⚠ Downstream affected — if this fails, it cascades to the usage that depends on this file:
- Dependent files:
install.ps1
🛠 AI fix prompt (copy & paste into your coding agent)
Validate the candidate file before replacing `$finalExe`, or rename the previous `$finalExe` to a backup and restore it in both validation-failure branches. Do not remove the old executable until the candidate has run successfully; update `git.exe` only after that successful commit point.
Flagged by Autter security & observability checks.
| } | ||
| } | ||
|
|
||
| verifyBinaryRuns(dest); |
There was a problem hiding this comment.
🔴 [ai] Do not delete the installed npm binary after a failed upgrade check — Risk: 86/100
ensureBinary replaces dest before invoking the new runtime check. On validation failure, verifyBinaryRuns unconditionally removes bin, then throws; main deliberately catches that error to keep npm install successful and tells the user that first run will retry. A prior working CLI has nevertheless been deleted. The npm launcher sees the missing file and attempts a network download on every invocation, so an offline user cannot run the previously installed version. The Windows rename fallback has the same destructive window: it removes dest before the replacement rename and does not restore it if that rename fails.
⚠ Downstream affected — if this fails, it cascades to the usage that depends on this file:
- Dependent files:
npm/install.js,npm/bin/autter.js
🛠 AI fix prompt (copy & paste into your coding agent)
Keep the old destination until a candidate has passed `--version`: validate a temporary executable before renaming, or retain and restore a backup when validation/replacement fails. In the Windows fallback, restore the old destination if the second rename fails. Only report success/defer-to-first-run after preserving a usable prior binary.
Flagged by Autter security & observability checks.
| MIN_GLIBC_MINOR=35 | ||
|
|
||
| # Require git before downloading — autter wraps git and cannot function without it. | ||
| check_git() { |
There was a problem hiding this comment.
🟠 [ai] Enforce the documented minimum Git version before installing — Risk: 72/100
The new preflight only checks that git can be found, then the installer downloads, replaces, and reports success for any Git version. This accepts Git 2.21 or older even though this PR documents Git 2.22+ as a requirement and the CLI's own install-hooks path states that versions below 2.22 lack functionality Autter relies on. Thus a user with an old but executable Git gets a successful installation of a CLI that cannot operate correctly with its required trace/worktree behavior, rather than the intended upfront failure and remediation guidance.
⚠ Downstream affected — if this fails, it cascades to the usage that depends on this file:
- Dependent files:
install.sh,src/commands/install_hooks.rs
🛠 AI fix prompt (copy & paste into your coding agent)
Parse `git --version` in install.sh and reject versions below 2.22.0 before downloading or replacing the installed binary; retain the existing not-found error path.
Flagged by Autter security & observability checks.
|
|
||
| # git is required — autter wraps git and cannot function without it. | ||
| try { | ||
| $null = & git --version 2>&1 |
There was a problem hiding this comment.
🟠 [ai] Reject old Git versions in the PowerShell installer — Risk: 72/100
The PowerShell preflight treats a successful git --version process as sufficient and never reads or compares its version. Consequently Windows users with Git older than 2.22 proceed through download and installation as successful, despite the requirement added by this PR and the CLI's explicit statement that Git below 2.22 will not work correctly. This makes the advertised upfront validation ineffective on the Windows install path.
⚠ Downstream affected — if this fails, it cascades to the usage that depends on this file:
- Dependent files:
install.ps1,src/commands/install_hooks.rs
🛠 AI fix prompt (copy & paste into your coding agent)
Capture and parse `git --version` in install.ps1, and invoke `Write-ErrorAndExit` when it is below 2.22.0, before any download or replacement.
Flagged by Autter security & observability checks.
|
|
||
| function checkGit() { | ||
| try { | ||
| execFileSync('git', ['--version'], { encoding: 'utf8', timeout: 10_000, stdio: 'pipe' }); |
There was a problem hiding this comment.
🟠 [ai] Make the npm Git preflight validate the minimum version — Risk: 72/100
checkGit only verifies that the git --version command exits successfully; its output is discarded. main relies on that check as its new up-front gate, so npm installation continues for Git 2.21 or older and can install a binary that the CLI later identifies as incompatible with required functionality. This is reachable both during postinstall and through the launcher fallback, because ensureBinary itself has no Git-version gate.
⚠ Downstream affected — if this fails, it cascades to the usage that depends on this file:
- Dependent files:
npm/install.js,npm/bin/autter.js,src/commands/install_hooks.rs
🛠 AI fix prompt (copy & paste into your coding agent)
Have `checkGit` parse the output from `git --version` and throw unless the version is at least 2.22.0. Apply the check to the launcher fallback as well, or put it in `ensureBinary`, so skipped postinstall cannot bypass it.
Flagged by Autter security & observability checks.
| const minor = Number(match[2]); | ||
| if (major < 2 || (major === 2 && minor < 35)) { | ||
| throw new Error( | ||
| `Unsupported glibc version (${major}.${minor}). autter requires glibc 2.35+ (Ubuntu 22.04+, Debian 12+, Fedora 36+). ` + |
There was a problem hiding this comment.
🟠 [deterministic] Biome: lint/style/useTemplate — Risk: 55/100
Template literals are preferred over string concatenation.
🛠 AI fix prompt (copy & paste into your coding agent)
Fix the Biome `lint/style/useTemplate` issue at npm/install.js:124: Template literals are preferred over string concatenation.
Flagged by Autter security & observability checks.
| } | ||
| if (process.platform === 'linux' && detail.includes('GLIBC')) { | ||
| throw new Error( | ||
| `The autter binary could not run on this system (incompatible glibc).\n${detail}\n\n` + |
There was a problem hiding this comment.
🟠 [deterministic] Biome: lint/style/useTemplate — Risk: 55/100
Template literals are preferred over string concatenation.
🛠 AI fix prompt (copy & paste into your coding agent)
Fix the Biome `lint/style/useTemplate` issue at npm/install.js:147: Template literals are preferred over string concatenation.
Flagged by Autter security & observability checks.
| ### System requirements | ||
|
|
||
| - **git** 2.22 or newer (required) | ||
| - **Linux**: glibc 2.35 or newer (Ubuntu 22.04+, Debian 12+, Fedora 36+). Ubuntu 20.04 and older WSL2 distros are not supported natively — use a newer WSL distro or run inside an `ubuntu:22.04` Docker container |
There was a problem hiding this comment.
🟡 [deterministic] markdownlint: MD013 — Risk: 30/100
Line length: Expected: 80; Actual: 210
🛠 AI fix prompt (copy & paste into your coding agent)
Fix the markdownlint `MD013` issue at INSTALL.md:43: Line length: Expected: 80; Actual: 210
Flagged by Autter security & observability checks.
| autter debug # full support dump (always exits 0) | ||
| ``` | ||
|
|
||
| `autter doctor` runs end-to-end checks (git proxy, hooks, checkpoint round-trip). On v1.6.9 and earlier, use `autter debug` instead. |
There was a problem hiding this comment.
🟡 [deterministic] markdownlint: MD013 — Risk: 30/100
Line length: Expected: 80; Actual: 132
🛠 AI fix prompt (copy & paste into your coding agent)
Fix the markdownlint `MD013` issue at INSTALL.md:62: Line length: Expected: 80; Actual: 132
Flagged by Autter security & observability checks.
|
|
||
| The npm package is a thin bootstrapper: it downloads the same release binary into `~/.autter/bin` and verifies its checksum, so hooks and self-updates work identically to the script installs. | ||
|
|
||
| **System requirements:** git 2.22+, Linux glibc 2.35+ (Ubuntu 22.04+), macOS 11+, Windows 10+, Node.js 18+ for the npm path. See [INSTALL.md](INSTALL.md) for details including Docker-based setup on older Linux distros. |
There was a problem hiding this comment.
🟡 [deterministic] markdownlint: MD013 — Risk: 30/100
Line length: Expected: 80; Actual: 218
🛠 AI fix prompt (copy & paste into your coding agent)
Fix the markdownlint `MD013` issue at README.md:57: Line length: Expected: 80; Actual: 218
Flagged by Autter security & observability checks.
Autter task list
Generated from PR diff, blast radius, and context. Issues found
Also detected but not listed above: 35 finding(s) dismissed as likely false positives by verification — see the Autter review dashboard for their verdicts. 🛠 Fix optionsCheck one option and Autter will start a fix run for the unresolved issues above.
Checking a box triggers the fix run immediately — Autter comments back with the issues being fixed and the branch created for each. |
Summary
install.sh,install.ps1,npm/install.js) now check for git and Linux glibc 2.35+ before downloading, and fail with a clear message when the binary cannot execute (e.g. Ubuntu 20.04 / older WSL2 GLIBC mismatch) instead of reporting successhook_statusnow requirestools.enableHooks,BeforeTool, andAfterToolcatch-all checkpoints before reporting hooks as up to dateinstall-hookswarns to restart agents even when hooks are already up to date, and surfaces missing git more clearlyautter doctorvsautter debugin INSTALL.md/README.mdTest plan
cargo test gemini:: --lib(32 passed)bash -n install.shcurl -fsSL install.sh | bashon Ubuntu 22.04 — succeedsautter install-hookswith Gemini running — shows restart warning even when hooks are up to dateMade with Cursor
Summary
Summary generated by Autter.
Harden installation by validating required Git and Linux glibc versions before downloading or configuring Autter, and tighten Gemini hook detection so incomplete configurations are repaired rather than reported as current. Documentation now states the supported platform prerequisites and recommended post-install verification commands.
Changes
install-hooksprerequisite messaging so Git-version warnings are surfaced consistently during hook setup.tools.enableHooksplus Autter hooks in both catch-all ("*")BeforeToolandAfterToolblocks before reporting the integration as up to date.README.mdandINSTALL.md, includingautter doctorandautter debugverification guidance.Breaking changes: Installations now fail early on Git versions below 2.22 and Linux systems with glibc below 2.35. This intentionally removes support for older Linux distributions and WSL environments that cannot run the distributed binary reliably.
Acceptance Criteria
BeforeToolandAfterToolblocks contain an Autter checkpoint command.autter doctor/autter debugverification.Test Plan
task testto execute the Rust test suite, including Gemini hook-status regression tests.task buildto confirm the CLI compiles.task fmtandtask lint.npm install -g @autter/cliwith a supported Node.js version and confirm the downloaded binary passes checksum and--versionverification."*"matcher, runautter install-hooks, and confirm both catch-all hook blocks andtools.enableHooksare configured.autter doctorafter installation to validate the installed CLI, proxy, hooks, and checkpoint round-trip.Rollback Plan
ubuntu:22.04container as documented.~/.gemini/settings.jsonfrom its backup/version-controlled copy, then rerun the previous Autter release’s hook installer if needed.Related Issues
No linked issue was identified.
Written for commit f93ebd6. Summary will update on new commits.