@instruktlabs/kiln 1.0.0 → 1.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 (68) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/CHANGELOG.md +48 -3
  5. package/CONTRIBUTING.md +16 -7
  6. package/README.md +95 -381
  7. package/dist/agent-run.mjs +1 -1
  8. package/dist/build.json +40 -28
  9. package/dist/cli.mjs +18 -14
  10. package/dist/mcp-engine.mjs +15 -11
  11. package/dist/mcp-server.mjs +1 -1
  12. package/docs/architecture.md +6 -3
  13. package/docs/chatgpt.md +20 -5
  14. package/docs/examples.md +40 -170
  15. package/docs/install.md +100 -35
  16. package/docs/migration.md +20 -0
  17. package/docs/sdk.md +26 -5
  18. package/lib/asset-widget-uri.d.ts +9 -0
  19. package/lib/asset-widget-uri.js +9 -0
  20. package/lib/cli-render-mode.js +10 -3
  21. package/lib/discovery/portable.d.ts +9 -0
  22. package/lib/discovery/portable.js +6 -0
  23. package/lib/engine-identity.d.ts +1 -1
  24. package/lib/engine-identity.js +1 -1
  25. package/lib/evaluator/isolation.js +19 -5
  26. package/lib/evaluator/probe-invariants.d.ts +11 -0
  27. package/lib/evaluator/probe-invariants.js +36 -0
  28. package/lib/evaluator/probe-worker.js +16 -4
  29. package/lib/loopback.d.ts +6 -0
  30. package/lib/loopback.js +6 -0
  31. package/lib/mcp-core.d.ts +209 -0
  32. package/lib/mcp-core.js +278 -0
  33. package/lib/mcp-engine.d.ts +57 -0
  34. package/lib/mcp-engine.js +284 -0
  35. package/lib/mcp-manifest.d.ts +15 -0
  36. package/lib/mcp-manifest.js +65 -0
  37. package/lib/mcp.d.ts +5 -0
  38. package/lib/mcp.js +2 -0
  39. package/lib/render-service-host.js +1 -1
  40. package/package.json +22 -1
  41. package/plugin.json +1 -1
  42. package/plugins/kiln-engine/.claude-plugin/icon.png +0 -0
  43. package/plugins/kiln-engine/.claude-plugin/plugin.json +9 -3
  44. package/plugins/kiln-engine/PRIVACY.md +100 -0
  45. package/plugins/kiln-engine/README.md +103 -18
  46. package/plugins/kiln-engine/{scripts/setup-workspace.mjs → bin/kiln-setup-workspace.mjs} +37 -9
  47. package/plugins/kiln-engine/package-provenance.json +15 -8
  48. package/plugins/kiln-engine/plugin.json +10 -4
  49. package/plugins/kiln-engine/runtime.json +10 -1
  50. package/plugins/kiln-engine/skills/kiln-setup-workspace/SKILL.md +17 -18
  51. package/plugins/kiln-engine/skills/kiln-setup-workspace/references/plugin-install.md +28 -8
  52. package/plugins/kiln-engine/skills/kiln-setup-workspace/references/renderer-setup.md +11 -0
  53. package/scripts/create-workspace.mjs +71 -13
  54. package/scripts/workspace-config.mjs +239 -0
  55. package/scripts/workspace-project.mjs +384 -0
  56. package/scripts/workspace-transaction.mjs +504 -0
  57. package/skills/kiln-setup-workspace/SKILL.md +17 -18
  58. package/skills/kiln-setup-workspace/references/plugin-install.md +28 -8
  59. package/skills/kiln-setup-workspace/references/renderer-setup.md +11 -0
  60. package/src/cli-render-mode.ts +9 -9
  61. package/src/cli.ts +3 -3
  62. package/src/discovery/portable.ts +9 -0
  63. package/src/engine-identity.ts +1 -1
  64. package/src/evaluator/isolation.ts +27 -6
  65. package/src/evaluator/probe-invariants.ts +50 -0
  66. package/src/evaluator/probe-worker.ts +22 -4
  67. package/src/mcp.ts +5 -0
  68. package/src/render-service-host.ts +1 -1
