@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +48 -3
- package/CONTRIBUTING.md +16 -7
- package/README.md +95 -381
- package/dist/agent-run.mjs +1 -1
- package/dist/build.json +40 -28
- package/dist/cli.mjs +18 -14
- package/dist/mcp-engine.mjs +15 -11
- package/dist/mcp-server.mjs +1 -1
- package/docs/architecture.md +6 -3
- package/docs/chatgpt.md +20 -5
- package/docs/examples.md +40 -170
- package/docs/install.md +100 -35
- package/docs/migration.md +20 -0
- package/docs/sdk.md +26 -5
- package/lib/asset-widget-uri.d.ts +9 -0
- package/lib/asset-widget-uri.js +9 -0
- package/lib/cli-render-mode.js +10 -3
- package/lib/discovery/portable.d.ts +9 -0
- package/lib/discovery/portable.js +6 -0
- package/lib/engine-identity.d.ts +1 -1
- package/lib/engine-identity.js +1 -1
- package/lib/evaluator/isolation.js +19 -5
- package/lib/evaluator/probe-invariants.d.ts +11 -0
- package/lib/evaluator/probe-invariants.js +36 -0
- package/lib/evaluator/probe-worker.js +16 -4
- package/lib/loopback.d.ts +6 -0
- package/lib/loopback.js +6 -0
- package/lib/mcp-core.d.ts +209 -0
- package/lib/mcp-core.js +278 -0
- package/lib/mcp-engine.d.ts +57 -0
- package/lib/mcp-engine.js +284 -0
- package/lib/mcp-manifest.d.ts +15 -0
- package/lib/mcp-manifest.js +65 -0
- package/lib/mcp.d.ts +5 -0
- package/lib/mcp.js +2 -0
- package/lib/render-service-host.js +1 -1
- package/package.json +22 -1
- package/plugin.json +1 -1
- package/plugins/kiln-engine/.claude-plugin/icon.png +0 -0
- package/plugins/kiln-engine/.claude-plugin/plugin.json +9 -3
- package/plugins/kiln-engine/PRIVACY.md +100 -0
- package/plugins/kiln-engine/README.md +103 -18
- package/plugins/kiln-engine/{scripts/setup-workspace.mjs → bin/kiln-setup-workspace.mjs} +37 -9
- package/plugins/kiln-engine/package-provenance.json +15 -8
- package/plugins/kiln-engine/plugin.json +10 -4
- package/plugins/kiln-engine/runtime.json +10 -1
- package/plugins/kiln-engine/skills/kiln-setup-workspace/SKILL.md +17 -18
- package/plugins/kiln-engine/skills/kiln-setup-workspace/references/plugin-install.md +28 -8
- package/plugins/kiln-engine/skills/kiln-setup-workspace/references/renderer-setup.md +11 -0
- package/scripts/create-workspace.mjs +71 -13
- package/scripts/workspace-config.mjs +239 -0
- package/scripts/workspace-project.mjs +384 -0
- package/scripts/workspace-transaction.mjs +504 -0
- package/skills/kiln-setup-workspace/SKILL.md +17 -18
- package/skills/kiln-setup-workspace/references/plugin-install.md +28 -8
- package/skills/kiln-setup-workspace/references/renderer-setup.md +11 -0
- package/src/cli-render-mode.ts +9 -9
- package/src/cli.ts +3 -3
- package/src/discovery/portable.ts +9 -0
- package/src/engine-identity.ts +1 -1
- package/src/evaluator/isolation.ts +27 -6
- package/src/evaluator/probe-invariants.ts +50 -0
- package/src/evaluator/probe-worker.ts +22 -4
- package/src/mcp.ts +5 -0
- 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
|
@@ -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()
|
|
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.
|
|
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.
|
|
5
|
+
"version": "1.1.0",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://github.com/instruktlabs/kiln",
|
|
8
8
|
"keywords": [
|
|
Binary file
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kiln-engine",
|
|
3
|
-
"version": "1.
|
|
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
|
|
1
|
+
# Kiln local plugin
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
[
|
|
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)
|
|
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
|
|
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
|
-
"
|
|
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/
|
|
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:
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"skills/kiln-setup-workspace/references/plugin-install.md": "sha256:
|
|
13
|
-
"skills/kiln-setup-workspace/
|
|
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.
|
|
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
|
|
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
|
|
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
|
}
|