@instruktlabs/kiln 1.0.0 → 1.2.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 (92) 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 +60 -3
  5. package/CONTRIBUTING.md +16 -7
  6. package/README.md +95 -381
  7. package/dist/agent-run.mjs +220 -150
  8. package/dist/build.json +40 -28
  9. package/dist/cli.mjs +242 -163
  10. package/dist/mcp-engine.mjs +412 -154
  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 +49 -5
  18. package/docs/tools-operations.md +1529 -0
  19. package/lib/asset-widget-uri.d.ts +9 -0
  20. package/lib/asset-widget-uri.js +9 -0
  21. package/lib/cli-render-mode.js +10 -3
  22. package/lib/discovery/index.d.ts +1 -1
  23. package/lib/discovery/index.js +2 -2
  24. package/lib/discovery/portable.d.ts +9 -0
  25. package/lib/discovery/portable.js +6 -0
  26. package/lib/discovery/service.d.ts +3 -1
  27. package/lib/discovery/service.js +4 -2
  28. package/lib/engine-identity.d.ts +1 -1
  29. package/lib/engine-identity.js +1 -1
  30. package/lib/evaluator/isolation.js +19 -5
  31. package/lib/evaluator/probe-invariants.d.ts +11 -0
  32. package/lib/evaluator/probe-invariants.js +36 -0
  33. package/lib/evaluator/probe-worker.js +16 -4
  34. package/lib/loopback.d.ts +6 -0
  35. package/lib/loopback.js +6 -0
  36. package/lib/mcp-core.d.ts +210 -0
  37. package/lib/mcp-core.js +279 -0
  38. package/lib/mcp-engine.d.ts +59 -0
  39. package/lib/mcp-engine.js +289 -0
  40. package/lib/mcp-manifest.d.ts +15 -0
  41. package/lib/mcp-manifest.js +65 -0
  42. package/lib/mcp.d.ts +5 -0
  43. package/lib/mcp.js +2 -0
  44. package/lib/render-service-host.js +1 -1
  45. package/lib/tools/discovery.d.ts +1 -1
  46. package/lib/tools/discovery.js +11 -9
  47. package/lib/tools/materials.d.ts +1 -1
  48. package/lib/tools/materials.js +44 -14
  49. package/lib/tools/operation-contract.d.ts +8 -0
  50. package/lib/tools/operation-contract.js +37 -0
  51. package/lib/tools/operations.d.ts +3 -0
  52. package/lib/tools/operations.js +154 -0
  53. package/lib/tools/registry.d.ts +6 -2
  54. package/lib/tools/registry.js +71 -23
  55. package/package.json +23 -1
  56. package/plugin.json +1 -1
  57. package/plugins/kiln-engine/.claude-plugin/icon.png +0 -0
  58. package/plugins/kiln-engine/.claude-plugin/plugin.json +9 -3
  59. package/plugins/kiln-engine/PRIVACY.md +100 -0
  60. package/plugins/kiln-engine/README.md +103 -18
  61. package/plugins/kiln-engine/{scripts/setup-workspace.mjs → bin/kiln-setup-workspace.mjs} +37 -9
  62. package/plugins/kiln-engine/package-provenance.json +15 -8
  63. package/plugins/kiln-engine/plugin.json +10 -4
  64. package/plugins/kiln-engine/runtime.json +10 -1
  65. package/plugins/kiln-engine/skills/kiln-setup-workspace/SKILL.md +17 -18
  66. package/plugins/kiln-engine/skills/kiln-setup-workspace/references/plugin-install.md +28 -8
  67. package/plugins/kiln-engine/skills/kiln-setup-workspace/references/renderer-setup.md +11 -0
  68. package/scripts/create-workspace.mjs +71 -13
  69. package/scripts/workspace-config.mjs +239 -0
  70. package/scripts/workspace-project.mjs +384 -0
  71. package/scripts/workspace-transaction.mjs +504 -0
  72. package/skills/kiln-setup-workspace/SKILL.md +17 -18
  73. package/skills/kiln-setup-workspace/references/plugin-install.md +28 -8
  74. package/skills/kiln-setup-workspace/references/renderer-setup.md +11 -0
  75. package/src/cli-render-mode.ts +9 -9
  76. package/src/cli.ts +3 -3
  77. package/src/discovery/index.ts +2 -0
  78. package/src/discovery/portable.ts +9 -0
  79. package/src/discovery/service.ts +3 -1
  80. package/src/engine-identity.ts +1 -1
  81. package/src/evaluator/isolation.ts +27 -6
  82. package/src/evaluator/probe-invariants.ts +50 -0
  83. package/src/evaluator/probe-worker.ts +22 -4
  84. package/src/mcp-core.ts +3 -0
  85. package/src/mcp-engine.ts +11 -1
  86. package/src/mcp.ts +5 -0
  87. package/src/render-service-host.ts +1 -1
  88. package/src/tools/discovery.ts +20 -10
  89. package/src/tools/materials.ts +59 -15
  90. package/src/tools/operation-contract.ts +51 -0
  91. package/src/tools/operations.ts +177 -0
  92. package/src/tools/registry.ts +100 -20