@@ -0,0 +1,65 @@
1
+ import { localAssetLibrary } from "./assets-node.js";
2
+ import { createLocalToolContext } from "./local-runtime.js";
3
+ import { KILN_RESOURCE_TEMPLATES, KILN_WIDGET_RESOURCE, } from "./mcp-core.js";
4
+ import { createKilnProgramToolRegistry, } from "./tools/registry.js";
5
+ const JSON_SCHEMA_TARGET = 'draft-2020-12';
6
+ function standardJsonSchema(schema, io) {
7
+ const carrier = schema;
8
+ const converter = carrier['~standard'].jsonSchema;
9
+ if (!converter)
10
+ throw new Error('The registry schema does not implement Standard JSON Schema (zod >= 4.2).');
11
+ const { $schema: _dialect, ...rest } = converter[io]({ target: JSON_SCHEMA_TARGET });
12
+ return rest;
13
+ }
14
+ /** The input schema as advertised: an object root first, the rest as converted. */
15
+ export function toolInputJsonSchema(def) {
16
+ const converted = standardJsonSchema(def.inputSchema, 'input');
17
+ if (converted['type'] !== undefined && converted['type'] !== 'object')
18
+ throw new Error(`${def.name}: a tool input schema must describe an object.`);
19
+ return { type: 'object', ...converted };
20
+ }
21
+ /** One registry definition as one `tools/list` entry, keys in the order the wire has always carried them. */
22
+ export function toolManifestEntry(def) {
23
+ return {
24
+ name: def.name,
25
+ description: def.description,
26
+ inputSchema: toolInputJsonSchema(def),
27
+ ...(def.annotations ? { annotations: def.annotations } : {}),
28
+ ...(def.ui
29
+ ? {
30
+ _meta: {
31
+ ui: { resourceUri: def.ui.resourceUri, visibility: ['model'] },
32
+ 'openai/outputTemplate': def.ui.resourceUri,
33
+ 'ui/resourceUri': def.ui.resourceUri,
34
+ },
35
+ }
36
+ : {}),
37
+ ...(def.outputSchema
38
+ ? { outputSchema: { type: 'object', ...standardJsonSchema(def.outputSchema, 'output') } }
39
+ : {}),
40
+ };
41
+ }
42
+ /** Which templates a context can serve: asset files need a library, project packages a bundle reader. */
43
+ export function resourceTemplatesFor(context) {
44
+ return [
45
+ ...(context.assetLibrary ? [KILN_RESOURCE_TEMPLATES.assetFile] : []),
46
+ ...(context.projectBundleReader ? [KILN_RESOURCE_TEMPLATES.projectPackage] : []),
47
+ ];
48
+ }
49
+ export function buildMcpManifest(defs, context) {
50
+ return {
51
+ kind: 'kiln.mcp-manifest.v1',
52
+ tools: defs.map(toolManifestEntry),
53
+ resources: [KILN_WIDGET_RESOURCE],
54
+ resourceTemplates: resourceTemplatesFor(context),
55
+ };
56
+ }
57
+ /**
58
+ * The manifest the packaged server advertises: the full surface with both
59
+ * templates, built from a context shaped like the packaged host's but with no
60
+ * environment of its own, so the file is the same on every machine.
61
+ */
62
+ export function packagedMcpManifest() {
63
+ const context = createLocalToolContext({ assetLibrary: localAssetLibrary() }, {});
64
+ return buildMcpManifest(createKilnProgramToolRegistry(context), context);
65
+ }
package/lib/mcp.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /** Node embedding API. The stdio executable retains its separate lazy entry. */
2
+ export { createKilnMcpServer, createKilnToolHost, kilnMcpToolDefs } from "./mcp-engine.js";
3
+ export type { KilnMcpCompatibilityOptions, KilnToolResult } from "./mcp-engine.js";
4
+ export type { KilnMcpHost, KilnContentBlock, KilnResourceContents } from "./mcp-core.js";
5
+ export type { KilnToolContext, KilnToolDef } from "./tools/registry.js";
package/lib/mcp.js ADDED
@@ -0,0 +1,2 @@
1
+ /** Node embedding API. The stdio executable retains its separate lazy entry. */
2
+ export { createKilnMcpServer, createKilnToolHost, kilnMcpToolDefs } from "./mcp-engine.js";
@@ -224,7 +224,7 @@ export async function startLocalRenderService(dir = renderServiceDir(), environm
224
224
  // that listener a bounded health warmup, and join only after full verification.
225
225
  // A failed spawn has no such race; absent/unknown never count as success.
226
226
  if (spawnError || (exitedAt !== undefined && Date.now() - exitedAt >= 1500))
227
- throw new Error(`render service exited during startup${spawnError ? `: ${spawnError.message}` : ''}${stderr.trim() ? `: ${stderr.trim().split('\n').slice(-3).join(' ')}` : windowsLaunch ? '; launch the renderer manually to inspect native-driver errors' : ''}`);
227
+ throw new Error(`render service exited during startup${spawnError ? `: ${spawnError.message}` : ''}${stderr.trim() ? `: ${stderr.trim()}` : windowsLaunch ? '; launch the renderer manually to inspect native-driver errors' : ''}`);
228
228
  await new Promise((done) => setTimeout(done, 250));
229
229
  }
230
230
  throw new Error(`render service health is unknown after ${budget}ms; inspect with \`kiln service reprobe\``);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instruktlabs/kiln",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Create and refine procedural 3D assets with JavaScript, image feedback, and reusable source revisions.",
5
5
  "license": "MIT",
6
6
  "author": "Matthew Kissinger",
@@ -83,6 +83,14 @@
83
83
  "types": "./lib/tools/registry.d.ts",
84
84
  "import": "./lib/tools/registry.js"
85
85
  },
