惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
The Cloudflare Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
V
Visual Studio Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
The GitHub Blog
The GitHub Blog
L
LangChain Blog
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
博客园 - Franky
阮一峰的网络日志
阮一峰的网络日志
GbyAI
GbyAI
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
V
V2EX
MyScale Blog
MyScale Blog

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店
GitHub - ThatXliner/patchwork: AST-native code refactor w...
thatxliner · 2026-05-06 · via Hacker News: Show HN

AST-native sed — find, replace, delete, and insert code by structure, not regex.

Installation

cargo install patchwork-cli

Usage

# Rename a method across files without false positives
patchwork replace -i -p 'getOldData($a)' -r 'getData($a)' src/**/*.java

# Replace a logging framework
patchwork delete -i -p 'logger.debug($msg)' src/*.py
patchwork insert-before -p 'logger.debug($msg)' --code 'tracing.debug($msg)' src/*.py

# Match by structure, not regex
patchwork find -p 'return null;' src/

More examples are available in the examples directory.

The problem

You want to rename a function, swap an import, or update an API call across a codebase. Your options:

  • sed — the regex might match inside strings or comments, misses multi-line patterns, and breaks on nested brackets. Gets fragile fast.
  • semgrep — a 200MB+ Python install, designed for CI linting, not for piping through find | xargs.

patchwork is a single 3MB binary that parses both your pattern and source into tree-sitter CSTs, finds structural matches, and applies edits. No models, no config, no Python runtime.

How it compares

Tool Language Parsing Size Languages Best for
patchwork Rust tree-sitter AST ~3MB 5 Simple CLI refactors, pipes, $()* repetition
ast-grep Rust tree-sitter AST ~10MB 25+ General refactoring, YAML rules, LSP/VS Code/MCP
Comby OCaml parser-free ~8MB ~all Quick cross-language/text-format replacements
Semgrep Python real parsers 200MB+ 20+ Security auditing with taint tracking & dataflow

patchwork vs ast-grep (the closest alternative):

  • patchwork is purely CLI — no YAML rules, no interactive mode, no LSP. A drop-in for sed in shell scripts.
  • patchwork's $($name)sep* / $($name)sep+ / $($name)sep? Rust-style repetition is unique here.
  • patchwork uses $lowercase placeholders (not $CAPITAL), which some find more natural.
  • ast-grep has a richer ecosystem — VS Code extension, MCP server, Python/Node bindings — if you need those.

patchwork vs Comby: patchwork uses real tree-sitter parsers so it understands language-specific AST structure. Comby is parser-free and works on any language, but with less structural precision.

patchwork vs Semgrep: Semgrep is heavy but delivers deep semantic analysis (taint tracking, dataflow). patchwork is for the 80% case: quick, correct structural edits that finish before your coffee gets cold.

How it works

Write a code snippet and patchwork finds structurally identical code in your source.

Names and values match exactly by defaultreturn 1; only matches return 1;, not return 42;. This means you don't accidentally match code that happens to have the same shape but different identifiers.

# Only matches exactly this call
patchwork find -p 'old_api(x)' src/

# Use $ to match any identifier
patchwork find -p 'old_api($x)' src/

$ placeholders

$name matches any single AST node — any identifier, literal, or expression. It's like .* for code but structure-aware.

# Match any call to old_api with any single argument
patchwork replace -i -p 'old_api($arg)' -r 'new_api($arg)' src/**/*.java

# Match any two-argument call, reorder args in replacement
patchwork replace -i -p '$f($a, $b)' -r '$f($b, $a)' src/*.py

# Delete all calls to debug regardless of argument
patchwork delete -i -p 'debug($msg)' src/*.py

# Match any return statement
patchwork find -p 'return $val;' src/

Tree-sitter queries

For precise structural patterns with named captures:

patchwork replace -q '(if_statement condition: (identifier) @matched)' -r 'check(x)' file.ts

Operations

Command Effect
find Print file:line:col for each match
replace Replace matched code with new code
delete Remove matched code
insert-before Insert code before each match
insert-after Insert code after each match

All editing commands support -i (in-place, like sed -i) and stdin/stdout piping.

Usage

# Pipe mode (requires --language with stdin)
cat Main.java | patchwork find -l java -p 'return null;'

# File mode (language detected from extension)
patchwork replace -i -p 'println($arg)' -r 'log($arg)' src/**/*.java

# Query mode
patchwork find -q '(method_invocation name: (identifier) @name (#eq? @name "println"))' App.java

# Multi-file
patchwork replace -p 'BufferedReader $r' -r 'Reader $r' src/**/*.java

Installation

cargo install patchwork

Or build from source:

git clone https://github.com/ThatXliner/patchwork
cd patchwork
cargo build --release

Supported languages

Java, Python, JavaScript, TypeScript, TSX. Adding a language is one crate dependency and a handful of lines.

Limitations

  • Single-file only — no cross-file rename tracking or import updates
  • Formatting — replacement text isn't auto-indented; include your own whitespace
  • No model — this is by design. Complex structural changes that need reasoning aren't supported. For those, use an LLM-based tool

Status

Single 3MB binary, zero dependencies, zero configuration. Works with pipes, files, and shell globs.