@punal_manalan/blender-project-harness 0.0.0-stage → 1.0.2

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 (91) hide show
  1. package/.kilo/agent/blender-grader.md +197 -0
  2. package/.kilo/agent/blender-worker.md +127 -0
  3. package/.kilo/blender-project-harness/config.example.json +71 -0
  4. package/.kilo/blender-project-harness/tools/harness/EXPECTED_FLOW.md +656 -0
  5. package/.kilo/blender-project-harness/tools/harness/blender-operations.mjs +882 -0
  6. package/.kilo/blender-project-harness/tools/harness/blender-operations.test.mjs +550 -0
  7. package/.kilo/blender-project-harness/tools/harness/blender.mjs +301 -0
  8. package/.kilo/blender-project-harness/tools/harness/blender.test.mjs +87 -0
  9. package/.kilo/blender-project-harness/tools/harness/cli.mjs +127 -0
  10. package/.kilo/blender-project-harness/tools/harness/documents.mjs +201 -0
  11. package/.kilo/blender-project-harness/tools/harness/download.mjs +94 -0
  12. package/.kilo/blender-project-harness/tools/harness/download.test.mjs +63 -0
  13. package/.kilo/blender-project-harness/tools/harness/engine.mjs +1866 -0
  14. package/.kilo/blender-project-harness/tools/harness/engine.test.mjs +2219 -0
  15. package/.kilo/blender-project-harness/tools/harness/intake.mjs +571 -0
  16. package/.kilo/blender-project-harness/tools/harness/intake.test.mjs +181 -0
  17. package/.kilo/blender-project-harness/tools/harness/package-lock.json +1227 -0
  18. package/.kilo/blender-project-harness/tools/harness/package.json +15 -0
  19. package/.kilo/blender-project-harness/tools/harness/plugin.mjs +550 -0
  20. package/.kilo/blender-project-harness/tools/harness/plugin.test.mjs +526 -0
  21. package/.kilo/blender-project-harness/tools/harness/proxy.mjs +222 -0
  22. package/.kilo/blender-project-harness/tools/harness/proxy.test.mjs +217 -0
  23. package/.kilo/blender-project-harness/tools/harness/scaffold.mjs +83 -0
  24. package/.kilo/blender-project-harness/tools/harness/scaffold.test.mjs +74 -0
  25. package/.kilo/blender-project-harness/tools/harness/server.mjs +24 -0
  26. package/.kilo/blender-project-harness/tools/harness/shell-policy.mjs +196 -0
  27. package/.kilo/blender-project-harness/tools/harness/shell-policy.test.mjs +68 -0
  28. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/ASSETS.md +29 -0
  29. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/DECISIONS.md +8 -0
  30. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/Goals/01-project-brief.md +71 -0
  31. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/Goals/README.md +17 -0
  32. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/INTAKE.md +8 -0
  33. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/README.md +57 -0
  34. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/REQUIREMENTS.md +64 -0
  35. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/REVIEW.md +29 -0
  36. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/References/README.md +18 -0
  37. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/Reviews/README.md +48 -0
  38. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/TASKSTRACKER.md +10 -0
  39. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/Tasks/README.md +4 -0
  40. package/.kilo/blender-project-harness/tools/harness/templates/project/Documents/WORKFLOW.md +36 -0
  41. package/.kilo/blender-project-harness/tools/harness/templates/project/README.md +130 -0
  42. package/.kilo/blender-project-harness/tools/harness/templates/project/assets/README.md +31 -0
  43. package/.kilo/blender-project-harness/tools/harness/templates/project/assets/audio/.gitkeep +0 -0
  44. package/.kilo/blender-project-harness/tools/harness/templates/project/assets/external/README.md +43 -0
  45. package/.kilo/blender-project-harness/tools/harness/templates/project/assets/external/SOURCE_TEMPLATE.md +18 -0
  46. package/.kilo/blender-project-harness/tools/harness/templates/project/assets/hdri/.gitkeep +0 -0
  47. package/.kilo/blender-project-harness/tools/harness/templates/project/assets/models/.gitkeep +0 -0
  48. package/.kilo/blender-project-harness/tools/harness/templates/project/assets/textures/.gitkeep +0 -0
  49. package/.kilo/blender-project-harness/tools/harness/templates/project/backups/.gitkeep +0 -0
  50. package/.kilo/blender-project-harness/tools/harness/templates/project/backups/README.md +5 -0
  51. package/.kilo/blender-project-harness/tools/harness/templates/project/exports/.gitkeep +0 -0
  52. package/.kilo/blender-project-harness/tools/harness/templates/project/exports/README.md +11 -0
  53. package/.kilo/blender-project-harness/tools/harness/templates/project/renders/README.md +7 -0
  54. package/.kilo/blender-project-harness/tools/harness/templates/project/renders/final/.gitkeep +0 -0
  55. package/.kilo/blender-project-harness/tools/harness/templates/project/renders/wip/.gitkeep +0 -0
  56. package/.kilo/blender-project-harness/tools/harness/templates/project/scenes/README.md +10 -0
  57. package/.kilo/blender-project-harness/tools/harness/templates/project/scripts/README.md +16 -0
  58. package/.kilo/blender-project-harness/tools/harness/test-fixture.mjs +91 -0
  59. package/.kilo/blender-project-harness/tools/harness/workspace.mjs +30 -0
  60. package/.kilo/blender-project-harness/tools/harness/workspace.test.mjs +31 -0
  61. package/.kilo/blender-project-harness/tools/test_blender_tools.py +427 -0
  62. package/.kilo/plugins/blender-workflow.js +3 -0
  63. package/.kilo/skills/blender-assets/SKILL.md +99 -0
  64. package/.kilo/skills/blender-mcp/SKILL.md +147 -0
  65. package/.kilo/skills/blender-mcp/references/README.md +22 -0
  66. package/.kilo/skills/blender-mcp/references/animation.md +83 -0
  67. package/.kilo/skills/blender-mcp/references/bpy.md +97 -0
  68. package/.kilo/skills/blender-mcp/references/level-design.md +53 -0
  69. package/.kilo/skills/blender-mcp/references/materials.md +80 -0
  70. package/.kilo/skills/blender-mcp/references/retopology.md +104 -0
  71. package/.kilo/skills/blender-mcp/references/rigging.md +123 -0
  72. package/.kilo/skills/blender-mcp/references/scene.md +72 -0
  73. package/.kilo/skills/blender-project-goal/SKILL.md +115 -0
  74. package/.kilo/skills/blender-project-grading/SKILL.md +184 -0
  75. package/.kilo/skills/blender-project-readme/SKILL.md +46 -0
  76. package/.kilo/skills/blender-project-requirements/SKILL.md +84 -0
  77. package/.kilo/skills/blender-project-scaffold/SKILL.md +59 -0
  78. package/.kilo/skills/blender-project-workflow/SKILL.md +96 -0
  79. package/.kilo/skills/blender-subagents/SKILL.md +204 -0
  80. package/.kilo/skills/blender-workflow-harness/SKILL.md +187 -0
  81. package/AGENTS.md +234 -0
  82. package/Blender/README.md +30 -0
  83. package/CHANGELOG.md +22 -0
  84. package/LICENSE +21 -0
  85. package/README.md +368 -2
  86. package/THIRD_PARTY_NOTICES.md +51 -0
  87. package/bin/blender-project-harness.mjs +4 -0
  88. package/installer/cli.mjs +116 -0
  89. package/installer/install.mjs +325 -0
  90. package/installer/install.test.mjs +134 -0
  91. package/package.json +58 -6
