Chisle
The coding-agent plugin that bills 52% of a bare model across 20 live tasks. Terse persona + tool-output compressor + context diet.
翻訳待ち
How registry.underpassai.com serves AXLR's signed tool catalog: a static signed index on S3 and CloudFront, a publish API with signed requests, an admin API behind mTLS, and a sandbox for tests.
翻訳待ち
開発ツールRust · ShellGitHub @underpass-aiオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
The write side of the AXLR tool catalog: a small, safe, serverless Rust registry for pre-forged tools
翻訳待ち
Loading the full README.
Read the full README ↗The write side of the AXLR tool catalog: a small, safe artifact registry for pre-forged tools and skills, run as Rust Lambdas on AWS for close to nothing. Publishers upload signed tool and skill versions, the registry scans them, runs their tests in a network-less sandbox and keeps them for a human reviewer; approved versions are listed in a signed index.json that the AXLR console installs from with /tools install.
AXLR and this registry are sibling projects in separate repositories. This one never imports AXLR; the index format is the contract between them.
| Where | What |
|---|---|
docs/domain.md | The domain: publishers and their keys, bundles and digests, publisher signatures, the policy scan, the version state machine, tools and skills, the signed index, key revocation |
docs/architecture.md | Hosting (Lambda, DynamoDB, S3, CloudFront, Route 53, mTLS), data model, security, cost, code layout, tests, delivery |
crates/domain | The domain crate: pure, one type per file, every value a validated newtype |
crates/application | Ports (traits) and use cases, one per file |
docs/api.md | The HTTP routes and bodies as the CLI speaks them and the API Lambdas serve them: signed requests, enrolment, approval, rate limits |
docs/client-identity.md | The client identity contract: one Ed25519 key per publisher, self-service enrolment, signed requests, per-key rate limits |
docs/operations.md | The offline CA, client certificates and their SHA-256, the truststore bucket and version, the us-east-1 CloudFront certificate, CA rotation, publisher enrolment and approval |
crates/adapters/memory | In-memory ports for tests |
crates/adapters/dynamodb | Publishers, tools, principals, the audit log, idempotency records, used nonces and rate windows over one DynamoDB table (condition expressions, a version lock per aggregate, GSI1 for the reviewer's queue, TTL on expires_at) |
crates/adapters/s3 | The artifact store (quarantine/<status>/…, published/tools/…) and the index writer (staging/index.json, published/index.json + .minisig) |
crates/adapters/lambda | Asynchronous invokes of test-runner and index-publisher, the system clock, the environment |
crates/adapters/http | Request and response mapping shared by the API Lambdas: signed requests, the upload and enrolment bodies, the mTLS principal, errors to status codes (429 with Retry-After), routing |
crates/runner | Runs a tool version's tests.json with the axlr_run_tool contract (PATH and HOME only, 30 s per case, 1 MiB per stream, a whole-run deadline; under bubblewrap off Lambda) or checks a skill's files, and records the report |
crates/cli | axlr-registry: the publisher, reviewer and operator command line |
crates/lambdas/* | The four Lambda entry points, each wiring the adapters above: publish-api, admin-api, index-publisher and test-runner (a container image with python3, bash and node) |
scripts/ca.sh | The local parts of docs/operations.md: init, issue, fingerprint, truststore, rotate, retire |
crates/local | axlr-registry-local: the registry from memory on the loopback (publish API, signed catalog, inline tests, automatic review) for end-to-end runs without AWS; see docs/operations.md, "Local harness" |
crates/e2e | The end-to-end scenario the release job runs against the staging stack (ignored unless REGISTRY_E2E_* is set) |
infra/template.yaml | The SAM template |
.github/workflows | ci-dev (every push), ci-main (merges: coverage gate, audit, integration, Lambda build), release (tags: build, staging, e2e, production) |
just check # fmt, clippy -D warnings, cargo test --workspace
just coverage # cargo llvm-cov, 80 % line gate, offline (Lambda and harness main.rs and the SDK-calling adapter files excluded)
just local # axlr-registry-local on 127.0.0.1:8787 (see docs/operations.md, "Local harness")
just services # DynamoDB Local on :8000 and MinIO on :9000 in Docker
just integration # every test, the adapter integration tests included (needs the services)
just coverage-all # the CI gate: everything under llvm-cov, only main.rs excluded
just lambdas # cargo lambda build --release --arm64 (needs cargo-lambda)
api.DOMAIN (every request signed with the publisher's key: X-AXLR-Key, X-AXLR-Timestamp, X-AXLR-Nonce, X-AXLR-Signature; publish-api):
| Route | Body | Answer |
|---|---|---|
POST /v1/publishers/enroll | {id, public_key, namespaces, contact}, signed with the key being enrolled | 202 {id, status: pending, namespaces}; an operator approves it |
POST /v1/publishers/{id}/keys | {public_key}, signed with one of the caller's keys | 201 {id, key_id} |
POST /v1/versions | {manifest, files: {name: base64}, key_id, signature} (base64 everywhere; Idempotency-Key header optional, replayed per key for a day) | 201 with the version, its status (scanned or rejected) and the scan findings |
GET /v1/versions/{name}/{version} | 200 with status, findings, test outcome and rejection reason |
Refusals of a signed request: 401 stale, unknown_key, bad_signature, replay; 403 pending, suspended; 429 rate_limited with Retry-After (60 requests per minute and 20 uploads per day per key by default, 5 enrolments per hour per address).
admin.DOMAIN (mTLS; the principal is the client certificate's SHA-256, admin-api):
This is the beginning of the README. Read the rest at the original. Read the full README ↗