@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.
Files changed (142) hide show
  1. package/DISCLAIMER.md +12 -0
  2. package/README.md +157 -0
  3. package/dist/src/agentTools/diff.d.ts +11 -0
  4. package/dist/src/agentTools/diff.js +88 -0
  5. package/dist/src/agentTools/policy.d.ts +3 -0
  6. package/dist/src/agentTools/policy.js +12 -0
  7. package/dist/src/agentTools/registry.d.ts +114 -0
  8. package/dist/src/agentTools/registry.js +663 -0
  9. package/dist/src/agentTools/results.d.ts +14 -0
  10. package/dist/src/agentTools/results.js +117 -0
  11. package/dist/src/agentTools/schemas.d.ts +3 -0
  12. package/dist/src/agentTools/schemas.js +89 -0
  13. package/dist/src/agentTools/surface.d.ts +11 -0
  14. package/dist/src/agentTools/surface.js +251 -0
  15. package/dist/src/certs.d.ts +8 -0
  16. package/dist/src/certs.js +34 -0
  17. package/dist/src/ck.d.ts +2 -0
  18. package/dist/src/ck.js +6 -0
  19. package/dist/src/ckLauncher.d.ts +150 -0
  20. package/dist/src/ckLauncher.js +1496 -0
  21. package/dist/src/cli.d.ts +2 -0
  22. package/dist/src/cli.js +265 -0
  23. package/dist/src/config.d.ts +52 -0
  24. package/dist/src/config.js +210 -0
  25. package/dist/src/connectEnvelope.d.ts +16 -0
  26. package/dist/src/connectEnvelope.js +70 -0
  27. package/dist/src/desktop.d.ts +19 -0
  28. package/dist/src/desktop.js +167 -0
  29. package/dist/src/desktopConnectProxy.d.ts +26 -0
  30. package/dist/src/desktopConnectProxy.js +175 -0
  31. package/dist/src/extensions/index.d.ts +2 -0
  32. package/dist/src/extensions/index.js +1 -0
  33. package/dist/src/extensions/registry.d.ts +8 -0
  34. package/dist/src/extensions/registry.js +52 -0
  35. package/dist/src/extensions/types.d.ts +42 -0
  36. package/dist/src/extensions/types.js +1 -0
  37. package/dist/src/fixtures/modelFusion.d.ts +103 -0
  38. package/dist/src/fixtures/modelFusion.js +404 -0
  39. package/dist/src/fixtures/replay.d.ts +9 -0
  40. package/dist/src/fixtures/replay.js +41 -0
  41. package/dist/src/fixtures/sanitizer.d.ts +9 -0
  42. package/dist/src/fixtures/sanitizer.js +43 -0
  43. package/dist/src/fixtures/schema.d.ts +38 -0
  44. package/dist/src/fixtures/schema.js +33 -0
  45. package/dist/src/gen/agent/v1/agent_pb.d.ts +21577 -0
  46. package/dist/src/gen/agent/v1/agent_pb.js +5325 -0
  47. package/dist/src/gen/aiserver/v1/aiserver_pb.d.ts +135242 -0
  48. package/dist/src/gen/aiserver/v1/aiserver_pb.js +34430 -0
  49. package/dist/src/gen/anyrun/v1/anyrun_pb.d.ts +1163 -0
  50. package/dist/src/gen/anyrun/v1/anyrun_pb.js +374 -0
  51. package/dist/src/gen/google/protobuf/google_pb.d.ts +142 -0
  52. package/dist/src/gen/google/protobuf/google_pb.js +54 -0
  53. package/dist/src/gen/internapi/v1/internapi_pb.d.ts +121 -0
  54. package/dist/src/gen/internapi/v1/internapi_pb.js +79 -0
  55. package/dist/src/logger.d.ts +8 -0
  56. package/dist/src/logger.js +37 -0
  57. package/dist/src/modelFusion/cursorHarness.d.ts +146 -0
  58. package/dist/src/modelFusion/cursorHarness.js +647 -0
  59. package/dist/src/modelFusion/index.d.ts +4 -0
  60. package/dist/src/modelFusion/index.js +2 -0
  61. package/dist/src/models/registry.d.ts +22 -0
  62. package/dist/src/models/registry.js +30 -0
  63. package/dist/src/proto.d.ts +13 -0
  64. package/dist/src/proto.js +61 -0
  65. package/dist/src/providers/openai.d.ts +64 -0
  66. package/dist/src/providers/openai.js +355 -0
  67. package/dist/src/redaction.d.ts +4 -0
  68. package/dist/src/redaction.js +65 -0
  69. package/dist/src/routeInventory.d.ts +16 -0
  70. package/dist/src/routeInventory.js +39 -0
  71. package/dist/src/routes.d.ts +37 -0
  72. package/dist/src/routes.js +227 -0
  73. package/dist/src/server.d.ts +50 -0
  74. package/dist/src/server.js +1353 -0
  75. package/dist/src/services/agent.d.ts +1 -0
  76. package/dist/src/services/agent.js +7 -0
  77. package/dist/src/services/agentRun.d.ts +60 -0
  78. package/dist/src/services/agentRun.js +391 -0
  79. package/dist/src/services/chat.d.ts +11 -0
  80. package/dist/src/services/chat.js +47 -0
  81. package/dist/src/services/models.d.ts +10 -0
  82. package/dist/src/services/models.js +216 -0
  83. package/dist/src/services/serverConfig.d.ts +2 -0
  84. package/dist/src/services/serverConfig.js +19 -0
  85. package/dist/src/testing/artifacts.d.ts +14 -0
  86. package/dist/src/testing/artifacts.js +92 -0
  87. package/dist/src/testing/cli.d.ts +4 -0
  88. package/dist/src/testing/cli.js +192 -0
  89. package/dist/src/testing/localBackend.d.ts +24 -0
  90. package/dist/src/testing/localBackend.js +310 -0
  91. package/dist/src/testing/processRunner.d.ts +7 -0
  92. package/dist/src/testing/processRunner.js +74 -0
  93. package/dist/src/testing/runner.d.ts +9 -0
  94. package/dist/src/testing/runner.js +85 -0
  95. package/dist/src/testing/scenarios.d.ts +3 -0
  96. package/dist/src/testing/scenarios.js +2535 -0
  97. package/dist/src/testing/types.d.ts +66 -0
  98. package/dist/src/testing/types.js +1 -0
  99. package/dist/src/tools/baselineInventory.d.ts +12 -0
  100. package/dist/src/tools/baselineInventory.js +680 -0
  101. package/dist/src/tools/checkModelFusionProtocol.d.ts +1 -0
  102. package/dist/src/tools/checkModelFusionProtocol.js +274 -0
  103. package/dist/src/tools/checkReleasePublishConfig.d.ts +1 -0
  104. package/dist/src/tools/checkReleasePublishConfig.js +99 -0
  105. package/dist/src/tools/generateProtoInventory.d.ts +1 -0
  106. package/dist/src/tools/generateProtoInventory.js +89 -0
  107. package/dist/src/tools/normalizeGeneratedCode.d.ts +1 -0
  108. package/dist/src/tools/normalizeGeneratedCode.js +18 -0
  109. package/dist/src/tools/releaseCheck.d.ts +26 -0
  110. package/dist/src/tools/releaseCheck.js +367 -0
  111. package/dist/src/trace.d.ts +39 -0
  112. package/dist/src/trace.js +106 -0
  113. package/dist/src/translation.d.ts +6 -0
  114. package/dist/src/translation.js +22 -0
  115. package/dist/src/upstream.d.ts +20 -0
  116. package/dist/src/upstream.js +270 -0
  117. package/docs/configuration.md +55 -0
  118. package/docs/cursor-app.md +263 -0
  119. package/docs/implementation-inventory.json +609 -0
  120. package/docs/learnings.md +363 -0
  121. package/docs/model-fusion-protocol-origin.json +126 -0
  122. package/docs/model-fusion-protocol.md +110 -0
  123. package/docs/plugin-authoring.md +24 -0
  124. package/docs/proto-inventory.md +1477 -0
  125. package/docs/protocol-surface-audit.md +92 -0
  126. package/docs/protocol.md +52 -0
  127. package/docs/refreshing-protos.md +78 -0
  128. package/docs/release-gates.md +110 -0
  129. package/docs/release-summary.json +86 -0
  130. package/docs/route-contract-manifest.json +288 -0
  131. package/docs/route-policy.json +133 -0
  132. package/docs/service-manifest.json +9490 -0
  133. package/docs/test-manifest.json +155 -0
  134. package/docs/testing-harness.md +204 -0
  135. package/docs/troubleshooting.md +36 -0
  136. package/docs/type-manifest-summary.json +28927 -0
  137. package/package.json +93 -0
  138. package/proto/agent/v1/agent.proto +5371 -0
  139. package/proto/aiserver/v1/aiserver.proto +32944 -0
  140. package/proto/anyrun/v1/anyrun.proto +294 -0
  141. package/proto/google/protobuf/google.proto +37 -0
  142. 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.
@@ -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
+ }