Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
ec89db0
feat(client): LiveResourceStore — the consumer half, green against th…
sunib Jul 11, 2026
65491a0
build(client): typecheck the tests, and give TypeScript a linter
sunib Jul 11, 2026
96ae6be
feat(gateway): the stream loop, green against the gateway half of the…
sunib Jul 11, 2026
1047f12
feat: close the seam — the client now reads bytes the gateway really …
sunib Jul 11, 2026
360bfa1
feat(conformance): three watch ops Kubernetes really sends — and the …
sunib Jul 11, 2026
3b4e1b1
feat(examples): the browser rung — a real Chromium, native EventSourc…
sunib Jul 11, 2026
d53f44d
docs: the test ladder, and the habit that found the bugs
sunib Jul 11, 2026
5d7127f
feat(gateway): trust resourceVersion ordering (Kubernetes 1.35+), and…
sunib Jul 12, 2026
f71d696
feat: require Kubernetes 1.35+, and put the resourceVersion fixtures …
sunib Jul 12, 2026
9907eb6
docs: propose the real-cluster rung (0002)
sunib Jul 12, 2026
c68b3b9
feat(cluster): ask a real Kubernetes the questions the docs do not an…
sunib Jul 12, 2026
35400c5
feat(kube): the backend, and both ways into a real API server
sunib Jul 13, 2026
2010d2f
docs(kube): name the failure mode we do NOT defend against
sunib Jul 13, 2026
d622f24
fix(e2e): `npx tsc` was downloading a stranger's package from the reg…
sunib Jul 13, 2026
5299075
fix(kube): a `replace` made the adapter unconsumable by everyone exce…
sunib Jul 13, 2026
4d51314
feat(spec): krm-stream is a READ path — say so, and stop promising a …
sunib Jul 13, 2026
555ae66
feat(gateway): the Handler the README promised, and the request half …
sunib Jul 13, 2026
7c36ded
feat(gateway): one upstream watch per SCOPE, not per browser tab
sunib Jul 13, 2026
7eb157e
feat: the published ESM states its own provenance, and the k8s floor …
sunib Jul 13, 2026
4c86141
docs(auth): the stance, the one supported route — and the revocation …
sunib Jul 13, 2026
b5030d5
feat(kube): share the watch AND keep Kubernetes as the boundary — SSA…
sunib Jul 13, 2026
e020c13
docs: propose ValidatePatch (0003) — and delete a claim that was no l…
sunib Jul 13, 2026
a3f8c12
docs(0003): the owner asked whether the feature should exist — and th…
sunib Jul 13, 2026
d0e3140
feat!: a redacted value is DELETED, not masked — the hazard cannot arise
sunib Jul 13, 2026
4a4220f
ci: make the pipeline reusable, and fix four warnings that were telli…
sunib Jul 13, 2026
de39066
ci(release): conventional commits cut the version — and for Go, the T…
sunib Jul 13, 2026
16db685
ci: dependabot and OpenSSF Scorecard
sunib Jul 13, 2026
8f330e1
docs(npm): the package page must not be blank
sunib Jul 13, 2026
7e440fe
docs: propose 0004 — views, suppression, and the bytes nobody asked for
sunib Jul 13, 2026
4c8510d
docs(0003): the placeholder is DELETED, not deprecated — say so where…
sunib Jul 14, 2026
806514a
docs(0004): resourceVersion stays on the wire — and a `seq` of our own
sunib Jul 14, 2026
55eb692
docs(0004): "know it changed, not what it is" needs no crypto — and r…
sunib Jul 14, 2026
f29fdbd
fix(gateway): a scope bigger than the queue could never be served — S…
sunib Jul 14, 2026
36a1cc3
docs(0004): send / redact / remove — and three projections, not four
sunib Jul 14, 2026
32f6f09
docs(0004): send / redact / ignore — one verb from the owner, one hel…
sunib Jul 14, 2026
1e5f1e4
fix(gateway): `data: {}` was our artifact, not the server's state — d…
sunib Jul 14, 2026
e474d85
docs(0004): suppression silently ate the rev — the reviewer found a b…
sunib Jul 14, 2026
b3fac4c
feat: add stream projections and suppression
sunib Jul 14, 2026
dfcf5a0
feat: harden host integration
sunib Jul 14, 2026
e658ce3
feat: publish scoped npm package with forwarder
sunib Jul 14, 2026
0116080
docs: simplify starter documentation
sunib Jul 14, 2026
eea313b
merge: integrate scoped npm package
sunib Jul 14, 2026
34e892a
fix: resolve review findings
sunib Jul 14, 2026
bf3c08b
fix: close remaining review gaps
sunib Jul 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,21 @@ ENV DEBIAN_FRONTEND=noninteractive
SHELL ["/bin/bash", "-o", "pipefail", "-c"]

