kit 1.13.0
Added
- Context-lock now covers your SSH identity per project. A new
[context.ssh]block locks which key a repo pushes/deploys with — declare any ofidentity(the IdentityFile path),fingerprint(SHA256:…, machine-portable), orhost_alias(the~/.ssh/configHost the remote uses).kit context checkreads the repo's effective identity — a per-repocore.sshCommand-ioverride wins, otherwise it resolves the remote host throughssh -G— derives the key fingerprint viassh-keygen -lf, and verifies it matches. Pushing a repo with the wrong account's key is a mismatch, not a silent pass — the SSH analog of the git-host remote lock. Pure parsers (core.sshCommand-i,ssh -Gidentityfile, keygen fingerprint, remote host) are unit-tested; the livessh -Gread smoke-tests on a real machine. kit healthnow covers all three git hosts: GitLab CI and Bitbucket Pipelines sensors (GitHub was already there). Both probe the platform REST API via a newhttpGetonHealthDeps(the HTTP-probe path the sentinel design anticipated): GitLabGET /api/v4/projects/:path/pipelineswithGITLAB_TOKEN, BitbucketGET /2.0/repositories/:ws/:repo/pipelines/withBITBUCKET_TOKEN(orBITBUCKET_USERNAME+BITBUCKET_APP_PASSWORD). Each flags the most recent terminal pipeline as red when it failed, records thehost/pathit checked, and reportsunknown(never a falsegreen) on a missing token, a non-OK response, or no git remote. Sensors are selected by CI-file presence (.gitlab-ci.yml/bitbucket-pipelines.yml). Also:analyze's CI-file detection now recognizesbitbucket-pipelines.yml(it knew.github/workflows+.gitlab-ci.ymlbut missed Bitbucket). Live API smoke is pending a real GitLab/Bitbucket project + tokens; the parsers + auth + remote-parsing are fixture-tested against the documented schemas.- Context-lock now covers GitLab and Bitbucket, not just GitHub.
[context.gitlab](group,remote) and[context.bitbucket](workspace,remote) join[context.github]:kit context checkparses the liveoriginremote per host and verifies it matches the declared values, so a repo pushed to the wrong GitLab group or Bitbucket workspace is a mismatch, not a silent pass (same cross-account guard as GitHub). The brownfieldkit initoffer (suggestContextToml/hasLockableContext) now also surfaces a detected GitLab/Bitbucket binding. One(tool, field)row each — the lock table stays data-driven. - Two services in the registry: Keycloak and Atlassian (acli). Keycloak is detected from its clients (
keycloak-js,keycloak-connect,keycloak-admin-client,keycloak-angular,python-keycloak, Gogocloak) and declares its realm/admin secrets (KEYCLOAK_URL,KEYCLOAK_REALM,KEYCLOAK_CLIENT_ID/SECRET,KEYCLOAK_ADMIN/_PASSWORD); it carries no mise tool because it is a self-hosted server (run via Docker), with admin through the server's ownkcadm.sh. Atlassian is detected frombitbucket-pipelines.yml/.bitbucket, provisions the Atlassian CLI via mise (tool: acli→aqua:atlassian.com/acli), and tracksATLASSIAN_API_TOKEN/ATLASSIAN_SITE_URL; its auth is left as an informational note rather than a guessed login command. Adding each was a single registry data row (no detector/generator edits), per the unified-registry design. kit checkverifies full-disk encryption and flags an exposed memory store. A new check confirms the disk is encrypted (FileVault on macOS, BitLocker on Windows, LUKS/crypton Linux) and warns when kit's memory database sits inside the repo tree (where it could be committed) rather than the home-dir store. Read-only and best-effort: an undeterminable state is reported, never assumed encrypted.secrets validateandenv diffare now wired into the CLI. Both were documented but unrouted;secrets validatechecks declared secret sources resolve, andenv diffcompares the declared vs present environment.
Fixed
- Flaky local test runs (intermittent file-level failures + drifting test counts) traced to a dirty
dist/. Thebuildscript (unlikebuild:prod) never cleaneddist/, so compiled output from deleted/renamed sources accumulated, and editor/sync conflict copies (2.ts,3.ts, …) left staledist/* [0-9].jsfiles. Thetestglob (dist/*.test.js) then ran those orphans as duplicate/divergent tests, producing nondeterministic counts (e.g. 2355 → 2359 → 2361) and sporadic "not ok" with zero failing subtests. Fix:buildnowrm -rf distbefore compiling (matchingbuild:prod), so every run tests only current sources, and the tsconfig conflict-copy exclude was widened from* 2.tsto* [0-9].ts/.tsxto cover all numbered copies. Verified: 16 consecutive clean runs held a stable 2355 tests / 0 failures. .gitignorehardening no longer hides the curated shared-memory tier.check-gitignorenow ignores.kit/*(contents) but re-includes!.kit/shared/, so kit's local state stays ignored while the committed-by-design.kit/shared/(e.g. shared memory) remains tracked. The old wholesale.kit/rule made git refuse to descend into the dir, so a later negation could not re-include it.
Removed
- Flushed ~30k lines of dead, unreferenced code — the app-ops + SaaS-scaffold cluster and the marketplace/monetization cluster.
tscconfirmed nothing remaining imported them (the build stays green), so this is pure dead-weight removal, not a behavior change. Trims kit toward its focused CLI/governance core.
Full changelog: https://github.com/sandstream/kit/blob/v1.13.0/CHANGELOG.md
Verify this release:
git tag -v v1.13.0
npm audit signatures