@klhapp/skillmux 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/docs/releasing.md +25 -14
- package/package.json +1 -1
- package/src/cli.ts +4 -0
- package/src/server.ts +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,21 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.4.4](https://github.com/klhq/skillmux/compare/v0.4.3...v0.4.4) (2026-07-23)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
* connect stdio transport before blocking on runtime init ([#54](https://github.com/klhq/skillmux/issues/54)) ([847af1c](https://github.com/klhq/skillmux/commit/847af1c39265937701e432b631710fc0a2aa9ea0))
|
|
14
|
+
|
|
15
|
+
## [0.4.3](https://github.com/klhq/skillmux/compare/v0.4.2...v0.4.3) (2026-07-23)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
* **release:** prevent slim from overwriting latest ([#53](https://github.com/klhq/skillmux/issues/53)) ([8b5da28](https://github.com/klhq/skillmux/commit/8b5da285b5cb2c9b3231e94ed1ec29331cf8cb9a))
|
|
21
|
+
* **release:** safe backfill and isolate publishing ([#51](https://github.com/klhq/skillmux/issues/51)) ([872333a](https://github.com/klhq/skillmux/commit/872333a70f32bf5be68cc3599c43bd4943a91051))
|
|
22
|
+
|
|
8
23
|
## [0.4.2](https://github.com/klhq/skillmux/compare/v0.4.1...v0.4.2) (2026-07-23)
|
|
9
24
|
|
|
10
25
|
|
package/docs/releasing.md
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# Releasing
|
|
2
2
|
|
|
3
3
|
Release Please creates releases after `main` is green. When its release PR is
|
|
4
|
-
merged,
|
|
5
|
-
|
|
6
|
-
triggered by a tag created with `GITHUB_TOKEN
|
|
4
|
+
merged, the same workflow creates the matching version tag and runs the
|
|
5
|
+
publishing jobs directly. The pipeline does not rely on a second workflow being
|
|
6
|
+
triggered by a tag created with `GITHUB_TOKEN`, and production environment
|
|
7
|
+
secrets do not cross a reusable-workflow boundary.
|
|
7
8
|
|
|
8
9
|
## Prepare
|
|
9
10
|
|
|
@@ -14,19 +15,23 @@ triggered by a tag created with `GITHUB_TOKEN`.
|
|
|
14
15
|
## Publish automatically
|
|
15
16
|
|
|
16
17
|
After the Release Please PR merges, the same workflow run creates the tag and
|
|
17
|
-
GitHub Release, then
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
GitHub Release, then publishes with the exact tag and commit SHA returned by
|
|
19
|
+
Release Please. The package version, tag, and commit must all match before
|
|
20
|
+
publishing begins.
|
|
20
21
|
|
|
21
|
-
There is intentionally no tag-push
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
There is intentionally no tag-push entry point. GitHub does not start a second
|
|
23
|
+
workflow for a tag created with the default `GITHUB_TOKEN`; publishing in the
|
|
24
|
+
Release Please workflow avoids that event-suppression edge case without adding
|
|
25
|
+
a PAT or GitHub App token.
|
|
25
26
|
|
|
26
27
|
## Exceptional recovery
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
the
|
|
29
|
+
Use the manual `workflow_dispatch` entry point only to backfill an existing
|
|
30
|
+
Release Please tag. The workflow verifies that the tag is clean SemVer,
|
|
31
|
+
resolves to the checked-out commit, is reachable from `main`, and still matches
|
|
32
|
+
`package.json`. It also requires a matching existing GitHub Release. Manual
|
|
33
|
+
backfills never publish npm, so a container or binary recovery cannot
|
|
34
|
+
accidentally republish an existing npm version.
|
|
30
35
|
|
|
31
36
|
The release workflow publishes:
|
|
32
37
|
|
|
@@ -40,6 +45,11 @@ The release workflow publishes:
|
|
|
40
45
|
- Multi-architecture `linux/amd64` and `linux/arm64` images with SBOM and
|
|
41
46
|
provenance
|
|
42
47
|
|
|
48
|
+
GHCR is the canonical container build. After both GHCR variants are published,
|
|
49
|
+
Docker Hub copies those exact multi-architecture images under its matching
|
|
50
|
+
tags. A Docker Hub authentication or availability failure therefore cannot
|
|
51
|
+
prevent GHCR from publishing.
|
|
52
|
+
|
|
43
53
|
Each Docker tag is a multi-architecture manifest. Users run the same tag on
|
|
44
54
|
AMD64 and ARM64; Docker automatically pulls the matching image.
|
|
45
55
|
|
|
@@ -55,8 +65,9 @@ Container images are published to:
|
|
|
55
65
|
- `${DOCKERHUB_USERNAME}/skillmux` on Docker Hub
|
|
56
66
|
|
|
57
67
|
The `production-release` GitHub environment provides the
|
|
58
|
-
`DOCKERHUB_USERNAME` variable and `DOCKERHUB_TOKEN` secret. npm
|
|
59
|
-
|
|
68
|
+
`DOCKERHUB_USERNAME` variable and `DOCKERHUB_TOKEN` secret. The npm job also
|
|
69
|
+
uses this environment as its Trusted Publisher identity; configure npm with
|
|
70
|
+
workflow `release-please.yml` and environment `production-release`. No
|
|
60
71
|
long-lived npm token is required. GitHub Packages uses the workflow's scoped
|
|
61
72
|
`GITHUB_TOKEN`.
|
|
62
73
|
Private repositories still publish BuildKit SBOM/provenance with container
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -148,6 +148,10 @@ async function main() {
|
|
|
148
148
|
};
|
|
149
149
|
process.once("SIGTERM", shutdown);
|
|
150
150
|
process.once("SIGINT", shutdown);
|
|
151
|
+
if (transport === "stdio") {
|
|
152
|
+
process.stdin.on("close", shutdown);
|
|
153
|
+
process.stdin.on("end", shutdown);
|
|
154
|
+
}
|
|
151
155
|
break;
|
|
152
156
|
}
|
|
153
157
|
case "index":
|
package/src/server.ts
CHANGED
|
@@ -60,9 +60,10 @@ export async function startServer(opts?: {
|
|
|
60
60
|
}): Promise<ServerHandle> {
|
|
61
61
|
const config = opts?.config ?? await loadConfig();
|
|
62
62
|
configure({ config, clients: opts?.clients ?? createClients(config) });
|
|
63
|
-
await initializeRuntime(readinessState);
|
|
64
|
-
metricsRegistry.setReadiness(readinessState.get());
|
|
65
63
|
const stopWatcher = await startVaultWatcher();
|
|
64
|
+
const initPromise = initializeRuntime(readinessState)
|
|
65
|
+
.then(() => metricsRegistry.setReadiness(readinessState.get()))
|
|
66
|
+
.catch((err) => console.error("skillmux runtime init error:", err));
|
|
66
67
|
|
|
67
68
|
const server = new McpServer({ name: "skillmux", version: "0.1.0" });
|
|
68
69
|
|
|
@@ -403,6 +404,7 @@ export async function startServer(opts?: {
|
|
|
403
404
|
},
|
|
404
405
|
});
|
|
405
406
|
let stopped = false;
|
|
407
|
+
await initPromise;
|
|
406
408
|
console.log(`skillmux serving over HTTP on ${hostname}:${bunServer.port}`);
|
|
407
409
|
return {
|
|
408
410
|
port: bunServer.port,
|