@@ -13,6 +13,7 @@ import { createKilnMaterialDef } from "./materials.js";
13
13
  import { createKilnReviewDef } from "./review.js";
14
14
  import { withWorkspaceContext } from "./workspace.js";
15
15
  import { describeInputError } from "./actions.js";
16
+ import { projectOperationDefs } from "./operations.js";
16
17
  import { advancedCaptureInput, cameraShotInput, cameraShotRecordInput, cameraVec3Input, captureInput, captureRecordInput, } from "./capture-input.js";
17
18
  import { compactEditResult, compactReviewResult, partsHint, requestedDetail, reviewDetailInput, } from "./review-detail.js";
18
19
  import { createCachedEvaluatorPort, MemoryBuildCache } from "../build-cache.js";
@@ -1605,22 +1606,25 @@ const rendererInput = z.strictObject({
1605
1606
  action: z.enum(['status', 'reprobe']).default('status'),
1606
1607
  });
1607
1608
  /** A saved-revision read whose failure names the listing call instead of a filesystem path (rule 9). */
1608
- async function readSavedRevision(target, collection, assetId, revisionId) {
1609
+ async function readSavedRevision(target, collection, assetId, revisionId, listCall = `kiln_assets { action: 'list', collection: '${collection}' }`) {
1609
1610
  try {
1610
1611
  return await target.read(collection, assetId, revisionId);
1611
1612
  }
1612
1613
  catch (error) {
1613
1614
  if (error.code === 'ENOENT')
1614
- throw new Error(`Unknown asset ${assetId} revision ${revisionId} in collection ${collection}. kiln_assets { action: 'list', collection: '${collection}' } lists the saved revisions.`);
1615
+ throw new Error(`Unknown asset ${assetId} revision ${revisionId} in collection ${collection}. ${listCall} lists the saved revisions.`);
1615
1616
  throw error;
1616
1617
  }
1617
1618
  }
1618
1619
  export function createKilnProgramToolRegistry(suppliedContext = {}) {
1620
+ return createProgramDefs(suppliedContext, 'grouped');
1621
+ }
1622
+ function createProgramDefs(suppliedContext, presentation) {
1619
1623
  toolRequirements(suppliedContext);
1620
1624
  const store = suppliedContext.programStore ?? new MemoryProgramStore();
1621
1625
  const context = withCaptureCache(withBuildCache({ ...suppliedContext, programStore: store }));
1622
1626
  return [
1623
- createKilnDiscoveryDef({ ...suppliedContext, programStore: store }),
1627
+ createKilnDiscoveryDef({ ...suppliedContext, programStore: store }, presentation),
1624
1628
  {
1625
1629
  name: 'kiln_renderer',
1626
1630
  description: 'Inspect status, or reprobe after renderer setup/repair to refresh this session and reset failed starts. Never installs, starts, stops or renders. Preserves CPU/local/remote selection; environment/credential changes require a host restart. Read viewFidelity after rendering.',
@@ -1665,7 +1669,9 @@ export function createKilnProgramToolRegistry(suppliedContext = {}) {
1665
1669
  ...(context.projectStore
1666
1670
  ? [createKilnProjectDef(context.projectStore, context.projectBundleReader)]
1667
1671
  : []),
1668
- ...(context.materialLibrary ? [createKilnMaterialDef(context.materialLibrary)] : []),
1672
+ ...(context.materialLibrary
1673
+ ? [createKilnMaterialDef(context.materialLibrary, presentation)]
1674
+ : []),
1669
1675
  ...(context.reviewStore && context.assetLibrary
1670
1676
  ? [
1671
1677
  createKilnReviewDef({
@@ -1675,7 +1681,7 @@ export function createKilnProgramToolRegistry(suppliedContext = {}) {
1675
1681
  }),
1676
1682
  ]
1677
1683
  : []),
1678
- ...createKilnAssetDefs({ ...context, programStore: store }),
1684
+ ...createKilnAssetDefs({ ...context, programStore: store }, presentation),
1679
1685
  ]
1680
1686
  .map((def) => withWorkspaceContext(def, context))
1681
1687
  .map((def) => ({
@@ -1689,6 +1695,10 @@ export function createKilnProgramToolRegistry(suppliedContext = {}) {
1689
1695
  },
1690
1696
  }));
1691
1697
  }
1698
+ /** Opt-in named domain operations; grouped local/native contracts remain unchanged. */
1699
+ export function createKilnOperationToolRegistry(context = {}) {
1700
+ return projectOperationDefs(createProgramDefs(context, 'operations'), context);
1701
+ }
1692
1702
  /** Canonical native workflow: shared definitions plus one host-owned terminal. */
1693
1703
  export function createKilnNativeToolRegistry(suppliedContext, completion) {
1694
1704
  const active = toolRequirements(suppliedContext);
@@ -1772,15 +1782,42 @@ const assetSelector = {
1772
1782
  assetId: z.string().regex(/^[a-z][a-z0-9_-]{0,79}$/),
1773
1783
  revisionId: z.string().regex(/^[a-z][a-z0-9_-]{0,79}$/),
1774
1784
  };
1785
+ const ASSET_CONTRACT = {
1786
+ collections: {
1787
+ fields: [],
1788
+ required: [],
1789
+ description: 'List configured asset storage collections. Collection is not project membership.',
1790
+ },
1791
+ catalog: {
1792
+ fields: ['assetId', 'query', 'offset', 'limit'],
1793
+ required: [],
1794
+ description: 'Search saved assets across configured collections with pagination.',
1795
+ },
1796
+ list: {
1797
+ fields: ['collection', 'assetId', 'query', 'offset', 'limit'],
1798
+ required: [],
1799
+ description: 'Search saved assets in one collection with pagination.',
1800
+ },
1801
+ get: {
1802
+ fields: ['collection', 'assetId', 'revisionId'],
1803
+ required: ['assetId'],
1804
+ description: 'Read a saved revision and its download descriptors. Omit revisionId for the newest revision.',
1805
+ },
1806
+ restore: {
1807
+ fields: ['collection', 'assetId', 'revisionId'],
1808
+ required: ['assetId'],
1809
+ description: 'Restore exact saved source as programRef for editing or rendering. Omit revisionId for the newest revision. Does not overwrite the saved revision. Binary-only assets have no source.',
1810
+ },
1811
+ };
1775
1812
  /**
1776
1813
  * The revision a get or restore without `revisionId` means: the newest, the
1777
1814
  * one no later revision names as its parent, ties to the latest `createdAt`
1778
1815
  * (c40 of 1 October 2026 called get with the asset id alone and was refused).
1779
1816
  */
1780
- export async function newestRevision(target, collection, assetId) {
1817
+ export async function newestRevision(target, collection, assetId, listCall = `kiln_assets { action: 'list', collection: '${collection}' }`) {
1781
1818
  const revisions = (await target.list(collection)).filter((a) => a.assetId === assetId);
1782
1819
  if (!revisions.length)
1783
- throw new Error(`Unknown asset ${assetId} in ${collection}; kiln_assets { action: 'list', collection: '${collection}' } lists them.`);
1820
+ throw new Error(`Unknown asset ${assetId} in ${collection}; ${listCall} lists them.`);
1784
1821
  const parents = new Set(revisions.map((a) => a.parentRevision).filter(Boolean));
1785
1822
  const heads = revisions.filter((a) => !parents.has(a.revisionId));
1786
1823
  const newest = (heads.length ? heads : revisions).sort((a, b) => a.createdAt < b.createdAt ? 1 : a.createdAt > b.createdAt ? -1 : 0);
@@ -1857,7 +1894,16 @@ export async function buildProgramAssetDraft(code, context, backdrop) {
1857
1894
  };
1858
1895
  }
1859
1896
  /** All asset operation schemas live here, alongside the existing tool definitions. */
1860
- export function createKilnAssetDefs(context) {
1897
+ export function createKilnAssetDefs(context, presentation = 'grouped') {
1898
+ const listCall = (collection) => presentation === 'operations'
1899
+ ? `kiln_assets_search({ collection: '${collection}' })`
1900
+ : `kiln_assets { action: 'list', collection: '${collection}' }`;
1901
+ const selector = presentation === 'operations'
1902
+ ? {
1903
+ ...assetSelector,
1904
+ collection: assetSelector.collection.describe('Collection ID from kiln_assets_collections; default project.'),
1905
+ }
1906
+ : assetSelector;
1861
1907
  const library = () => {
1862
1908
  if (!context.assetLibrary)
1863
1909
  throw new Error('No asset library configured. The local CLI/MCP host supplies workspace collections; embedded hosts must inject assetLibrary.');
@@ -1886,11 +1932,11 @@ export function createKilnAssetDefs(context) {
1886
1932
  downloadUrls: await context.assetDownloadUrls?.(collection, asset.assetId, asset.revisionId),
1887
1933
  });
1888
1934
  const saveInput = z.object({
1889
- collection: assetSelector.collection,
1935
+ collection: selector.collection,
1890
1936
  programRef: z.string(),
1891
1937
  name: z.string().min(1).max(200),
1892
- assetId: assetSelector.assetId.optional(),
1893
- parentRevision: assetSelector.revisionId.optional(),
1938
+ assetId: selector.assetId.optional(),
1939
+ parentRevision: selector.revisionId.optional(),
1894
1940
  tags: z.array(z.string().max(80)).max(30).optional(),
1895
1941
  brief: z.string().max(8000).optional(),
1896
1942
  description: z.string().max(4000).optional(),
@@ -1908,16 +1954,16 @@ export function createKilnAssetDefs(context) {
1908
1954
  });
1909
1955
  const assetsInput = z.object({
1910
1956
  action: z.enum(['collections', 'catalog', 'list', 'get', 'restore']).default('list'),
1911
- collection: assetSelector.collection,
1912
- assetId: assetSelector.assetId.optional(),
1913
- revisionId: assetSelector.revisionId
1957
+ collection: selector.collection,
1958
+ assetId: selector.assetId.optional(),
1959
+ revisionId: selector.revisionId
1914
1960
  .optional()
1915
1961
  .describe('get, restore: the saved revision; omitted, the newest.'),
1916
1962
  query: z.string().max(200).optional(),
1917
1963
  offset: z.number().int().min(0).default(0),
1918
1964
  limit: z.number().int().min(1).max(50).default(20),
1919
1965
  });
1920
- const exportInput = z.object(assetSelector);
1966
+ const exportInput = z.object(selector);
1921
1967
  const profileExportInput = exportInput.extend({
1922
1968
  profile: z
1923
1969
  .enum(['editable', 'runtime'])
@@ -1925,8 +1971,8 @@ export function createKilnAssetDefs(context) {
1925
1971
  .describe('editable preserves canonical source/GLB/build resources. runtime returns a standalone GLB and versioned review-metadata sidecar; no source bundle or geometry optimization.'),
1926
1972
  });
1927
1973
  const importInput = z.object({
1928
- ...assetSelector,
1929
- sourceCollection: assetSelector.collection,
1974
+ ...selector,
1975
+ sourceCollection: selector.collection,
1930
1976
  });
1931
1977
  return [
1932
1978
  {
@@ -1942,7 +1988,7 @@ export function createKilnAssetDefs(context) {
1942
1988
  requirements: activeRequirements.binding,
1943
1989
  };
1944
1990
  if (input.assetId && input.parentRevision) {
1945
- const previous = await readSavedRevision(target, input.collection, input.assetId, input.parentRevision);
1991
+ const previous = await readSavedRevision(target, input.collection, input.assetId, input.parentRevision, listCall(input.collection));
1946
1992
  assertSavedRequirementsAuthorized(previous.manifest, activeRequirements);
1947
1993
  }
1948
1994
  const code = await context.programStore.get(input.programRef);
@@ -1957,6 +2003,7 @@ export function createKilnAssetDefs(context) {
1957
2003
  name: 'kiln_assets',
1958
2004
  description: 'Browse saved assets: collections discovers storage; catalog searches all configured collections; list searches one. Both searches paginate. get returns a build record/downloads; restore loads exact source for kiln_source/kiln_edit. Collection is not project membership. Binary-only assets cannot restore source.',
1959
2005
  inputSchema: assetsInput,
2006
+ actionContract: ASSET_CONTRACT,
1960
2007
  run: async (raw) => {
1961
2008
  const input = assetsInput.parse(raw);
1962
2009
  const activeRequirements = toolRequirements(context);
@@ -2005,10 +2052,11 @@ export function createKilnAssetDefs(context) {
2005
2052
  })),
2006
2053
  };
2007
2054
  }
2008
- if (!input.assetId)
2055
+ if (ASSET_CONTRACT[input.action].required.some((field) => !input[field]))
2009
2056
  throw new Error(`kiln_assets ${input.action} requires assetId; kiln_assets { action: 'list', collection: '${input.collection}' } lists them.`);
2010
- const revisionId = input.revisionId ?? (await newestRevision(target, input.collection, input.assetId));
2011
- const record = await readSavedRevision(target, input.collection, input.assetId, revisionId);
2057
+ const revisionId = input.revisionId ??
2058
+ (await newestRevision(target, input.collection, input.assetId, listCall(input.collection)));
2059
+ const record = await readSavedRevision(target, input.collection, input.assetId, revisionId, listCall(input.collection));
2012
2060
  if (input.action === 'get')
2013
2061
  return links(input.collection, record.manifest);
2014
2062
  const saved = assertSavedRequirementsAuthorized(record.manifest, activeRequirements);
@@ -2080,7 +2128,7 @@ export function createKilnAssetDefs(context) {
2080
2128
  inputSchema: profileExportInput,
2081
2129
  run: async (raw) => {
2082
2130
  const input = profileExportInput.parse(raw);
2083
- const record = await readSavedRevision(library(), input.collection, input.assetId, input.revisionId);
2131
+ const record = await readSavedRevision(library(), input.collection, input.assetId, input.revisionId, listCall(input.collection));
2084
2132
  const { inspectDrawDiagnostics } = await import("../draw-diagnostics.js");
2085
2133
  if (input.profile === 'runtime') {
2086
2134
  const output = await (await import("../asset-export.js")).exportAssetGlb(record, {
@@ -2114,7 +2162,7 @@ export function createKilnAssetDefs(context) {
2114
2162
  run: async (raw) => {
2115
2163
  const input = importInput.parse(raw);
2116
2164
  const target = library();
2117
- const record = await readSavedRevision(target, input.sourceCollection, input.assetId, input.revisionId);
2165
+ const record = await readSavedRevision(target, input.sourceCollection, input.assetId, input.revisionId, listCall(input.sourceCollection));
2118
2166
  await target.import(input.collection, [record]);
2119
2167
  return links(input.collection, record.manifest);
2120
2168
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instruktlabs/kiln",
3
- "version": "1.0.0",
3
+ "version": "1.2.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",
@@ -280,6 +299,7 @@
280
299
  "docs/runtime.md",
281
300
  "docs/sdk.md",
282
301
  "docs/tools.md",
302
+ "docs/tools-operations.md",
283
303
  "README.md",
284
304
  "CONTRIBUTING.md",
285
305
  "LICENSE",
@@ -327,10 +347,12 @@
327
347
  "acorn": "^8.18.0",
328
348
  "acorn-walk": "^8.3.5",
329
349
  "gltf-validator": "2.0.0-dev.3.10",
350
+ "jsonc-parser": "3.3.1",
330
351
  "manifold-3d": "^3.5.4",
331
352
  "minisearch": "7.2.0",
332
353
  "pngjs": "7.0.0",
333
354
  "sharp": "^0.35.5",
355
+ "smol-toml": "1.9.0",
334
356
  "three": "0.186.1",
335
357
  "three-subdivide": "1.1.5",
336
358
  "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.2.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.2.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.2.0, maintained by Instrukt Labs under the MIT license.
4
+ This plugin pins engine 1.2.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.2.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)