Nimblesite / Nimblesite/Shipwright
Why does the deployment manifest carry component `language`? (enum also omits Go/C)
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 0
- Forks
- 0
- Avg merge
- 1m
- Merged PRs (30d)
- 10
Description
Question / design discussion
Adopting Shipwright for Osprey (a compiler whose CLI binary is written in Go, with a C runtime) surfaced a question about the component.language field in shipwright.json.
What I found
language is referenced in:
schemas/shipwright.schema.json—component.languageenum isrust | dotnet | dart | typescript | kotlin | javascript. It is optional.docs/specs/binary-version-contract.md→[SWR-VERSION-BINDINGS]— uses language to pick the per-language version binding library (shipwrightfor Rust,Shipwrightfor .NET,@nimblesite/shipwright-mcpfor Node, …). This is a build-time concern, not a deployment/resolution one.docs/specs/ide-extension-deployment.md:137anddocs/specs/vsix-platform-bundling.md:283— components with"language": "dotnet"must acquire the runtime via Microsoft's .NET Install Tool.
The concern
The deployment contract itself is language-agnostic: the host resolves a binary, runs --version, and compares against expectedVersion. The implementation language is irrelevant to that.
For anything that compiles to native machine code (Go, Rust, C, C++), language carries zero deployment-relevant information — there's no language-specific runtime to fetch and nothing for the host to do differently. Osprey compiles Go → a native binary with a static C runtime; the host launches it and checks --version exactly like it would a Rust binary. The field is pure noise here.
The two places language is used don't justify it living in the deployment manifest:
- Binding selection (
SWR-VERSION-BINDINGS) is a build-time property — which library a binary was compiled with — not something a host needs at resolution time. - The .NET-runtime-acquisition rule is a single narrow special case (framework-dependent .NET sidecars). The deployment-relevant fact there is "needs a managed runtime acquired," not "is written in C#."
The enum is the wrong shape regardless
Even setting the above aside, a single language value per component doesn't model reality: one VSIX can bundle several sidecars written in different languages (say a Rust LSP + a .NET formatter + a Node MCP server) in a single artifact. There is no single "the language" for such a product, and the runtime-acquisition decision is per-sidecar and host-level, not a property you can read off one enum. A closed per-component language enum:
- can't express native-compiled components at all (no
go/c/cpp), and - pretends "language" is the axis that matters for deployment when the actual axis is "does this component need a managed runtime fetched, and how."
Proposal (for discussion)
- Drop
languagefrom the deployment manifest (move binding-selection to build-time config where it belongs), or - If the .NET case needs modelling, model the deployment-relevant fact directly per-component — e.g.
runtimeAcquisition: dotnet-install-tool(or a smallmanagedRuntimeblock) — rather than inferring it fromlanguage == "dotnet". That composes correctly for multi-sidecar VSIXs and keeps the niche runtime handling out of the common path.
Happy to send a PR once there's a direction. Filed while wiring Osprey's shipwright.json, where I'm omitting language on the Go CLI component.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with schemas/shipwright.schema.json and the [SWR-VERSION-BINDINGS] section of docs/specs/binary-version-contract.md, then review the deployment rules in docs/specs/ide-extension-deployment.md and docs/specs/vsix-platform-bundling.md. Compare removing language with modelling runtime acquisition directly; done means the maintainers choose a direction and the schema and affected specifications agree.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c, go, typescript
- Domain
- build-system, devops
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100