86
+ "./tools/input": {
87
+ "types": "./lib/tools/actions.d.ts",
88
+ "import": "./lib/tools/actions.js"
89
+ },
90
+ "./mcp": {
91
+ "types": "./lib/mcp.d.ts",
92
+ "import": "./lib/mcp.js"
93
+ },
86
94
  "./arena": {
87
95
  "types": "./lib/arena/index.d.ts",
88
96
  "import": "./lib/arena/index.js"
@@ -115,6 +123,10 @@
115
123
  "types": "./lib/views/index.d.ts",
116
124
  "import": "./lib/views/index.js"
117
125
  },
126
+ "./views/port": {
127
+ "types": "./lib/views/port.d.ts",
128
+ "import": "./lib/views/port.js"
129
+ },
118
130
  "./validation": {
119
131
  "types": "./lib/validation.d.ts",
120
132
  "import": "./lib/validation.js"
@@ -207,6 +219,10 @@
207
219
  "types": "./lib/discovery/index.d.ts",
208
220
  "import": "./lib/discovery/index.js"
209
221
  },
222
+ "./discovery/portable": {
223
+ "types": "./lib/discovery/portable.d.ts",
224
+ "import": "./lib/discovery/portable.js"
225
+ },
210
226
  "./metrics": {
211
227
  "types": "./lib/metrics.d.ts",
212
228
  "import": "./lib/metrics.js"
@@ -253,6 +269,9 @@
253
269
  "plugins/kiln-engine/",
254
270
  ".mcp.json",
255
271
  "scripts/create-workspace.mjs",
272
+ "scripts/workspace-config.mjs",
273
+ "scripts/workspace-project.mjs",
274
+ "scripts/workspace-transaction.mjs",
256
275
  "scripts/package-plugin.mjs",
257
276
  "render-service/src/",
258
277
  "render-service/package.json",
@@ -327,10 +346,12 @@
327
346
  "acorn": "^8.18.0",
328
347
  "acorn-walk": "^8.3.5",
329
348
  "gltf-validator": "2.0.0-dev.3.10",
349
+ "jsonc-parser": "3.3.1",
330
350
  "manifold-3d": "^3.5.4",
331
351
  "minisearch": "7.2.0",
332
352
  "pngjs": "7.0.0",
333
353
  "sharp": "^0.35.5",
354
+ "smol-toml": "1.9.0",
334
355
  "three": "0.186.1",
335
356
  "three-subdivide": "1.1.5",
336
357
  "xatlasjs": "^0.2.0",
package/plugin.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "kiln",
3
3
  "displayName": "Kiln",
4
4
  "description": "Build and revise 3D assets with your coding agent. Write JavaScript, inspect selected views, edit saved source revisions, and export GLB files locally.",
5
- "version": "1.0.0",
5
+ "version": "1.1.0",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/instruktlabs/kiln",
8
8
  "keywords": [
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "kiln-engine",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Set up a local Kiln workspace to create, inspect and revise editable 3D assets with Claude Code or Codex.",
5
5
  "author": {
6
- "name": "Instrukt Labs"
6
+ "name": "Instrukt Labs",
7
+ "email": "support@instruktlabs.com"
7
8
  },
8
9
  "homepage": "https://github.com/instruktlabs/kiln",
9
10
  "repository": "https://github.com/instruktlabs/kiln",
@@ -14,5 +15,10 @@
14
15
  "gltf",
15
16
  "asset-generation",
16
17
  "gamedev"
17
- ]
18
+ ],
19
+ "icon": "./.claude-plugin/icon.png",
20
+ "documentationUrl": "https://github.com/instruktlabs/kiln/tree/main/plugins/kiln-engine",
21
+ "supportUrl": "https://github.com/instruktlabs/kiln/blob/main/plugins/kiln-engine/README.md#support-and-security",
22
+ "privacyPolicyUrl": "https://github.com/instruktlabs/kiln/blob/main/docs/local-plugin-privacy.md",
23
+ "termsOfServiceUrl": "https://github.com/instruktlabs/kiln/blob/main/LICENSE"
18
24
  }
