Cleanup: clippy is quiet outside billing, the README says g1t, and http-cache-semantics is 4.3.0
- work, search and repos: clippy's five suggestions (a needless Ok(?), assert_eq! with a bool, a collapsible if, a manual Option::map). - README: work is handed to g1t and reviewed by g1t, one name. - npm audit fix: http-cache-semantics 4.2.0 -> 4.3.0. The rest of the audit's fixes are downgrades (Starlight 0.21, @cloudflare/puppeteer 0.0.11), and sharp 0.35.5 waits on Astro's range; sharp runs only in the docs build.
6 files+16−180/6 viewed
| 7 | 7 | - **Collaborate.** Git over HTTPS, public and private repositories, issues, | |
| 8 | 8 | pull requests, line comments and reviews, protected branches, workspaces, | |
| 9 | 9 | profiles and site-wide search. | |
| 10 | − | - **Agents as teammates.** Assign an issue to g1t's agent or mention it, or | |
| 10 | + | - **Agents as teammates.** Assign an issue to g1t or mention `@g1t`, or | |
| 11 | 11 | connect Claude Code, Codex, OpenCode or Cursor over MCP. Hand g1t an | |
| 12 | 12 | outcome and a planner splits it into issues with dependencies that agents | |
| 13 | 13 | take up as they unblock. Agents see what the others are changing, ask each | |
| 70 | 70 | - Overlap: each pull request shows which others in progress change the | |
| 71 | 71 | same files, while the work is still going on. | |
| 72 | 72 | - Catch-up: when `main` has moved under a pull request, g1t merges it in, | |
| 73 | − | and a g1t agent resolves any conflict. | |
| 74 | − | - Reviews written by a g1t agent, on request: line comments, a summary and | |
| 73 | + | and g1t resolves any conflict. | |
| 74 | + | - Reviews written by g1t, on request: line comments, a summary and | |
| 75 | 75 | a verdict. | |
| 76 | 76 | - Importing a public repository from any git host by its address, and | |
| 77 | 77 | public or private repositories through g1t's GitHub App, imported once, |
| 13 | 13 | "devDependencies": { | |
| 14 | 14 | "typescript": "^5.9.3", | |
| 15 | 15 | "wrangler": "^4.146.0" | |
| 16 | + | }, | |
| 17 | + | "engines": { | |
| 18 | + | "node": ">=22.22.0" | |
| 16 | 19 | } | |
| 17 | 20 | }, | |
| 18 | 21 | "apps/docs": { | |
| 6931 | 6934 | } | |
| 6932 | 6935 | }, | |
| 6933 | 6936 | "node_modules/http-cache-semantics": { | |
| 6934 | − | "version": "4.2.0", | |
| 6935 | − | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", | |
| 6936 | − | "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", | |
| 6937 | + | "version": "4.3.0", | |
| 6938 | + | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.3.0.tgz", | |
| 6939 | + | "integrity": "sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==", | |
| 6937 | 6940 | "license": "BSD-2-Clause" | |
| 6938 | 6941 | }, | |
| 6939 | 6942 | "node_modules/http-proxy-agent": { |
| 109 | 109 | return Ok(FileList::default()); | |
| 110 | 110 | }; | |
| 111 | 111 | let base_tree = match base { | |
| 112 | − | Some(base) => match resolve(repo, base).await? { | |
| 113 | − | Some((_, tree)) => Some(tree), | |
| 114 | − | // A base that cannot be read is treated as nothing: every file. | |
| 115 | − | None => None, | |
| 116 | − | }, | |
| 112 | + | Some(base) => resolve(repo, base).await?.map(|(_, tree)| tree), | |
| 117 | 113 | None => None, | |
| 118 | 114 | }; | |
| 119 | 115 | let (files, truncated) = changed(repo, base_tree.as_deref(), &tree, skip, limit).await?; |
| 81 | 81 | start = end.saturating_sub(PROSE_CHARS); | |
| 82 | 82 | } | |
| 83 | 83 | // Start and end on a word boundary where there is one nearby. | |
| 84 | − | if start > 0 { | |
| 85 | − | if let Some(space) = flat[start..first.max(start)].iter().position(|c| *c == ' ') { | |
| 84 | + | if start > 0 | |
| 85 | + | && let Some(space) = flat[start..first.max(start)].iter().position(|c| *c == ' ') { | |
| 86 | 86 | start += space + 1; | |
| 87 | 87 | } | |
| 88 | − | } | |
| 89 | 88 | let mut end = end; | |
| 90 | 89 | if end < flat.len() | |
| 91 | 90 | && let Some(space) = flat[start..end].iter().rposition(|c| *c == ' ') |
| 310 | 310 | let reader = Reader::of(&viewer(&["acme"])); | |
| 311 | 311 | let verdict = check(&reader, &[row("rep_1", "acme", false)], Some(&[repo("rep_1", "acme", true)])); | |
| 312 | 312 | assert!(verdict.keep.contains("rep_1")); | |
| 313 | − | assert_eq!(verdict.corrections[0].private, true); | |
| 313 | + | assert!(verdict.corrections[0].private); | |
| 314 | 314 | } | |
| 315 | 315 | ||
| 316 | 316 | #[test] | |
| 320 | 320 | let reader = Reader::of(&viewer(&["acme"])); | |
| 321 | 321 | let verdict = check(&reader, &[row("rep_2", "acme", true)], Some(&[repo("rep_2", "acme", false)])); | |
| 322 | 322 | assert!(verdict.keep.contains("rep_2")); | |
| 323 | − | assert_eq!(verdict.corrections[0].private, false); | |
| 323 | + | assert!(!verdict.corrections[0].private); | |
| 324 | 324 | // Once corrected, an outsider's first check lets it through too. | |
| 325 | 325 | assert!(Reader::of(&None).may_see("rep_2", "acme", false)); | |
| 326 | 326 | } |
| 273 | 273 | ||
| 274 | 274 | /// The repository a project's memory is about; none for the workspace's. | |
| 275 | 275 | async fn memory_repo_id(&self, id: &str) -> Result<Option<String>> { | |
| 276 | − | Ok(self | |
| 276 | + | self | |
| 277 | 277 | .db | |
| 278 | 278 | .prepare("SELECT scope_key AS value FROM memories WHERE id = ? AND scope = 'project'") | |
| 279 | 279 | .bind(&[id.into()])? | |
| 280 | 280 | .first::<String>(Some("value")) | |
| 281 | − | .await?) | |
| 281 | + | .await | |
| 282 | 282 | } | |
| 283 | 283 | ||
| 284 | 284 | async fn mark_used(&self, ids: &[String]) -> Result<()> { |