ENV DLV_VERSION=v1.27.0 \
GOPLS_VERSION=v0.22.0 \
STATICCHECK_VERSION=v0.7.0
GOPLS_VERSION=v0.23.0 \
STATICCHECK_VERSION=v0.7.0 \
CODEX_VERSION=0.144.3

RUN apt-get update \
&& apt-get -y install --no-install-recommends bash-completion \
&& apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*

# Codex CLI. npm's prefix here is /usr, which lives in the container's writable layer — so this
# has to be baked into the image, not installed at post-create, or a rebuild silently loses it.
# The login it writes lands in ~/.codex/auth.json, which devcontainer.json mounts as a volume.
RUN npm install -g "@openai/codex@${CODEX_VERSION}" \
&& npm cache clean --force \
&& codex --version

# hadolint ignore=SC2016
RUN printf '%s\n' \
'' \
Expand Down
19 changes: 19 additions & 0 deletions .devcontainer/devcontainer-lock.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"features": {
"ghcr.io/devcontainers/features/common-utils:2.5.9": {
"version": "2.5.9",
"resolved": "ghcr.io/devcontainers/features/common-utils@sha256:cb0c4d3c276f157eed17935747e364178d75fee17f55c4e129966f64633deb3a",
"integrity": "sha256:cb0c4d3c276f157eed17935747e364178d75fee17f55c4e129966f64633deb3a"
},
"ghcr.io/devcontainers/features/docker-outside-of-docker:1.10.0": {
"version": "1.10.0",
"resolved": "ghcr.io/devcontainers/features/docker-outside-of-docker@sha256:c2c2cf829505ead8e4892c88c31b6594ae94a2bbb209e16e1fac456c1a3a624e",
"integrity": "sha256:c2c2cf829505ead8e4892c88c31b6594ae94a2bbb209e16e1fac456c1a3a624e"
},
"ghcr.io/devcontainers/features/git:1": {
"version": "1.3.8",
"resolved": "ghcr.io/devcontainers/features/git@sha256:fd75977de13a9979000e0e78baf949adb0ca71d2398995fa22e0a36d7e7e7fe2",
"integrity": "sha256:fd75977de13a9979000e0e78baf949adb0ca71d2398995fa22e0a36d7e7e7fe2"
}
}
}
5 changes: 5 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
"extensions": [
"golang.go",
"anthropic.claude-code",
"openai.chatgpt",
"redhat.vscode-yaml"
]
}
Expand All @@ -59,12 +60,16 @@
// cannot write to it at all. post-create.sh chowns /home/vscode for exactly this reason.
// Without it: `claude` cannot log in, `gh auth login` cannot store a token, and the symptom
// gives you no clue why.
//
// Codex is kinder than Claude here: it keeps BOTH its config and its login (auth.json) inside
// ~/.codex, so the one volume is the whole story — no symlink into persisted-home needed.
"mounts": [
"source=krm-stream-gomodcache,target=/go/pkg/mod,type=volume",
"source=krm-stream-gobuildcache,target=/home/vscode/.cache/go-build,type=volume",
"source=krm-stream-dotkube,target=/home/vscode/.kube,type=volume",
"source=krm-stream-ghconfig,target=/home/vscode/.config/gh,type=volume",
"source=krm-stream-claudeconfig,target=/home/vscode/.claude,type=volume",
"source=krm-stream-codexconfig,target=/home/vscode/.codex,type=volume",
"source=krm-stream-persisted-home,target=/home/vscode/persisted-home,type=volume"
],
"containerEnv": {
Expand Down
9 changes: 5 additions & 4 deletions .devcontainer/post-create.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,17 @@ bash "${workspace_dir}/.devcontainer/sync-signing-key.sh" \
|| log "warning: SSH commit signing not configured (no agent / no key?) — commits will be unsigned"

# ------------------------------------------------------- home ownership (READ ME) --
# Every named volume mounted under /home/vscode (~/.claude, ~/.config/gh, ~/.kube, the Go
# caches, persisted-home) is created by Docker as ROOT-owned, because the image has no such
# Every named volume mounted under /home/vscode (~/.claude, ~/.codex, ~/.config/gh, ~/.kube, the
# Go caches, persisted-home) is created by Docker as ROOT-owned, because the image has no such
# directory to inherit ownership from. Without this chown, the `vscode` user cannot write to
# any of them — and the symptom is baffling: `claude` cannot log in, `gh auth login` cannot
# store a token, and kubectl cannot write a kubeconfig. Same fix as gitops-api's.
# any of them — and the symptom is baffling: `claude` and `codex` cannot log in, `gh auth login`
# cannot store a token, and kubectl cannot write a kubeconfig. Same fix as gitops-api's.
log "ensuring cache dirs exist, then fixing ownership under /home/vscode"
sudo mkdir -p \
/home/vscode/.cache/go-build \
/home/vscode/.cache/golangci-lint \
/home/vscode/.claude \
/home/vscode/.codex \
/home/vscode/.config/gh \
/home/vscode/.kube \
/home/vscode/persisted-home
Expand Down
61 changes: 61 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Grouped, so a week of upstream patch releases is one PR to review and one release-note line — not
# eleven. Every ecosystem in the repo is listed: an ecosystem that is not listed here is one where
# nobody is watching.
#
# Conventional commits, because release-please reads them: `chore(deps):` keeps routine bumps out of
# the changelog, which is what a consumer of this library wants — they do not care that our linter
# moved. The k8s.io/* floor is DELIBERATELY excluded below; see gateway/kube/go.mod for why.
version: 2

updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
groups:
github-actions:
patterns: ["*"]
commit-message:
prefix: "chore(deps)"

# The core module has no dependencies at all — by design, and CI fails if that changes — so there
# is nothing here to update. Only the adapter has any.
- package-ecosystem: gomod
directory: /gateway/kube
schedule:
interval: weekly
groups:
gomod:
patterns: ["*"]
ignore:
# The k8s.io/* requirement is a SUPPORTED-VERSION FLOOR, not a version to keep current: Go's
# minimal version selection means an adopter already on a newer client-go keeps it, while
# chasing patch releases here would force every adopter up to whatever we last built against.
# An adapter has no business dictating which Kubernetes libraries its host runs. Raising it is
# a deliberate act (it raises the supported minor), so it is not Dependabot's to make.
- dependency-name: k8s.io/*
commit-message:
prefix: "chore(deps)"

# devDependencies only — this package ships ZERO runtime dependencies, and the three dev ones are
# the compiler, its node types, and biome.
- package-ecosystem: npm
directory: /packages/krm-stream
schedule:
interval: weekly
groups:
npm:
patterns: ["*"]
commit-message:
prefix: "chore(deps)"

# Playwright lives here rather than in the library, which is exactly why it needs its own entry.
- package-ecosystem: npm
directory: /examples/vanilla-browser
schedule:
interval: weekly
groups:
npm:
patterns: ["*"]
commit-message:
prefix: "chore(deps)"
Loading