@@ -0,0 +1,100 @@
1
+ # Kiln local plugin privacy
2
+
3
+ Draft for owner review before directory submission. Updated 7 October 2026.
4
+
5
+ This notice covers the `kiln-engine` local plugin maintained by Instrukt Labs and
6
+ the local workspace it sets up. It does not cover the separate hosted Kiln service
7
+ or your coding assistant's account and conversation history. The local plugin does
8
+ not require a Kiln account, an email address, payment details or a model API key.
9
+
10
+ ## What stays on your computer
11
+
12
+ Setup reads its public package/version pin, locates Node and npm, and checks the
13
+ workspace and runtime directories you select. It installs the engine in a persistent
14
+ data directory outside the plugin cache. Paths can contain your device account
15
+ name; paths, package identity and file hashes appear in local configuration,
16
+ installation records and command results returned to your assistant.
17
+
18
+ When adding Kiln to an existing project, setup reads the selected client's
19
+ configuration and records ownership of Kiln's own entries. It preserves unrelated
20
+ settings and existing project instructions. A recoverable setup transaction
21
+ temporarily copies the affected files into private local recovery storage outside
22
+ the project. Those copies can contain credentials already present in the client's
23
+ configuration. They are not uploaded, printed or added to the workspace manifest.
24
+ This storage uses filesystem permissions; Kiln does not encrypt these snapshots.
25
+
26
+ Your workspace and configured asset libraries hold authored JavaScript, material
27
+ files, asset names, metadata, previews and GLBs. Local tools read and write the
28
+ work you ask them to handle and return requested source, images and results to
29
+ your coding assistant. Avoid putting personal or confidential information in a
30
+ source file, asset name or tool argument unless you intend your assistant to see it.
31
+
32
+ The local plugin does not send these assets to an Instrukt Labs service or add
33
+ analytics reporting. Your assistant can send prompts and tool results to its own
34
+ provider. That processing, and any assistant history or backups, follows the
35
+ assistant's settings and privacy policy. Kiln does not control those copies.
36
+
37
+ ## Network access and other services
38
+
39
+ - Installing or updating the marketplace/plugin contacts GitHub through your
40
+ coding assistant or Git. Setup downloads the exact engine version and its
41
+ dependencies through npm using `https://registry.npmjs.org`. Those services
42
+ receive download requests and ordinary connection information, including your
43
+ IP address. No asset upload is part of setup.
44
+ - npm runs with lifecycle scripts, audit and funding requests disabled. It can
45
+ still use your existing npm configuration and inherited environment, including
46
+ registry authentication you already configured. Kiln does not request an npm
47
+ login or registry token for this public package, copy credentials into the
48
+ plugin, or promise to strip npm's normal credential configuration. npm also
49
+ writes to its normal cache and log directories.
50
+ - CPU rendering is local. An optional local render service stays on your machine.
51
+ If you explicitly configure a renderer on another machine, Kiln sends the GLB
52
+ and capture settings to that chosen endpoint and uses its configured
53
+ authentication. Review that operator's privacy and retention practices first.
54
+ - Opening documentation, filing a GitHub issue or contacting support uses the
55
+ service you choose. Information in a public issue is public; it is not private
56
+ telemetry from your local workspace.
57
+
58
+ Relevant service policies: [npm](https://docs.npmjs.com/policies/privacy/),
59
+ [GitHub](https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement),
60
+ [Claude](https://www.anthropic.com/legal/privacy) and
61
+ [OpenAI](https://openai.com/policies/privacy-policy/). Other assistants and optional
62
+ renderer operators provide their own policies.
63
+
64
+ ## Retention and deletion
65
+
66
+ Local source, saved assets, runtime installations and workspace configuration
67
+ remain until you delete them. Uninstalling the plugin removes neither your assets
68
+ nor its separately installed engine. Plugin updates also leave existing
69
+ workspaces on their installed engine until you request a managed upgrade.
70
+
71
+ Setup removes recovery snapshots after a successful transaction or completed
72
+ recovery. Interrupted setup can leave them until recovery succeeds or you resolve
73
+ the interruption. The default location is
74
+ `%LOCALAPPDATA%/InstruktLabs/Kiln/setup-transactions` on Windows, or
75
+ `$XDG_DATA_HOME/instruktlabs/kiln/setup-transactions` elsewhere, falling back to
76
+ `~/.local/share/instruktlabs/kiln/setup-transactions`. Use the setup helper's
77
+ `--recover` operation before retrying an interrupted change. Do not upload recovery
78
+ files to a public issue or delete them while setup or recovery is active.
79
+
80
+ There is no automatic seven-day expiry for local work; that is a separate hosted
81
+ service policy. Remove selected local work using Kiln's library controls or your
82
+ filesystem, and manage independent exports, backups, npm caches and assistant
83
+ histories through their respective applications. Preserve copies you want before
84
+ deleting a workspace or runtime.
85
+
86
+ ## Support and security
87
+
88
+ Contact [support@instruktlabs.com](mailto:support@instruktlabs.com) for privacy
89
+ questions, deletion requests concerning information you sent to support, or
90
+ private security reports. Support receives only what you send, including your
91
+ email address and message. Support mail is forwarded through Cloudflare to the
92
+ maintainer's Google inbox; see [Cloudflare's privacy policy](https://www.cloudflare.com/privacypolicy/)
93
+ and [Google's privacy policy](https://policies.google.com/privacy). We use support
94
+ correspondence to handle the request; this is not an automatic local-plugin alert
95
+ or a mailing-list signup.
96
+
97
+ Do not send passwords, tokens, recovery codes or private assets with a bug report.
98
+ Sanitize logs and paths before posting publicly. Instrukt Labs cannot remotely
99
+ access or erase your local workspace, your assistant's copies or a renderer
100
+ operator's records through this plugin.
@@ -1,25 +1,110 @@
1
- # Kiln Engine local plugin
1
+ # Kiln local plugin
2
2
 
3
- Version 1.0.0, published by Instrukt Labs under the MIT license.
3
+ Plugin version 1.1.0, maintained by Instrukt Labs under the MIT license.
4
+ This plugin pins engine 1.1.0. Registry setup requires that exact version
5
+ to be published. Use a published release tag for normal installation or a reviewed
6
+ local archive for development qualification. The installation ID remains
7
+ `kiln-engine@instruktlabs`.
4
8
 
5
- Ask your coding agent to set up a Kiln workspace. The setup skill installs
6
- `@instruktlabs/kiln@1.0.0` with npm and creates a separate asset workspace.
7
- Use a supported Node.js installation with npm; no Bun, engine clone or separate
8
- model API key is required. The workspace's START.md explains how to reopen it.
9
+ Set up Kiln in an existing project or a new asset workspace, then create and revise
10
+ editable 3D assets with your coding agent. Use a supported Node.js installation
11
+ with npm. No Bun, engine checkout, Kiln account or separate model API key is needed.
12
+ The plugin requires a local shell and filesystem; Claude chat and Cowork are not
13
+ supported by this local bundle.
9
14
 
10
- The plugin registers setup only. The workspace supplies the authoring skills
11
- and one local MCP server, `kiln_workspace`. Open Claude Code in that workspace;
12
- launch Codex there with `node codex.mjs`. Accept the host's ordinary trust prompts
13
- and verify live tool discovery before authoring.
15
+ ## Install
16
+
17
+ For Claude Code:
18
+
19
+ ```sh
20
+ claude plugin marketplace add instruktlabs/kiln
21
+ claude plugin install kiln-engine@instruktlabs
22
+ ```
23
+
24
+ For Codex:
25
+
26
+ ```sh
27
+ codex plugin marketplace add instruktlabs/kiln
28
+ codex plugin add kiln-engine@instruktlabs
29
+ ```
30
+
31
+ Restart or reload your coding agent's plugins as its installation message directs.
32
+ Then ask it to set up a Kiln workspace. The maintained setup skill runs this
33
+ plugin's `bin/kiln-setup-workspace.mjs` with Node, installs
34
+ `@instruktlabs/kiln@1.1.0` outside the project and configures your chosen
35
+ workspace. The same initializer supports existing projects and new workspaces.
36
+
37
+ The plugin registers setup only. The workspace supplies authoring skills and one
38
+ local MCP server, `kiln_workspace`. Open Claude Code in that workspace or launch
39
+ Codex there with `codex`. For headless Codex execution, use
40
+ `node codex.mjs "TASK"` with an explicit prompt. Read `.kiln/START.md` after
41
+ adoption or `START.md` in a legacy workspace, accept the host's ordinary trust
42
+ prompts and verify live tool discovery before authoring.
43
+
44
+ ## Setup examples
45
+
46
+ 1. **Create:** “Set up a new Kiln workspace in an empty directory outside this
47
+ checkout, using my current coding agent. Verify its tools before I author an
48
+ asset.” The installer downloads the pinned engine when needed, creates the
49
+ selected workspace and keeps its engine in a separate runtime store. npm also
50
+ uses its normal cache and log directories.
51
+ 2. **Adopt:** “Add Kiln to this project without replacing my instructions or other
52
+ MCP settings. Show the planned changes first.” Use `--adopt --check` to
53
+ preview, then `--adopt` to apply. Read `.kiln/AGENTS.md` alongside the
54
+ project's instructions. Repeat with another supported `--harness` to add
55
+ that integration around the same saved assets. The engine's adapter list is
56
+ included in `runtime.json`; it does not imply this plugin can be installed
57
+ in every listed client. Published engine 1.0.0 does not support adoption.
58
+ 3. **Check:** “Check my existing Kiln workspace without changing it.” The helper's
59
+ `--check` mode reports whether managed files and the installed engine are
60
+ current. A missing runtime is reported without installing one.
61
+ 4. **Upgrade:** “Upgrade my managed Kiln workspace while preserving my sources,
62
+ saved assets and customizations.” Stop the workspace's harness session first.
63
+ The helper's `--upgrade` mode uses the pinned engine and refuses conflicts
64
+ rather than replacing customized managed files.
14
65
 
15
66
  The engine installation and your assets stay outside the disposable plugin cache.
16
- Plugin removal or updating its cached files does not delete them. An existing
17
- workspace remains on its installed engine until an explicit managed upgrade.
18
- Read [setup and upgrade guidance](skills/kiln-setup-workspace/references/plugin-install.md).
67
+ Removing or updating the plugin does not delete them. Existing workspaces stay on
68
+ their installed engine until an explicit managed upgrade. Read the
69
+ [setup and upgrade guide](skills/kiln-setup-workspace/references/plugin-install.md)
70
+ for paths, repair and failure recovery.
71
+
72
+ ## Execution and network access
73
+
74
+ The setup skill asks your coding agent to execute a bundled Node installer. That
75
+ installer runs npm with lifecycle scripts disabled and invokes Kiln's workspace
76
+ generator. It does this before the workspace MCP server exists; it does not
77
+ silently install a global MCP server or grant itself shell permissions.
78
+
79
+ Adoption and managed project updates temporarily keep recovery copies outside
80
+ the project. Client configuration can already contain credentials, so these
81
+ private copies may too. They are removed after successful setup or recovery;
82
+ interrupted transactions retain them. See [local privacy](PRIVACY.md) for the
83
+ storage location and protection limits. Use `--recover` before retrying an
84
+ interrupted project update.
85
+
86
+ Marketplace installation and updates contact `https://github.com`. First engine
87
+ installation and dependency downloads use `https://registry.npmjs.org`. npm can
88
+ use your existing npm configuration and environment. No npm login or token is
89
+ required for this public package. Normal local asset work does not upload your
90
+ assets to Instrukt Labs. Tool results can enter your coding assistant's model
91
+ context; its provider handles those copies.
92
+
93
+ CPU rendering is local. Material appearance needs a compatible local renderer or
94
+ one you explicitly configure on another machine; a remote renderer receives the
95
+ GLB and requested capture settings. Follow the setup skill's renderer checks.
96
+ The separate hosted Kiln integration has its own authentication and privacy notice.
97
+
98
+ ## Support and security
99
+
100
+ Send private security or privacy questions to
101
+ [support@instruktlabs.com](mailto:support@instruktlabs.com). Never include
102
+ passwords, tokens, recovery codes or private assets in public issues. For a normal
103
+ bug report, provide the plugin and engine versions, operating system and a small
104
+ sanitized reproduction at [GitHub issues](https://github.com/instruktlabs/kiln/issues).
19
105
 
20
- CPU rendering is available locally. Material appearance requires a qualified
21
- renderer; follow the setup skill's renderer checks rather than assuming GPU support.
22
- Hosted ChatGPT access is a separate integration, and this local bundle is not a
23
- public OpenAI directory submission.
106
+ If setup fails, retain the error, check Node/npm and network access, and follow the
107
+ setup guide. Do not delete an unfamiliar runtime or another installer's lock.
24
108
 
25
- [Source and issues](https://github.com/instruktlabs/kiln)
109
+ [Local privacy notice](PRIVACY.md) · [MIT license](LICENSE) ·
110
+ [Source](https://github.com/instruktlabs/kiln)
@@ -232,14 +232,15 @@ async function installRuntime(data, pin, archive, archiveHash, options) {
232
232
 
233
233
  export async function setupPluginWorkspace(options = {}) {
234
234
  const harness = options.harness || 'claude';
235
- if (!['claude', 'codex'].includes(harness)) throw new Error('Choose harness claude or codex.');
236
235
  const mode = options.mode || 'create';
237
- if (!['create', 'check', 'upgrade', 'repair'].includes(mode))
236
+ if (!['create', 'check', 'upgrade', 'repair', 'recover'].includes(mode))
238
237
  throw new Error('Unknown workspace setup mode.');
238
+ if (mode === 'recover' && (options.adopt || options.skills))
239
+ throw new Error('Use --recover alone before retrying setup.');
239
240
  if (!options.directory) throw new Error('Provide a workspace directory.');
240
241
  if (
241
242
  options.skills &&
242
- (mode !== 'create' ||
243
+ ((mode !== 'create' && !(mode === 'check' && options.adopt)) ||
243
244
  !Array.isArray(options.skills) ||
244
245
  options.skills.some((name) => !['compose', 'batch'].includes(name)))
245
246
  )
@@ -251,6 +252,18 @@ export async function setupPluginWorkspace(options = {}) {
251
252
  if (pin.name !== packageName) throw new Error(`The plugin must pin package ${packageName}.`);
252
253
  if (typeof pin.version !== 'string' || !exactVersion.test(pin.version))
253
254
  throw new Error('The plugin runtime needs an exact stable, rc.N or dev.N version.');
255
+ // New bundles derive adapters from their pinned engine's initializer. Keep the
256
+ // original two-client contract for older bundles that have no capability list.
257
+ const harnesses = pin.harnesses === undefined ? ['claude', 'codex'] : pin.harnesses;
258
+ if (
259
+ !Array.isArray(harnesses) ||
260
+ !harnesses.length ||
261
+ harnesses.some((name) => typeof name !== 'string' || !/^[a-z][a-z0-9-]{0,63}$/.test(name)) ||
262
+ new Set(harnesses).size !== harnesses.length
263
+ )
264
+ throw new Error('Invalid workspace harness capabilities in the plugin runtime pin.');
265
+ if (!harnesses.includes(harness))
266
+ throw new Error(`Choose a supported workspace harness: ${harnesses.join(', ')}.`);
254
267
  const directory = await canonical(options.directory);
255
268
  const data = await canonical(options.dataDirectory || defaultDataDirectory());
256
269
  for (const [a, b] of [
@@ -260,7 +273,7 @@ export async function setupPluginWorkspace(options = {}) {
260
273
  ])
261
274
  if (inside(a, b) || inside(b, a))
262
275
  throw new Error('Keep workspace, runtime data and plugin cache in separate directories.');
263
- if (mode === 'create' && (await exists(directory))) {
276
+ if (mode === 'create' && !options.adopt && (await exists(directory))) {
264
277
  if (!(await lstat(directory)).isDirectory() || (await readdir(directory)).length)
265
278
  throw new Error(
266
279
  'The workspace destination must be an empty directory; no existing files were changed.',
@@ -273,13 +286,22 @@ export async function setupPluginWorkspace(options = {}) {
273
286
  { name: pin.name, version: pin.version },
274
287
  archive,
275
288
  archiveHash,
276
- { ...options, mode },
289
+ { ...options, mode: mode === 'recover' ? 'check' : mode },
277
290
  );
278
- const { createWorkspace } = await import(
291
+ const { createWorkspace, workspaceSetupCapabilities } = await import(
279
292
  pathToFileURL(join(runtime, 'scripts/create-workspace.mjs')).href
280
293
  );
294
+ if (options.adopt && workspaceSetupCapabilities?.projectAdoption !== 1)
295
+ throw new Error(
296
+ 'The pinned engine does not support project adoption. Use a plugin release that pins a supporting engine; no project files were changed.',
297
+ );
298
+ if (mode === 'recover' && workspaceSetupCapabilities?.recovery !== 1)
299
+ throw new Error(
300
+ 'The pinned engine does not support project recovery. No project files were changed.',
301
+ );
281
302
  const workspace = await createWorkspace(directory, harness, {
282
303
  installation: runtime,
304
+ ...(options.adopt ? { adopt: true } : {}),
283
305
  ...(mode === 'create' ? {} : { [mode]: true }),
284
306
  ...(options.skills ? { skills: options.skills } : {}),
285
307
  });
@@ -302,9 +324,13 @@ export function parseSetupArguments(args) {
302
324
  };
303
325
  while (values.length) {
304
326
  const flag = values.shift();
305
- if (['--check', '--upgrade', '--repair'].includes(flag)) {
306
- if (result.mode) throw new Error('Choose only one of --check, --upgrade or --repair.');
327
+ if (['--check', '--upgrade', '--repair', '--recover'].includes(flag)) {
328
+ if (result.mode)
329
+ throw new Error('Choose only one of --check, --upgrade, --repair or --recover.');
307
330
  result.mode = flag.slice(2);
331
+ } else if (flag === '--adopt') {
332
+ if (result.adopt) throw new Error('Repeated option --adopt.');
333
+ result.adopt = true;
308
334
  } else if (Object.hasOwn(valueFlags, flag)) {
309
335
  const value = values.shift();
310
336
  if (!value || value.startsWith('--')) throw new Error(`Missing value for ${flag}.`);
@@ -312,6 +338,8 @@ export function parseSetupArguments(args) {
312
338
  result[valueFlags[flag]] = flag === '--skills' ? value.split(',') : value;
313
339
  } else throw new Error(`Unknown option ${flag}.`);
314
340
  }
341
+ if (result.mode === 'recover' && (result.adopt || result.skills))
342
+ throw new Error('Use --recover alone before retrying setup.');
315
343
  return result;
316
344
  }
317
345
 
@@ -323,7 +351,7 @@ if (
323
351
  const options = parseSetupArguments(process.argv.slice(2));
324
352
  if (options.help)
325
353
  console.log(
326
- 'Usage: node scripts/setup-workspace.mjs <directory> [--harness claude|codex] [--skills compose,batch]\n node scripts/setup-workspace.mjs <managed-workspace> --check|--upgrade|--repair\nOptions: --data-dir <persistent-directory>, --archive <qualification.tgz>, --npm-cli <npm-cli.js>',
354
+ 'Usage: node bin/kiln-setup-workspace.mjs <directory> [--harness NAME] [--skills compose,batch]\n node bin/kiln-setup-workspace.mjs <project-or-new-workspace> --adopt [--check]\n node bin/kiln-setup-workspace.mjs <managed-workspace> --check|--upgrade|--repair|--recover\nOptions: --data-dir <persistent-directory>, --archive <qualification.tgz>, --npm-cli <npm-cli.js>\nWorkspace adapters are declared by the pinned engine in runtime.json.',
327
355
  );
328
356
  else {
329
357
  const result = await setupPluginWorkspace(options);
@@ -1,15 +1,22 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "kind": "kiln-local-plugin",
4
- "engineVersion": "1.0.0",
4
+ "pluginVersion": "1.1.0",
5
+ "engineVersion": "1.1.0",
6
+ "executables": [
7
+ "bin/kiln-setup-workspace.mjs"
8
+ ],
5
9
  "files": {
6
- ".claude-plugin/plugin.json": "sha256:c40c7eafed4c0822faef83178633f3bf3449311220f709d5155aed4a9c74cd6b",
10
+ ".claude-plugin/icon.png": "sha256:b4b651c402793b7e27cab780f04b14f80daec6d0cd5b7e4e90313930581a54e9",
11
+ ".claude-plugin/plugin.json": "sha256:189394253cf57f988fd82b31dad05012d693615a50126eebb29bab3e80e3a2a9",
12
+ "bin/kiln-setup-workspace.mjs": "sha256:3d9a30236919a6ca91acb6b26f808cec442e6edc3dd88fe010645b010d76e838",
7
13
  "LICENSE": "sha256:cdba278ebf1d6de618869936226bf03be4887179c128efc7aaa13d22034826a5",
8
- "plugin.json": "sha256:f80ecc90d141adf45e5fadfe5092c325e9174f02b364c1e0059cd5bd345eaaf1",
9
- "README.md": "sha256:3a9482e4e8e47b8ef7fb27d2d880253397a7f903b7ccdd64794995fd3075d2dd",
10
- "runtime.json": "sha256:18129a1d310c468aeba0966792940242f0359ab14c41a4c9ef240310d07d3bd2",
11
- "scripts/setup-workspace.mjs": "sha256:0936f482a213706cf1576da11e57d40993b90f42b486f262e55d38d8d27b2e4d",
12
- "skills/kiln-setup-workspace/references/plugin-install.md": "sha256:84f4ce4c9620aae1e6b37a6a04f5c874feae507c9e7a2f24fe62e48bbe6c09bd",
13
- "skills/kiln-setup-workspace/SKILL.md": "sha256:9dbcb66514e21ea11b097bb1cd4b27b616834ded3e8182ea804f370add37a69f"
14
+ "plugin.json": "sha256:428ab085c6257ccc0e2dec3c7d4f9b6e02db0024a5f0b355410a30d6282dcd1d",
15
+ "PRIVACY.md": "sha256:5f58d981667e40441e21c2dec411f269a9a67a6141cec61976d27088fb12573b",
16
+ "README.md": "sha256:6a7fc436113f7493c884b2c495629351b01b2cd7e82e7b808f3abe73b9eb9af4",
17
+ "runtime.json": "sha256:253f76044dcc162295ca760ff584d1d6894068357c727a56b077b44278f38eb3",
18
+ "skills/kiln-setup-workspace/references/plugin-install.md": "sha256:c338fb792e7fad0364c3e1a13c94c506afa1395489ec1b6e83b36d04728935fb",
19
+ "skills/kiln-setup-workspace/references/renderer-setup.md": "sha256:b743b1b2827fa814385990e1e5b849391cb427413e9c016d273aa19cebd46031",
20
+ "skills/kiln-setup-workspace/SKILL.md": "sha256:65ed926b3503a33f4fe793e84e4a045ce36e3967f0e6b340e456a15dd010ce54"
14
21
  }
15
22
  }
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "kiln-engine",
4
- "version": "1.0.0",
4
+ "version": "1.1.0",
5
5
  "description": "Set up a local Kiln workspace to create, inspect and revise editable 3D assets with Claude Code or Codex.",
6
6
  "author": {
7
- "name": "Instrukt Labs"
7
+ "name": "Instrukt Labs",
8
+ "email": "support@instruktlabs.com"
8
9
  },
9
10
  "homepage": "https://github.com/instruktlabs/kiln",
10
11
  "repository": "https://github.com/instruktlabs/kiln",
@@ -19,10 +20,14 @@
19
20
  "extensions": {
20
21
  "com.openai": {
21
22
  "interface": {
22
- "displayName": "Kiln Engine",
23
+ "displayName": "Kiln",
23
24
  "shortDescription": "Create editable 3D assets in a local workspace",
24
25
  "longDescription": "Install the pinned Kiln engine and set up a workspace with local MCP tools and maintained authoring skills. Your coding agent supplies the model.",
25
26
  "developerName": "Instrukt Labs",
27
+ "websiteURL": "https://github.com/instruktlabs/kiln/tree/main/plugins/kiln-engine",
28
+ "supportURL": "https://github.com/instruktlabs/kiln/blob/main/plugins/kiln-engine/README.md#support-and-security",
29
+ "privacyPolicyURL": "https://github.com/instruktlabs/kiln/blob/main/docs/local-plugin-privacy.md",
30
+ "termsOfServiceURL": "https://github.com/instruktlabs/kiln/blob/main/LICENSE",
26
31
  "category": "Developer Tools",
27
32
  "capabilities": [
28
33
  "Read",
@@ -30,7 +35,8 @@
30
35
  ],
31
36
  "defaultPrompt": [
32
37
  "Set up a Kiln workspace for this coding agent.",
33
- "Check and upgrade my existing Kiln workspace."
38
+ "Check my existing Kiln workspace without changing it.",
39
+ "Upgrade my managed Kiln workspace while preserving my assets."
34
40
  ]
35
41
  }
36
42
  }
@@ -1,4 +1,13 @@
1
1
  {
2
2
  "name": "@instruktlabs/kiln",
3
- "version": "1.0.0"
3
+ "version": "1.1.0",
4
+ "harnesses": [
5
+ "claude",
6
+ "codex",
7
+ "opencode",
8
+ "hermes",
9
+ "agy",
10
+ "copilot",
11
+ "cursor-agent"
12
+ ]
4
13
  }