From 26ff4515c095fe23e7b37fc7728b64c6a090759b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 21:24:01 +0000 Subject: [PATCH] chore(main): release 0.1.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 192 ++++++++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/.release-please-manifest.json b/.release-please-manifest.json index e18ee07..466df71 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.0.0" + ".": "0.1.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..867970f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,192 @@ +# Changelog + +## 0.1.0 (2026-06-02) + + +### Features + +* **api:** /api/v1/connections CRUD ([#0040](https://github.com/karnstack/tempo/issues/0040)) ([9566ee5](https://github.com/karnstack/tempo/commit/9566ee5e6a01669708776e90993211d312c8edd2)) +* **api:** /api/v1/engineers + per-engineer metrics ([#0043](https://github.com/karnstack/tempo/issues/0043)) ([6603bdc](https://github.com/karnstack/tempo/commit/6603bdcec42f955337a33300995f49e1a9adbcf3)) +* **api:** /api/v1/me + auth middleware ([#0038](https://github.com/karnstack/tempo/issues/0038)) ([a84b348](https://github.com/karnstack/tempo/commit/a84b348604be53ad23053895099875795e84995f)) +* **api:** /api/v1/orgs/:org/metrics ([#0042](https://github.com/karnstack/tempo/issues/0042)) ([c646359](https://github.com/karnstack/tempo/commit/c64635930c3f512d04f5c25b30f393539bb57eb4)) +* **api:** /api/v1/repos + per-repo metrics ([#0041](https://github.com/karnstack/tempo/issues/0041)) ([f04c2b9](https://github.com/karnstack/tempo/commit/f04c2b964817b1b7244ce922574d82783b6b090b)) +* **api:** /api/v1/sync/status + system/health ([#0044](https://github.com/karnstack/tempo/issues/0044)) ([f166e8c](https://github.com/karnstack/tempo/commit/f166e8cc12859b7ad4aa9bae4d1fbafb335b4853)) +* **api:** /api/v1/tokens CRUD with encrypted PAT ([#0039](https://github.com/karnstack/tempo/issues/0039)) ([7eac45f](https://github.com/karnstack/tempo/commit/7eac45f64fe112d890ed5ee84977b9246bdbdf33)) +* **api:** /api/v1/tokens CRUD with PAT encryption ([25d1618](https://github.com/karnstack/tempo/commit/25d1618bab927ae6fc78734065e1cd4131a82176)) +* **api:** /auth/firstrun + /auth/register handlers ([435e331](https://github.com/karnstack/tempo/commit/435e331724a2ce2e06aba5156ac618201f6edfa1)) +* **api:** /auth/login handler ([5f30088](https://github.com/karnstack/tempo/commit/5f3008893c34c0718f4b56e72e4b834d3043d641)) +* **api:** /auth/logout handler ([702b882](https://github.com/karnstack/tempo/commit/702b882c687ff51d0acb120bbbd6847496c20818)) +* **api:** connections CRUD handlers ([#0040](https://github.com/karnstack/tempo/issues/0040)) ([a04ad67](https://github.com/karnstack/tempo/commit/a04ad67be5a0f42e3bf3554baceae8411541199b)) +* **api:** embed and serve openapi.yaml ([#0045](https://github.com/karnstack/tempo/issues/0045)) ([8879fdb](https://github.com/karnstack/tempo/commit/8879fdb9bcd924aa74213a6d192e8c6184d08125)) +* **api:** engineers list + metrics handler ([#0043](https://github.com/karnstack/tempo/issues/0043)) ([453d8c1](https://github.com/karnstack/tempo/commit/453d8c12d9a694209ad7a23971d5cadcca386d3e)) +* **api:** GET /api/v1/me behind RequireSession ([66829df](https://github.com/karnstack/tempo/commit/66829df023721b98261b8b9aa2eaa8033c6d940e)) +* **api:** hand-rolled OpenAPI 3.1 spec ([#0045](https://github.com/karnstack/tempo/issues/0045)) ([690f2ee](https://github.com/karnstack/tempo/commit/690f2eebe011e5e5bfbc48f6e191f91a415f182f)) +* **api:** mount /auth/login + /auth/logout ([7e6afb4](https://github.com/karnstack/tempo/commit/7e6afb41f487feabc288dac4ee82758850c9ba23)) +* **api:** mount auth routes ([e911e0f](https://github.com/karnstack/tempo/commit/e911e0fcf77fad80480f0d78a61738cce1c44c4c)) +* **api:** OpenAPI 3.1 spec generation ([#0045](https://github.com/karnstack/tempo/issues/0045)) ([270365c](https://github.com/karnstack/tempo/commit/270365c076310b2f65939a665f89339dc059ff3a)) +* **api:** org metrics handler ([#0042](https://github.com/karnstack/tempo/issues/0042)) ([502c519](https://github.com/karnstack/tempo/commit/502c51966181a92b1a83e65880c569c2c19961fc)) +* **api:** per-request access log middleware with context propagation ([17c291a](https://github.com/karnstack/tempo/commit/17c291ade2fe10e57ca92ebf7f4ae1afc46aef3f)) +* **api:** repos list + metrics handlers ([#0041](https://github.com/karnstack/tempo/issues/0041)) ([3ad37d1](https://github.com/karnstack/tempo/commit/3ad37d12802198500b96dcfd5cb2424a3c20c44c)) +* **api:** requireSession echo middleware ([746e8e9](https://github.com/karnstack/tempo/commit/746e8e9ce433136ae4ec9618a2ea304665a8a42c)) +* **api:** sync status handler ([#0044](https://github.com/karnstack/tempo/issues/0044)) ([bc42b94](https://github.com/karnstack/tempo/commit/bc42b94002b057358f6e11d845422ea3fb6dad64)) +* **api:** wire authenticator into router ([92b8b9d](https://github.com/karnstack/tempo/commit/92b8b9d78a69282cb6f1bd3e84e0cad080dda992)) +* **api:** wire me.Configure into router ([2ce98af](https://github.com/karnstack/tempo/commit/2ce98af7e9c395c72997a0f0f98970a9e4c6234f)) +* **api:** wire tokens.Configure + secret.Box into fx graph ([d81d6f4](https://github.com/karnstack/tempo/commit/d81d6f41bfa1dca0e31db8084f18101d1895d47a)) +* **auth:** /auth/login + /auth/logout + middleware ([#0018](https://github.com/karnstack/tempo/issues/0018)) ([8e0c86d](https://github.com/karnstack/tempo/commit/8e0c86dbae3c4193fcb0691369b945b64168b7d3)) +* **auth:** /auth/register + first-run gate ([#0017](https://github.com/karnstack/tempo/issues/0017)) ([36b322d](https://github.com/karnstack/tempo/commit/36b322d09f0d290d11be003b75a3f621528e3398)) +* **auth:** Argon2id password hashing module ([#0015](https://github.com/karnstack/tempo/issues/0015)) ([fc3493d](https://github.com/karnstack/tempo/commit/fc3493d08c2e5297f1e3d041f103d3f833a73ca0)) +* **auth:** argon2id password hashing with PHC encoding ([78b2fae](https://github.com/karnstack/tempo/commit/78b2fae2fbeba86989bfd9c274b20ac3ea374faf)) +* **auth:** authenticator with constant-time login ([c28f668](https://github.com/karnstack/tempo/commit/c28f668e38e39fc0cdf05be8572133a31074cc48)) +* **auth:** cookie session manager (issue/validate/revoke) ([644305e](https://github.com/karnstack/tempo/commit/644305e07c104f1f688084add4a4dc99025d9ea5)) +* **auth:** fx provider for authenticator ([bb56d10](https://github.com/karnstack/tempo/commit/bb56d1047eb5d830a3593888fafa0816771d78a8)) +* **auth:** fx providers for manager + registrar ([b91d115](https://github.com/karnstack/tempo/commit/b91d115d5714a5805f062e4cdf834fa0f640b173)) +* **auth:** registrar with first-run gate ([9b357ff](https://github.com/karnstack/tempo/commit/9b357ff9a57e284df1744dff5ba7e5090358bbf3)) +* **auth:** Server-validated cookie sessions ([#0016](https://github.com/karnstack/tempo/issues/0016)) ([3cb8273](https://github.com/karnstack/tempo/commit/3cb8273dbe8d3cd3633b741365169295504a539f)) +* **cmd/migrate:** pure-Go goose runner ([17fb0a6](https://github.com/karnstack/tempo/commit/17fb0a6f25a05bbd2a620c6cd85763d28ada6128)) +* **cmd:** wire auth manager + registrar ([9104b1c](https://github.com/karnstack/tempo/commit/9104b1c8680379e391a66170c520a6e7c978c028)) +* **cmd:** wire authenticator ([52f2b32](https://github.com/karnstack/tempo/commit/52f2b3287fd43568b3a45c15d81683a039681592)) +* **config:** full env loader with validation + dev secret fallback ([#0013](https://github.com/karnstack/tempo/issues/0013)) ([4d49628](https://github.com/karnstack/tempo/commit/4d49628d2844a06fa2bb0829edcab3451c08de1c)) +* **config:** parse TEMPO_DB into driver+DSN ([2284767](https://github.com/karnstack/tempo/commit/2284767af2807a780bd2769b45fba2e8417b80b9)) +* **config:** TEMPO_SYNC_RUN_RETENTION ([#0031](https://github.com/karnstack/tempo/issues/0031)) ([c681fbb](https://github.com/karnstack/tempo/commit/c681fbb85d21ab9912666987fb0e4eb896fd24bc)) +* **docker:** docker compose stack with migrate one-shot ([#0060](https://github.com/karnstack/tempo/issues/0060)) ([3631874](https://github.com/karnstack/tempo/commit/363187431d2e7e2100cff62f41b048f930be9c2d)) +* **docker:** Dockerfile (multi-stage distroless) + docker-compose ([#0060](https://github.com/karnstack/tempo/issues/0060)) ([e229067](https://github.com/karnstack/tempo/commit/e22906744a6ec767803577e6f0bc8c93f305de3d)) +* **docker:** multi-stage distroless Dockerfile + .dockerignore ([#0060](https://github.com/karnstack/tempo/issues/0060)) ([a80f68b](https://github.com/karnstack/tempo/commit/a80f68b234d8ad022a3f72bd89f530311bdbe2d1)) +* **dx:** air-based hot reload + concurrent dev script ([#0006](https://github.com/karnstack/tempo/issues/0006)) ([a58816c](https://github.com/karnstack/tempo/commit/a58816c1634a415b3ec889ee5258f004cbc8514e)) +* **github/commits:** types + REST fetcher with since/ETag/page ([689eb19](https://github.com/karnstack/tempo/commit/689eb19e30715d5a9afb332d5e9fc0e593a9ac35)) +* **github/deployments:** types + REST fetcher with ETag/page ([475c60e](https://github.com/karnstack/tempo/commit/475c60e3187f1324f6da8f3f59f140fae303887b)) +* **github/orgrepos:** types + REST fetcher with ETag/page ([443f94a](https://github.com/karnstack/tempo/commit/443f94a2469cd4334da36436289fa7dc4c464084)) +* **github/prconvo:** types + GraphQL queries + per-PR fetchers ([8c26afa](https://github.com/karnstack/tempo/commit/8c26afacfa5493c88cc79c5c7a18f51d5102a480)) +* **github/prs:** types + GraphQL query + page fetch with cursor + since cutoff ([a9cb7be](https://github.com/karnstack/tempo/commit/a9cb7be6c471baf8fb1ba02d866a9291423624cf)) +* **github/releases:** types + REST fetcher with ETag/page ([a480160](https://github.com/karnstack/tempo/commit/a48016047dc792e952a92420b3f5fc4ce7174ee4)) +* **github/vcr:** auto mode and record-tag demo test ([1eec178](https://github.com/karnstack/tempo/commit/1eec178a7ab3d6628deed05d1d8eb654d05eb5cd)) +* **github/vcr:** canonical match keys for replay ([f0ad5cc](https://github.com/karnstack/tempo/commit/f0ad5cc748b5879b562fa90f0e707a5276eaab34)) +* **github/vcr:** cassette load/save with JSON body fallback ([b4dfc27](https://github.com/karnstack/tempo/commit/b4dfc27dc6c6264241a7add623f0cfbbc163d10b)) +* **github/vcr:** mode enum and TEMPO_VCR env helper ([dca27a6](https://github.com/karnstack/tempo/commit/dca27a69253b87862f1fd44f59027b23a318a513)) +* **github/vcr:** record transport with header scrubbing ([b3e91b7](https://github.com/karnstack/tempo/commit/b3e91b7dacc1614acfd960cae0fab16db05b8d8f)) +* **github/vcr:** replay transport with ordered match ([666e8cd](https://github.com/karnstack/tempo/commit/666e8cdc3fa00a135a2e097a9af0082d4dbbe9dd)) +* **github/vcr:** scaffold package skeleton ([f473070](https://github.com/karnstack/tempo/commit/f47307024acbe0b1a7c3d9634cc708f2d0e981b6)) +* **github:** Commits fetcher (REST since + ETag) ([#0023](https://github.com/karnstack/tempo/issues/0023)) ([92f0351](https://github.com/karnstack/tempo/commit/92f035136296f4ca19ecac668e50c87945aa8f4c)) +* **github:** Deployments + Releases fetcher ([#0024](https://github.com/karnstack/tempo/issues/0024)) ([bcc3ad9](https://github.com/karnstack/tempo/commit/bcc3ad9a87a932826005a3864b0793ed280f42cd)) +* **github:** expose Client.RESTRemaining() ([479ded7](https://github.com/karnstack/tempo/commit/479ded719cb5185e87fb9637eec67d1278ee1f8a)) +* **github:** expose graphql limiter remaining ([#0027](https://github.com/karnstack/tempo/issues/0027)) ([295dd49](https://github.com/karnstack/tempo/commit/295dd49749731984f8e8f0d80f1feb9903108a10)) +* **github:** GitHub client base (REST + GraphQL) + rate limiter ([#0019](https://github.com/karnstack/tempo/issues/0019)) ([cae8ee8](https://github.com/karnstack/tempo/commit/cae8ee8b0e1ddcc25b5f1e8eb55c73ed38df9ccf)) +* **github:** Org repos enumerator ([#0025](https://github.com/karnstack/tempo/issues/0025)) ([b5a5f12](https://github.com/karnstack/tempo/commit/b5a5f128cc0fd32a3787df2e4f37001637a49be5)) +* **github:** PR fetcher (GraphQL with cursors) ([#0021](https://github.com/karnstack/tempo/issues/0021)) ([29aee43](https://github.com/karnstack/tempo/commit/29aee43c4b32214e44bebf0252f4d0b391d20ce0)) +* **github:** rate-limit aware Limiter ([b096a77](https://github.com/karnstack/tempo/commit/b096a773b3116203ea3adfddf657c7c2dbe7ad88)) +* **github:** REST + GraphQL client with retry and rate-limit handling ([d81dcfd](https://github.com/karnstack/tempo/commit/d81dcfd94a46c74ede86cc273d82db4650c706a3)) +* **github:** Reviews + review-comments + issue-comments fetchers ([#0022](https://github.com/karnstack/tempo/issues/0022)) ([b30205b](https://github.com/karnstack/tempo/commit/b30205b4a72255dc53e087970c60913917aa3170)) +* **github:** sentinel errors for HTTP and graphql failures ([c31bb76](https://github.com/karnstack/tempo/commit/c31bb761a0db86caac3533000592a20b94fd60b2)) +* **github:** VCR-style fixture recorder/replayer for tests ([#0020](https://github.com/karnstack/tempo/issues/0020)) ([f70fa65](https://github.com/karnstack/tempo/commit/f70fa65eb2b6a7f104f8549655858e6c4d01eb65)) +* **ingest/commits:** isolate per-repo failures ([#0029](https://github.com/karnstack/tempo/issues/0029)) ([0a0e124](https://github.com/karnstack/tempo/commit/0a0e1242b90298698e10be2343b18ccdeeced27b)) +* **ingest/commits:** runner skeleton + fx wiring ([#0029](https://github.com/karnstack/tempo/issues/0029)) ([a058465](https://github.com/karnstack/tempo/commit/a05846580229622944911c0081a6af0f33e3c20d)) +* **ingest/commits:** single-repo happy path + cursor ([#0029](https://github.com/karnstack/tempo/issues/0029)) ([a4aa3de](https://github.com/karnstack/tempo/commit/a4aa3dee78316a4a2caee4091f9a9de79ac93841)) +* **ingest/deployments:** early-stop on cursor crossover ([#0030](https://github.com/karnstack/tempo/issues/0030)) ([b3ba126](https://github.com/karnstack/tempo/commit/b3ba126acaa240b65632c07c85932a06b7b71b1e)) +* **ingest/deployments:** isolate per-repo failures ([#0030](https://github.com/karnstack/tempo/issues/0030)) ([5657971](https://github.com/karnstack/tempo/commit/5657971d6ddc596fef046af7f7e21b98190028ad)) +* **ingest/deployments:** runner skeleton + fx wiring ([#0030](https://github.com/karnstack/tempo/issues/0030)) ([cc4c781](https://github.com/karnstack/tempo/commit/cc4c781fc734be7c0e5ad54411051465712ed245)) +* **ingest/deployments:** single-repo happy path + cursor ([#0030](https://github.com/karnstack/tempo/issues/0030)) ([3f4a52d](https://github.com/karnstack/tempo/commit/3f4a52d8508420d150672b4d0c6d74eb9f33657e)) +* **ingest/prconvo:** isolate per-PR failures ([#0028](https://github.com/karnstack/tempo/issues/0028)) ([166be53](https://github.com/karnstack/tempo/commit/166be537f478c27b0e9dcf82491220c68a702534)) +* **ingest/prconvo:** multi-PR iteration ([#0028](https://github.com/karnstack/tempo/issues/0028)) ([60ecd1a](https://github.com/karnstack/tempo/commit/60ecd1ae34ac4d5cca2109006fe63570005da10f)) +* **ingest/prconvo:** runner skeleton + fx wiring ([#0028](https://github.com/karnstack/tempo/issues/0028)) ([dcc12a5](https://github.com/karnstack/tempo/commit/dcc12a5bbce66798d7c7963a7edcb94c57289a90)) +* **ingest/prconvo:** single-PR happy path + cursor ([#0028](https://github.com/karnstack/tempo/issues/0028)) ([2564d96](https://github.com/karnstack/tempo/commit/2564d96b788004b10d6e5752ef4e7a5566a0d771)) +* **ingest/prs:** isolate per-repo failures ([#0027](https://github.com/karnstack/tempo/issues/0027)) ([b3e720c](https://github.com/karnstack/tempo/commit/b3e720c1f51a53d910e4a2d73202f1fd5389db4f)) +* **ingest/prs:** page loop ([#0027](https://github.com/karnstack/tempo/issues/0027)) ([e30cf6a](https://github.com/karnstack/tempo/commit/e30cf6afd29435f0f36895c77ba28e2ed349fcaa)) +* **ingest/prs:** runner skeleton + fx wiring ([#0027](https://github.com/karnstack/tempo/issues/0027)) ([5dd37b7](https://github.com/karnstack/tempo/commit/5dd37b7d242437fb09d95c52993ad399bd3a287f)) +* **ingest/prs:** single-page run + cursor persist ([#0027](https://github.com/karnstack/tempo/issues/0027)) ([71b63c1](https://github.com/karnstack/tempo/commit/71b63c19830f09cfeda19e25a4167133074d31a0)) +* **ingest:** commits ingest end-to-end ([#0029](https://github.com/karnstack/tempo/issues/0029)) ([0f667a8](https://github.com/karnstack/tempo/commit/0f667a84f83e592f7a2d139cb2101be3ad29e35c)) +* **ingest:** deployments ingest end-to-end ([#0030](https://github.com/karnstack/tempo/issues/0030)) ([0521cbb](https://github.com/karnstack/tempo/commit/0521cbb50f286abedaeef08f1fa62cd095b033ff)) +* **ingest:** fx lifecycle wiring ([#0026](https://github.com/karnstack/tempo/issues/0026)) ([5073588](https://github.com/karnstack/tempo/commit/50735882c2d528b77f5dab2f17d89055b3f787a6)) +* **ingest:** PR ingest end-to-end with cursor persistence ([#0027](https://github.com/karnstack/tempo/issues/0027)) ([e654f9b](https://github.com/karnstack/tempo/commit/e654f9bce54147a84be6e1b7054342a205e8c8a3)) +* **ingest:** prune sync_runs to retention ([#0031](https://github.com/karnstack/tempo/issues/0031)) ([048c681](https://github.com/karnstack/tempo/commit/048c6813ad122c85005166a4a15ab7979f382bf0)) +* **ingest:** reviews/comments ingest end-to-end ([#0028](https://github.com/karnstack/tempo/issues/0028)) ([2ee93a1](https://github.com/karnstack/tempo/commit/2ee93a16c166c227a914ddba6d7e9066bb2e23d2)) +* **ingest:** runner interface + noop runner ([#0026](https://github.com/karnstack/tempo/issues/0026)) ([ffe87a0](https://github.com/karnstack/tempo/commit/ffe87a037291b3dc0730237dc55f887713b3834c)) +* **ingest:** scheduler tick core ([#0026](https://github.com/karnstack/tempo/issues/0026)) ([f51a46b](https://github.com/karnstack/tempo/commit/f51a46bf08b62e24ca02158778e3d8a7863c4520)) +* **ingest:** StatusFor helper for sync_runs ([#0031](https://github.com/karnstack/tempo/issues/0031)) ([abe79a2](https://github.com/karnstack/tempo/commit/abe79a25cfec96110aefb3423d7432f6b3619707)) +* **ingest:** sync runs + status hook + retention ([#0031](https://github.com/karnstack/tempo/issues/0031)) ([e005e4d](https://github.com/karnstack/tempo/commit/e005e4d0301c5ff33be0be1396e03f5546e422a2)) +* **ingest:** wire commits runner into main ([#0029](https://github.com/karnstack/tempo/issues/0029)) ([840c0c3](https://github.com/karnstack/tempo/commit/840c0c3d1bae488f54a886753521fca7e3a1fba1)) +* **ingest:** wire deployments runner into main ([#0030](https://github.com/karnstack/tempo/issues/0030)) ([5a8f674](https://github.com/karnstack/tempo/commit/5a8f674ddd0d7cb03517f020cb70b9da8c752761)) +* **ingest:** wire prconvo runner into main ([#0028](https://github.com/karnstack/tempo/issues/0028)) ([ea555ec](https://github.com/karnstack/tempo/commit/ea555ec4edad39f5c538ea9c0a1d2e4fa6d8b335)) +* **ingest:** wire prs runner into main ([#0027](https://github.com/karnstack/tempo/issues/0027)) ([47ad7ff](https://github.com/karnstack/tempo/commit/47ad7ff3db85ff3918ac2d79ce103253460532e2)) +* **ingest:** wire scheduler into main ([#0026](https://github.com/karnstack/tempo/issues/0026)) ([37a715c](https://github.com/karnstack/tempo/commit/37a715ca62426beb825a604c5c384f076e67c02e)) +* **ingest:** worker scheduler — ticker per-connection iteration ([#0026](https://github.com/karnstack/tempo/issues/0026)) ([19f585a](https://github.com/karnstack/tempo/commit/19f585a0372d63d9d29e8ad062545d54b4a0e7a8)) +* **logger:** context propagation helpers ([a1b86ab](https://github.com/karnstack/tempo/commit/a1b86abfcbf7b2ef7e25059dc38c4565ce793bf0)) +* **logger:** honor TEMPO_LOG_LEVEL and TEMPO_LOG_FORMAT ([8dfa812](https://github.com/karnstack/tempo/commit/8dfa8121848a3dde4e38ac8ff0856dea855c2dab)) +* **migrations:** embed SQL files into Go package ([5617430](https://github.com/karnstack/tempo/commit/5617430feb463d27c0b3772665c075705277c450)) +* **migrations:** rollup_runs tracking table ([#0032](https://github.com/karnstack/tempo/issues/0032)) ([1646706](https://github.com/karnstack/tempo/commit/16467064b08ad5aaa92d1ddcfbc5235318e31ae1)) +* **rollup:** Aggregator interface ([#0032](https://github.com/karnstack/tempo/issues/0032)) ([6319079](https://github.com/karnstack/tempo/commit/6319079cbb582bcfcf85020b247df9d7c8dc7111)) +* **rollup:** Cycle time + lead time rollup p50/p90 ([#0035](https://github.com/karnstack/tempo/issues/0035)) ([b342a0c](https://github.com/karnstack/tempo/commit/b342a0cddeeacc682d926085e079e0e30ab817c4)) +* **rollup:** cycle_time aggregator ([#0035](https://github.com/karnstack/tempo/issues/0035)) ([3d779bf](https://github.com/karnstack/tempo/commit/3d779bf42890011a2c594a976a6bc562d8c99106)) +* **rollup:** Engineer stats rollup ([#0033](https://github.com/karnstack/tempo/issues/0033)) ([622cf24](https://github.com/karnstack/tempo/commit/622cf243dc0074b4acb127bf4cd5de751d12f685)) +* **rollup:** engineer_stats aggregator ([#0033](https://github.com/karnstack/tempo/issues/0033)) ([6d57894](https://github.com/karnstack/tempo/commit/6d57894ef817c8e6a4db2de2a9bdb3aa6069b3be)) +* **rollup:** fx wiring + main.go invoke ([#0032](https://github.com/karnstack/tempo/issues/0032)) ([99ccaf5](https://github.com/karnstack/tempo/commit/99ccaf58eb6fda7cc192d0b6f5e8e0ed2a3d229f)) +* **rollup:** fx wiring for cycle_time ([#0035](https://github.com/karnstack/tempo/issues/0035)) ([7b4a7dd](https://github.com/karnstack/tempo/commit/7b4a7dd5dd68e5e7f6620a2568d010375e88442e)) +* **rollup:** fx wiring for engineer_stats ([#0033](https://github.com/karnstack/tempo/issues/0033)) ([ecf5878](https://github.com/karnstack/tempo/commit/ecf587872fc1f3173080d574aaf2186ad19a5736)) +* **rollup:** fx wiring for repo_stats ([#0034](https://github.com/karnstack/tempo/issues/0034)) ([9bfe18e](https://github.com/karnstack/tempo/commit/9bfe18e5b836e8e24c7930f71472ec277da623b2)) +* **rollup:** fx wiring for review_stats ([#0036](https://github.com/karnstack/tempo/issues/0036)) ([5799b20](https://github.com/karnstack/tempo/commit/5799b20afc37c23866c7005df232618f290fab7a)) +* **rollup:** Idempotent re-aggregation hook ([#0037](https://github.com/karnstack/tempo/issues/0037)) ([70f91e5](https://github.com/karnstack/tempo/commit/70f91e532804031f1d2b08a6d607146c007252a1)) +* **rollup:** Repo stats rollup ([#0034](https://github.com/karnstack/tempo/issues/0034)) ([ea22d3e](https://github.com/karnstack/tempo/commit/ea22d3ef1d4f51fac6cf005b21d2bce9b8ca8957)) +* **rollup:** repo_stats aggregator ([#0034](https://github.com/karnstack/tempo/issues/0034)) ([4956822](https://github.com/karnstack/tempo/commit/4956822d07c4855f6741b1ab3f5104e2f9f7ede0)) +* **rollup:** Review latency + load rollup ([#0036](https://github.com/karnstack/tempo/issues/0036)) ([a9d59f3](https://github.com/karnstack/tempo/commit/a9d59f3ec13c967ee7e297bc1b0bbfdd236dd0bf)) +* **rollup:** review_stats aggregator ([#0036](https://github.com/karnstack/tempo/issues/0036)) ([1341ffc](https://github.com/karnstack/tempo/commit/1341ffccce5e9ae326b138f9b98ce81f75ad567e)) +* **rollup:** rollup scheduler (daily 02:00 instance-local) ([#0032](https://github.com/karnstack/tempo/issues/0032)) ([2247648](https://github.com/karnstack/tempo/commit/22476484ca5a51f98352a34f9b34d05085212ea4)) +* **rollup:** scheduler Rebuild method ([#0037](https://github.com/karnstack/tempo/issues/0037)) ([53f1b17](https://github.com/karnstack/tempo/commit/53f1b17925b05d033c39275d465b44454782aed2)) +* **rollup:** scheduler with RunDate, Tick, CatchUp, Loop ([#0032](https://github.com/karnstack/tempo/issues/0032)) ([d7939f8](https://github.com/karnstack/tempo/commit/d7939f8883ccb91d84e2468a1ca16f1a8e7715b0)) +* **secret:** AES-256-GCM Box for at-rest credential encryption ([f78aed2](https://github.com/karnstack/tempo/commit/f78aed2782c8a3b251cb1af654eac71844254451)) +* **server:** embed SPA via //go:embed with SPA fallback ([#0005](https://github.com/karnstack/tempo/issues/0005)) ([342c4f9](https://github.com/karnstack/tempo/commit/342c4f979c088bd02b34eb60a7a252ebc818c9da)) +* **server:** Logger (zap) + request/correlation middleware ([#0014](https://github.com/karnstack/tempo/issues/0014)) ([d6c3ecc](https://github.com/karnstack/tempo/commit/d6c3ecc192950eadd39f06b09863daaa685bf51a)) +* **server:** minimal echo+fx+zap server with /system/health ([#0002](https://github.com/karnstack/tempo/issues/0002)) ([f1a10c0](https://github.com/karnstack/tempo/commit/f1a10c0531bf11f5be7a7614ebda356b02b5fc9c)) +* **server:** wire SQLite into fx graph + warmup ping ([a1fd271](https://github.com/karnstack/tempo/commit/a1fd2717d3049dfe967b25237e0a85714869ef9e)) +* **storage:** CountConnectionsByToken for token-delete safety ([51af05d](https://github.com/karnstack/tempo/commit/51af05da8470706468a3eca4d7e1f9072bb028cc)) +* **storage:** declare Storage interface seam ([d7e58f9](https://github.com/karnstack/tempo/commit/d7e58f91f689f83ca205abaaae576f1119313169)) +* **storage:** gh_user by tenant+login lookup ([#0043](https://github.com/karnstack/tempo/issues/0043)) ([622069e](https://github.com/karnstack/tempo/commit/622069e13979b8632b16280a5f2ff0298998bd91)) +* **storage:** list-active-connections sqlc query ([#0026](https://github.com/karnstack/tempo/issues/0026)) ([df2d21f](https://github.com/karnstack/tempo/commit/df2d21f31cd643d7b074f27b420b74cea944527d)) +* **storage:** ListAllRepos + engineer_stats agg note ([#0033](https://github.com/karnstack/tempo/issues/0033)) ([f4bd0ce](https://github.com/karnstack/tempo/commit/f4bd0ced7ae98e805aeedc99206c9c5063845ee7)) +* **storage:** migration 0001 — identity & config tables ([#0008](https://github.com/karnstack/tempo/issues/0008)) ([c64f6fa](https://github.com/karnstack/tempo/commit/c64f6faa140527d9af29378e6953e09c71962408)) +* **storage:** migration 0002 — raw event tables ([#0009](https://github.com/karnstack/tempo/issues/0009)) ([57443f5](https://github.com/karnstack/tempo/commit/57443f53dcda8b5469d133c312a08e9224969f6d)) +* **storage:** migration 0003 — daily rollup tables ([#0010](https://github.com/karnstack/tempo/issues/0010)) ([40ead77](https://github.com/karnstack/tempo/commit/40ead7729e99f41e1897d4d9d49deef1c007a145)) +* **storage:** migration 0004 — sync state tables ([#0011](https://github.com/karnstack/tempo/issues/0011)) ([882702c](https://github.com/karnstack/tempo/commit/882702cba5be4d489a86fa123933235adb4a9fa9)) +* **storage:** org-level summed rollup queries ([#0042](https://github.com/karnstack/tempo/issues/0042)) ([19aa6c6](https://github.com/karnstack/tempo/commit/19aa6c6ad5939c2f8343e303218203325b219a4e)) +* **storage:** postgres stub package ([d51fe08](https://github.com/karnstack/tempo/commit/d51fe0854bb763c1b640f36e686daf48a98e8ac0)) +* **storage:** pull_requests.updated_at column ([#0028](https://github.com/karnstack/tempo/issues/0028)) ([ad7bc65](https://github.com/karnstack/tempo/commit/ad7bc65444fc337b3f785cf2385688443a07bfda)) +* **storage:** repo by owner/name lookup ([#0041](https://github.com/karnstack/tempo/issues/0041)) ([de65f56](https://github.com/karnstack/tempo/commit/de65f56e277750b3cddc871c340c853afd87d939)) +* **storage:** repo lead-time UPSERT query ([#0035](https://github.com/karnstack/tempo/issues/0035)) ([8acf801](https://github.com/karnstack/tempo/commit/8acf801bfc491d7876bd83d67b1949d73d456c1c)) +* **storage:** repo_stats aggregation query ([#0034](https://github.com/karnstack/tempo/issues/0034)) ([5292e1f](https://github.com/karnstack/tempo/commit/5292e1f01fc008ca81801d0465943d5913ff4e47)) +* **storage:** review stats source + cleanup queries ([#0036](https://github.com/karnstack/tempo/issues/0036)) ([527856f](https://github.com/karnstack/tempo/commit/527856f5a16357e8d6a7d8d4075193cafac5fd85)) +* **storage:** rollup_runs queries ([#0032](https://github.com/karnstack/tempo/issues/0032)) ([32e5bc3](https://github.com/karnstack/tempo/commit/32e5bc398aed7e5ad768951cc3cf61e233fd174c)) +* **storage:** sqlc-typed repository queries + repo round-trip tests ([#0012](https://github.com/karnstack/tempo/issues/0012)) ([05e01e1](https://github.com/karnstack/tempo/commit/05e01e16cd0c988e40073edc4627efac84ac4165)) +* **storage:** SQLite implementation with PRAGMAs + fx provider ([9778ccf](https://github.com/karnstack/tempo/commit/9778ccf5f4b33551e31b013255743d270d2a6e0e)) +* **storage:** Storage interface + SQLite driver wiring (sqlc, goose) ([#0007](https://github.com/karnstack/tempo/issues/0007)) ([0b5dd8a](https://github.com/karnstack/tempo/commit/0b5dd8af13107c3126f48c097a0cdb2232208824)) +* **storage:** sync_runs status + retention queries ([#0031](https://github.com/karnstack/tempo/issues/0031)) ([43eee51](https://github.com/karnstack/tempo/commit/43eee5106aa7c9b160024ec3609ba6c23f2f0c16)) +* **web:** /connections page ([#0049](https://github.com/karnstack/tempo/issues/0049)) ([872a880](https://github.com/karnstack/tempo/commit/872a880fae708d092749d8eabc786f27569be655)) +* **web:** add AuthCard shell for /login and /register ([ec5f309](https://github.com/karnstack/tempo/commit/ec5f3097891b9a99c63895e297517b7f27317ff9)) +* **web:** add safeFromPath helper for auth redirects ([61c3cd9](https://github.com/karnstack/tempo/commit/61c3cd9682b7306296f6c66fc36e17dde47fb2d1)) +* **web:** add shadcn field/alert/spinner primitives ([f63a029](https://github.com/karnstack/tempo/commit/f63a029c3668ff58e01d1d37f82e063190386eb2)) +* **web:** add shadcn primitives for connections page ([#0049](https://github.com/karnstack/tempo/issues/0049)) ([8ab1941](https://github.com/karnstack/tempo/commit/8ab19410febf415f4f8d6f9c3ffc5b959c1fcf40)) +* **web:** add sidebar/dropdown-menu/avatar/skeleton/tooltip/empty primitives ([#0047](https://github.com/karnstack/tempo/issues/0047)) ([ee51ee0](https://github.com/karnstack/tempo/commit/ee51ee05084ac84f429c93ac8e18c76018646695)) +* **web:** add-connection dialog ([#0049](https://github.com/karnstack/tempo/issues/0049)) ([709185d](https://github.com/karnstack/tempo/commit/709185d57e2b15738493a9d38a4c3bfb40977eda)) +* **web:** App shell (Sidebar nav + top bar + root layout) ([#0047](https://github.com/karnstack/tempo/issues/0047)) ([c29925e](https://github.com/karnstack/tempo/commit/c29925ee5c450df199324b7e4a139cedac1af777)) +* **web:** app shell with sidebar nav, topbar, and route guard ([#0047](https://github.com/karnstack/tempo/issues/0047)) ([90c7dbe](https://github.com/karnstack/tempo/commit/90c7dbea782c66bb188b8864bd835fac6181c528)) +* **web:** Auth pages — register (first-run) + login ([#0048](https://github.com/karnstack/tempo/issues/0048)) ([716cecb](https://github.com/karnstack/tempo/commit/716cecbb229730c9464df5460d4f7b4fb74b11f2)) +* **web:** centralize me + firstrun query options ([a228acc](https://github.com/karnstack/tempo/commit/a228acc58135f13d5798f3d523f43135d47a907a)) +* **web:** connection list table ([#0049](https://github.com/karnstack/tempo/issues/0049)) ([03ee8a4](https://github.com/karnstack/tempo/commit/03ee8a43fe351839079381ea25c9809b5b310ffc)) +* **web:** connections + tokens query hooks ([#0049](https://github.com/karnstack/tempo/issues/0049)) ([2fb5838](https://github.com/karnstack/tempo/commit/2fb58387c42d48a76781dc93dccb0b9887666aa2)) +* **web:** delete-connection confirm dialog ([#0049](https://github.com/karnstack/tempo/issues/0049)) ([dd3a0e4](https://github.com/karnstack/tempo/commit/dd3a0e4d3c9ba9b5d87fa47f1b84c345180199af)) +* **web:** frontend bootstrap via shadcn preset bcivVNFh ([#0003](https://github.com/karnstack/tempo/issues/0003)) ([599fd7e](https://github.com/karnstack/tempo/commit/599fd7eadea7a5b5d8ec9b75dbcc4e8d2876064f)) +* **web:** Generate TS client into web/src/lib/api.ts ([#0046](https://github.com/karnstack/tempo/issues/0046)) ([a412a66](https://github.com/karnstack/tempo/commit/a412a66e29949d8edfdf432cc969110e7d1784fa)) +* **web:** Layer TanStack Router + Query on top of the shadcn starter ([#0004](https://github.com/karnstack/tempo/issues/0004)) ([5130ab7](https://github.com/karnstack/tempo/commit/5130ab754bb24818840644e47fea6434a4498652)) +* **web:** mount sonner toaster at root ([#0049](https://github.com/karnstack/tempo/issues/0049)) ([86ea48e](https://github.com/karnstack/tempo/commit/86ea48edc7dad1d56e7f3938d60499e8c8c32963)) +* **web:** openapi-typescript codegen + script ([#0046](https://github.com/karnstack/tempo/issues/0046)) ([d5ab7a3](https://github.com/karnstack/tempo/commit/d5ab7a3bbea617188ead82496f0b62c8520e8d06)) +* **web:** per-route titles, t-in-a-box favicon, sidebar polish ([44b2b8d](https://github.com/karnstack/tempo/commit/44b2b8d422f1c6992ad2c282915cc5a4a711cca7)) +* **web:** scaffold shadcn frontend with preset bcivVNFh ([#0003](https://github.com/karnstack/tempo/issues/0003)) ([fa3b0dd](https://github.com/karnstack/tempo/commit/fa3b0dd7ac8614446c40c16e94f260f03614b134)) +* **web:** Settings → Tokens tab (list/add/delete) ([#0050](https://github.com/karnstack/tempo/issues/0050)) ([f6dcf7c](https://github.com/karnstack/tempo/commit/f6dcf7c4dffc3b06b2597ae535409ddccac635a3)) +* **web:** TanStack Router + Query layered on shadcn starter ([#0004](https://github.com/karnstack/tempo/issues/0004)) ([750ebaa](https://github.com/karnstack/tempo/commit/750ebaacb92e0d1ea29a4c80fe16f8b1ca7f2544)) +* **web:** typed apiClient ([#0046](https://github.com/karnstack/tempo/issues/0046)) ([e5d04eb](https://github.com/karnstack/tempo/commit/e5d04eb6218ca922a0901946e0b07b2b43732a31)) +* **web:** wire /login and /register pages ([6547ae4](https://github.com/karnstack/tempo/commit/6547ae493a0f801ee4fa1935752ddcd31fe1a2a2)) +* **web:** wire shared AuthForm for login + register ([f36c158](https://github.com/karnstack/tempo/commit/f36c158090e1db9ecbd647875d6b268e5a519330)) + + +### Bug Fixes + +* **web:** handle null in connections token Select onValueChange ([#0049](https://github.com/karnstack/tempo/issues/0049)) ([0fd65fd](https://github.com/karnstack/tempo/commit/0fd65fd388adf3b2f72706f2c7e979718aefb56d)) +* **web:** honor HOST env in vite config ([721045d](https://github.com/karnstack/tempo/commit/721045d0befdcda7f04de0aa051e597b0a100934)) +* **web:** topbar separator stretches; sidebar brand mark shrink-0 ([5c4abd3](https://github.com/karnstack/tempo/commit/5c4abd3f342c228b646d8ff97b16c78bfbed3b6c)) +* **web:** wrap user-menu label in DropdownMenuGroup ([da45d53](https://github.com/karnstack/tempo/commit/da45d53c1d27af720e0307fdde126f06f7b1e8d3))