nccgs 2.1.0 → 3.0.0-rc.1

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 (683) hide show
  1. package/CHANGELOG.md +66 -197
  2. package/LICENSE +1 -1
  3. package/README.md +65 -174
  4. package/THIRD_PARTY_NOTICES.md +6 -34
  5. package/bin/nccgs.mjs +86 -0
  6. package/cli/doctor.mjs +82 -0
  7. package/cli/install.mjs +111 -0
  8. package/cli/release.mjs +59 -0
  9. package/cli/run.mjs +35 -0
  10. package/cli/spawn.mjs +20 -0
  11. package/cli/uninstall.mjs +43 -0
  12. package/cli/update-check.mjs +66 -0
  13. package/docs/EVIDENCE-VERIFICATION.md +22 -0
  14. package/package.json +22 -30
  15. package/runtime/core/fs.mjs +80 -0
  16. package/runtime/core/job-object.mjs +73 -0
  17. package/runtime/core/modes.mjs +87 -0
  18. package/runtime/core/process-tree.mjs +109 -0
  19. package/runtime/core/project.mjs +107 -0
  20. package/runtime/core/snapshot.mjs +114 -0
  21. package/runtime/hooks/common.mjs +19 -0
  22. package/runtime/hooks/done-guard.mjs +15 -0
  23. package/runtime/hooks/guard-mcp.mjs +8 -0
  24. package/runtime/hooks/guard-shell.mjs +16 -0
  25. package/runtime/hooks/guard-write.mjs +25 -0
  26. package/runtime/hooks/session-log.mjs +7 -0
  27. package/runtime/hooks/session-start.mjs +32 -0
  28. package/runtime/hooks/unity-transport.mjs +12 -0
  29. package/runtime/modes.json +39 -0
  30. package/runtime/task/cost.mjs +103 -0
  31. package/runtime/task/criteria.mjs +128 -0
  32. package/runtime/task/ledger.mjs +109 -0
  33. package/runtime/task/plan.mjs +69 -0
  34. package/runtime/task/project.mjs +79 -0
  35. package/runtime/task/report.mjs +252 -0
  36. package/runtime/task/task.mjs +232 -0
  37. package/runtime/unity/assets.mjs +51 -0
  38. package/runtime/unity/playtest.mjs +145 -0
  39. package/runtime/unity/unity.mjs +343 -0
  40. package/scripts/check-job-object.mjs +18 -0
  41. package/scripts/sync-unity-skills.mjs +35 -119
  42. package/template/CLAUDE.md +39 -0
  43. package/template/agents/fast-fix.md +9 -0
  44. package/template/agents/implementer.md +19 -0
  45. package/template/agents/playtester.md +15 -0
  46. package/template/agents/reviewer.md +19 -0
  47. package/template/agents/scout.md +9 -0
  48. package/template/ponytail/README.md +8 -0
  49. package/{.claude/nccgs/packages → template}/ponytail/engineering.md +10 -0
  50. package/template/protocols/evidence.md +52 -0
  51. package/template/protocols/playtest.md +45 -0
  52. package/template/protocols/review.md +34 -0
  53. package/template/protocols/unity-cli-notes.md +56 -0
  54. package/template/settings.fragment.json +33 -0
  55. package/template/skills/art-bible/SKILL.md +19 -0
  56. package/template/skills/asset-spec/SKILL.md +19 -0
  57. package/template/skills/brainstorm/SKILL.md +17 -0
  58. package/template/skills/map-systems/SKILL.md +25 -0
  59. package/template/skills/playtest/SKILL.md +17 -0
  60. package/template/skills/status/SKILL.md +18 -0
  61. package/template/skills/test/SKILL.md +34 -0
  62. package/template/skills/unity-foundation/SKILL.md +17 -0
  63. package/template/skills/vertical-slice/SKILL.md +17 -0
  64. package/template/skills/work/SKILL.md +65 -0
  65. package/unity-skills/2d-pixel-perfect/SKILL.md +208 -0
  66. package/unity-skills/2d-pixel-perfect/references/api-reference.md +81 -0
  67. package/unity-skills/2d-pixel-perfect/references/camera-setup-builtin.cs +40 -0
  68. package/unity-skills/2d-pixel-perfect/references/camera-setup-urp.cs +49 -0
  69. package/unity-skills/2d-pixel-perfect/references/pipeline-detection.cs +50 -0
  70. package/unity-skills/2d-pixel-perfect/references/sprite-settings.cs +37 -0
  71. package/unity-skills/asset-transformer-toolkit/SECURITY.md +15 -0
  72. package/unity-skills/asset-transformer-toolkit/SKILL.md +39 -0
  73. package/unity-skills/asset-transformer-toolkit/references/create-importer.md +121 -0
  74. package/unity-skills/asset-transformer-toolkit/references/lods.md +61 -0
  75. package/unity-skills/asset-transformer-toolkit/references/rule-api.md +154 -0
  76. package/unity-skills/asset-transformer-toolkit/references/ruleblock-api.md +37 -0
  77. package/unity-skills/asset-transformer-toolkit/references/ruleset-api.md +138 -0
  78. package/unity-skills/asset-transformer-toolkit/references/rulesets-and-actions.md +227 -0
  79. package/unity-skills/audio-setup-mixers/SECURITY.md +16 -0
  80. package/unity-skills/audio-setup-mixers/SKILL.md +127 -0
  81. package/unity-skills/audio-setup-mixers/references/api.md +162 -0
  82. package/unity-skills/build-gtk/SKILL.md +242 -0
  83. package/unity-skills/build-gtk/references/graph-api.md +324 -0
  84. package/unity-skills/build-gtk/references/pitfalls.md +86 -0
  85. package/unity-skills/build-gtk/references/runtime-and-visualization.md +196 -0
  86. package/unity-skills/build-gtk/references/state-machine-api.md +286 -0
  87. package/unity-skills/build-live-game/SKILL.md +255 -0
  88. package/{.claude/skills → unity-skills}/build-live-game/references/achievements.md +132 -154
  89. package/{.claude/skills → unity-skills}/build-live-game/references/apis.md +10 -19
  90. package/{.claude/skills → unity-skills}/build-live-game/references/authentication.md +14 -20
  91. package/{.claude/skills → unity-skills}/build-live-game/references/battlepass.md +269 -225
  92. package/unity-skills/build-live-game/references/blueprints-and-samples.md +75 -0
  93. package/unity-skills/build-live-game/references/cloud-code-cloudbehaviours.md +1111 -0
  94. package/unity-skills/build-live-game/references/cloud-code-modules.md +1276 -0
  95. package/unity-skills/build-live-game/references/cloud-code.md +58 -0
  96. package/{.claude/skills → unity-skills}/build-live-game/references/cloud-save.md +15 -25
  97. package/{.claude/skills → unity-skills}/build-live-game/references/deployment.md +33 -18
  98. package/{.claude/skills → unity-skills}/build-live-game/references/player-account.md +31 -23
  99. package/{.claude/skills → unity-skills}/build-live-game/references/tooling.md +0 -56
  100. package/unity-skills/build-live-game/references/ugs-cli.md +86 -0
  101. package/unity-skills/craft-game-floors/SECURITY.md +23 -0
  102. package/unity-skills/craft-game-floors/SKILL.md +134 -0
  103. package/unity-skills/craft-game-floors/references/art-direction.md +85 -0
  104. package/unity-skills/craft-game-floors/references/camera-rigs.md +51 -0
  105. package/unity-skills/craft-game-floors/references/character-motion.md +35 -0
  106. package/unity-skills/craft-game-floors/references/game-audio.md +47 -0
  107. package/unity-skills/craft-game-floors/references/game-feel.md +68 -0
  108. package/unity-skills/craft-game-floors/references/game-shell.md +45 -0
  109. package/unity-skills/craft-game-floors/references/live-floor.md +35 -0
  110. package/unity-skills/craft-game-floors/references/placeholder-assets.md +35 -0
  111. package/unity-skills/craft-game-floors/references/scene-lighting.md +52 -0
  112. package/unity-skills/craft-game-floors/references/toon-shading.md +34 -0
  113. package/unity-skills/craft-game-floors/references/vfx.md +40 -0
  114. package/unity-skills/craft-game-floors/references/visual-scorecard.md +43 -0
  115. package/unity-skills/create-2d-physics/SECURITY.md +16 -0
  116. package/unity-skills/create-2d-physics/SKILL.md +128 -0
  117. package/unity-skills/create-2d-physics/references/2d-physics-core.md +155 -0
  118. package/unity-skills/create-2d-physics/references/legacy-2d-physics.md +45 -0
  119. package/unity-skills/create-tile-palette-or-rule-tiles/SKILL.md +12 -0
  120. package/unity-skills/create-tile-palette-or-rule-tiles/references/hexagonalruletile.md +71 -0
  121. package/unity-skills/create-tile-palette-or-rule-tiles/references/palette-create.md +38 -0
  122. package/unity-skills/create-tile-palette-or-rule-tiles/references/ruletile-createempty.md +35 -0
  123. package/unity-skills/create-tile-palette-or-rule-tiles/references/ruletile-createfromsegment.md +212 -0
  124. package/unity-skills/create-tile-palette-or-rule-tiles/references/ruletile.md +90 -0
  125. package/unity-skills/create-tile-palette-or-rule-tiles/scripts/CreatePaletteTemplate.cs +148 -0
  126. package/unity-skills/create-tile-palette-or-rule-tiles/scripts/ManualWorkflowExample.cs +63 -0
  127. package/unity-skills/create-tile-palette-or-rule-tiles/scripts/RuleTileGenerator.cs +61 -0
  128. package/unity-skills/create-tile-palette-or-rule-tiles/scripts/TilemapRuleTileCreateFromSegment.cs +225 -0
  129. package/unity-skills/generate-editor-search-query/SECURITY.md +17 -0
  130. package/unity-skills/generate-editor-search-query/SKILL.md +117 -0
  131. package/unity-skills/generate-editor-search-query/references/open-search-window.md +70 -0
  132. package/unity-skills/generate-editor-search-query/references/query-patterns.md +124 -0
  133. package/{.claude/skills → unity-skills}/implement-in-app-purchases/SKILL.md +1 -2
  134. package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/api-notes.md +25 -28
  135. package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/path-convert-native-google-billing.md +1 -1
  136. package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/path-implement-iap-d2c.md +40 -5
  137. package/{.claude/skills → unity-skills}/initialize-ai-navigation/SKILL.md +4 -4
  138. package/{.claude/skills → unity-skills}/initialize-ai-navigation/references/navigation-system.md +3 -3
  139. package/{.claude/skills → unity-skills}/levelplay-unity-integration/CHANGELOG.md +12 -0
  140. package/{.claude/skills → unity-skills}/levelplay-unity-integration/README.md +9 -5
  141. package/unity-skills/levelplay-unity-integration/SKILL.md +442 -0
  142. package/{.claude/skills → unity-skills}/levelplay-unity-integration/references/banner-api.md +15 -8
  143. package/{.claude/skills → unity-skills}/levelplay-unity-integration/references/best-practices.md +604 -536
  144. package/unity-skills/levelplay-unity-integration/references/dependency-resolution.md +94 -0
  145. package/{.claude/skills → unity-skills}/levelplay-unity-integration/references/ilrd-api.md +2 -2
  146. package/{.claude/skills → unity-skills}/levelplay-unity-integration/references/initialization-api.md +221 -0
  147. package/{.claude/skills → unity-skills}/levelplay-unity-integration/references/interstitial-api.md +11 -3
  148. package/{.claude/skills → unity-skills}/levelplay-unity-integration/references/ios-setup.md +6 -34
  149. package/{.claude/skills → unity-skills}/levelplay-unity-integration/references/migration-sdk-9.md +1 -1
  150. package/{.claude/skills → unity-skills}/levelplay-unity-integration/references/privacy-settings.md +14 -29
  151. package/{.claude/skills → unity-skills}/levelplay-unity-integration/references/rewarded-api.md +20 -4
  152. package/unity-skills/levelplay-unity-integration/references/testing-and-validation.md +222 -0
  153. package/unity-skills/levelplay-unity-integration/references/troubleshooting.md +99 -0
  154. package/unity-skills/localization/SKILL.md +347 -0
  155. package/{.claude/skills → unity-skills}/localization/references/api-notes.md +4 -0
  156. package/unity-skills/localization/resources/L10nBatchProcessor.cs +191 -0
  157. package/unity-skills/manage-sprite-atlas/SKILL.md +351 -0
  158. package/unity-skills/manage-sprite-atlas/references/addressables-delivery.md +58 -0
  159. package/unity-skills/manage-sprite-atlas/references/api.md +382 -0
  160. package/unity-skills/manage-sprite-atlas/references/best-practices.md +183 -0
  161. package/unity-skills/manage-sprite-atlas/references/common-errors.md +123 -0
  162. package/unity-skills/manage-sprite-atlas/references/custom-packing.md +147 -0
  163. package/unity-skills/manage-sprite-atlas/references/manual-authoring.md +39 -0
  164. package/unity-skills/manage-sprite-atlas/resources/authoringvsruntime.cs +176 -0
  165. package/unity-skills/manage-sprite-atlas/resources/buildaddressablespostprocess.cs +59 -0
  166. package/unity-skills/manage-sprite-atlas/resources/cacheloadedatlases.cs +145 -0
  167. package/unity-skills/manage-sprite-atlas/resources/cleanupbatchoperations.cs +119 -0
  168. package/unity-skills/manage-sprite-atlas/resources/createandconfiguremasteratlas.cs +57 -0
  169. package/unity-skills/manage-sprite-atlas/resources/custompackersetup.cs +88 -0
  170. package/unity-skills/manage-sprite-atlas/resources/deprecatedmethods.cs +142 -0
  171. package/unity-skills/manage-sprite-atlas/resources/dontmodifywithoutsaving.cs +120 -0
  172. package/unity-skills/manage-sprite-atlas/resources/dontpackinruntimebuilds.cs +190 -0
  173. package/unity-skills/manage-sprite-atlas/resources/dontscriptspriteatlasineditor.cs +114 -0
  174. package/unity-skills/manage-sprite-atlas/resources/editorconfiguration.cs +95 -0
  175. package/unity-skills/manage-sprite-atlas/resources/enablespritepacking.cs +172 -0
  176. package/unity-skills/manage-sprite-atlas/resources/gridspritepacker.cs +50 -0
  177. package/unity-skills/manage-sprite-atlas/resources/handlelatebinding.cs +147 -0
  178. package/unity-skills/manage-sprite-atlas/resources/handlenullcases.cs +141 -0
  179. package/unity-skills/manage-sprite-atlas/resources/migratev1tov2.cs +335 -0
  180. package/unity-skills/manage-sprite-atlas/resources/multipagepacker.cs +80 -0
  181. package/unity-skills/manage-sprite-atlas/resources/optimizetexturesettings.cs +191 -0
  182. package/unity-skills/manage-sprite-atlas/resources/packerdebugging.cs +158 -0
  183. package/unity-skills/manage-sprite-atlas/resources/packtransform.cs +51 -0
  184. package/unity-skills/manage-sprite-atlas/resources/platformnames.cs +127 -0
  185. package/unity-skills/manage-sprite-atlas/resources/queryspritesefficiently.cs +222 -0
  186. package/unity-skills/manage-sprite-atlas/resources/registercallbacks.cs +152 -0
  187. package/unity-skills/manage-sprite-atlas/resources/runtimeatlasloader.cs +15 -0
  188. package/unity-skills/manage-sprite-atlas/resources/runtimespriteaccess.cs +19 -0
  189. package/unity-skills/manage-sprite-atlas/resources/savespriteatlasasset.cs +107 -0
  190. package/unity-skills/manage-sprite-atlas/resources/scriptablepacker.cs +81 -0
  191. package/unity-skills/manage-sprite-atlas/resources/setincludeinbuild.cs +164 -0
  192. package/unity-skills/manage-sprite-atlas/resources/sizeoptimizedpacker.cs +88 -0
  193. package/unity-skills/manage-sprite-atlas/resources/spriteatlaslatebinding.cs +123 -0
  194. package/unity-skills/manage-sprite-atlas/resources/spriteatlasprebuildgenerator.cs +219 -0
  195. package/unity-skills/manage-sprite-atlas/resources/spritedata.cs +35 -0
  196. package/unity-skills/manage-sprite-atlas/resources/spritepack.cs +39 -0
  197. package/unity-skills/manage-sprite-atlas/resources/texturedata.cs +15 -0
  198. package/unity-skills/manage-sprite-atlas/resources/updatebuildscripts.cs +357 -0
  199. package/unity-skills/manage-sprite-atlas/resources/updatesettingsconfiguration.cs +135 -0
  200. package/unity-skills/manage-sprite-atlas/resources/usevariantswisely.cs +179 -0
  201. package/unity-skills/manage-sprite-atlas/resources/variantatlas.cs +39 -0
  202. package/unity-skills/manifest.json +1155 -0
  203. package/unity-skills/migrate-birp-to-urp/SECURITY.md +16 -0
  204. package/unity-skills/migrate-birp-to-urp/SKILL.md +543 -0
  205. package/unity-skills/migrate-birp-to-urp/references/capturing-the-editor.md +66 -0
  206. package/unity-skills/migrate-birp-to-urp/references/complex-shader-situations.md +272 -0
  207. package/unity-skills/migrate-birp-to-urp/references/custom-shader-triage.md +123 -0
  208. package/unity-skills/migrate-birp-to-urp/references/implementation-patterns.md +529 -0
  209. package/unity-skills/migrate-birp-to-urp/references/migration-workflow.md +265 -0
  210. package/unity-skills/migrate-birp-to-urp/references/quality-settings-map.md +69 -0
  211. package/unity-skills/new-unity-project/SECURITY.md +26 -0
  212. package/unity-skills/new-unity-project/SKILL.md +386 -0
  213. package/unity-skills/new-unity-project/references/skill-setup.md +66 -0
  214. package/unity-skills/optimize-audio/SECURITY.md +16 -0
  215. package/{.claude/skills → unity-skills}/optimize-audio/SKILL.md +17 -17
  216. package/{.claude/skills → unity-skills}/optimize-audio/resources/audio-import-api.md +8 -5
  217. package/{.claude/skills → unity-skills}/optimize-text-mesh-pro/SKILL.md +1 -11
  218. package/unity-skills/optimize-web/SECURITY.md +16 -0
  219. package/{.claude/skills → unity-skills}/optimize-web/SKILL.md +164 -27
  220. package/unity-skills/optimize-web/scripts/WebOptimizer.cs +46 -0
  221. package/unity-skills/optimize-web/scripts/toktx-examples.sh +11 -0
  222. package/{.claude/skills → unity-skills}/physics-3d-collision/SKILL.md +2 -2
  223. package/unity-skills/physics-3d-collision/references/troubleshooting.md +8 -0
  224. package/unity-skills/project-auditor-fixes/SKILL.md +64 -0
  225. package/{.claude/skills → unity-skills}/setup-multiplayer-services/SKILL.md +1 -4
  226. package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/SKILL.md +1 -1
  227. package/{.claude/skills → unity-skills}/shader-graph-create-custom-node/SKILL.md +1 -1
  228. package/unity-skills/sprite-editor/SECURITY.md +16 -0
  229. package/{.claude/skills → unity-skills}/sprite-editor/SKILL.md +9 -9
  230. package/{.claude/skills → unity-skills}/sprite-editor/references/templates.md +1 -1
  231. package/unity-skills/sprite-segment-3x3grid/SKILL.md +136 -0
  232. package/unity-skills/sprite-segment-3x3grid/scripts/SpriteGridAnalysis.cs +119 -0
  233. package/{.claude/skills → unity-skills}/ui/SKILL.md +1 -1
  234. package/{.claude/skills → unity-skills}/ui-imgui/SKILL.md +1 -7
  235. package/{.claude/skills → unity-skills}/ui-ugui/SKILL.md +3 -9
  236. package/{.claude/skills → unity-skills}/ui-uitk/SKILL.md +8 -14
  237. package/{.claude/skills → unity-skills}/ui-uitk/references/custom-elements.md +1 -1
  238. package/unity-skills/unity-cli/CHANGELOG.md +515 -0
  239. package/unity-skills/unity-cli/SECURITY.md +68 -0
  240. package/unity-skills/unity-cli/SKILL.md +723 -0
  241. package/unity-skills/unity-cli/references/auth-license-cloud.md +318 -0
  242. package/unity-skills/unity-cli/references/build-run-test.md +555 -0
  243. package/unity-skills/unity-cli/references/cloud-automation.md +736 -0
  244. package/{.claude/skills → unity-skills}/unity-cli/references/collaboration.md +166 -105
  245. package/unity-skills/unity-cli/references/config-hub.md +239 -0
  246. package/unity-skills/unity-cli/references/diagnostics-maintenance.md +720 -0
  247. package/unity-skills/unity-cli/references/docs-workflow.md +179 -0
  248. package/unity-skills/unity-cli/references/editors-install.md +476 -0
  249. package/unity-skills/unity-cli/references/integration-advanced.md +1130 -0
  250. package/unity-skills/unity-cli/references/playmode-verification-loop.md +279 -0
  251. package/unity-skills/unity-cli/references/projects-templates.md +996 -0
  252. package/unity-skills/unity-cli/references/version-control.md +612 -0
  253. package/{.claude/skills → unity-skills}/unity-package-management/SKILL.md +60 -12
  254. package/{.claude/skills → unity-skills}/unity-package-management/references/select-packages.md +39 -21
  255. package/unity-skills/unity-pipeline/SECURITY.md +17 -0
  256. package/unity-skills/unity-pipeline/SKILL.md +335 -0
  257. package/unity-skills/urp-postprocessing/SECURITY.md +16 -0
  258. package/{.claude/skills → unity-skills}/urp-postprocessing/SKILL.md +12 -12
  259. package/{.claude/skills → unity-skills}/urp-postprocessing/references/code-templates.md +39 -8
  260. package/{.claude/skills → unity-skills}/validate-urp-render-graph-renderer-feature/SKILL.md +1 -1
  261. package/.claude/agents/nccgs-adversarial-reviewer.md +0 -43
  262. package/.claude/agents/nccgs-engine-programmer.md +0 -27
  263. package/.claude/agents/nccgs-fast-implementer.md +0 -30
  264. package/.claude/agents/nccgs-game-designer.md +0 -26
  265. package/.claude/agents/nccgs-gameplay-programmer.md +0 -26
  266. package/.claude/agents/nccgs-qa-engineer.md +0 -27
  267. package/.claude/agents/nccgs-task-scout.md +0 -24
  268. package/.claude/agents/nccgs-ui-programmer.md +0 -27
  269. package/.claude/agents/nccgs-unity-build-specialist.md +0 -27
  270. package/.claude/agents/nccgs-unity-implementer.md +0 -28
  271. package/.claude/agents/nccgs-unity-systems-specialist.md +0 -27
  272. package/.claude/agents/nccgs-unity-ui-specialist.md +0 -27
  273. package/.claude/agents/nccgs-verification-engineer.md +0 -27
  274. package/.claude/nccgs/MEMORY.md +0 -64
  275. package/.claude/nccgs/THIRD_PARTY_NOTICES.md +0 -29
  276. package/.claude/nccgs/VERSION +0 -1
  277. package/.claude/nccgs/agent-library/nccgs-accessibility-specialist.md +0 -25
  278. package/.claude/nccgs/agent-library/nccgs-adversarial-reviewer.md +0 -41
  279. package/.claude/nccgs/agent-library/nccgs-ai-programmer.md +0 -25
  280. package/.claude/nccgs/agent-library/nccgs-analytics-engineer.md +0 -25
  281. package/.claude/nccgs/agent-library/nccgs-art-direction-lead.md +0 -25
  282. package/.claude/nccgs/agent-library/nccgs-audio-direction-lead.md +0 -25
  283. package/.claude/nccgs/agent-library/nccgs-creative-director.md +0 -25
  284. package/.claude/nccgs/agent-library/nccgs-documentation-manager.md +0 -25
  285. package/.claude/nccgs/agent-library/nccgs-economy-designer.md +0 -25
  286. package/.claude/nccgs/agent-library/nccgs-engine-programmer.md +0 -25
  287. package/.claude/nccgs/agent-library/nccgs-fast-implementer.md +0 -28
  288. package/.claude/nccgs/agent-library/nccgs-game-design-lead.md +0 -25
  289. package/.claude/nccgs/agent-library/nccgs-game-designer.md +0 -24
  290. package/.claude/nccgs/agent-library/nccgs-gameplay-programmer.md +0 -24
  291. package/.claude/nccgs/agent-library/nccgs-level-designer.md +0 -25
  292. package/.claude/nccgs/agent-library/nccgs-live-ops-designer.md +0 -25
  293. package/.claude/nccgs/agent-library/nccgs-localization-lead.md +0 -25
  294. package/.claude/nccgs/agent-library/nccgs-narrative-lead.md +0 -25
  295. package/.claude/nccgs/agent-library/nccgs-network-programmer.md +0 -25
  296. package/.claude/nccgs/agent-library/nccgs-performance-analyst.md +0 -25
  297. package/.claude/nccgs/agent-library/nccgs-producer.md +0 -25
  298. package/.claude/nccgs/agent-library/nccgs-production-coordinator.md +0 -22
  299. package/.claude/nccgs/agent-library/nccgs-programming-lead.md +0 -25
  300. package/.claude/nccgs/agent-library/nccgs-prototyper.md +0 -25
  301. package/.claude/nccgs/agent-library/nccgs-qa-engineer.md +0 -25
  302. package/.claude/nccgs/agent-library/nccgs-qa-lead.md +0 -25
  303. package/.claude/nccgs/agent-library/nccgs-release-engineer.md +0 -25
  304. package/.claude/nccgs/agent-library/nccgs-release-lead.md +0 -25
  305. package/.claude/nccgs/agent-library/nccgs-security-engineer.md +0 -25
  306. package/.claude/nccgs/agent-library/nccgs-sound-designer.md +0 -25
  307. package/.claude/nccgs/agent-library/nccgs-systems-designer.md +0 -25
  308. package/.claude/nccgs/agent-library/nccgs-task-scout.md +0 -22
  309. package/.claude/nccgs/agent-library/nccgs-technical-architect.md +0 -25
  310. package/.claude/nccgs/agent-library/nccgs-technical-artist.md +0 -25
  311. package/.claude/nccgs/agent-library/nccgs-technical-director.md +0 -25
  312. package/.claude/nccgs/agent-library/nccgs-tools-programmer.md +0 -25
  313. package/.claude/nccgs/agent-library/nccgs-ui-programmer.md +0 -25
  314. package/.claude/nccgs/agent-library/nccgs-unity-build-specialist.md +0 -25
  315. package/.claude/nccgs/agent-library/nccgs-unity-content-specialist.md +0 -25
  316. package/.claude/nccgs/agent-library/nccgs-unity-implementer.md +0 -26
  317. package/.claude/nccgs/agent-library/nccgs-unity-rendering-specialist.md +0 -25
  318. package/.claude/nccgs/agent-library/nccgs-unity-systems-specialist.md +0 -25
  319. package/.claude/nccgs/agent-library/nccgs-unity-ui-specialist.md +0 -25
  320. package/.claude/nccgs/agent-library/nccgs-ux-designer.md +0 -25
  321. package/.claude/nccgs/agent-library/nccgs-verification-engineer.md +0 -25
  322. package/.claude/nccgs/agent-library/nccgs-world-builder.md +0 -25
  323. package/.claude/nccgs/agent-library/nccgs-writer.md +0 -25
  324. package/.claude/nccgs/constitution.md +0 -176
  325. package/.claude/nccgs/hooks/agent-audit.mjs +0 -16
  326. package/.claude/nccgs/hooks/closure-guard.mjs +0 -57
  327. package/.claude/nccgs/hooks/common.mjs +0 -42
  328. package/.claude/nccgs/hooks/post-compact.mjs +0 -1
  329. package/.claude/nccgs/hooks/pre-compact.mjs +0 -8
  330. package/.claude/nccgs/hooks/protect-git.mjs +0 -22
  331. package/.claude/nccgs/hooks/protect-write.mjs +0 -17
  332. package/.claude/nccgs/hooks/runtime-observation.mjs +0 -11
  333. package/.claude/nccgs/hooks/session-start.mjs +0 -29
  334. package/.claude/nccgs/hooks/session-stop.mjs +0 -7
  335. package/.claude/nccgs/packages/ponytail/README.md +0 -46
  336. package/.claude/nccgs/packages/ponytail/manifest.json +0 -24
  337. package/.claude/nccgs/pipeline.json +0 -260
  338. package/.claude/nccgs/protocols/agent-contract.md +0 -101
  339. package/.claude/nccgs/protocols/astra-claude.md +0 -111
  340. package/.claude/nccgs/protocols/bounded-repair.md +0 -246
  341. package/.claude/nccgs/protocols/context-packets.md +0 -18
  342. package/.claude/nccgs/protocols/delivery-acceptance.md +0 -105
  343. package/.claude/nccgs/protocols/design-lifecycle.md +0 -139
  344. package/.claude/nccgs/protocols/editor-session-evidence.md +0 -52
  345. package/.claude/nccgs/protocols/evidence.md +0 -31
  346. package/.claude/nccgs/protocols/model-routing.md +0 -46
  347. package/.claude/nccgs/protocols/orchestration.md +0 -74
  348. package/.claude/nccgs/protocols/review-handoff.md +0 -81
  349. package/.claude/nccgs/protocols/standalone-gates.md +0 -329
  350. package/.claude/nccgs/protocols/standalone-pilot.md +0 -144
  351. package/.claude/nccgs/protocols/standalone.md +0 -207
  352. package/.claude/nccgs/protocols/task-autonomy.md +0 -55
  353. package/.claude/nccgs/protocols/task-gates.md +0 -144
  354. package/.claude/nccgs/protocols/task-slices.md +0 -106
  355. package/.claude/nccgs/protocols/unity-boundary.md +0 -11
  356. package/.claude/nccgs/routing.generated.md +0 -49
  357. package/.claude/nccgs/settings.fragment.json +0 -153
  358. package/.claude/nccgs/studio.json +0 -472
  359. package/.claude/nccgs/tools/approve-overrides.mjs +0 -81
  360. package/.claude/nccgs/tools/autonomy.mjs +0 -27
  361. package/.claude/nccgs/tools/command-process.mjs +0 -50
  362. package/.claude/nccgs/tools/compile-policy.mjs +0 -121
  363. package/.claude/nccgs/tools/configure-models.mjs +0 -96
  364. package/.claude/nccgs/tools/criteria.mjs +0 -121
  365. package/.claude/nccgs/tools/delivery-budget.mjs +0 -52
  366. package/.claude/nccgs/tools/design-readiness.mjs +0 -158
  367. package/.claude/nccgs/tools/editor-session-evidence.mjs +0 -66
  368. package/.claude/nccgs/tools/evidence.mjs +0 -153
  369. package/.claude/nccgs/tools/gates.mjs +0 -297
  370. package/.claude/nccgs/tools/handoff.mjs +0 -51
  371. package/.claude/nccgs/tools/inputs.mjs +0 -108
  372. package/.claude/nccgs/tools/installation-guard.mjs +0 -55
  373. package/.claude/nccgs/tools/integrity.mjs +0 -69
  374. package/.claude/nccgs/tools/lifecycle.mjs +0 -542
  375. package/.claude/nccgs/tools/native-completion.mjs +0 -21
  376. package/.claude/nccgs/tools/orchestration.mjs +0 -680
  377. package/.claude/nccgs/tools/paths.mjs +0 -60
  378. package/.claude/nccgs/tools/policy.mjs +0 -107
  379. package/.claude/nccgs/tools/process-lock.mjs +0 -74
  380. package/.claude/nccgs/tools/repair-packet.mjs +0 -106
  381. package/.claude/nccgs/tools/returned-handoff.mjs +0 -38
  382. package/.claude/nccgs/tools/review-budget.mjs +0 -171
  383. package/.claude/nccgs/tools/review-handoff.mjs +0 -66
  384. package/.claude/nccgs/tools/runtime.mjs +0 -71
  385. package/.claude/nccgs/tools/session-budget.mjs +0 -67
  386. package/.claude/nccgs/tools/task-slices.mjs +0 -147
  387. package/.claude/nccgs/tools/task.mjs +0 -145
  388. package/.claude/nccgs/tools/tool-guard.mjs +0 -131
  389. package/.claude/nccgs/tools/unity-repair.mjs +0 -128
  390. package/.claude/nccgs/tools/verification-jobs.mjs +0 -171
  391. package/.claude/nccgs/tools/verification-worker.mjs +0 -71
  392. package/.claude/nccgs/tools/windows-compiler-server.cs +0 -163
  393. package/.claude/nccgs/tools/windows-job.cs +0 -103
  394. package/.claude/nccgs/unity-skills-manifest.json +0 -727
  395. package/.claude/nccgs/workflow-catalog.json +0 -654
  396. package/.claude/rules/nccgs-canonical-docs.md +0 -19
  397. package/.claude/rules/nccgs-editor-tools.md +0 -12
  398. package/.claude/rules/nccgs-localization.md +0 -12
  399. package/.claude/rules/nccgs-networking.md +0 -13
  400. package/.claude/rules/nccgs-performance.md +0 -14
  401. package/.claude/rules/nccgs-rendering.md +0 -16
  402. package/.claude/rules/nccgs-security.md +0 -13
  403. package/.claude/rules/nccgs-tests.md +0 -18
  404. package/.claude/rules/nccgs-ui.md +0 -14
  405. package/.claude/rules/nccgs-unity-assets.md +0 -21
  406. package/.claude/rules/nccgs-unity-code.md +0 -22
  407. package/.claude/skills/accessibility-review/SKILL.md +0 -22
  408. package/.claude/skills/accessibility-review/references/astra.md +0 -17
  409. package/.claude/skills/accessibility-review/references/legacy.md +0 -7
  410. package/.claude/skills/architecture-decision/SKILL.md +0 -22
  411. package/.claude/skills/architecture-decision/references/astra.md +0 -12
  412. package/.claude/skills/architecture-decision/references/legacy.md +0 -7
  413. package/.claude/skills/asset-audit/SKILL.md +0 -22
  414. package/.claude/skills/asset-audit/references/astra.md +0 -17
  415. package/.claude/skills/asset-audit/references/legacy.md +0 -7
  416. package/.claude/skills/audit/SKILL.md +0 -22
  417. package/.claude/skills/audit/references/astra.md +0 -17
  418. package/.claude/skills/audit/references/dimensions.md +0 -46
  419. package/.claude/skills/audit/references/legacy.md +0 -9
  420. package/.claude/skills/balance-review/SKILL.md +0 -22
  421. package/.claude/skills/balance-review/references/astra.md +0 -17
  422. package/.claude/skills/balance-review/references/legacy.md +0 -7
  423. package/.claude/skills/bug-triage/SKILL.md +0 -22
  424. package/.claude/skills/bug-triage/references/astra.md +0 -27
  425. package/.claude/skills/bug-triage/references/legacy.md +0 -7
  426. package/.claude/skills/build-live-game/SKILL.md +0 -317
  427. package/.claude/skills/build-live-game/references/cloud-code.md +0 -563
  428. package/.claude/skills/closure/SKILL.md +0 -22
  429. package/.claude/skills/closure/references/astra.md +0 -15
  430. package/.claude/skills/closure/references/legacy.md +0 -7
  431. package/.claude/skills/compatibility-review/SKILL.md +0 -22
  432. package/.claude/skills/compatibility-review/references/astra.md +0 -17
  433. package/.claude/skills/compatibility-review/references/legacy.md +0 -7
  434. package/.claude/skills/context-pack/SKILL.md +0 -22
  435. package/.claude/skills/context-pack/references/astra.md +0 -12
  436. package/.claude/skills/context-pack/references/legacy.md +0 -7
  437. package/.claude/skills/dependency-review/SKILL.md +0 -22
  438. package/.claude/skills/dependency-review/references/astra.md +0 -17
  439. package/.claude/skills/dependency-review/references/legacy.md +0 -7
  440. package/.claude/skills/design/SKILL.md +0 -24
  441. package/.claude/skills/design/references/astra.md +0 -12
  442. package/.claude/skills/design/references/legacy.md +0 -13
  443. package/.claude/skills/design-review/SKILL.md +0 -24
  444. package/.claude/skills/design-review/references/astra.md +0 -17
  445. package/.claude/skills/design-review/references/legacy.md +0 -7
  446. package/.claude/skills/evidence-review/SKILL.md +0 -22
  447. package/.claude/skills/evidence-review/references/astra.md +0 -17
  448. package/.claude/skills/evidence-review/references/legacy.md +0 -7
  449. package/.claude/skills/hotfix/SKILL.md +0 -22
  450. package/.claude/skills/hotfix/references/astra.md +0 -30
  451. package/.claude/skills/hotfix/references/legacy.md +0 -7
  452. package/.claude/skills/incident-recovery/SKILL.md +0 -22
  453. package/.claude/skills/incident-recovery/references/astra.md +0 -27
  454. package/.claude/skills/incident-recovery/references/legacy.md +0 -7
  455. package/.claude/skills/levelplay-unity-integration/SKILL.md +0 -1126
  456. package/.claude/skills/localization/SKILL.md +0 -135
  457. package/.claude/skills/localization/resources/L10nBatchProcessor.cs +0 -69
  458. package/.claude/skills/localize-game/SKILL.md +0 -22
  459. package/.claude/skills/localize-game/references/astra.md +0 -27
  460. package/.claude/skills/localize-game/references/legacy.md +0 -7
  461. package/.claude/skills/migrate-project/SKILL.md +0 -22
  462. package/.claude/skills/migrate-project/references/astra.md +0 -30
  463. package/.claude/skills/migrate-project/references/legacy.md +0 -19
  464. package/.claude/skills/migrate-project/references/procedure.md +0 -96
  465. package/.claude/skills/milestone-review/SKILL.md +0 -22
  466. package/.claude/skills/milestone-review/references/astra.md +0 -12
  467. package/.claude/skills/milestone-review/references/legacy.md +0 -7
  468. package/.claude/skills/nccgs-code-review/SKILL.md +0 -22
  469. package/.claude/skills/nccgs-code-review/references/astra.md +0 -21
  470. package/.claude/skills/nccgs-code-review/references/legacy.md +0 -7
  471. package/.claude/skills/new-unity-project/SKILL.md +0 -179
  472. package/.claude/skills/performance-audit/SKILL.md +0 -22
  473. package/.claude/skills/performance-audit/references/astra.md +0 -17
  474. package/.claude/skills/performance-audit/references/legacy.md +0 -7
  475. package/.claude/skills/physics-3d-collision/references/troubleshooting.md +0 -41
  476. package/.claude/skills/plan-feature/SKILL.md +0 -22
  477. package/.claude/skills/plan-feature/references/astra.md +0 -12
  478. package/.claude/skills/plan-feature/references/legacy.md +0 -7
  479. package/.claude/skills/playtest/SKILL.md +0 -22
  480. package/.claude/skills/playtest/references/astra.md +0 -31
  481. package/.claude/skills/playtest/references/legacy.md +0 -7
  482. package/.claude/skills/project-stage/SKILL.md +0 -22
  483. package/.claude/skills/project-stage/references/astra.md +0 -12
  484. package/.claude/skills/project-stage/references/legacy.md +0 -7
  485. package/.claude/skills/prototype-feature/SKILL.md +0 -22
  486. package/.claude/skills/prototype-feature/references/astra.md +0 -31
  487. package/.claude/skills/prototype-feature/references/legacy.md +0 -7
  488. package/.claude/skills/qa-plan/SKILL.md +0 -22
  489. package/.claude/skills/qa-plan/references/astra.md +0 -12
  490. package/.claude/skills/qa-plan/references/legacy.md +0 -7
  491. package/.claude/skills/release/SKILL.md +0 -22
  492. package/.claude/skills/release/references/astra.md +0 -30
  493. package/.claude/skills/release/references/legacy.md +0 -11
  494. package/.claude/skills/release-readiness/SKILL.md +0 -22
  495. package/.claude/skills/release-readiness/references/astra.md +0 -17
  496. package/.claude/skills/release-readiness/references/legacy.md +0 -7
  497. package/.claude/skills/retrospective/SKILL.md +0 -22
  498. package/.claude/skills/retrospective/references/astra.md +0 -12
  499. package/.claude/skills/retrospective/references/legacy.md +0 -7
  500. package/.claude/skills/review/SKILL.md +0 -22
  501. package/.claude/skills/review/references/astra.md +0 -21
  502. package/.claude/skills/review/references/legacy.md +0 -9
  503. package/.claude/skills/security-audit/SKILL.md +0 -22
  504. package/.claude/skills/security-audit/references/astra.md +0 -17
  505. package/.claude/skills/security-audit/references/legacy.md +0 -7
  506. package/.claude/skills/sprint-plan/SKILL.md +0 -22
  507. package/.claude/skills/sprint-plan/references/astra.md +0 -12
  508. package/.claude/skills/sprint-plan/references/legacy.md +0 -7
  509. package/.claude/skills/status/SKILL.md +0 -22
  510. package/.claude/skills/status/references/astra.md +0 -19
  511. package/.claude/skills/status/references/legacy.md +0 -9
  512. package/.claude/skills/story-readiness/SKILL.md +0 -24
  513. package/.claude/skills/story-readiness/references/astra.md +0 -17
  514. package/.claude/skills/story-readiness/references/legacy.md +0 -7
  515. package/.claude/skills/test/SKILL.md +0 -22
  516. package/.claude/skills/test/references/astra.md +0 -27
  517. package/.claude/skills/test/references/legacy.md +0 -9
  518. package/.claude/skills/ui-review/SKILL.md +0 -22
  519. package/.claude/skills/ui-review/references/astra.md +0 -17
  520. package/.claude/skills/ui-review/references/legacy.md +0 -7
  521. package/.claude/skills/unity-cli/CHANGELOG.md +0 -233
  522. package/.claude/skills/unity-cli/SECURITY.md +0 -22
  523. package/.claude/skills/unity-cli/SKILL.md +0 -414
  524. package/.claude/skills/unity-cli/references/auth-license-cloud.md +0 -146
  525. package/.claude/skills/unity-cli/references/build-run-test.md +0 -349
  526. package/.claude/skills/unity-cli/references/config-hub.md +0 -103
  527. package/.claude/skills/unity-cli/references/diagnostics-maintenance.md +0 -326
  528. package/.claude/skills/unity-cli/references/editors-install.md +0 -327
  529. package/.claude/skills/unity-cli/references/integration-advanced.md +0 -472
  530. package/.claude/skills/unity-cli/references/projects-templates.md +0 -574
  531. package/.claude/skills/work/SKILL.md +0 -22
  532. package/.claude/skills/work/references/astra.md +0 -32
  533. package/.claude/skills/work/references/classification.md +0 -41
  534. package/.claude/skills/work/references/closure.md +0 -60
  535. package/.claude/skills/work/references/feature-contracts.md +0 -36
  536. package/.claude/skills/work/references/legacy.md +0 -29
  537. package/.claude/skills/work/references/verification.md +0 -26
  538. package/CLAUDE.md +0 -8
  539. package/MEMORY.md +0 -60
  540. package/UPGRADING.md +0 -118
  541. package/VERSION +0 -1
  542. package/docs/ARCHITECTURE.md +0 -131
  543. package/docs/BOUNDED-REPAIR.md +0 -80
  544. package/docs/EDITOR-SESSION-EVIDENCE.md +0 -52
  545. package/docs/HANDOFF-AUTOMATION.md +0 -144
  546. package/docs/HUONG-DAN-MIGRATE-VA-SU-DUNG.md +0 -116
  547. package/docs/MIGRATION-MATRIX.md +0 -23
  548. package/docs/NCCGS-1.3.md +0 -13
  549. package/docs/NCCGS-1.4.1.md +0 -149
  550. package/docs/NCCGS-1.4.md +0 -184
  551. package/docs/NCCGS-1.5-IMPLEMENTATION-PLAN.md +0 -378
  552. package/docs/NCCGS-1.5-PILOT.md +0 -130
  553. package/docs/NCCGS-1.5.md +0 -237
  554. package/docs/PHASE-1-OPERATIONS.md +0 -278
  555. package/docs/PHASE-2-OPERATIONS.md +0 -183
  556. package/docs/PROJECT-POLICY.md +0 -94
  557. package/docs/RELEASE-STATUS.md +0 -142
  558. package/docs/TASK-SLICING.md +0 -57
  559. package/docs/UNINSTALL.md +0 -134
  560. package/docs/UPGRADE-QUALIFICATION.md +0 -45
  561. package/docs/WORKFLOWS.md +0 -85
  562. package/package-assets/nccgs-project.gitignore +0 -2
  563. package/package-assets/setup-vivox-voice-chat-evals.gitignore +0 -7
  564. package/scaffold/.nccgs/autonomy.json +0 -4
  565. package/scaffold/.nccgs/bugs/.gitkeep +0 -1
  566. package/scaffold/.nccgs/closures/.gitkeep +0 -1
  567. package/scaffold/.nccgs/context/.gitkeep +0 -1
  568. package/scaffold/.nccgs/decisions/.gitkeep +0 -1
  569. package/scaffold/.nccgs/evidence/.gitkeep +0 -1
  570. package/scaffold/.nccgs/execution.json +0 -10
  571. package/scaffold/.nccgs/features/.gitkeep +0 -1
  572. package/scaffold/.nccgs/gates.json +0 -7
  573. package/scaffold/.nccgs/inputs.json +0 -6
  574. package/scaffold/.nccgs/migrations/.gitkeep +0 -1
  575. package/scaffold/.nccgs/playtests/.gitkeep +0 -1
  576. package/scaffold/.nccgs/project.yaml +0 -108
  577. package/scaffold/.nccgs/requirements.yaml +0 -10
  578. package/scaffold/.nccgs/reviews/.gitkeep +0 -1
  579. package/scaffold/.nccgs/state.md +0 -40
  580. package/scaffold/.nccgs/templates/agent-handoff.md +0 -37
  581. package/scaffold/.nccgs/templates/architecture-decision.md +0 -27
  582. package/scaffold/.nccgs/templates/closure-record.md +0 -62
  583. package/scaffold/.nccgs/templates/context-packet.yaml +0 -17
  584. package/scaffold/.nccgs/templates/design-contract.json +0 -34
  585. package/scaffold/.nccgs/templates/evidence-record.md +0 -23
  586. package/scaffold/.nccgs/templates/feature-contract.md +0 -60
  587. package/scaffold/.nccgs/templates/implementation-report.md +0 -52
  588. package/scaffold/.nccgs/templates/migration-plan.md +0 -40
  589. package/scaffold/.nccgs/templates/repair-packet.json +0 -14
  590. package/scaffold/.nccgs/templates/repair-unity-code.json +0 -18
  591. package/scaffold/.nccgs/templates/repair-unity-editor.json +0 -21
  592. package/scaffold/.nccgs/templates/task-slices.json +0 -28
  593. package/scaffold/.nccgs/templates/waiver.md +0 -11
  594. package/scripts/benchmark-snapshot.mjs +0 -205
  595. package/scripts/benchmark-v15.mjs +0 -173
  596. package/scripts/cli.mjs +0 -205
  597. package/scripts/doctor.mjs +0 -261
  598. package/scripts/install.mjs +0 -529
  599. package/scripts/recover-session.mjs +0 -89
  600. package/scripts/run.mjs +0 -85
  601. package/scripts/supervise.mjs +0 -148
  602. package/scripts/uninstall.mjs +0 -292
  603. package/scripts/validate.mjs +0 -280
  604. package/scripts/work-handoff.mjs +0 -38
  605. package/tests/autonomy.test.mjs +0 -113
  606. package/tests/benchmark-v15.test.mjs +0 -65
  607. package/tests/design-readiness.test.mjs +0 -200
  608. package/tests/editor-session-evidence.test.mjs +0 -45
  609. package/tests/evidence.test.mjs +0 -186
  610. package/tests/fixtures/compiler-shutdown.cs +0 -64
  611. package/tests/framework.test.mjs +0 -740
  612. package/tests/gates.test.mjs +0 -479
  613. package/tests/lifecycle-v15.test.mjs +0 -300
  614. package/tests/orchestration-v15.test.mjs +0 -596
  615. package/tests/phase1.test.mjs +0 -416
  616. package/tests/phase2.test.mjs +0 -250
  617. package/tests/policy-v15.test.mjs +0 -234
  618. package/tests/ponytail-package.test.mjs +0 -75
  619. package/tests/review-budget.test.mjs +0 -177
  620. package/tests/runtime-v15.test.mjs +0 -1192
  621. package/tests/session-budget.test.mjs +0 -34
  622. package/tests/task-slices.test.mjs +0 -285
  623. package/tests/uninstall.test.mjs +0 -477
  624. package/tests/unity-generated.test.mjs +0 -140
  625. /package/{.claude/nccgs/packages → template}/ponytail/LICENSE +0 -0
  626. /package/{.claude/nccgs/packages → template}/ponytail/NOTICE.md +0 -0
  627. /package/{.claude/nccgs/packages → template}/ponytail/complexity-review.md +0 -0
  628. /package/{.claude/skills → unity-skills}/build-live-game/references/remote-config.md +0 -0
  629. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/README.md +0 -0
  630. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/codeless-catalog.md +0 -0
  631. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/convert-adapty.md +0 -0
  632. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/convert-essentialkit.md +0 -0
  633. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/convert-revenuecat.md +0 -0
  634. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/convert-unipay.md +0 -0
  635. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/migration-v4-to-v5.md +0 -0
  636. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/path-add-iap-to-new-project.md +0 -0
  637. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/path-convert-native-storekit.md +0 -0
  638. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/platform-notes.md +0 -0
  639. /package/{.claude/skills → unity-skills}/implement-in-app-purchases/references/pre-check.md +0 -0
  640. /package/{.claude/skills → unity-skills}/localization/resources/LocalizedFontAsset.cs +0 -0
  641. /package/{.claude/skills → unity-skills}/optimize-audio/resources/platform-settings.md +0 -0
  642. /package/{.claude/skills → unity-skills}/optimize-web/resources/WebOptimizer.cs +0 -0
  643. /package/{.claude/skills → unity-skills}/optimize-web/resources/toktx-examples.sh +0 -0
  644. /package/{.claude/skills → unity-skills}/physics-3d-collision/resources/CollisionDebugger.cs +0 -0
  645. /package/{.claude/skills → unity-skills}/setup-multiplayer-services/references/dgs-entrypoint.md +0 -0
  646. /package/{.claude/skills → unity-skills}/setup-multiplayer-services/references/entrypoints.md +0 -0
  647. /package/{.claude/skills → unity-skills}/setup-multiplayer-services/references/examples.md +0 -0
  648. /package/{.claude/skills → unity-skills}/setup-multiplayer-services/references/implementation-fit.md +0 -0
  649. /package/{.claude/skills → unity-skills}/setup-multiplayer-services/references/underlying-services.md +0 -0
  650. /package/{.claude/skills → unity-skills}/setup-multiplayer-services/references/workflows-prerequisites.md +0 -0
  651. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/evals/.env.example +0 -0
  652. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/evals/README.md +0 -0
  653. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/evals/promptfooconfig.yaml +0 -0
  654. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/evals/tests/init-and-login.yaml +0 -0
  655. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/evals/tests/text-chat.yaml +0 -0
  656. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/evals/tests/voice-channels.yaml +0 -0
  657. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/references/events-and-participants.md +0 -0
  658. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/references/init-and-login.md +0 -0
  659. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/references/text-chat.md +0 -0
  660. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/references/troubleshooting.md +0 -0
  661. /package/{.claude/skills → unity-skills}/setup-vivox-voice-chat/references/voice-channels.md +0 -0
  662. /package/{.claude/skills → unity-skills}/shader-graph-create-custom-node/resources/all_hints.hlsl +0 -0
  663. /package/{.claude/skills → unity-skills}/sprite-editor/references/api_reference.md +0 -0
  664. /package/{.claude/skills → unity-skills}/sprite-editor/references/background.md +0 -0
  665. /package/{.claude/skills → unity-skills}/sprite-editor/scripts/AutomaticSliceTexture.cs +0 -0
  666. /package/{.claude/skills → unity-skills}/sprite-editor/scripts/GenerateNewSpriteRects.cs +0 -0
  667. /package/{.claude/skills → unity-skills}/sprite-editor/scripts/GetTextureSourceImageSize.cs +0 -0
  668. /package/{.claude/skills → unity-skills}/sprite-editor/scripts/GetTextureToSlice.cs +0 -0
  669. /package/{.claude/skills → unity-skills}/sprite-editor/scripts/GridSliceTexture.cs +0 -0
  670. /package/{.claude/skills → unity-skills}/sprite-editor/scripts/IsometricSliceTexture.cs +0 -0
  671. /package/{.claude/skills → unity-skills}/sprite-editor/scripts/README.md +0 -0
  672. /package/{.claude/skills → unity-skills}/sprite-editor/scripts/SetPivotExample.cs +0 -0
  673. /package/{.claude/skills → unity-skills}/sprite-editor/scripts/SpriteToPng.cs +0 -0
  674. /package/{.claude/skills → unity-skills}/ui-imgui/references/gui-elements.md +0 -0
  675. /package/{.claude/skills → unity-skills}/ui-imgui/references/templates.md +0 -0
  676. /package/{.claude/skills → unity-skills}/ui-ugui/references/scrollview-setup.md +0 -0
  677. /package/{.claude/skills → unity-skills}/ui-uitk/references/common-issues.md +0 -0
  678. /package/{.claude/skills → unity-skills}/ui-uitk/references/painter2d.md +0 -0
  679. /package/{.claude/skills → unity-skills}/ui-uitk/references/pointermanipulator-guide.md +0 -0
  680. /package/{.claude/skills → unity-skills}/ui-uitk/references/svg-icons.md +0 -0
  681. /package/{.claude/skills → unity-skills}/ui-uitk/references/ui-runtime-binding.md +0 -0
  682. /package/{.claude/skills → unity-skills}/ui-uitk/references/uss-guide.md +0 -0
  683. /package/{.claude/skills → unity-skills}/urp-postprocessing/references/effect-reference.md +0 -0
