chadtmiller.com/knotless

Git hosted in your atproto account, on any stock PDS, fast enough for agents.

git clone knotless://chadtmiller.com/knotless

needs the knotless git helper. set it up

CLI: knotless edit and knotless delete-comment

chadtmiller.com committed on Oct 22, 2026 parent 675c1ce commit 8fabb64
Showing 1 changed file with 24 additions and 0 deletions
crates/knotless/src/cli.rs+24−0
@@ -87,6 +87,10 @@ const USAGE: &str = "usage: knotless <command>
list <url> [--pulls | --issues] pulls and issues, newest first
show <url> <at-uri> a pull or issue and its comments
comment <url> <at-uri> <text> [--approve | --changes]
edit <url> <at-uri> [--title <title>] [-m <body>]
change your pull, issue or comment;
-m '' drops a pull's or issue's body
delete-comment <url> <at-uri> take back your comment or review
close <url> <at-uri>
reopen <url> <at-uri>
branch <url> <name> [<from>] create a branch, at the default branch
@@ -427,6 +431,26 @@ async fn command(
let uri = forge::comment(ctx, &url, subject, text, verdict).await?;
writeln!(out, "{uri}")?;
}
"edit" => {
let url = args.url()?;
let subject = args.next("<at-uri>")?;
let (mut title, mut body) = (None, None);
while let Some(flag) = args.rest.next() {
let slot = match flag.as_str() {
"--title" => &mut title,
"-m" => &mut body,
other => bail!("unexpected {other}"),
};
*slot = Some(args.next("<text>")?);
}
forge::edit(ctx, &url, subject, title, body).await?;
writeln!(out, "edited")?;
}
"delete-comment" => {
let url = args.url()?;
forge::delete_comment(ctx, &url, args.next("<at-uri>")?).await?;
writeln!(out, "deleted")?;
}
"close" | "reopen" => {
let url = args.url()?;
let subject = args.next("<at-uri>")?;