~ knotless Search/
↑↓ move↵ open⇧↵ all results

chadtmiller.com/knotless

git that lives in your Atmosphere account

knotless.dev
1 collaborator

knotless 0.13.0 Latest 2 packages, 1 image

1
10

Commands are grouped, and each MCP tool is its command's twin

Merged chadtmiller.com asked to merge into main from chadtmiller.com/knotless:cli/groups
.changeset/cli-groups.mdnew+7−0
@@ -0,0 +1,7 @@
---
default: minor
---
# Commands are grouped
Every `knotless` command is now `knotless <group> <action>`: `knotless pull create`, `knotless repo star`, `knotless run list`, `knotless branch protect`. An opposite is `--undo` on the action, so `unstar` is `repo star --undo`. Only `login`, `logout`, `upgrade` and `status` stand alone. The old names, such as `knotless pull` and `knotless checks`, work for one more release and then go. `knotless --help` lists the new ones. The MCP tools are renamed to match, `<group>_<action>`: `repo_star`, `pull_merge`, `run_list`. A tool is now the twin of the command of its name, so what the CLI could do and the tools could not, and the other way round, is added: `repo tree`, `repo read`, `repo log`, `pull update-branch`, `pull dismiss-review` and `release read` on the command line, and the commands that lacked tools, in the tools. Update any MCP client config that names a tool.
.claude/skills/docs/questions.md+1−1
@@ -82,6 +82,6 @@ then one question per mechanism.
12. What does a check record hold, how is it keyed, and why are only some
accounts' checks shown?
13. How do reruns and run-by-name work?
14. How does `knotless merge` use checks (the merge gate)?
14. How does `knotless pull merge` use checks (the merge gate)?
15. How does the merge queue use the runner? Keep this to a short summary
and a link to merge-queue.md.
.claude/skills/docs/SKILL.md+2−2
@@ -29,7 +29,7 @@ The map from code to pages is in AGENTS.md, under Docs.
- An audit (are these pages still true?): steps 1 and 4 for each page,
then fix what is wrong, or file an issue when the code is what's wrong.
The `docs-audit` workflow does steps 1 and 4 on the runner when the
owner asks (`knotless rerun <repo> --ref refs/heads/main --workflow
owner asks (`knotless run rerun <repo> --ref refs/heads/main --workflow
docs-audit`), one session per page, and reports at the end of its log;
it costs model usage, so ask first. Verify each finding against the
code before acting on it.
@@ -46,7 +46,7 @@ tagged:
- `[DOC WRONG]` a page says something the code contradicts: give both
A section headed Quirks lists what looks like a bug, with file and line.
Those are filed as issues (`knotless issue`), not written up as design.
Those are filed as issues (`knotless issue create`), not written up as design.
Drop `[doc]` facts the code does not bear out.
## 2. Context
.claude/skills/ui/SKILL.md+3−3
@@ -72,7 +72,7 @@ checks repo: chadtmiller.com/knotless, ref: refs/heads/<branch>, workflow: look
```
It installs and builds the branch's `web/` first, so a look takes about
two minutes: ask `checks` again, waiting 60 seconds at a time, as a
two minutes: ask `knotless run list` again, waiting 60 seconds at a time, as a
longer wait can outlast the MCP call itself.
The pictures come back 12 at most: ask for that many. What `look` says,
a page wider than the screen or a `--set` that changed nothing, is at
@@ -172,5 +172,5 @@ moved is a mistake to fix.
A state the check does not draw (a menu open, an edit box, a list
emptied by a filter) it cannot show the reviewer: give the pull your
`just look` pictures of it, each as an `--image` to `knotless pull` or
`knotless edit`, as AGENTS.md says.
`just look` pictures of it, each as an `--image` to `knotless pull create` or
`knotless pull edit`, as AGENTS.md says.
.knotless/workflows/deploy.yml+2−2
@@ -21,7 +21,7 @@
# Once up, the image is published as the release of the `knotless-server`
# package at main's version (docs/design/packages.md#images), if that
# version has none yet: `docker save` on the host, as an OCI image layout,
# into `knotless publish --oci` there, as the owner, with RELEASE_PASSWORD,
# into `knotless release publish --oci` there, as the owner, with RELEASE_PASSWORD,
# an app password of theirs granted to pushes to main as release.yml's is.
# It is then `docker pull knotless.dev/chadtmiller.com/knotless/knotless-server`:
# one image for serve, the pages, the runner and the triager, as here.
@@ -86,7 +86,7 @@ env:
KNOTLESS_CLIENT_MINIMUM: 0.6.0
KNOTLESS_CLIENT_MINIMUM_REASON: "knotless 0.6.0 changed how deleted branches are stored, and older clients can have their pushes refused: run `knotless upgrade`."
# Labels issues with Clef, as its own account, whose labels count only
# for the scopes the owner names it a triager of (knotless triagers):
# for the scopes the owner names it a triager of (knotless triager add):
# here, and in every repository that names it.
KNOTLESS_TRIAGE_REPOS: chadtmiller.com/knotless
KNOTLESS_TRIAGE_ARGS: --model clef --scopes kind,area --discover
.knotless/workflows/docs-audit.yml+1−1
@@ -4,7 +4,7 @@
# the code does. Each run costs model usage, so it never runs on a push or
# a pull, only when the owner asks for it by name:
#
# knotless rerun knotless://chadtmiller.com/knotless --ref refs/heads/main \
# knotless run rerun knotless://chadtmiller.com/knotless --ref refs/heads/main \
# --workflow docs-audit [-e PAGES="design/storage.md reference/cli.md"] \
# [-e AUDIT_MODEL=...]
#
.knotless/workflows/look.yml+2−2
@@ -3,9 +3,9 @@
# any state, as this check's outputs to look at. Only when the owner asks
# for it by name, at any branch, with LOOK as just look's arguments:
#
# knotless rerun knotless://chadtmiller.com/knotless --ref refs/heads/<branch> \
# knotless run rerun knotless://chadtmiller.com/knotless --ref refs/heads/<branch> \
# --workflow look -e LOOK="profile --phone --signed-in"
# knotless checks knotless://chadtmiller.com/knotless --workflow look --images <dir>
# knotless run list knotless://chadtmiller.com/knotless --workflow look --images <dir>
#
# Over MCP, rerun with workflow, ref and env, then checks with images.
# The runner keeps 32 pictures and checks over MCP returns 12, so a run
.knotless/workflows/publish-lexicons.yml+4−4
@@ -20,10 +20,10 @@
#
# It starts only once main's seven checks have passed at its commit
# (`after`), holding no job while it waits, so the checks are never kept
# from one. Asked for on any other branch, `knotless rerun <repo> --ref
# refs/heads/<branch> --workflow publish-lexicons`, it waits for those of
# them that ran there, plans, and skips the publish, which runs at main
# alone.
# from one. Asked for on any other branch, `knotless run rerun <repo>
# --ref refs/heads/<branch> --workflow publish-lexicons`, it waits for
# those of them that ran there, plans, and skips the publish, which runs
# at main alone.
on:
push: {refs: [refs/heads/main], paths: [lexicons/**, .knotless/workflows/publish-lexicons.yml]}
asked: {refs: [refs/heads/*]}
.knotless/workflows/release.yml+2−2
@@ -1,7 +1,7 @@
# Publishes the client as a release of the `knotless` package
# (docs/design/packages.md): when main's version, in Cargo.toml, has no
# release yet and this commit's checks all pass, it builds every target
# deploy/build-client.sh builds and publishes them with `knotless publish`,
# deploy/build-client.sh builds and publishes them with `knotless release publish`,
# as the repository's owner, with the version's CHANGELOG.md section as its
# notes, and tags its commit `v<version>`. `knope release` bumps the
# version in a pull; once that lands, this publishes it. A version
@@ -9,7 +9,7 @@
#
# RELEASE_PASSWORD is an app password of the owner's, granted to pushes to
# main alone in the runner's secrets file. Asked for on any other branch,
# `knotless rerun <repo> --ref refs/heads/<branch> --workflow release`, it
# `knotless run rerun <repo> --ref refs/heads/<branch> --workflow release`, it
# builds everything and publishes nothing, to try the build.
on:
push: {refs: [refs/heads/main], paths: [Cargo.toml]}
.knotless/workflows/scenarios.yml+1−1
@@ -2,7 +2,7 @@
# work through the MCP server. Each run costs model usage, so this never
# runs on a push or a pull, only when the owner asks for it by name:
#
# knotless rerun knotless://chadtmiller.com/knotless --ref refs/heads/main \
# knotless run rerun knotless://chadtmiller.com/knotless --ref refs/heads/main \
# --workflow scenarios [-e TRACKS="team solo"] [-e SCENARIO_MODEL=...]
#
# TRACKS names the tracks, all of them but `ci` by default: its runner
.knotless/uses.lock+1−1
crates/knotless/examples/bench.rs+3−1
crates/knotless/src/approvals.rs+3−3
crates/knotless/src/checks.rs+1−1
crates/knotless/src/cli.rs+1513−1315
A large diff, not shown.
crates/knotless/src/emails.rs+1−1
crates/knotless/src/env.rs+1−1
crates/knotless/src/forge.rs+5−8
crates/knotless/src/gateway.rs+1−1
crates/knotless/src/helper.rs+1−1
crates/knotless/src/landing.rs+3−3
crates/knotless/src/lib.rs+1−0
crates/knotless/src/manage.rs+3−3
crates/knotless/src/oldnames.rsnew+302−0
crates/knotless/src/org.rs+19−1
crates/knotless/src/query.rs+1−1
crates/knotless/src/queue.rs+18−8
crates/knotless/src/release.rs+1−1
crates/knotless/src/secrets.rs+1−1
crates/knotless/src/site.rs+1−1
crates/knotless/src/social.rs+1−1
crates/knotless/src/uses.rs+1−1
crates/knotless/src/workflow.rs+1−1
crates/knotless/tests/cli.rs+399−210
609 lines changed: not loaded until asked for.
crates/knotless/tests/git_flows.rs+3−3
crates/knotless/tests/library.rs+2−2
crates/knotless/tests/oauth.rs+15−13
crates/knotless/tests/spaces.rs+89−56
crates/knotless-agent/tests/keep.rs+9−6
crates/knotless-agent/tests/review.rs+46−27
crates/knotless-agent/claude-review+3−2
crates/knotless-mcp/src/lib.rs+1375−729
A large diff, not shown.
crates/knotless-mcp/tests/http.rs+12−12
crates/knotless-mcp/tests/mcp.rs+742−574
A large diff, not shown.
crates/knotless-run/tests/run.rs+174−108
crates/knotless-serve/src/web/account_data.rs+1−1
crates/knotless-serve/src/web/account_settings.rs+1−1
crates/knotless-serve/src/web/controls.rs+4−4
crates/knotless-serve/src/web/delegation.rs+3−3
crates/knotless-serve/src/web/landing.rs+11−11
crates/knotless-serve/src/web/opening.rs+1−1
crates/knotless-serve/src/web/repos.rs+1−1
crates/knotless-serve/src/web/stars.rs+1−1
crates/knotless-serve/src/logs.rs+1−1
crates/knotless-serve/src/oci.rs+1−1
crates/knotless-serve/src/shared.rs+1−1
crates/knotless-serve/tests/gateway/opening.rs+10−3
crates/knotless-serve/tests/gateway/org_index.rs+4−4
crates/knotless-serve/tests/gateway/orgs.rs+70−55
crates/knotless-serve/tests/gateway/private_flow.rs+4−4
crates/knotless-serve/tests/gateway/reviewed.rs+42−26
crates/knotless-serve/tests/gateway/subscriptions.rs+1−1
crates/knotless-serve/tests/gateway/threads.rs+32−11
crates/knotless-serve/tests/forge.rs+793−455
A large diff, not shown.
crates/knotless-serve/tests/gateway.rs+211−104
crates/knotless-serve/tests/pages.rs+32−26
crates/knotless-serve/tests/releases.rs+9−3
crates/knotless-serve/tests/sites.rs+4−4
crates/knotless-serve/tests/status.rs+13−5
crates/knotless-serve/tests/web.rs+132−77
crates/knotless-triage/src/lib.rs+1−1
crates/knotless-triage/tests/triage.rs+84−42
deploy/runner-host/README.md+8−8
deploy/README.md+9−9
docs/design/access.md+9−9
docs/design/collaboration.md+30−30
docs/design/gateway.md+8−8
docs/design/identity.md+5−5
docs/design/merge-queue.md+9−9
docs/design/packages.md+7−7
docs/design/pages.md+2−2
docs/design/prior-art.md+1−1
docs/design/README.md+2−2
docs/design/reusable-workflows.md+2−2
docs/design/runner.md+23−23
docs/design/security.md+2−2
docs/design/serve.md+31−31
docs/design/storage.md+8−8
docs/guide/agents.md+2−2
docs/guide/collaborating.md+62−62
docs/guide/getting-started.md+16−16
docs/guide/private.md+7−7
docs/guide/reviews.md+8−8
docs/guide/sites.md+9−9
docs/guide/workflows.md+16−16
docs/reference/actions.md+104−75
docs/reference/api.md+40−40
docs/reference/cli.md+346−203
549 lines changed: not loaded until asked for.
docs/reference/mcp.md+242−89
docs/reference/performance.md+3−3
docs/reference/workflows.md+6−6
docs/development.md+7−7
harness/e2e/private.spec.mjs+12−12
harness/e2e/setup.mjs+1−1
harness/shots/world.mjs+28−28
harness/authorize.mjs+1−1
harness/queue-stats.mjs+1−1
lexicons/dev/knotless/acceptTransfer.json+1−1
lexicons/dev/knotless/addAgent.json+1−1
lexicons/dev/knotless/addEmail.json+1−1
lexicons/dev/knotless/addRunner.json+1−1
lexicons/dev/knotless/archiveRepo.json+1−1
lexicons/dev/knotless/assignItem.json+1−1
lexicons/dev/knotless/blockActor.json+1−1
lexicons/dev/knotless/compactRepo.json+1−1
lexicons/dev/knotless/createComment.json+1−1
lexicons/dev/knotless/createIssue.json+1−1
lexicons/dev/knotless/createOrgRepo.json+2−2
lexicons/dev/knotless/createPull.json+1−1
lexicons/dev/knotless/createRepo.json+2−2
lexicons/dev/knotless/createReport.json+1−1
lexicons/dev/knotless/defineLabel.json+1−1
lexicons/dev/knotless/delegateWrites.json+1−1
lexicons/dev/knotless/deleteAccountData.json+1−1
lexicons/dev/knotless/deleteBranch.json+1−1
lexicons/dev/knotless/deleteComment.json+1−1
lexicons/dev/knotless/deleteRepo.json+1−1
lexicons/dev/knotless/editItem.json+1−1
lexicons/dev/knotless/forkRepo.json+1−1
lexicons/dev/knotless/getAccountData.json+1−1
lexicons/dev/knotless/getMergeStatus.json+2−2
lexicons/dev/knotless/getRepoSettings.json+1−1
lexicons/dev/knotless/getRepoStorage.json+1−1
lexicons/dev/knotless/getTemplate.json+1−1
lexicons/dev/knotless/hideItem.json+1−1
lexicons/dev/knotless/labelItem.json+1−1
lexicons/dev/knotless/leaveQueue.json+1−1
lexicons/dev/knotless/listRunners.json+1−1
lexicons/dev/knotless/listWorkflows.json+1−1
lexicons/dev/knotless/mergePull.json+1−1
lexicons/dev/knotless/protectBranch.json+1−1
lexicons/dev/knotless/pull.json+1−1
lexicons/dev/knotless/queuePull.json+1−1
lexicons/dev/knotless/removeAgent.json+1−1
lexicons/dev/knotless/removeEmail.json+1−1
lexicons/dev/knotless/removeLabel.json+1−1
lexicons/dev/knotless/removeRunner.json+1−1
lexicons/dev/knotless/removeTriager.json+1−1
lexicons/dev/knotless/renameBranch.json+1−1
lexicons/dev/knotless/renameRepo.json+1−1
lexicons/dev/knotless/requestRerun.json+1−1
lexicons/dev/knotless/retargetPull.json+1−1
lexicons/dev/knotless/revertPull.json+1−1
lexicons/dev/knotless/setItemState.json+1−1
lexicons/dev/knotless/setTriager.json+1−1
lexicons/dev/knotless/shareRepo.json+2−2
lexicons/dev/knotless/transferRepo.json+1−1
lexicons/dev/knotless/unprotectBranch.json+1−1
lexicons/dev/knotless/unshareRepo.json+1−1
lexicons/dev/knotless/updateProfile.json+1−1
lexicons/dev/knotless/updateRepo.json+1−1
lexicons/dev/knotless/uploadAvatar.json+1−1
lexicons/dev/knotless/uploadImage.json+1−1
web/src/lib/molecules/Delegate.svelte+1−1
web/src/lib/molecules/ForkButton.svelte+1−1
web/src/lib/molecules/RerunMenu.svelte+1−1
web/src/lib/molecules/WatchMenu.svelte+1−1
web/src/lib/organisms/DangerZone.svelte+4−4
web/src/lib/organisms/DeleteData.svelte+1−1
web/src/lib/organisms/MergeBox.svelte+2−2
web/src/lib/organisms/ReleaseList.svelte+1−1
web/src/lib/organisms/RunnerList.svelte+1−1
web/src/lib/organisms/RunWorkflow.svelte+1−1
web/src/lib/organisms/SettingsAccess.svelte+4−4
web/src/lib/organisms/SettingsBranches.svelte+1−1
web/src/lib/organisms/SettingsGeneral.svelte+2−2
web/src/lib/organisms/SettingsLabels.svelte+1−1
web/src/lib/organisms/SettingsStorage.svelte+2−2
web/src/lib/organisms/StepSheet.svelte+1−1
web/src/lib/organisms/TransferOffer.svelte+1−1
web/src/lib/format.ts+1−1
web/src/routes/new/+page.svelte+1−1
web/src/routes/privacy/+page.svelte+1−1
web/src/routes/settings/+layout.svelte+1−1
AGENTS.md+52−28
README.md+1−1