@velum-labs/cursorkit 0.1.0
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/DISCLAIMER.md +12 -0
- package/README.md +157 -0
- package/dist/src/agentTools/diff.d.ts +11 -0
- package/dist/src/agentTools/diff.js +88 -0
- package/dist/src/agentTools/policy.d.ts +3 -0
- package/dist/src/agentTools/policy.js +12 -0
- package/dist/src/agentTools/registry.d.ts +114 -0
- package/dist/src/agentTools/registry.js +663 -0
- package/dist/src/agentTools/results.d.ts +14 -0
- package/dist/src/agentTools/results.js +117 -0
- package/dist/src/agentTools/schemas.d.ts +3 -0
- package/dist/src/agentTools/schemas.js +89 -0
- package/dist/src/agentTools/surface.d.ts +11 -0
- package/dist/src/agentTools/surface.js +251 -0
- package/dist/src/certs.d.ts +8 -0
- package/dist/src/certs.js +34 -0
- package/dist/src/ck.d.ts +2 -0
- package/dist/src/ck.js +6 -0
- package/dist/src/ckLauncher.d.ts +150 -0
- package/dist/src/ckLauncher.js +1496 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +265 -0
- package/dist/src/config.d.ts +52 -0
- package/dist/src/config.js +210 -0
- package/dist/src/connectEnvelope.d.ts +16 -0
- package/dist/src/connectEnvelope.js +70 -0
- package/dist/src/desktop.d.ts +19 -0
- package/dist/src/desktop.js +167 -0
- package/dist/src/desktopConnectProxy.d.ts +26 -0
- package/dist/src/desktopConnectProxy.js +175 -0
- package/dist/src/extensions/index.d.ts +2 -0
- package/dist/src/extensions/index.js +1 -0
- package/dist/src/extensions/registry.d.ts +8 -0
- package/dist/src/extensions/registry.js +52 -0
- package/dist/src/extensions/types.d.ts +42 -0
- package/dist/src/extensions/types.js +1 -0
- package/dist/src/fixtures/modelFusion.d.ts +103 -0
- package/dist/src/fixtures/modelFusion.js +404 -0
- package/dist/src/fixtures/replay.d.ts +9 -0
- package/dist/src/fixtures/replay.js +41 -0
- package/dist/src/fixtures/sanitizer.d.ts +9 -0
- package/dist/src/fixtures/sanitizer.js +43 -0
- package/dist/src/fixtures/schema.d.ts +38 -0
- package/dist/src/fixtures/schema.js +33 -0
- package/dist/src/gen/agent/v1/agent_pb.d.ts +21577 -0
- package/dist/src/gen/agent/v1/agent_pb.js +5325 -0
- package/dist/src/gen/aiserver/v1/aiserver_pb.d.ts +135242 -0
- package/dist/src/gen/aiserver/v1/aiserver_pb.js +34430 -0
- package/dist/src/gen/anyrun/v1/anyrun_pb.d.ts +1163 -0
- package/dist/src/gen/anyrun/v1/anyrun_pb.js +374 -0
- package/dist/src/gen/google/protobuf/google_pb.d.ts +142 -0
- package/dist/src/gen/google/protobuf/google_pb.js +54 -0
- package/dist/src/gen/internapi/v1/internapi_pb.d.ts +121 -0
- package/dist/src/gen/internapi/v1/internapi_pb.js +79 -0
- package/dist/src/logger.d.ts +8 -0
- package/dist/src/logger.js +37 -0
- package/dist/src/modelFusion/cursorHarness.d.ts +146 -0
- package/dist/src/modelFusion/cursorHarness.js +647 -0
- package/dist/src/modelFusion/index.d.ts +4 -0
- package/dist/src/modelFusion/index.js +2 -0
- package/dist/src/models/registry.d.ts +22 -0
- package/dist/src/models/registry.js +30 -0
- package/dist/src/proto.d.ts +13 -0
- package/dist/src/proto.js +61 -0
- package/dist/src/providers/openai.d.ts +64 -0
- package/dist/src/providers/openai.js +355 -0
- package/dist/src/redaction.d.ts +4 -0
- package/dist/src/redaction.js +65 -0
- package/dist/src/routeInventory.d.ts +16 -0
- package/dist/src/routeInventory.js +39 -0
- package/dist/src/routes.d.ts +37 -0
- package/dist/src/routes.js +227 -0
- package/dist/src/server.d.ts +50 -0
- package/dist/src/server.js +1353 -0
- package/dist/src/services/agent.d.ts +1 -0
- package/dist/src/services/agent.js +7 -0
- package/dist/src/services/agentRun.d.ts +60 -0
- package/dist/src/services/agentRun.js +391 -0
- package/dist/src/services/chat.d.ts +11 -0
- package/dist/src/services/chat.js +47 -0
- package/dist/src/services/models.d.ts +10 -0
- package/dist/src/services/models.js +216 -0
- package/dist/src/services/serverConfig.d.ts +2 -0
- package/dist/src/services/serverConfig.js +19 -0
- package/dist/src/testing/artifacts.d.ts +14 -0
- package/dist/src/testing/artifacts.js +92 -0
- package/dist/src/testing/cli.d.ts +4 -0
- package/dist/src/testing/cli.js +192 -0
- package/dist/src/testing/localBackend.d.ts +24 -0
- package/dist/src/testing/localBackend.js +310 -0
- package/dist/src/testing/processRunner.d.ts +7 -0
- package/dist/src/testing/processRunner.js +74 -0
- package/dist/src/testing/runner.d.ts +9 -0
- package/dist/src/testing/runner.js +85 -0
- package/dist/src/testing/scenarios.d.ts +3 -0
- package/dist/src/testing/scenarios.js +2535 -0
- package/dist/src/testing/types.d.ts +66 -0
- package/dist/src/testing/types.js +1 -0
- package/dist/src/tools/baselineInventory.d.ts +12 -0
- package/dist/src/tools/baselineInventory.js +680 -0
- package/dist/src/tools/checkModelFusionProtocol.d.ts +1 -0
- package/dist/src/tools/checkModelFusionProtocol.js +274 -0
- package/dist/src/tools/checkReleasePublishConfig.d.ts +1 -0
- package/dist/src/tools/checkReleasePublishConfig.js +99 -0
- package/dist/src/tools/generateProtoInventory.d.ts +1 -0
- package/dist/src/tools/generateProtoInventory.js +89 -0
- package/dist/src/tools/normalizeGeneratedCode.d.ts +1 -0
- package/dist/src/tools/normalizeGeneratedCode.js +18 -0
- package/dist/src/tools/releaseCheck.d.ts +26 -0
- package/dist/src/tools/releaseCheck.js +367 -0
- package/dist/src/trace.d.ts +39 -0
- package/dist/src/trace.js +106 -0
- package/dist/src/translation.d.ts +6 -0
- package/dist/src/translation.js +22 -0
- package/dist/src/upstream.d.ts +20 -0
- package/dist/src/upstream.js +270 -0
- package/docs/configuration.md +55 -0
- package/docs/cursor-app.md +263 -0
- package/docs/implementation-inventory.json +609 -0
- package/docs/learnings.md +363 -0
- package/docs/model-fusion-protocol-origin.json +126 -0
- package/docs/model-fusion-protocol.md +110 -0
- package/docs/plugin-authoring.md +24 -0
- package/docs/proto-inventory.md +1477 -0
- package/docs/protocol-surface-audit.md +92 -0
- package/docs/protocol.md +52 -0
- package/docs/refreshing-protos.md +78 -0
- package/docs/release-gates.md +110 -0
- package/docs/release-summary.json +86 -0
- package/docs/route-contract-manifest.json +288 -0
- package/docs/route-policy.json +133 -0
- package/docs/service-manifest.json +9490 -0
- package/docs/test-manifest.json +155 -0
- package/docs/testing-harness.md +204 -0
- package/docs/troubleshooting.md +36 -0
- package/docs/type-manifest-summary.json +28927 -0
- package/package.json +93 -0
- package/proto/agent/v1/agent.proto +5371 -0
- package/proto/aiserver/v1/aiserver.proto +32944 -0
- package/proto/anyrun/v1/anyrun.proto +294 -0
- package/proto/google/protobuf/google.proto +37 -0
- package/proto/internapi/v1/internapi.proto +32 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Protocol Surface Audit
|
|
2
|
+
|
|
3
|
+
The repo has the full generated Cursor proto, but runtime coverage is still a
|
|
4
|
+
small allowlist. This file separates schema visibility from implemented bridge
|
|
5
|
+
surface. The machine-readable baseline is generated in
|
|
6
|
+
`docs/route-contract-manifest.json` and `docs/implementation-inventory.json`.
|
|
7
|
+
|
|
8
|
+
## Implemented Interceptors
|
|
9
|
+
|
|
10
|
+
- Model discovery:
|
|
11
|
+
`/aiserver.v1.AiService/AvailableModels`,
|
|
12
|
+
`/aiserver.v1.AiService/GetUsableModels`,
|
|
13
|
+
`/aiserver.v1.AiService/GetDefaultModelForCli`,
|
|
14
|
+
`/aiserver.v1.AiService/GetDefaultModel`
|
|
15
|
+
- Session naming/config:
|
|
16
|
+
`/aiserver.v1.AiService/NameAgent`,
|
|
17
|
+
`/aiserver.v1.ServerConfigService/GetServerConfig`
|
|
18
|
+
- Agent run path:
|
|
19
|
+
`/agent.v1.AgentService/Run`,
|
|
20
|
+
`/agent.v1.AgentService/RunSSE`,
|
|
21
|
+
`/aiserver.v1.BidiService/BidiAppend`
|
|
22
|
+
- Chat path:
|
|
23
|
+
`/aiserver.v1.ChatService/StreamUnifiedChatWithTools`
|
|
24
|
+
- Desktop/auth diagnostics:
|
|
25
|
+
`/auth/full_stripe_profile`, `/auth/stripe_profile`,
|
|
26
|
+
`/aiserver.v1.AnalyticsService/UploadIssueTrace`
|
|
27
|
+
|
|
28
|
+
Everything else is byte-preserving pass-through unless a plugin explicitly owns a
|
|
29
|
+
route.
|
|
30
|
+
|
|
31
|
+
## High-Value Gaps
|
|
32
|
+
|
|
33
|
+
- `agent.v1.AgentService/RunPoll`: alternate agent transport. The current bridge
|
|
34
|
+
has conditional local handling for `Run` and `RunSSE`, but poll semantics stay
|
|
35
|
+
pass-through until observed and decoded.
|
|
36
|
+
- `agent.v1.ControlService/*`: filesystem, shell, diff, artifact, skill reload,
|
|
37
|
+
and plugin reload APIs. This is the major missing surface for local models to
|
|
38
|
+
truly use Cursor tools.
|
|
39
|
+
- `agent.v1.AgentServerMessage` tool-call updates: the generated proto has
|
|
40
|
+
`ToolCallStartedUpdate`, `ToolCallDeltaUpdate`, `ToolCallCompletedUpdate`, and
|
|
41
|
+
many concrete tool-call messages. Local OpenAI tool calls need to be translated
|
|
42
|
+
into these messages, then resumed with client tool results.
|
|
43
|
+
- `ChatService/StreamUnifiedChatWithToolsSSE`: visible in the proto but not yet
|
|
44
|
+
captured with fixtures. It should stay pass-through until framing and response
|
|
45
|
+
shape are verified.
|
|
46
|
+
- Desktop model picker routes: current desktop traffic has not reached the bridge
|
|
47
|
+
without manual routing. Do not guess desktop-specific routes until
|
|
48
|
+
route-inventory logs prove them.
|
|
49
|
+
- Dashboard/plugin/skills routes: observed as healthy pass-through in CLI/ACP
|
|
50
|
+
traffic. These are likely extension-management surfaces, but should not be
|
|
51
|
+
intercepted without decoded fixtures and a product reason.
|
|
52
|
+
|
|
53
|
+
## Current Context/Tool State
|
|
54
|
+
|
|
55
|
+
The previous local agent implementation forwarded only
|
|
56
|
+
`UserMessage.text` to the OpenAI-compatible backend. That made local runs appear
|
|
57
|
+
to lack repository context and tool access.
|
|
58
|
+
|
|
59
|
+
The bridge now forwards already-materialized context when Cursor sends it:
|
|
60
|
+
|
|
61
|
+
- custom system prompt
|
|
62
|
+
- user selected files/code/terminal/context snippets
|
|
63
|
+
- hook context
|
|
64
|
+
- inline prompt-context tree nodes
|
|
65
|
+
- MCP tool names/descriptions as metadata
|
|
66
|
+
|
|
67
|
+
The bridge also logs `local agent run diagnostics` with body-free counts for
|
|
68
|
+
context, MCP tools, and injected context messages. Real traffic currently shows:
|
|
69
|
+
|
|
70
|
+
- `cursor-agent --print`: no MCP tools and no context in the probe.
|
|
71
|
+
- `cursor-agent acp`: 59 MCP tool definitions and one injected context/tool
|
|
72
|
+
metadata message in the probe.
|
|
73
|
+
|
|
74
|
+
This is not full tool execution. Full tool support needs a loop:
|
|
75
|
+
|
|
76
|
+
1. Send OpenAI-compatible `tools` definitions for Cursor/MCP tools.
|
|
77
|
+
2. Parse streaming `tool_calls` from the local model.
|
|
78
|
+
3. Emit Cursor `AgentServerMessage` tool-call started/delta/completed updates.
|
|
79
|
+
4. Receive the client-side tool result through the agent protocol.
|
|
80
|
+
5. Continue the local model conversation with tool results.
|
|
81
|
+
|
|
82
|
+
## Desktop Test State
|
|
83
|
+
|
|
84
|
+
`desktop-ui-experimental` now launches an isolated Cursor app with a Chromium
|
|
85
|
+
remote debugging port and captures renderer DOM text through CDP. On this
|
|
86
|
+
machine, isolated CDP works and reaches the real Cursor workbench renderer, but
|
|
87
|
+
the isolated profile stops at login, so model-picker assertions are blocked by
|
|
88
|
+
auth state.
|
|
89
|
+
|
|
90
|
+
Default-profile launches can reuse auth, but may attach to an already-running
|
|
91
|
+
Cursor process and ignore a new debug port. A fully automated picker test needs a
|
|
92
|
+
logged-in debuggable profile or a reliable isolated-profile auth flow.
|
package/docs/protocol.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Observed Protocol
|
|
2
|
+
|
|
3
|
+
This document records the transport assumptions that the bridge is allowed to rely on. Unknown or unverified behavior must stay on the byte-preserving pass-through path.
|
|
4
|
+
|
|
5
|
+
See `docs/learnings.md` for the broader set of implementation observations,
|
|
6
|
+
debugging lessons, and known unknowns behind these protocol rules.
|
|
7
|
+
See `docs/protocol-surface-audit.md` for the gap analysis between the full proto
|
|
8
|
+
surface and the routes currently implemented by the bridge. The generated
|
|
9
|
+
baseline files `docs/route-contract-manifest.json`,
|
|
10
|
+
`docs/implementation-inventory.json`, `docs/test-manifest.json`, and
|
|
11
|
+
`docs/release-summary.json` are checked by `pnpm baseline:check`.
|
|
12
|
+
|
|
13
|
+
## Current Verified Surface
|
|
14
|
+
|
|
15
|
+
- The default proto files are package-preserving outputs under `proto/`.
|
|
16
|
+
- `docs/service-manifest.json` and `docs/type-manifest-summary.json` are generated from the full default proto files.
|
|
17
|
+
- Runtime interception is allowlisted in `src/routes.ts`.
|
|
18
|
+
- The route/proto contract manifest is generated from `docs/service-manifest.json`, `src/routes.ts`, and `src/config.ts`.
|
|
19
|
+
- Cursor Agent CLI model-listing RPCs use raw `application/proto` framing, not Connect envelopes. Model interceptors must preserve the incoming protobuf framing.
|
|
20
|
+
- The current interceptable routes are:
|
|
21
|
+
- `/aiserver.v1.AiService/AvailableModels`
|
|
22
|
+
- `/aiserver.v1.AiService/GetUsableModels`
|
|
23
|
+
- `/aiserver.v1.AiService/GetDefaultModelForCli`
|
|
24
|
+
- `/aiserver.v1.AiService/GetDefaultModel`
|
|
25
|
+
- `/aiserver.v1.AiService/NameAgent`
|
|
26
|
+
- `/aiserver.v1.ServerConfigService/GetServerConfig`
|
|
27
|
+
- `/auth/full_stripe_profile`
|
|
28
|
+
- `/auth/stripe_profile`
|
|
29
|
+
- `/agent.v1.AgentService/Run`
|
|
30
|
+
- `/agent.v1.AgentService/RunSSE`
|
|
31
|
+
- `/aiserver.v1.BidiService/BidiAppend`
|
|
32
|
+
- `/aiserver.v1.ChatService/StreamUnifiedChatWithTools`
|
|
33
|
+
- `/aiserver.v1.AnalyticsService/UploadIssueTrace`
|
|
34
|
+
- Cursor desktop app support is observe-first. Desktop mode enables redacted route inventory logging, but it does not add desktop-only interceptors until traffic proves the exact RPC and framing.
|
|
35
|
+
|
|
36
|
+
## Transport Behavior To Capture
|
|
37
|
+
|
|
38
|
+
Before enabling additional typed routes, capture and sanitize:
|
|
39
|
+
|
|
40
|
+
- HTTP version and ALPN.
|
|
41
|
+
- TLS, SNI, Host, and certificate expectations.
|
|
42
|
+
- Exact endpoint path and query strings.
|
|
43
|
+
- Request and response content types.
|
|
44
|
+
- Connect envelope flags, compressed-frame behavior, and end-stream metadata.
|
|
45
|
+
- Response streaming behavior and whether first bytes arrive before the full response is buffered.
|
|
46
|
+
- Request abort behavior and upstream cancellation.
|
|
47
|
+
- Trailer or trailer-like metadata.
|
|
48
|
+
- SSE behavior for `StreamUnifiedChatWithToolsSSE`.
|
|
49
|
+
|
|
50
|
+
## Default Policy
|
|
51
|
+
|
|
52
|
+
Every route starts as pass-through-only. A route can become interceptable only when a sanitized fixture proves its method path, body envelope, decoded message type, response shape, and failure behavior.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Refreshing Protos
|
|
2
|
+
|
|
3
|
+
This repo vendors the proto extraction logic under `vendor/extract-cursor-protos`.
|
|
4
|
+
The checked-in `proto/` directory is the full extracted proto surface used for
|
|
5
|
+
endpoint visibility, runtime decoding, and TypeScript codegen. When Cursor
|
|
6
|
+
version drift breaks the bridge, refresh from the installed Cursor app and
|
|
7
|
+
update the runtime code against captured fixtures.
|
|
8
|
+
|
|
9
|
+
## Source
|
|
10
|
+
|
|
11
|
+
The extractor was vendored from the public research repository
|
|
12
|
+
`unkn0wncode/extract-cursor-protos`, tree
|
|
13
|
+
`1932c41e1e53adc8b118fe73cfe462828682a802`. See
|
|
14
|
+
`vendor/extract-cursor-protos/UPSTREAM.md`.
|
|
15
|
+
|
|
16
|
+
No upstream license file was present when vendored, so keep attribution intact
|
|
17
|
+
and treat the code as experimental research material.
|
|
18
|
+
|
|
19
|
+
## Refresh Stable Cursor
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm install
|
|
23
|
+
pnpm extract:protos
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
That command runs:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
cd vendor/extract-cursor-protos
|
|
30
|
+
go run . /Applications/Cursor.app ../../proto
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The output path is the default proto directory used by the project:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
proto/
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The current extraction is summarized in `docs/proto-inventory.md`. Regenerate
|
|
40
|
+
the inventory, manifests, and TypeScript code after extraction:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pnpm proto:inventory
|
|
44
|
+
pnpm codegen
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The Cursor bundle exposes runtime descriptors with package and type names, but
|
|
48
|
+
not original `.proto` file metadata. Some descriptors include foreign package
|
|
49
|
+
references and nested names that would create invalid protoc import cycles if
|
|
50
|
+
written one-file-per-package. The extractor therefore normalizes the full
|
|
51
|
+
discovered graph for codegen: nested types are flattened, foreign message shapes
|
|
52
|
+
are copied into the consuming package with provenance comments, and service
|
|
53
|
+
paths keep their source package names.
|
|
54
|
+
|
|
55
|
+
## Refresh Cursor Nightly Or A Custom App Path
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
cd vendor/extract-cursor-protos
|
|
59
|
+
go run . "/Applications/Cursor Nightly.app" ../../proto
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The extractor treats app paths containing `nightly` as Nightly builds and uses
|
|
63
|
+
the upstream Nightly compatibility path.
|
|
64
|
+
|
|
65
|
+
## After Refreshing
|
|
66
|
+
|
|
67
|
+
1. Capture real Cursor traffic again for `AvailableModels` and
|
|
68
|
+
`StreamUnifiedChatWithTools`.
|
|
69
|
+
2. Decode the captures with the refreshed proto.
|
|
70
|
+
3. Run `pnpm proto:inventory`.
|
|
71
|
+
4. Run `pnpm codegen`.
|
|
72
|
+
5. Update `fixtures/` and `docs/protocol.md`.
|
|
73
|
+
6. Update bridge routing or translation code only after fixtures prove the field tags
|
|
74
|
+
and streaming event order.
|
|
75
|
+
|
|
76
|
+
Do not assume a generated proto is sufficient by itself. Cursor’s server
|
|
77
|
+
expectations also include headers, Connect envelope framing, endpoint selection,
|
|
78
|
+
and version-specific streaming behavior.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Release Gates
|
|
2
|
+
|
|
3
|
+
This package publishes to public npm as `@velum-labs/cursorkit` through CI; there are no
|
|
4
|
+
manual deploys. `pnpm release:check` is the authoritative deterministic local
|
|
5
|
+
release gate. It runs generated baseline drift checks, build, deterministic
|
|
6
|
+
tests, formatting, examples typecheck, and package artifact smoke validation,
|
|
7
|
+
then writes `.cursor-rpc/release-check/release-summary.json`.
|
|
8
|
+
|
|
9
|
+
GitHub Actions release automation lives in `.github/workflows/release-packages.yml`. It
|
|
10
|
+
validates, tests, and packs the package on a published GitHub Release (and on
|
|
11
|
+
`workflow_dispatch` dry runs). Publishing is gated behind a published GitHub
|
|
12
|
+
Release (not a bare tag push) so the release notes and tag are reviewed before
|
|
13
|
+
anything ships, and the publish step uploads the packed tarball as a workflow
|
|
14
|
+
artifact for provenance.
|
|
15
|
+
|
|
16
|
+
Before publishing or sharing a tarball, all gates must pass:
|
|
17
|
+
|
|
18
|
+
- `pnpm install --frozen-lockfile`
|
|
19
|
+
- `pnpm release:publish:check`
|
|
20
|
+
- `pnpm release:check`
|
|
21
|
+
- `pnpm baseline:check`
|
|
22
|
+
- `pnpm build`
|
|
23
|
+
- `pnpm test`
|
|
24
|
+
- `pnpm format:check`
|
|
25
|
+
- `pnpm examples:check`
|
|
26
|
+
- `pnpm audit --audit-level moderate`
|
|
27
|
+
- `pnpm pack`
|
|
28
|
+
- `node dist/src/cli.js --help`
|
|
29
|
+
- `go test ./...` from `vendor/extract-cursor-protos`
|
|
30
|
+
|
|
31
|
+
## Release publish workflow
|
|
32
|
+
|
|
33
|
+
Triggers:
|
|
34
|
+
|
|
35
|
+
- a published GitHub Release whose tag matches `cursorkit-v*`
|
|
36
|
+
(for example `cursorkit-v0.1.0`) or `v*` (for example `v0.1.0`)
|
|
37
|
+
- manual `workflow_dispatch` dry runs, with `dry_run: true` by default
|
|
38
|
+
|
|
39
|
+
Safety guards:
|
|
40
|
+
|
|
41
|
+
- The release job only runs when
|
|
42
|
+
`github.repository == 'velum-labs/cursorkit'`, so forks cannot publish.
|
|
43
|
+
- The publish step only runs on the `release: published` event (reviewed release
|
|
44
|
+
notes + tag) and only when `package.json` has `"private": false`.
|
|
45
|
+
- `pnpm release:publish:check` requires:
|
|
46
|
+
- `publishConfig.registry` to be `https://registry.npmjs.org`;
|
|
47
|
+
- `publishConfig.access` to be `public`;
|
|
48
|
+
- `publishConfig.provenance` to be `true`;
|
|
49
|
+
- `package.json` `private` to be `false`;
|
|
50
|
+
- the model-fusion protocol package pin to name
|
|
51
|
+
`@velum-labs/model-fusion-protocol`;
|
|
52
|
+
- the pinned model-fusion protocol schema bundle hash to match the local
|
|
53
|
+
JSON Schema/OpenAPI protocol manifest.
|
|
54
|
+
- Model-fusion service clients/types must come from the generated
|
|
55
|
+
`@velum-labs/model-fusion-protocol` OpenAPI package once fusionkit publishes it.
|
|
56
|
+
- Durable record validators/types must come from the fusionkit JSON Schema bundle
|
|
57
|
+
in the generated protocol package. Cursorkit's local record validators are
|
|
58
|
+
temporary fixture validators with schema-bundle provenance until that package
|
|
59
|
+
is published.
|
|
60
|
+
- `@velum-labs/model-fusion-protocol` must be installable from GitHub Packages,
|
|
61
|
+
and its installed protocol metadata must match the pinned schema bundle hash.
|
|
62
|
+
- Protobuf/Buf remains outside the v1 release path; the release check expects
|
|
63
|
+
JSON Schema durable records and OpenAPI 3.1 HTTP/API contracts.
|
|
64
|
+
|
|
65
|
+
Secrets and permissions:
|
|
66
|
+
|
|
67
|
+
- Dry runs require no custom secret. Publishing to public npm uses OIDC trusted
|
|
68
|
+
publishing (`id-token: write` + `npm publish --provenance`); once a Trusted
|
|
69
|
+
Publisher is configured on npmjs.com no token is needed, and `NPM_TOKEN` is the
|
|
70
|
+
bootstrap fallback for the first publish.
|
|
71
|
+
- Installing the `@velum-labs/model-fusion-protocol` devDep from GitHub Packages
|
|
72
|
+
uses `PACKAGES_READ_TOKEN` (falling back to the built-in `GITHUB_TOKEN`).
|
|
73
|
+
- Python/private PyPI secrets such as `PRIVATE_PYPI_*` are intentionally not used
|
|
74
|
+
in cursorkit. They belong in fusionkit's protocol-package release workflow.
|
|
75
|
+
|
|
76
|
+
`pnpm release:check` is the command to trust for deterministic readiness. The
|
|
77
|
+
other commands are listed so an operator can reproduce a failing layer directly
|
|
78
|
+
or run extra non-deterministic checks before final-gate validation.
|
|
79
|
+
|
|
80
|
+
Package smoke validates:
|
|
81
|
+
|
|
82
|
+
- `pnpm pack` succeeds after a build.
|
|
83
|
+
- The tarball contains the required `dist/src`, `proto`, `docs`, `README.md`,
|
|
84
|
+
and `DISCLAIMER.md` files.
|
|
85
|
+
- `examples/` is intentionally excluded from the tarball; source examples are
|
|
86
|
+
typechecked by `pnpm examples:check` against the built package exports.
|
|
87
|
+
- A temporary clean project can install the tarball with `pnpm add --offline`.
|
|
88
|
+
- The installed `cursorkit` binary can execute `--help`.
|
|
89
|
+
|
|
90
|
+
Optional live suites are not part of deterministic release readiness. The
|
|
91
|
+
release summary reports them as `skipped_with_reason` until prerequisites such
|
|
92
|
+
as a running MLX backend, Cursor auth, or Cursor desktop are available.
|
|
93
|
+
|
|
94
|
+
Generated baseline artifacts:
|
|
95
|
+
|
|
96
|
+
- `docs/route-contract-manifest.json`: route/proto contract entries generated
|
|
97
|
+
from `docs/service-manifest.json`, `src/routes.ts`, and `src/config.ts`.
|
|
98
|
+
- `docs/implementation-inventory.json`: route, config, and uncertainty
|
|
99
|
+
inventory for the current implementation.
|
|
100
|
+
- `docs/test-manifest.json`: deterministic and optional-live suite inventory,
|
|
101
|
+
release-check behavior, prerequisites, and artifact outputs.
|
|
102
|
+
- `docs/release-summary.json`: baseline completion metrics and remaining
|
|
103
|
+
blockers for the next production phases, grouped by protocol, MLX, tool,
|
|
104
|
+
desktop optional-live, reliability/security, packaging, and final gate status.
|
|
105
|
+
|
|
106
|
+
API stability policy:
|
|
107
|
+
|
|
108
|
+
- `@velum-labs/cursorkit/extensions` and `@velum-labs/cursorkit/providers/openai` are experimental.
|
|
109
|
+
- Breaking plugin API changes are allowed while these subpaths remain experimental.
|
|
110
|
+
- Add semver guarantees and deprecation windows before marking extension APIs stable.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"generatedBy": "src/tools/baselineInventory.ts",
|
|
4
|
+
"phase": "baseline-drift",
|
|
5
|
+
"status": "ci-release-scaffolded",
|
|
6
|
+
"deterministicGate": "pnpm release:check",
|
|
7
|
+
"categories": [
|
|
8
|
+
{
|
|
9
|
+
"id": "baseline-drift",
|
|
10
|
+
"deterministicSuites": ["baseline-drift"],
|
|
11
|
+
"optionalLiveSuites": [],
|
|
12
|
+
"releaseCheckStatus": "required"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "static",
|
|
16
|
+
"deterministicSuites": ["build", "format-check"],
|
|
17
|
+
"optionalLiveSuites": [],
|
|
18
|
+
"releaseCheckStatus": "required"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "protocol",
|
|
22
|
+
"deterministicSuites": ["baseline-drift", "unit-tests"],
|
|
23
|
+
"optionalLiveSuites": ["real-client-live"],
|
|
24
|
+
"releaseCheckStatus": "required"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "mlx",
|
|
28
|
+
"deterministicSuites": ["unit-tests"],
|
|
29
|
+
"optionalLiveSuites": ["mlx-live", "real-client-live"],
|
|
30
|
+
"releaseCheckStatus": "required"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "tool",
|
|
34
|
+
"deterministicSuites": ["unit-tests"],
|
|
35
|
+
"optionalLiveSuites": ["real-client-live"],
|
|
36
|
+
"releaseCheckStatus": "required"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "desktop-optional-live",
|
|
40
|
+
"deterministicSuites": [],
|
|
41
|
+
"optionalLiveSuites": ["desktop-live"],
|
|
42
|
+
"releaseCheckStatus": "skipped_with_reason_until_prerequisites_available"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "reliability-security",
|
|
46
|
+
"deterministicSuites": ["unit-tests"],
|
|
47
|
+
"optionalLiveSuites": [],
|
|
48
|
+
"releaseCheckStatus": "required"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "packaging",
|
|
52
|
+
"deterministicSuites": ["examples-typecheck", "pack-smoke"],
|
|
53
|
+
"optionalLiveSuites": [],
|
|
54
|
+
"releaseCheckStatus": "required"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "final-gate",
|
|
58
|
+
"deterministicSuites": [
|
|
59
|
+
"baseline-drift",
|
|
60
|
+
"build",
|
|
61
|
+
"unit-tests",
|
|
62
|
+
"format-check",
|
|
63
|
+
"examples-typecheck",
|
|
64
|
+
"pack-smoke"
|
|
65
|
+
],
|
|
66
|
+
"optionalLiveSuites": [],
|
|
67
|
+
"releaseCheckStatus": "required"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"metrics": {
|
|
71
|
+
"routeContractCoverage": "13/13",
|
|
72
|
+
"interceptRouteCount": 13,
|
|
73
|
+
"protoBackedRouteCount": 11,
|
|
74
|
+
"configEnvVarCount": 39,
|
|
75
|
+
"uncertaintyCount": 7,
|
|
76
|
+
"implementedDeterministicSuites": 6,
|
|
77
|
+
"placeholderSuites": 0,
|
|
78
|
+
"optionalLiveSuites": 3
|
|
79
|
+
},
|
|
80
|
+
"remainingBlockers": [
|
|
81
|
+
"Captured fixture replay for conditional intercept routes.",
|
|
82
|
+
"Live cursor-agent, ACP, and desktop acceptance gates.",
|
|
83
|
+
"Final reliability/security hardening validation.",
|
|
84
|
+
"Final full-gate run with optional live MLX and desktop prerequisites available."
|
|
85
|
+
]
|
|
86
|
+
}
|