package/README.md CHANGED
@@ -1,3 +1,369 @@
1
- # Temporary Holding Version
1
+ <h1 align="center">Blender Project Harness</h1>
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ <p align="center">
4
+ <strong>A guarded, evidence-driven Blender production workflow for Kilo.</strong><br>
5
+ Requirements, bounded scene changes, worker tickets, sealed evidence, independent graders, and clean project history.
6
+ </p>
7
+
8
+ <p align="center">
9
+ <a href="https://github.com/punal100/blender-project-harness/releases"><img alt="GitHub release" src="https://img.shields.io/github/v/release/punal100/blender-project-harness?display_name=tag&sort=semver"></a>
10
+ <a href="https://www.npmjs.com/package/@punal_manalan/blender-project-harness"><img alt="npm" src="https://img.shields.io/badge/npm-1.0.2-CB3837?logo=npm&logoColor=white"></a>
11
+ <a href="https://github.com/punal100/blender-project-harness/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/punal100/blender-project-harness"></a>
12
+ <img alt="Node" src="https://img.shields.io/badge/node-%3E%3D22-brightgreen">
13
+ <img alt="Blender" src="https://img.shields.io/badge/Blender-5.2-orange">
14
+ <img alt="MCP for Blender" src="https://img.shields.io/badge/MCP%20for%20Blender-2.2.6-blueviolet">
15
+ <a href="https://github.com/punal100/blender-project-harness/issues"><img alt="Issues" src="https://img.shields.io/github/issues/punal100/blender-project-harness"></a>
16
+ <a href="https://github.com/punal100/blender-project-harness/pulls"><img alt="PRs welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen"></a>
17
+ </p>
18
+
19
+ <p align="center">
20
+ <a href="#why">Why</a> |
21
+ <a href="#features">Features</a> |
22
+ <a href="#install">Install</a> |
23
+ <a href="#quick-start">Quick start</a> |
24
+ <a href="#how-it-works">How it works</a> |
25
+ <a href="#safety-model">Safety</a> |
26
+ <a href="#tests">Tests</a> |
27
+ <a href="#star-history">Star history</a>
28
+ </p>
29
+
30
+ ---
31
+
32
+ ## Why
33
+
34
+ Blender projects are easy to start and hard to keep honest. A scene can look right in the viewport while the geometry, topology, assets, exports, and project history are wrong. A long agent session can also lose track of what changed, what was reviewed, and what is safe to commit.
35
+
36
+ Blender Project Harness makes the workflow explicit:
37
+
38
+ - requirements are confirmed before work starts;
39
+ - scene edits are bounded by object names, paths, and declared scenes;
40
+ - a worker executes one ticketed apply batch at a time;
41
+ - visual evidence is inspected, not assumed;
42
+ - the final scene, renders, facts, manifest, and evidence key are sealed;
43
+ - independent graders review frozen evidence;
44
+ - project commits and checkpoints are harness-owned;
45
+ - assets, licences, and exports are verified before completion.
46
+
47
+ The user stays in plain language. The harness handles the production contract.
48
+
49
+ ---
50
+
51
+ ## Features
52
+
53
+ | Area | What you get |
54
+ |---|---|
55
+ | Guarded lifecycle | Registration, goals, bounded changes, tickets, WIP renders, seals, reviews, and checkpoints |
56
+ | Single writer | One Blender instance and one apply writer at a time; parallel read-only inspection is allowed |
57
+ | Exact scope | Object names, project-relative paths, declared scenes, requirements, and milestones |
58
+ | Evidence contract | Saved scene hash, per-scene renders, camera evidence, scene facts, manifest, and evidence key |
59
+ | Geometry checks | Dimensions, transforms, materials, topology, non-manifold edges, boundary edges, and loose vertices |
60
+ | Independent grading | Visual, technical, and spec graders with primary and backup models |
61
+ | Review modes | Off, Single, and All |
62
+ | Autonomy modes | Fully Autonomous and Partially Autonomous |
63
+ | Asset governance | Intake, hashes, MIME, dimensions, source, licence, sidecars, and strict asset checks |
64
+ | Multi-scene support | Declared scenes, duplicate/link semantics, per-scene evidence, and a master Video Sequencer scene |
65
+ | Export receipts | Format, path, bytes, SHA-256, source scene, and signature verification |
66
+ | Kilo integration | MCP routing, plugin permissions, goal state, skills, and subagent delegation |
67
+ | Installer | Versioned install, config preservation, dependency install, and automatic backups |
68
+ | Documentation | Setup guide, expected-flow reference, project templates, and contract tests |
69
+
70
+ ---
71
+
72
+ ## Architecture
73
+
74
+ ```mermaid
75
+ flowchart LR
76
+ U[User] --> K[Kilo]
77
+ K --> H[Blender Project Harness]
78
+ H --> T[Apply ticket]
79
+ T --> W[Worker]
80
+ W --> B[Blender]
81
+ B --> S[Saved scene]
82
+ S --> E[Sealed evidence]
83
+ E --> G[Visual, technical, spec graders]
84
+ G --> R[Review verdict]
85
+ R --> C[Commit and checkpoint]
86
+ C --> D[Completion]
87
+ ```
88
+
89
+ The harness is the only writer of workflow state. Workers execute assigned tickets. Graders read sealed evidence and write only their own reports.
90
+
91
+ ---
92
+
93
+ ## Install
94
+
95
+ ### Requirements
96
+
97
+ | Requirement | Version / notes |
98
+ |---|---|
99
+ | Blender | 5.2 is the current tested baseline; the MCP addon requires 3.0+ |
100
+ | MCP for Blender | Pinned `mcp-for-blender==2.2.6` |
101
+ | Node.js | 22 or newer |
102
+ | npm | Bundled with Node.js |
103
+ | uv / uvx | Required for the Blender MCP addon |
104
+ | Kilo | VS Code extension or CLI |
105
+
106
+ Install the Blender addon:
107
+
108
+ ```powershell
109
+ uvx --from mcp-for-blender==2.2.6 mcp-for-blender install-addon
110
+ ```
111
+
112
+ Enable **Interface: MCP for Blender** under **Edit > Preferences > Add-ons**, then restart Blender.
113
+
114
+ ### From npm
115
+
116
+ ```powershell
117
+ npx @punal_manalan/blender-project-harness@latest install
118
+ ```
119
+
120
+ The 1.0.2 package is the current release. If the registry does not have it yet, use the release
121
+ tarball or a source checkout below.
122
+
123
+ ### From the release tarball
124
+
125
+ ```powershell
126
+ npm install --save-dev https://github.com/punal100/blender-project-harness/releases/download/v1.0.2/punal_manalan-blender-project-harness-1.0.2.tgz
127
+ npx blender-project-harness install
128
+ ```
129
+
130
+ ### From source
131
+
132
+ ```powershell
133
+ git clone https://github.com/punal100/blender-project-harness.git
134
+ Set-Location blender-project-harness
135
+ npm ci --prefix .kilo/blender-project-harness/tools/harness
136
+ npm run doctor --prefix .kilo/blender-project-harness/tools/harness
137
+ ```
138
+
139
+ ### What the installer does
140
+
141
+ - Copies the harness into `.kilo/blender-project-harness/tools/`.
142
+ - Writes `VERSION`, `install.json`, `config.json`, and a copy of the package `AGENTS.md`.
143
+ - Runs `npm ci` for the installed harness.
144
+ - Updates `.kilo/kilo.jsonc` and `.kilo/plugins/blender-workflow.js`.
145
+ - Adds missing `AGENTS.md`, `.kilo/skills/`, `.kilo/agent/`, and `Blender/README.md`.
146
+ - Adds the local config and backups to `.gitignore`.
147
+
148
+ Run the same command to update. The previous installation is moved to:
149
+
150
+ ```text
151
+ .temp/blender-project-harness-backups/<version>-<timestamp>/
152
+ ```
153
+
154
+ The old copy is preserved, not deleted. The new version keeps `config.json` unless you pass
155
+ `--reset-config`. The package `AGENTS.md` is always available at
156
+ `.kilo/blender-project-harness/AGENTS.md`; the root `AGENTS.md` is only installed when missing and is
157
+ never overwritten.
158
+
159
+ ---
160
+
161
+ ## Quick start
162
+
163
+ Open the workspace in Kilo and describe the project. Include the subject, style, key objects, camera
164
+ and lighting preferences, dimensions, deliverables, and whether external files or paid media
165
+ generation are allowed.
166
+
167
+ ```text
168
+ Create a small cozy retro computer room. Use warm lamp light, a cool window accent, a desk with a
169
+ CRT monitor, keyboard, mug, chair, rug, and wall decor. Make one hero camera view and save the scene
170
+ inside a new Blender project.
171
+ ```
172
+
173
+ The agent then:
174
+
175
+ 1. Confirms requirements and asks for the workflow mode: **Fully Autonomous** or **Partially
176
+ Autonomous**.
177
+ 2. Asks for the review mode: **Off**, **Single**, or **All**.
178
+ 3. Scaffolds the project, fills its records, registers it, and starts the goal.
179
+ 4. Launches Blender through the harness and saves the bootstrap scene.
180
+ 5. Builds the project in bounded changes using worker apply tickets.
181
+ 6. Renders and inspects WIP evidence, then seals a review round.
182
+ 7. Dispatches the configured graders and aggregates their reports.
183
+ 8. Commits the scoped change, checkpoints the project, and reports the result.
184
+
185
+ ---
186
+
187
+ ## How it works
188
+
189
+ ```text
190
+ status and capabilities
191
+ -> requirements confirmation
192
+ -> workflow and review mode selection
193
+ -> scaffold, documents, registration, and goal
194
+ -> bounded scene change
195
+ -> apply ticket and worker execution
196
+ -> save and WIP render
197
+ -> finalize and seal
198
+ -> independent graders
199
+ -> review verdict
200
+ -> scoped commit and checkpoint
201
+ -> completion
202
+ ```
203
+
204
+ ### Bounded changes
205
+
206
+ - One observable outcome per change.
207
+ - Exact object names and project-relative paths.
208
+ - Declared scenes for multi-scene work.
209
+ - Requirement and milestone scoping.
210
+ - One open change per project.
211
+ - Apply batches up to ten operations.
212
+ - Ticket expiry and change-window recovery.
213
+ - Worker-only apply execution.
214
+
215
+ ### Sealed evidence
216
+
217
+ A sealed round captures:
218
+
219
+ - the saved `.blend` hash;
220
+ - per-scene renders;
221
+ - camera evidence;
222
+ - scene facts including dimensions and topology;
223
+ - a manifest with every evidence hash;
224
+ - a reproducible evidence key;
225
+ - a review round folder;
226
+ - the strict asset-check receipt when assets were used.
227
+
228
+ Graders must cite the same scene hash and evidence key. Missing evidence or tooling problems produce
229
+ `BLOCKED`, not a pass.
230
+
231
+ ### Review modes
232
+
233
+ | Mode | Behavior |
234
+ |---|---|
235
+ | Off | Self-review only |
236
+ | Single | One configured grader |
237
+ | All | Every configured grader, up to `max_parallel` |
238
+
239
+ Every worker and grader has a primary and backup provider/model/reasoning variant. A missing or
240
+ disabled grader is a tooling failure, not a silent pass.
241
+
242
+ ### Assets and exports
243
+
244
+ - User-supplied files enter through guarded `intake`.
245
+ - Downloads stage public HTTPS assets only; they do not import or register automatically.
246
+ - Generated media is agent-owned and requires permission before credits are spent.
247
+ - External assets require `SOURCE.md` and `LICENSE.txt`.
248
+ - Non-redistributable binaries stay out of Git.
249
+ - Strict `check_assets` must pass on the final unchanged scene.
250
+ - Exports receive a verified receipt with format, path, bytes, SHA-256, source scene, and signature.
251
+
252
+ ---
253
+
254
+ ## Safety model
255
+
256
+ | Guarantee | Behavior |
257
+ |---|---|
258
+ | One Blender instance | The workspace runs one guarded instance at a time |
259
+ | One writer | Apply operations execute through one worker at a time |
260
+ | Bounded edits | Every scene change has exact names, paths, and declared scenes |
261
+ | No raw Python | Arbitrary Blender Python and project Python execution are blocked |
262
+ | No manual project Git | Project commits go through the harness |
263
+ | No silent pass | Missing evidence and grader failures produce `BLOCKED` |
264
+ | No fake assets | Generated or downloaded files must be inspected, registered, and licensed |
265
+ | No hidden exports | Every export needs a verified receipt |
266
+ | No frozen-record edits | Registration changes require explicit re-registration |
267
+
268
+ ---
269
+
270
+ ## Configuration
271
+
272
+ Worker and grader configuration lives at:
273
+
274
+ ```text
275
+ .kilo/blender-project-harness/config.json
276
+ ```
277
+
278
+ The tracked template is:
279
+
280
+ ```text
281
+ .kilo/blender-project-harness/config.example.json
282
+ ```
283
+
284
+ Review and autonomy modes are frozen at registration. Changing them requires explicit
285
+ re-registration, not an in-place edit.
286
+
287
+ ---
288
+
289
+ ## Tests
290
+
291
+ ```powershell
292
+ npm run test:installer
293
+ npm test --prefix .kilo/blender-project-harness/tools/harness
294
+ python -B -m unittest discover -s .kilo/blender-project-harness/tools -p "test_*.py" -v
295
+ ```
296
+
297
+ The Node suite is comprehensive and can take several minutes on Windows. Use `npm run pack:check` to
298
+ inspect the npm package contents without publishing.
299
+
300
+ Current release checks:
301
+
302
+ - Installer tests: `6/6` passing.
303
+ - Python harness contract tests: `21` passing with `112` subtests.
304
+ - Targeted engine, plugin, shell-policy, and workspace tests: passing.
305
+ - Doctor: passing.
306
+ - npm package: `91` files, no `node_modules`, no local `config.json`.
307
+
308
+ ---
309
+
310
+ ## What's in the repo
311
+
312
+ ```text
313
+ AGENTS.md Internal agent contract and workflow rules
314
+ README.md This human setup and usage guide
315
+ package.json npm package metadata and installer entry point
316
+ bin/ npm installer executable
317
+ installer/ Versioned installer, update, and backup logic
318
+ .kilo/ Workspace Kilo config, skills, agents, and plugin
319
+ .kilo/blender-project-harness/
320
+ Harness, config, and version records
321
+ .kilo/blender-project-harness/config.example.json
322
+ Default worker and grader configuration
323
+ .kilo/blender-project-harness/config.json
324
+ Local worker and grader configuration (ignored)
325
+ .kilo/blender-project-harness/tools/harness/
326
+ Guarded Node.js workflow, MCP bridge, and harness tests
327
+ .kilo/blender-project-harness/tools/harness/EXPECTED_FLOW.md
328
+ Developer reference for the expected lifecycle and evidence
329
+ Blender/ Blender project collection
330
+ Commands/ Approved non-project shell-command records
331
+ ```
332
+
333
+ [`Blender/README.md`](Blender/README.md) covers the project-collection conventions. The generic
334
+ harness lifecycle and evidence contract are documented in
335
+ [`.kilo/blender-project-harness/tools/harness/EXPECTED_FLOW.md`](.kilo/blender-project-harness/tools/harness/EXPECTED_FLOW.md).
336
+ Licensing lives in [`LICENSE`](LICENSE) and [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md).
337
+
338
+ ---
339
+
340
+ ## Star history
341
+
342
+ <a href="https://www.star-history.com/#punal100/blender-project-harness&Date">
343
+ <picture>
344
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=punal100/blender-project-harness&type=Date&theme=dark">
345
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=punal100/blender-project-harness&type=Date">
346
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=punal100/blender-project-harness&type=Date">
347
+ </picture>
348
+ </a>
349
+
350
+ Star history is provided by [star-history.com](https://www.star-history.com/).
351
+
352
+ ---
353
+
354
+ ## Known limits
355
+
356
+ - No arbitrary Blender Python execution.
357
+ - No browser or authentication bypass.
358
+ - No automatic licence acceptance.
359
+ - Media generation is agent-owned; the harness intakes and records the result.
360
+ - Multi-scene, media-generation, and export paths are implemented, but the current live acceptance
361
+ run is a single scene. Verify those paths in the project where they are used.
362
+ - One live Blender instance and one writer at a time; parallel read-only inspection is allowed.
363
+ - Windows is the primary documented setup environment.
364
+
365
+ ---
366
+
367
+ ## License
368
+
369
+ MIT. See [`LICENSE`](LICENSE).
@@ -0,0 +1,51 @@
1
+ # Third-party notices
2
+
3
+ ## MCP for Blender workflow guides
4
+
5
+ The files in `.kilo/skills/blender-mcp/references/` are adapted from the workflow
6
+ guides shipped with [ahujasid/mcp-for-blender](https://github.com/ahujasid/mcp-for-blender)
7
+ (`src/blender_mcp/guides/`) and are used under the MIT License.
8
+
9
+ Adapted files:
10
+
11
+ - `animation.md`
12
+ - `bpy.md`
13
+ - `level-design.md`
14
+ - `materials.md`
15
+ - `retopology.md`
16
+ - `rigging.md`
17
+ - `scene.md`
18
+
19
+ Local changes: version-specific API corrections, safety and approval wording,
20
+ neutral examples (reference values are not project requirements), source links,
21
+ and workspace-specific guidance. Git history records each change.
22
+
23
+ ### Upstream license
24
+
25
+ MIT License
26
+
27
+ Copyright (c) 2025 Siddharth Ahuja
28
+
29
+ Permission is hereby granted, free of charge, to any person obtaining a copy
30
+ of this software and associated documentation files (the "Software"), to deal
31
+ in the Software without restriction, including without limitation the rights
32
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
33
+ copies of the Software, and to permit persons to whom the Software is
34
+ furnished to do so, subject to the following conditions:
35
+
36
+ The above copyright notice and this permission notice shall be included in all
37
+ copies or substantial portions of the Software.
38
+
39
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
40
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
41
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
42
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
43
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
44
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
45
+ SOFTWARE.
46
+
47
+ ## Blender
48
+
49
+ Blender is a trademark of the Blender Foundation. This project is an unaided
50
+ workspace and tooling template; it is not affiliated with or endorsed by the
51
+ Blender Foundation or the mcp-for-blender project.
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { main } from '../installer/cli.mjs';
3
+
4
+ await main(process.argv.slice(2));
@@ -0,0 +1,116 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { install, status, INSTALL_RELATIVE, PACKAGE_NAME } from './install.mjs';
6
+
7
+ const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
8
+ const packageJson = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
9
+
10
+ function usage() {
11
+ return [
12
+ `${PACKAGE_NAME} ${packageJson.version}`,
13
+ '',
14
+ 'Usage:',
15
+ ' npx @punal_manalan/blender-project-harness [install] [options]',
16
+ ' npx @punal_manalan/blender-project-harness status [--root <path>] [--json]',
17
+ ' npx @punal_manalan/blender-project-harness doctor [--root <path>]',
18
+ '',
19
+ 'Options:',
20
+ ' --root <path> Workspace root (default: current directory)',
21
+ ' --force Reinstall the current version',
22
+ ' --dry-run Show what would change without writing',
23
+ ' --skip-deps Do not run npm ci in the installed harness',
24
+ ' --reset-config Replace the installed config with the package example',
25
+ ' --json Print machine-readable output',
26
+ ' --version Print the package version',
27
+ ' --help Show this help',
28
+ '',
29
+ 'The harness is installed under .kilo/blender-project-harness.',
30
+ 'An existing installation is moved to .temp/blender-project-harness-backups.',
31
+ ].join('\n');
32
+ }
33
+
34
+ function parse(argv) {
35
+ const known = new Set(['install', 'status', 'doctor', 'help']);
36
+ const command = known.has(argv[0]) ? argv.shift() : 'install';
37
+ const options = { root: process.cwd(), force: false, dryRun: false, skipDeps: false, resetConfig: false, json: false };
38
+ for (let index = 0; index < argv.length; index += 1) {
39
+ const token = argv[index];
40
+ if (token === '--root') {
41
+ const value = argv[index + 1];
42
+ if (!value || value.startsWith('--')) throw new Error('missing value for --root');
43
+ options.root = path.resolve(value);
44
+ index += 1;
45
+ } else if (token === '--force') options.force = true;
46
+ else if (token === '--dry-run') options.dryRun = true;
47
+ else if (token === '--skip-deps' || token === '--no-deps') options.skipDeps = true;
48
+ else if (token === '--reset-config') options.resetConfig = true;
49
+ else if (token === '--json') options.json = true;
50
+ else if (token === '--help' || token === '-h') options.help = true;
51
+ else if (token === '--version' || token === '-v') options.version = true;
52
+ else throw new Error(`unknown option: ${token}`);
53
+ }
54
+ return { command, options };
55
+ }
56
+
57
+ function humanInstall(result) {
58
+ if (result.status === 'current') {
59
+ return `${PACKAGE_NAME} ${result.version} is already installed at ${INSTALL_RELATIVE}. Use --force to reinstall.`;
60
+ }
61
+ const lines = [
62
+ `${result.status === 'updated' ? 'Updated' : 'Installed'} ${PACKAGE_NAME} ${result.version}`,
63
+ `Location: ${path.relative(result.root, result.installDir).replaceAll('\\', '/')}`,
64
+ `Dependencies: ${result.dependencies}`,
65
+ ];
66
+ if (result.backup) lines.push(`Backup: ${result.backup}`);
67
+ if (result.written?.length) lines.push(`Updated: ${result.written.join(', ')}`);
68
+ if (result.actions?.length) lines.push(`Created: ${result.actions.join(', ')}`);
69
+ if (result.warnings?.length) lines.push(...result.warnings.map((warning) => `Warning: ${warning}`));
70
+ return lines.join('\n');
71
+ }
72
+
73
+ async function main(argv) {
74
+ try {
75
+ const { command, options } = parse([...argv]);
76
+ if (options.help || command === 'help') {
77
+ process.stdout.write(`${usage()}\n`);
78
+ return;
79
+ }
80
+ if (options.version) {
81
+ process.stdout.write(`${packageJson.version}\n`);
82
+ return;
83
+ }
84
+ if (command === 'status') {
85
+ const result = status({ root: options.root });
86
+ process.stdout.write(options.json ? `${JSON.stringify(result, null, 2)}\n`
87
+ : result.installed
88
+ ? `${PACKAGE_NAME} ${result.version} installed at ${path.relative(result.root, result.installDir).replaceAll('\\', '/')}\n`
89
+ : `${PACKAGE_NAME} is not installed under ${INSTALL_RELATIVE}\n`);
90
+ return;
91
+ }
92
+ if (command === 'doctor') {
93
+ const cli = path.join(options.root, INSTALL_RELATIVE, 'tools', 'harness', 'cli.mjs');
94
+ if (!fs.existsSync(cli)) throw new Error(`harness is not installed at ${INSTALL_RELATIVE}; run install first`);
95
+ const result = spawnSync(process.execPath, [cli, 'doctor'], { cwd: options.root, stdio: 'inherit', windowsHide: false });
96
+ if (result.error) throw result.error;
97
+ process.exitCode = result.status ?? 1;
98
+ return;
99
+ }
100
+ const result = install({
101
+ root: options.root,
102
+ packageRoot,
103
+ version: packageJson.version,
104
+ force: options.force,
105
+ dryRun: options.dryRun,
106
+ skipDeps: options.skipDeps,
107
+ resetConfig: options.resetConfig,
108
+ });
109
+ process.stdout.write(options.json || options.dryRun ? `${JSON.stringify(result, null, 2)}\n` : `${humanInstall(result)}\n`);
110
+ } catch (error) {
111
+ process.stderr.write(`${PACKAGE_NAME}: ${error.message}\n`);
112
+ process.exitCode = 1;
113
+ }
114
+ }
115
+
116
+ export { main };