chadtmiller.com/knotless
git that lives in your Atmosphere account
1
10
Commands are grouped, and each MCP tool is its command's twin
.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/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.