package/bin/nccgs.mjs ADDED
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env node
2
+ // nccgs CLI: install | update | doctor | run | uninstall | mode | task | version | help
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { spawn } from "node:child_process";
6
+ import { projectRoot } from "../runtime/core/project.mjs";
7
+ import { PKG, TEMPLATE, install } from "../cli/install.mjs";
8
+ import { doctor } from "../cli/doctor.mjs";
9
+ import { launch } from "../cli/run.mjs";
10
+ import { uninstall } from "../cli/uninstall.mjs";
11
+ import { allModes, createMode, setModeAgent, useMode, BUILTIN } from "../runtime/core/modes.mjs";
12
+ import { renderProject } from "../runtime/task/project.mjs";
13
+ import { release } from "../cli/release.mjs";
14
+
15
+ const argv = process.argv.slice(2);
16
+ const command = argv[0];
17
+ const sep = argv.indexOf("--");
18
+ const own = sep < 0 ? argv.slice(1) : argv.slice(1, sep);
19
+ const forwarded = sep < 0 ? [] : argv.slice(sep + 1);
20
+ const opt = {}; const positional = [];
21
+ for (let i = 0; i < own.length; i++) {
22
+ const a = own[i];
23
+ if (a.startsWith("--")) { const n = own[i + 1]; if (n === undefined || n.startsWith("--")) opt[a.slice(2)] = true; else { opt[a.slice(2)] = n; i++; } }
24
+ else positional.push(a);
25
+ }
26
+ const root = projectRoot(opt.project === true ? undefined : opt.project);
27
+ const out = v => process.stdout.write(JSON.stringify(v, null, 2) + "\n");
28
+ const die = m => { process.stderr.write(`nccgs ${command}: ${m}\n`); process.exit(1); };
29
+
30
+ const HELP = `nccgs ${PKG.version} - Unity-first evidence loop for Claude Code
31
+
32
+ nccgs install --project DIR [--mode BALANCE] [--rigor production] [--autonomy guarded] [--dry-run]
33
+ nccgs update --project DIR [--dry-run] [--force] [--skills-only]
34
+ nccgs doctor --project DIR [--check-models] [--check-updates]
35
+ nccgs run --project DIR [--mode M] [--autonomy guarded|full] [--dry-run] [-- claude args]
36
+ nccgs uninstall --project DIR [--dry-run] [--force]
37
+ nccgs mode list | show NAME | create --from BALANCE --name X | set --name X --agent reviewer --model opus --effort high | use NAME
38
+ nccgs task <open|verify|review|close|inspect|list|fix|report|project> ... (same as node .claude/nccgs/runtime/task/task.mjs)
39
+ nccgs status --project DIR writes .nccgs/project.html (all tasks, open findings, cost) and prints the summary
40
+ nccgs release --project DIR [--from TAG|DATE] [--to TAG|DATE|now] [--name v1.2.0] changelog from tasks closed in the range
41
+ `;
42
+
43
+ try {
44
+ switch (command) {
45
+ case undefined: case "help": case "--help": case "-h": process.stdout.write(HELP); break;
46
+ case "version": case "--version": case "-v": process.stdout.write(PKG.version + "\n"); break;
47
+ case "install": out(install(root, { dryRun: !!opt["dry-run"], force: !!opt.force, mode: str(opt.mode), autonomy: str(opt.autonomy), rigor: str(opt.rigor) })); break;
48
+ case "update": out(install(root, { update: true, dryRun: !!opt["dry-run"], force: !!opt.force, skillsOnly: !!opt["skills-only"] })); break;
49
+ case "doctor": {
50
+ const r = await doctor(root, { checkModels: !!opt["check-models"], checkUpdatesNow: !!opt["check-updates"] });
51
+ for (const c of r.checks) process.stderr.write(`${c.status.toUpperCase().padEnd(4)} ${c.id.padEnd(20)} ${c.message}\n`);
52
+ if (r.summary) process.stderr.write(`\n${r.summary.pass} pass · ${r.summary.warn} warn · ${r.summary.fail} fail\n`);
53
+ if (opt.json) out(r);
54
+ process.exit(r.summary?.fail ? 1 : 0);
55
+ }
56
+ case "run": { const r = await launch(root, { mode: str(opt.mode), autonomy: str(opt.autonomy), dryRun: !!opt["dry-run"], forwarded }); if (opt["dry-run"]) out(r); process.exit(r.exitCode ?? 0); }
57
+ case "uninstall": out(uninstall(root, { dryRun: !!opt["dry-run"], force: !!opt.force })); break;
58
+ case "status": {
59
+ const r = renderProject(root);
60
+ const m = r.model;
61
+ process.stderr.write(`${m.project.name} · ${m.success.length}/${m.closed.length} closed SUCCESS · ${m.open.length} open · findings H ${m.bySeverity.BLOCKER + m.bySeverity.HIGH} / M ${m.bySeverity.MEDIUM} / L ${m.bySeverity.LOW}\n${r.file}\n`);
62
+ if (opt.json) out({ file: r.file, closed: m.closed.length, success: m.success.length, open: m.open.map(x => x.task.id), findings: m.bySeverity, tokens: m.tokens });
63
+ break;
64
+ }
65
+ case "release": { const r = release(root, { from: str(opt.from), to: str(opt.to) ?? "now", name: str(opt.name), write: !opt["dry-run"] }); process.stdout.write(r.markdown); if (r.file) process.stderr.write(`\n${r.file}\n`); break; }
66
+ case "mode": {
67
+ const sub = positional[0];
68
+ if (!sub || sub === "list") { const modes = allModes(root); out(Object.fromEntries(Object.entries(modes).map(([k, v]) => [k, { description: v.description, custom: !!v.custom, ...Object.fromEntries(BUILTIN.agents.map(a => [a, v[a] ? `${v[a].model}/${v[a].effort ?? "-"}` : "-"])) }]))); }
69
+ else if (sub === "show") out(allModes(root)[positional[1] ?? str(opt.name)] ?? die("mode not found"));
70
+ else if (sub === "create") out(createMode(root, { name: str(opt.name) ?? positional[1], from: str(opt.from) ?? "BALANCE" }));
71
+ else if (sub === "set") out(setModeAgent(root, { name: str(opt.name), agent: str(opt.agent), model: str(opt.model), effort: opt.effort === undefined ? undefined : str(opt.effort), fallback: opt.fallback === undefined ? undefined : (opt.fallback === "none" ? "none" : { model: str(opt.fallback), effort: str(opt["fallback-effort"]) ?? "high" }) }));
72
+ else if (sub === "use") out(useMode(root, positional[1] ?? str(opt.name), { templateDir: TEMPLATE }));
73
+ else die(`unknown mode subcommand ${sub}`);
74
+ break;
75
+ }
76
+ case "task": {
77
+ const script = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "runtime", "task", "task.mjs");
78
+ const child = spawn(process.execPath, [script, ...argv.slice(1), ...(opt.project ? [] : ["--project", root])], { stdio: "inherit" });
79
+ child.on("close", code => process.exit(code ?? 1));
80
+ break;
81
+ }
82
+ default: die(`unknown command ${command}\n${HELP}`);
83
+ }
84
+ } catch (error) { die(error.message); }
85
+
86
+ function str(v) { return v === undefined || v === true ? undefined : String(v); }
package/cli/doctor.mjs ADDED
@@ -0,0 +1,82 @@
1
+ // nccgs doctor: facts about this machine and project, with pass | warn | fail per check.
2
+ import path from "node:path";
3
+ import { spawnToolSync } from "./spawn.mjs";
4
+ import { readJson as readJsonFile } from "../runtime/core/fs.mjs";
5
+ import path2 from "node:path";
6
+ import { TEMPLATE } from "./install.mjs";
7
+ import { readJson, exists, sha256File } from "../runtime/core/fs.mjs";
8
+ import { at, isUnityProject, loadConfig, editorVersion, pipelineVersion, versionLine } from "../runtime/core/project.mjs";
9
+ import { allModes, BUILTIN, validateAgentSetting } from "../runtime/core/modes.mjs";
10
+ import * as unity from "../runtime/unity/unity.mjs";
11
+ import { PKG } from "./install.mjs";
12
+ import { checkUpdates } from "./update-check.mjs";
13
+ import { available as jobObjectAvailable } from "../runtime/core/job-object.mjs";
14
+
15
+ const MIN_CLAUDE = [2, 1, 295];
16
+ const cmp = (a, b) => { for (let i = 0; i < 3; i++) { if ((a[i] ?? 0) !== (b[i] ?? 0)) return (a[i] ?? 0) - (b[i] ?? 0); } return 0; };
17
+ const ver = s => (String(s).match(/(\d+)\.(\d+)\.(\d+)/) ?? []).slice(1, 4).map(Number);
18
+
19
+ export async function doctor(root, { checkModels = false, checkUpdatesNow = false } = {}) {
20
+ const checks = [];
21
+ const add = (id, status, message, data) => checks.push({ id, status, message, ...(data ? { data } : {}) });
22
+ add("node", cmp(ver(process.version), [20, 0, 0]) >= 0 ? "pass" : "fail", `Node ${process.version} (needs >= 20)`);
23
+ if (process.platform === "win32") { const jo = await jobObjectAvailable(); add("process-tree", jo ? "pass" : "warn", jo ? "Windows Job Object available (koffi): timed-out Editors die with their whole tree" : "koffi not installed: falling back to taskkill /T + ppid walk (run `npm install` in the nccgs package, or `npx nccgs` installs it)"); }
24
+ else add("process-tree", "pass", `${process.platform}: process group + NCCGS_TREE tag + ppid walk`);
25
+ const claude = spawnToolSync("claude", ["--version"], { encoding: "utf8", windowsHide: true, timeout: 15000 });
26
+ const claudeVersion = claude.status === 0 ? claude.stdout.trim() : null;
27
+ add("claude", claudeVersion ? (cmp(ver(claudeVersion), MIN_CLAUDE) >= 0 ? "pass" : "warn") : "fail", claudeVersion ? `Claude Code ${claudeVersion}` : "claude not on PATH");
28
+ const cliVersion = await unity.cliVersion();
29
+ add("unity-cli", cliVersion ? "pass" : "fail", cliVersion ? `Unity CLI ${cliVersion}` : "unity CLI not on PATH (install: https://unity.com/en/blog/meet-the-unity-cli)");
30
+ if (!isUnityProject(root)) { add("project", "fail", `${root} is not a Unity project`); return { root, checks }; }
31
+ add("project", "pass", versionLine(root, cliVersion));
32
+ add("pipeline-package", pipelineVersion(root) ? "pass" : "fail", pipelineVersion(root) ? `com.unity.pipeline ${pipelineVersion(root)}` : "com.unity.pipeline missing: run `unity pipeline install --project-path <project>` in Unity 6.0+");
33
+ const state = exists(at(root, "installState")) ? readJson(at(root, "installState")) : null;
34
+ add("installed", state ? (state.version === PKG.version ? "pass" : "warn") : "fail", state ? `NCCGS ${state.version} installed${state.version !== PKG.version ? ` (package is ${PKG.version}: run update)` : ""}` : "NCCGS not installed");
35
+ if (state) {
36
+ const drift = [];
37
+ for (const [rel, sha] of Object.entries(state.files ?? {})) { const f = path.join(root, rel); if (!exists(f)) drift.push(`missing ${rel}`); else if (sha256File(f) !== sha) drift.push(`changed ${rel}`); }
38
+ add("inventory", drift.length ? "warn" : "pass", drift.length ? `${drift.length} managed file(s) differ: ${drift.slice(0, 5).join(", ")}${drift.length > 5 ? "…" : ""}` : "managed files match the inventory", { drift, overrides: state.overrides });
39
+ }
40
+ const settings = exists(at(root, "settings")) ? readJson(at(root, "settings")) : {};
41
+ const hookCount = Object.values(settings.hooks ?? {}).flat().filter(e => (e.hooks ?? []).some(h => (h.args ?? []).some(a => String(a).includes("/.claude/nccgs/runtime/hooks/")))).length;
42
+ const expectedHooks = Object.values(readJsonFile(path2.join(TEMPLATE, "settings.fragment.json")).hooks).flat().length;
43
+ add("hooks", hookCount >= expectedHooks ? "pass" : "fail", `${hookCount}/${expectedHooks} NCCGS hook entries in .claude/settings.json`);
44
+ const config = loadConfig(root);
45
+ const modes = allModes(root);
46
+ if (!modes[config.mode]) add("mode", "fail", `mode ${config.mode} not found`);
47
+ else {
48
+ const warnings = BUILTIN.agents.flatMap(a => modes[config.mode][a] ? validateAgentSetting(modes[config.mode][a]).map(w => `${a}: ${w}`) : []);
49
+ add("mode", "pass", `mode ${config.mode}${modes[config.mode].custom ? " (custom)" : ""} · rigor ${config.rigor} · autonomy ${config.autonomy}`, warnings.length ? { warnings } : undefined);
50
+ }
51
+ for (const agent of BUILTIN.agents.filter(a => a !== "coordinator")) {
52
+ if (!exists(path.join(at(root, "agents"), `nccgs-${agent}.md`))) add(`agent-${agent}`, "fail", `.claude/agents/nccgs-${agent}.md missing (run \`nccgs mode use ${config.mode}\`)`);
53
+ }
54
+ const instance = cliVersion ? await unity.instanceFor(root) : null;
55
+ add("editor", instance ? (instance.state === "ready" ? "pass" : "warn") : "warn", instance ? `Editor ${instance.editorVersion ?? instance.version} ${instance.state} on port ${instance.port} (live verify available)` : "no Editor open for this project (verify will use a batch Editor; open the project for screenshots)");
56
+ if (instance?.state === "ready") {
57
+ const cat = await unity.catalog(root, { refresh: true });
58
+ add("pipeline-commands", cat.commands.length ? "pass" : "fail", cat.commands.length ? `${cat.commands.length} Pipeline commands discovered (package ${cat.version})` : `cannot list Pipeline commands: ${cat.error}`);
59
+ for (const cap of ["playStart", "screenshot", "consoleGet", "testRun", "eval"]) {
60
+ const name = await unity.resolve(root, cap);
61
+ if (!name) add(`capability-${cap}`, "fail", `no Pipeline command for ${cap}`);
62
+ }
63
+ }
64
+ const skillsManifest = exists(path.join(root, ".claude/nccgs/unity-skills-manifest.json")) ? readJson(path.join(root, ".claude/nccgs/unity-skills-manifest.json")) : null;
65
+ if (skillsManifest) {
66
+ const age = Math.floor((Date.now() - Date.parse(skillsManifest.synced_at)) / 86400000);
67
+ add("unity-skills", age > 60 ? "warn" : "pass", `${skillsManifest.skills.length} vendored Unity skills, synced ${age} days ago (${skillsManifest.source_revision})`);
68
+ }
69
+ if (checkModels && claudeVersion) {
70
+ const mode = modes[config.mode];
71
+ for (const agent of ["reviewer", "implementer"]) {
72
+ const m = mode?.[agent]?.model; if (!m || m === "inherit") continue;
73
+ const probe = spawnToolSync("claude", ["-p", "Reply with OK", "--model", m, "--max-turns", "1", "--output-format", "text"], { encoding: "utf8", windowsHide: true, timeout: 90000 });
74
+ add(`model-${agent}`, probe.status === 0 ? "pass" : "warn", probe.status === 0 ? `${agent}: ${m} answered` : `${agent}: ${m} not available on this account (${(probe.stderr || probe.stdout).trim().slice(0, 120)})`);
75
+ }
76
+ }
77
+ if (checkUpdatesNow) {
78
+ const u = await checkUpdates(root, { force: true, cliVersion });
79
+ add("updates", u.notices.length ? "warn" : "pass", u.notices.length ? u.notices.map(n => `${n.component} ${n.current} -> ${n.latest}`).join("; ") : "everything current (or unreachable)", u);
80
+ }
81
+ return { root, version: PKG.version, checks, summary: { pass: checks.filter(c => c.status === "pass").length, warn: checks.filter(c => c.status === "warn").length, fail: checks.filter(c => c.status === "fail").length } };
82
+ }
@@ -0,0 +1,111 @@
1
+ // nccgs install | update: copy the managed files into a Unity project, merge settings, scaffold .nccgs.
2
+ // Managed files are inventoried with hashes; a file the user changed is never overwritten (recorded as an override).
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { readJson, writeJson, writeText, readText, exists, sha256File, walk, toPosix, nowIso } from "../runtime/core/fs.mjs";
7
+ import { at, LAYOUT, isUnityProject, loadConfig, saveConfig, ensureLayout, DEFAULT_CONFIG, editorVersion } from "../runtime/core/project.mjs";
8
+ import { renderAgents } from "../runtime/core/modes.mjs";
9
+
10
+ export const PKG_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
11
+ export const PKG = readJson(path.join(PKG_ROOT, "package.json"));
12
+ export const TEMPLATE = path.join(PKG_ROOT, "template");
13
+
14
+ // Managed set: (packageRelative -> projectRelative)
15
+ function managedFiles() {
16
+ const list = [];
17
+ const add = (fromDir, toDir, filter = () => true) => {
18
+ for (const file of walk(fromDir)) {
19
+ const rel = toPosix(path.relative(fromDir, file));
20
+ if (filter(rel)) list.push({ from: file, to: path.posix.join(toDir, rel) });
21
+ }
22
+ };
23
+ add(path.join(PKG_ROOT, "runtime"), ".claude/nccgs/runtime");
24
+ add(path.join(TEMPLATE, "skills"), ".claude/skills");
25
+ add(path.join(TEMPLATE, "protocols"), ".claude/nccgs/protocols");
26
+ add(path.join(TEMPLATE, "ponytail"), ".claude/nccgs/ponytail");
27
+ add(path.join(PKG_ROOT, "unity-skills"), ".claude/skills", rel => rel !== "manifest.json");
28
+ list.push({ from: path.join(PKG_ROOT, "unity-skills", "manifest.json"), to: ".claude/nccgs/unity-skills-manifest.json" });
29
+ list.push({ from: path.join(TEMPLATE, "CLAUDE.md"), to: "CLAUDE.md", keepIfExists: true });
30
+ return list;
31
+ }
32
+
33
+ export function install(root, { update = false, force = false, dryRun = false, mode, autonomy, rigor, skillsOnly = false } = {}) {
34
+ if (!isUnityProject(root)) throw new Error(`${root} is not a Unity project (needs Assets/ and ProjectSettings/ProjectVersion.txt)`);
35
+ const stateFile = at(root, "installState");
36
+ const previous = exists(stateFile) ? readJson(stateFile) : null;
37
+ if (update && !previous) throw new Error("NCCGS is not installed here; use `install`");
38
+ if (!update && previous && !force) throw new Error(`NCCGS ${previous.version} is already installed; use \`update\``);
39
+ const actions = []; // { action: add|replace|keep|override|skip, path }
40
+ const inventory = {};
41
+ for (const item of managedFiles()) {
42
+ if (skillsOnly && !item.to.startsWith(".claude/skills/") && !item.to.endsWith("unity-skills-manifest.json")) continue;
43
+ const target = path.join(root, item.to);
44
+ const incoming = sha256File(item.from);
45
+ const existsNow = exists(target);
46
+ const current = existsNow ? sha256File(target) : null;
47
+ const recorded = previous?.files?.[item.to] ?? null;
48
+ let action;
49
+ if (!existsNow) action = "add";
50
+ else if (current === incoming) action = "keep";
51
+ else if (item.keepIfExists && !recorded) action = "keep-user"; // e.g. the user's own CLAUDE.md
52
+ else if (recorded && current === recorded) action = "replace"; // unchanged managed file, new version
53
+ else if (force) action = "replace-forced";
54
+ else action = "override"; // user changed it: keep theirs, record it
55
+ actions.push({ action, path: item.to });
56
+ inventory[item.to] = ["add", "replace", "replace-forced", "keep"].includes(action) ? incoming : (current ?? incoming);
57
+ if (!dryRun && ["add", "replace", "replace-forced"].includes(action)) {
58
+ fs.mkdirSync(path.dirname(target), { recursive: true });
59
+ fs.copyFileSync(item.from, target);
60
+ }
61
+ }
62
+ // Scaffold .nccgs (never overwritten), config, modes.
63
+ if (!dryRun && !skillsOnly) {
64
+ ensureLayout(root);
65
+ const config = exists(at(root, "config")) ? loadConfig(root) : structuredClone(DEFAULT_CONFIG);
66
+ if (!config.name) config.name = path.basename(root);
67
+ if (mode) config.mode = mode;
68
+ if (autonomy) config.autonomy = autonomy;
69
+ if (rigor) config.rigor = rigor;
70
+ saveConfig(root, config);
71
+ if (!exists(at(root, "state"))) writeText(at(root, "state"), "# Project state\n\nMaintained by `task close`. Newest first.\n\n");
72
+ const gi = path.join(root, ".nccgs", ".gitignore");
73
+ if (!exists(gi)) writeText(gi, "evidence/screens/\nevidence/measurements/\ncache/\nevents.jsonl\n");
74
+ renderAgents(root, config.mode, { templateDir: TEMPLATE });
75
+ mergeSettings(root);
76
+ }
77
+ const overrides = actions.filter(a => a.action === "override").map(a => a.path);
78
+ if (!dryRun) {
79
+ writeJson(stateFile, { schemaVersion: 3, version: PKG.version, installedAt: previous?.installedAt ?? nowIso(), updatedAt: nowIso(), editor: editorVersion(root), files: inventory, overrides });
80
+ }
81
+ return { version: PKG.version, dryRun, counts: count(actions), overrides, actions: dryRun ? actions.filter(a => a.action !== "keep") : undefined };
82
+ }
83
+
84
+ function count(actions) { return actions.reduce((acc, a) => { acc[a.action] = (acc[a.action] ?? 0) + 1; return acc; }, {}); }
85
+
86
+ // Merge our hooks and deny rules into .claude/settings.json without touching anything else.
87
+ export function mergeSettings(root) {
88
+ const fragment = readJson(path.join(TEMPLATE, "settings.fragment.json"));
89
+ const file = at(root, "settings");
90
+ const settings = exists(file) ? readJson(file) : {};
91
+ settings.permissions ??= {};
92
+ settings.permissions.deny = [...new Set([...(settings.permissions.deny ?? []), ...fragment.permissions.deny])];
93
+ settings.hooks ??= {};
94
+ for (const [event, entries] of Object.entries(fragment.hooks)) {
95
+ const existing = (settings.hooks[event] ?? []).filter(e => !isOurs(e));
96
+ settings.hooks[event] = [...existing, ...entries];
97
+ }
98
+ writeJson(file, settings);
99
+ }
100
+ export function removeSettings(root) {
101
+ const file = at(root, "settings");
102
+ if (!exists(file)) return;
103
+ const settings = readJson(file);
104
+ for (const [event, entries] of Object.entries(settings.hooks ?? {})) {
105
+ settings.hooks[event] = entries.filter(e => !isOurs(e));
106
+ if (!settings.hooks[event].length) delete settings.hooks[event];
107
+ }
108
+ if (settings.hooks && !Object.keys(settings.hooks).length) delete settings.hooks;
109
+ writeJson(file, settings);
110
+ }
111
+ const isOurs = entry => (entry.hooks ?? []).some(h => (h.args ?? []).some(a => String(a).includes("/.claude/nccgs/runtime/hooks/")) || String(h.command ?? "").includes(".claude/nccgs/runtime/hooks/"));
@@ -0,0 +1,59 @@
1
+ // nccgs release: a changelog section from the tasks closed between two points in time.
2
+ // Points are git refs (tags, commits; dates come from `git log -1 --format=%cI`) or ISO dates.
3
+ // Output: Markdown grouped by outcome, each task with its criteria score, tests, review and report link.
4
+ import path from "node:path";
5
+ import { spawnToolSync } from "./spawn.mjs";
6
+ import { writeText, toPosix } from "../runtime/core/fs.mjs";
7
+ import { at, loadConfig } from "../runtime/core/project.mjs";
8
+ import { listTasks } from "../runtime/task/ledger.mjs";
9
+ import { reportModel } from "../runtime/task/report.mjs";
10
+ import { fmtTokens } from "../runtime/task/cost.mjs";
11
+
12
+ function refDate(root, ref) {
13
+ if (!ref || ref === "now") return Date.now();
14
+ if (/^\d{4}-\d{2}-\d{2}/.test(ref)) return Date.parse(ref);
15
+ const r = spawnToolSync("git", ["log", "-1", "--format=%cI", ref], { cwd: root, encoding: "utf8", windowsHide: true, timeout: 15000 });
16
+ if (r.status !== 0 || !r.stdout.trim()) throw new Error(`cannot resolve ${ref} to a date: not an ISO date and git says "${(r.stderr || "").trim().slice(0, 120)}"`);
17
+ return Date.parse(r.stdout.trim());
18
+ }
19
+
20
+ export function release(root, { from, to = "now", name, write = true } = {}) {
21
+ const fromMs = from ? refDate(root, from) : 0;
22
+ const toMs = refDate(root, to);
23
+ if (!(toMs > fromMs)) throw new Error("`to` must be after `from`");
24
+ const config = loadConfig(root);
25
+ const lang = config.report?.language === "vi" ? "vi" : "en";
26
+ const t = lang === "vi" ? VI : EN;
27
+ const tasks = listTasks(root).filter(x => x.status === "closed" && Date.parse(x.closedAt) > fromMs && Date.parse(x.closedAt) <= toMs).sort((a, b) => a.closedAt < b.closedAt ? -1 : 1);
28
+ const models = tasks.map(task => reportModel(root, task));
29
+ const label = name ?? (to === "now" ? new Date(toMs).toISOString().slice(0, 10) : to);
30
+ const lines = [`## ${label}${from ? ` (${t.since} ${from})` : ""}`, ""];
31
+ const groups = [["success", t.shipped], ["partial", t.partial], ["blocked", t.blocked], ["failed", t.failed]];
32
+ let any = false;
33
+ for (const [outcome, title] of groups) {
34
+ const g = models.filter(m => m.task.outcome === outcome);
35
+ if (!g.length) continue;
36
+ any = true;
37
+ lines.push(`### ${title}`, "");
38
+ for (const m of g) {
39
+ const rel = toPosix(path.relative(root, path.join(at(root, "reports"), `${m.task.id}.md`)));
40
+ const bits = [`${t.criteriaShort} ${m.evaluation.summary.pass}/${m.evaluation.summary.total}`];
41
+ if (m.tests) bits.push(`${t.testsShort} ${m.tests.passed}/${m.tests.total}`);
42
+ if (m.review) bits.push(`${t.reviewShort} ${m.review.verdict}${m.review.model ? ` (${m.review.model})` : ""}`);
43
+ if (m.cost?.total?.messages) bits.push(`${fmtTokens(m.cost.total.output)} ${t.tokensOut}`);
44
+ const open = m.findings.filter(f => !f.resolved);
45
+ lines.push(`- **${m.task.id}** ${m.task.title} — ${bits.join(" · ")} — [${t.report}](${rel})${open.length ? ` — ${open.length} ${t.openFindings}` : ""}`);
46
+ }
47
+ lines.push("");
48
+ }
49
+ if (!any) lines.push(t.nothing, "");
50
+ const totals = models.reduce((a, m) => ({ tasks: a.tasks + 1, tests: a.tests + (m.tests?.total ?? 0), out: a.out + (m.cost?.total?.output ?? 0), fix: a.fix + m.task.fixRounds }), { tasks: 0, tests: 0, out: 0, fix: 0 });
51
+ if (any) lines.push(`${t.totals}: ${totals.tasks} ${t.tasksWord} · ${totals.tests} ${t.testsWord} · ${totals.fix} ${t.fixRounds} · ${fmtTokens(totals.out)} ${t.tokensOut}`, "");
52
+ const markdown = lines.join("\n");
53
+ let file = null;
54
+ if (write) { file = path.join(at(root, "nccgs"), "releases", `${label.replace(/[^\w.-]+/g, "_")}.md`); writeText(file, markdown); }
55
+ return { label, from: from ?? null, to, tasks: tasks.map(x => x.id), file, markdown };
56
+ }
57
+
58
+ const EN = { since: "since", shipped: "Shipped", partial: "Partial", blocked: "Blocked", failed: "Failed", criteriaShort: "criteria", testsShort: "tests", reviewShort: "review", tokensOut: "tokens out", report: "report", openFindings: "open finding(s)", nothing: "No tasks closed in this range.", totals: "Totals", tasksWord: "tasks", testsWord: "tests", fixRounds: "fix rounds" };
59
+ const VI = { since: "từ", shipped: "Đã giao", partial: "Dở dang", blocked: "Bị chặn", failed: "Thất bại", criteriaShort: "tiêu chí", testsShort: "test", reviewShort: "review", tokensOut: "token ra", report: "report", openFindings: "finding còn mở", nothing: "Không có task nào đóng trong khoảng này.", totals: "Tổng", tasksWord: "task", testsWord: "test", fixRounds: "vòng sửa" };
package/cli/run.mjs ADDED
@@ -0,0 +1,35 @@
1
+ // nccgs run: launch Claude Code for a project with NCCGS's permission and transport policy.
2
+ // acceptEdits by default; bypassPermissions only with --autonomy full (or config.autonomy = full).
3
+ import { spawnTool } from "./spawn.mjs";
4
+ import { readJson, exists } from "../runtime/core/fs.mjs";
5
+ import { at, isUnityProject, loadConfig } from "../runtime/core/project.mjs";
6
+ import { allModes } from "../runtime/core/modes.mjs";
7
+ import { checkUpdates } from "./update-check.mjs";
8
+
9
+ const OWNED = /^(--permission-mode|--dangerously-skip-permissions|--allow-dangerously-skip-permissions|--strict-mcp-config|--mcp-config|--model)(=|$)/;
10
+
11
+ export async function plan(root, { mode, autonomy, forwarded = [], claudeBin = process.env.NCCGS_CLAUDE_BIN || "claude" } = {}) {
12
+ if (!isUnityProject(root)) throw new Error(`${root} is not a Unity project`);
13
+ if (!exists(at(root, "installState"))) throw new Error("NCCGS is not installed here; run `nccgs install --project <dir>`");
14
+ const config = loadConfig(root);
15
+ const modeName = mode || config.mode;
16
+ const modes = allModes(root);
17
+ if (!modes[modeName]) throw new Error(`Unknown mode ${modeName}`);
18
+ const auto = autonomy || config.autonomy;
19
+ if (!["guarded", "full"].includes(auto)) throw new Error("autonomy must be guarded | full");
20
+ for (const a of forwarded) if (OWNED.test(a)) throw new Error(`NCCGS owns ${a}; set it through project.json or nccgs mode`);
21
+ const coordinator = modes[modeName].coordinator ?? {};
22
+ const args = ["--permission-mode", auto === "full" ? "bypassPermissions" : "acceptEdits", "--strict-mcp-config", "--mcp-config", '{"mcpServers":{}}'];
23
+ if (coordinator.model && coordinator.model !== "inherit") args.push("--model", coordinator.model);
24
+ const env = { ...process.env, NCCGS_PROJECT_ROOT: root, NCCGS_MODE: modeName, NCCGS_AUTONOMY: auto, CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1" };
25
+ return { root, claudeBin, args: [...args, ...forwarded], env, mode: modeName, autonomy: auto, coordinator };
26
+ }
27
+
28
+ export async function launch(root, options = {}) {
29
+ const p = await plan(root, options);
30
+ try { await checkUpdates(root); } catch {}
31
+ process.stderr.write(`NCCGS run · ${p.mode} · ${p.autonomy === "full" ? "bypassPermissions (full autonomy)" : "acceptEdits"} · ${p.root}\n`);
32
+ if (options.dryRun) return { ...p, env: undefined };
33
+ const child = spawnTool(p.claudeBin, p.args, { cwd: p.root, env: p.env, stdio: "inherit", windowsHide: false });
34
+ return new Promise(resolve => child.on("close", code => resolve({ ...p, env: undefined, exitCode: code })));
35
+ }
package/cli/spawn.mjs ADDED
@@ -0,0 +1,20 @@
1
+ // Spawn helpers that avoid `shell: true` + args (Node DEP0190) while still resolving .cmd shims on Windows.
2
+ import { spawn, spawnSync } from "node:child_process";
3
+
4
+ const win = process.platform === "win32";
5
+ // Quote one argument for cmd.exe /c: wrap in double quotes, escape embedded quotes, neutralise cmd metacharacters.
6
+ export function quoteWin(arg) {
7
+ const s = String(arg);
8
+ const body = /[\s"]/.test(s) || s === "" ? `"${s.replace(/(\\*)"/g, '$1$1\\"').replace(/(\\+)$/, "$1$1")}"` : s;
9
+ return body.replace(/([()%!^<>&|])/g, "^$1");
10
+ }
11
+ export function commandLine(bin, args) { return [bin, ...args].map(quoteWin).join(" "); }
12
+
13
+ export function spawnTool(bin, args, options = {}) {
14
+ if (!win) return spawn(bin, args, options);
15
+ return spawn("cmd.exe", ["/d", "/s", "/c", `"${commandLine(bin, args)}"`], { ...options, windowsVerbatimArguments: true });
16
+ }
17
+ export function spawnToolSync(bin, args, options = {}) {
18
+ if (!win) return spawnSync(bin, args, options);
19
+ return spawnSync("cmd.exe", ["/d", "/s", "/c", `"${commandLine(bin, args)}"`], { ...options, windowsVerbatimArguments: true });
20
+ }
@@ -0,0 +1,43 @@
1
+ // nccgs uninstall: remove managed files that are unchanged, detach hooks, keep .nccgs/ history
2
+ // and anything the user modified. Everything removed is copied to .nccgs/backups/<id>/ first.
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { readJson, writeJson, exists, sha256File, nowIso } from "../runtime/core/fs.mjs";
6
+ import { at } from "../runtime/core/project.mjs";
7
+ import { removeSettings } from "./install.mjs";
8
+ import { openTasks } from "../runtime/task/ledger.mjs";
9
+
10
+ export function uninstall(root, { dryRun = false, force = false } = {}) {
11
+ const stateFile = at(root, "installState");
12
+ if (!exists(stateFile)) throw new Error("NCCGS is not installed here");
13
+ const state = readJson(stateFile);
14
+ const open = openTasks(root);
15
+ if (open.length && !force) throw new Error(`open tasks: ${open.map(t => t.id).join(", ")}. Close them or pass --force (history is kept either way)`);
16
+ const id = `uninstall-${nowIso().replace(/[:.]/g, "-")}`;
17
+ const backup = path.join(root, ".nccgs", "backups", id);
18
+ const removed = [], kept = [];
19
+ for (const [rel, sha] of Object.entries(state.files ?? {})) {
20
+ const file = path.join(root, rel);
21
+ if (!exists(file)) continue;
22
+ if (sha256File(file) !== sha && !force) { kept.push(rel); continue; }
23
+ removed.push(rel);
24
+ if (!dryRun) {
25
+ const dest = path.join(backup, rel); fs.mkdirSync(path.dirname(dest), { recursive: true }); fs.copyFileSync(file, dest); fs.unlinkSync(file);
26
+ }
27
+ }
28
+ const agentsDir = at(root, "agents");
29
+ if (exists(agentsDir)) for (const f of fs.readdirSync(agentsDir)) if (/^nccgs-.*\.md$/.test(f)) { removed.push(`.claude/agents/${f}`); if (!dryRun) { const file = path.join(agentsDir, f); const dest = path.join(backup, ".claude/agents", f); fs.mkdirSync(path.dirname(dest), { recursive: true }); fs.copyFileSync(file, dest); fs.unlinkSync(file); } }
30
+ if (!dryRun) {
31
+ removeSettings(root);
32
+ writeJson(path.join(backup, "manifest.json"), { id, at: nowIso(), version: state.version, removed, kept });
33
+ fs.unlinkSync(stateFile);
34
+ pruneEmpty(path.join(root, ".claude"));
35
+ }
36
+ return { id, dryRun, removed: removed.length, kept, backup: path.relative(root, backup), note: ".nccgs/ (tasks, evidence, reports, config) is kept" };
37
+ }
38
+
39
+ function pruneEmpty(dir) {
40
+ if (!exists(dir)) return;
41
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) if (entry.isDirectory()) pruneEmpty(path.join(dir, entry.name));
42
+ if (!fs.readdirSync(dir).length) fs.rmdirSync(dir);
43
+ }
@@ -0,0 +1,66 @@
1
+ // Update notices: NCCGS (npm), Unity Skills (GitHub HEAD), Unity CLI (its own notification), Pipeline.
2
+ // Notify only. Never installs. Cached once per day under .nccgs/cache; every source has a 3 s timeout
3
+ // and network failures are silent.
4
+ import { readJson, writeJson, exists } from "../runtime/core/fs.mjs";
5
+ import { at, loadConfig, pipelineVersion } from "../runtime/core/project.mjs";
6
+ import { PKG, PKG_ROOT } from "./install.mjs";
7
+ import path from "node:path";
8
+ import { run } from "../runtime/core/process-tree.mjs";
9
+ import { UNITY_BIN, unityArgv } from "../runtime/unity/unity.mjs";
10
+
11
+ const DAY = 86400000;
12
+ // semver compare with prerelease: 3.0.0-alpha.1 < 3.0.0 ; 2.1.1 < 3.0.0-alpha.1
13
+ export function newer(latest, current) {
14
+ const parse = v => { const m = String(v).match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([\w.-]+))?/); return m ? { n: [Number(m[1]), Number(m[2]), Number(m[3])], pre: m[4] ?? null } : null; };
15
+ const a = parse(latest), b = parse(current); if (!a || !b) return false;
16
+ for (let i = 0; i < 3; i++) if (a.n[i] !== b.n[i]) return a.n[i] > b.n[i];
17
+ if (a.pre === b.pre) return false; if (a.pre === null) return true; if (b.pre === null) return false; return a.pre > b.pre;
18
+ }
19
+
20
+ async function fetchJson(url, timeoutMs = 3000) {
21
+ const ctl = new AbortController();
22
+ const t = setTimeout(() => ctl.abort(), timeoutMs);
23
+ try {
24
+ const r = await fetch(url, { signal: ctl.signal, headers: { "user-agent": `nccgs/${PKG.version}`, accept: "application/json" } });
25
+ if (!r.ok) return null;
26
+ return await r.json();
27
+ } catch { return null; } finally { clearTimeout(t); }
28
+ }
29
+
30
+ export async function checkUpdates(root, { force = false, cliVersion = null } = {}) {
31
+ const config = loadConfig(root);
32
+ const file = at(root, "updateCheck");
33
+ const cached = exists(file) ? readJson(file) : null;
34
+ const interval = config.updates.check === "weekly" ? 7 * DAY : config.updates.check === "never" ? Infinity : DAY;
35
+ if (!force && cached && Date.now() - Date.parse(cached.checkedAt) < interval) return cached;
36
+ if (config.updates.check === "never" && !force) return { checkedAt: new Date().toISOString(), notices: [], skipped: true };
37
+ const channels = new Set(config.updates.channels ?? []);
38
+ const notices = [];
39
+ const sources = {};
40
+ if (channels.has("nccgs")) {
41
+ const j = await fetchJson("https://registry.npmjs.org/nccgs/latest");
42
+ sources.nccgs = j?.version ?? null;
43
+ if (j?.version && newer(j.version, PKG.version)) notices.push({ component: "nccgs", current: PKG.version, latest: j.version, hint: "npx nccgs@latest update --project . --dry-run" });
44
+ }
45
+ if (channels.has("unity-skills")) {
46
+ const manifest = readJson(path.join(PKG_ROOT, "unity-skills", "manifest.json"), {});
47
+ const j = await fetchJson("https://api.github.com/repos/Unity-Technologies/skills/commits/main");
48
+ sources.unitySkills = j?.sha ?? null;
49
+ if (j?.sha && manifest.source_revision && !j.sha.startsWith(manifest.source_revision) && manifest.source_revision !== "unknown-local-copy") notices.push({ component: "unity-skills", current: manifest.source_revision.slice(0, 7), latest: j.sha.slice(0, 7), hint: "nccgs update --skills-only --dry-run" });
50
+ else if (j?.sha && manifest.source_revision === "unknown-local-copy") notices.push({ component: "unity-skills", current: "unknown", latest: j.sha.slice(0, 7), hint: "node scripts/sync-unity-skills.mjs to pin a commit" });
51
+ }
52
+ if (channels.has("unity-cli")) {
53
+ // The CLI reports its own update in the JSON envelope's notifications (seen on beta.14).
54
+ const r = await run(UNITY_BIN, unityArgv(["editors", "--installed", "--format", "json"]), { timeoutMs: 8000 });
55
+ try {
56
+ const j = JSON.parse(r.stdout.replace(/^/, ""));
57
+ const n = (j.notifications ?? []).find(x => x.code === "CLI_UPDATE_AVAILABLE");
58
+ sources.unityCli = n?.data?.latest ?? cliVersion;
59
+ if (n) notices.push({ component: "unity-cli", current: n.data.current, latest: n.data.latest, hint: n.remediation?.command ?? "unity self-update" });
60
+ } catch {}
61
+ }
62
+ if (channels.has("pipeline")) sources.pipeline = pipelineVersion(root); // latest version requires a registry call we do not make in alpha
63
+ const value = { checkedAt: new Date().toISOString(), notices, sources };
64
+ writeJson(file, value);
65
+ return value;
66
+ }
@@ -0,0 +1,22 @@
1
+ # Evidence layer verification (2026-11-04)
2
+
3
+ Machine: Windows x64, Node 24.12, Claude Code 2.1.316, Unity CLI 1.0.0-beta.14, com.unity.pipeline 0.9.1-exp.1.
4
+ Projects: TestNCCGS1 (6000.3.17f1) and TestNCCGS2 (6000.6.7f1), both open in the Editor.
5
+
6
+ | Capability | Command | 6000.3.17f1 | 6000.6.7f1 |
7
+ |---|---|---|---|
8
+ | Tests with the project open | `test run --mode editor` (Pipeline) - `unity test` refuses with "already open" (exit 6) | OK | OK |
9
+ | Enter / exit Play Mode | `editor.playmode start` / `stop` | OK | OK |
10
+ | First command after Play start | `script eval` | EDITOR_NOT_RUNNING for ~3 s (domain reload), then OK | OK after 1 s |
11
+ | Screenshot | `capture screenshot --view game --output <abs>` | OK (PNG seen) | OK |
12
+ | Console | `console status` / `console get` | OK | OK |
13
+ | Simulated input | `runtime simulate_key --key Space` | OK | OK |
14
+ | Performance | `diagnostics get_performance` | OK | OK |
15
+ | Command discovery | `command --detail compact` (166 commands, 37 groups), `--query`, `--obsolete-command-names` | OK | OK |
16
+ | Orphan processes after tests | none new after 10 s | 0 | not measured |
17
+
18
+ NCCGS 3.0.0-alpha.1 end-to-end on TestNCCGS1: `install` (152 files) → `doctor` 11 pass / 0 fail → `task open` (3 criteria, observe auto-added) → `verify --kind tests` (pipeline, 4 s) → `verify --kind observe` (Play, Space, 2 screenshots, console, performance, stop; 21 s; 3/3 criteria pass) → `review` prompt written → `close --outcome success` correctly refused without a review.
19
+
20
+ Consequences baked into the runtime: live/batch selection by `unity status`; `waitReady` after Play start; names resolved from the catalog cache; `--editor-version` pinned from ProjectVersion.txt; `capture game_view --save_path` avoided (writes under Assets/).
21
+
22
+ Added during phases 2–4 (all measured on 6000.3.17f1 / Pipeline 0.9.1-exp.1): `simulate_key` delivers key-down and key-up in one input update (polling misses it; `InputAction` does not); PlayMode tests only run async (`--async_tests` + `test status`); each Pipeline round trip costs ~0.9 s, so sub-second timing is scheduled inside the Editor by one `script eval` (`observe --shots`, playtests with probes at 10 Hz and reactive rules); `script eval` is a method body without `using` and can reference the project's own types; `set_run_in_background` keeps Play Mode alive when the Editor loses focus; the Editor rewrites `ProjectSettings/ShaderGraphSettings.asset` and `SceneTemplateSettings.json` on its own (excluded from snapshots).
package/package.json CHANGED
@@ -1,47 +1,39 @@
1
1
  {
2
2
  "name": "nccgs",
3
- "version": "2.1.0",
4
- "description": "Unity-first game-studio operating system for Claude Code",
3
+ "version": "3.0.0-rc.1",
4
+ "description": "NCCGS 3 - a Unity-first evidence loop for Claude Code: contract, run, look, review, report.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
8
- "nccgs": "scripts/cli.mjs"
8
+ "nccgs": "bin/nccgs.mjs"
9
+ },
10
+ "engines": {
11
+ "node": ">=20"
9
12
  },
10
13
  "files": [
11
- ".claude/",
12
- "docs/",
13
- "package-assets/",
14
- "scaffold/",
14
+ "bin/",
15
+ "cli/",
16
+ "runtime/",
17
+ "template/",
18
+ "unity-skills/",
15
19
  "scripts/",
16
- "tests/",
17
- "CLAUDE.md",
18
- "MEMORY.md",
19
- "LICENSE",
20
+ "docs/",
20
21
  "README.md",
21
- "THIRD_PARTY_NOTICES.md",
22
- "UPGRADING.md",
23
- "VERSION",
24
- "CHANGELOG.md"
22
+ "CHANGELOG.md",
23
+ "LICENSE",
24
+ "THIRD_PARTY_NOTICES.md"
25
25
  ],
26
- "engines": {
27
- "node": ">=18"
28
- },
29
- "publishConfig": {
30
- "access": "public",
31
- "tag": "latest",
32
- "registry": "https://registry.npmjs.org/"
33
- },
34
26
  "scripts": {
35
- "validate": "node scripts/validate.mjs",
36
- "test": "node --test tests/*.test.mjs",
37
- "pack:check": "npm pack --dry-run",
38
- "policy:build": "node .claude/nccgs/tools/compile-policy.mjs --write",
39
- "policy:check": "node .claude/nccgs/tools/compile-policy.mjs"
27
+ "test": "node --test test/*.test.mjs",
28
+ "pack:check": "npm pack --dry-run"
29
+ },
30
+ "optionalDependencies": {
31
+ "koffi": "^3.3.6"
40
32
  },
41
33
  "keywords": [
42
34
  "claude-code",
43
- "game-development",
44
35
  "unity",
45
- "workflow"
36
+ "game-development",
37
+ "evidence"
46
38
  ]
47
39
  }