[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71CDXVQG3088KVBQ4QNF008":3,"skill-same:01M71CDXVQG3088KVBQ4QNF008":58},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":6,"ownerDescription":42,"updatedAt":43,"install":44,"resources":57},"01M71CDXVQG3088KVBQ4QNF008","threejs-geometry",null,"Three.js geometry creation - built-in shapes, BufferGeometry, custom geometry, instancing. Use when creating 3D shapes, working with vertices, building custom meshes, or optimizing with instanced rendering.","nexuslinkproductions\u002Fyuri-os","nexuslinkproductions","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F273246263?v=4","01M718YX9NZRCW50B59B8ZVDKN","Marcel Spatz","01M718YXAQ7530F4B1VKN6SFQV",2,"MIT","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fthreejs-geometry\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30],"geometry","threejs geometry","threejs","3D","creation","three","custom","use","when","with","rendering","js","2026-11-10 10:12:30",false,"---\nname: threejs-geometry\ndescription: Three.js geometry creation - built-in shapes, BufferGeometry, custom geometry, instancing. Use when creating 3D shapes, working with vertices, building custom meshes, or optimizing with instanced rendering.\n---\n\n# Three.js Geometry\n\n## Quick Start\n\n```javascript\nimport * as THREE from \"three\";\n\n\u002F\u002F Built-in geometry\nconst box = new THREE.BoxGeometry(1, 1, 1);\nconst sphere = new THREE.SphereGeometry(0.5, 32, 32);\nconst plane = new THREE.PlaneGeometry(10, 10);\n\n\u002F\u002F Create mesh\nconst material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });\nconst mesh = new THREE.Mesh(box, material);\nscene.add(mesh);\n```\n\n## Built-in Geometries\n\n### Basic Shapes\n\n```javascript\n\u002F\u002F Box - width, height, depth, widthSegments, heightSegments, depthSegments\nnew THREE.BoxGeometry(1, 1, 1, 1, 1, 1);\n\n\u002F\u002F Sphere - radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength\nnew THREE.SphereGeometry(1, 32, 32);\nnew THREE.SphereGeometry(1, 32, 32, 0, Math.PI * 2, 0, Math.PI); \u002F\u002F Full sphere\nnew THREE.SphereGeometry(1, 32, 32, 0, Math.PI); \u002F\u002F Hemisphere\n\n\u002F\u002F Plane - width, height, widthSegments, heightSegments\nnew THREE.PlaneGeometry(10, 10, 1, 1);\n\n\u002F\u002F Circle - radius, segments, thetaStart, thetaLength\nnew THREE.CircleGeometry(1, 32);\nnew THREE.CircleGeometry(1, 32, 0, Math.PI); \u002F\u002F Semicircle\n\n\u002F\u002F Cylinder - radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded\nnew THREE.CylinderGeometry(1, 1, 2, 32, 1, false);\nnew THREE.CylinderGeometry(0, 1, 2, 32); \u002F\u002F Cone\nnew THREE.CylinderGeometry(1, 1, 2, 6); \u002F\u002F Hexagonal prism\n\n\u002F\u002F Cone - radius, height, radialSegments, heightSegments, openEnded\nnew THREE.ConeGeometry(1, 2, 32, 1, false);\n\n\u002F\u002F Torus - radius, tube, radialSegments, tubularSegments, arc\nnew THREE.TorusGeometry(1, 0.4, 16, 100);\n\n\u002F\u002F TorusKnot - radius, tube, tubularSegments, radialSegments, p, q\nnew THREE.TorusKnotGeometry(1, 0.4, 100, 16, 2, 3);\n\n\u002F\u002F Ring - innerRadius, outerRadius, thetaSegments, phiSegments\nnew THREE.RingGeometry(0.5, 1, 32, 1);\n```\n\n### Advanced Shapes\n\n```javascript\n\u002F\u002F Capsule - radius, length, capSegments, radialSegments\nnew THREE.CapsuleGeometry(0.5, 1, 4, 8);\n\n\u002F\u002F Dodecahedron - radius, detail\nnew THREE.DodecahedronGeometry(1, 0);\n\n\u002F\u002F Icosahedron - radius, detail (0 = 20 faces, higher = smoother)\nnew THREE.IcosahedronGeometry(1, 0);\n\n\u002F\u002F Octahedron - radius, detail\nnew THREE.OctahedronGeometry(1, 0);\n\n\u002F\u002F Tetrahedron - radius, detail\nnew THREE.TetrahedronGeometry(1, 0);\n\n\u002F\u002F Polyhedron - vertices, indices, radius, detail\nconst vertices = [1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1];\nconst indices = [2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1];\nnew THREE.PolyhedronGeometry(vertices, indices, 1, 0);\n```\n\n### Path-Based Shapes\n\n```javascript\n\u002F\u002F Lathe - points[], segments, phiStart, phiLength\nconst points = [\n  new THREE.Vector2(0, 0),\n  new THREE.Vector2(0.5, 0),\n  new THREE.Vector2(0.5, 1),\n  new THREE.Vector2(0, 1),\n];\nnew THREE.LatheGeometry(points, 32);\n\n\u002F\u002F Extrude - shape, options\nconst shape = new THREE.Shape();\nshape.moveTo(0, 0);\nshape.lineTo(1, 0);\nshape.lineTo(1, 1);\nshape.lineTo(0, 1);\nshape.lineTo(0, 0);\n\nconst extrudeSettings = {\n  steps: 2,\n  depth: 1,\n  bevelEnabled: true,\n  bevelThickness: 0.1,\n  bevelSize: 0.1,\n  bevelSegments: 3,\n};\nnew THREE.ExtrudeGeometry(shape, extrudeSettings);\n\n\u002F\u002F Tube - path, tubularSegments, radius, radialSegments, closed\nconst curve = new THREE.CatmullRomCurve3([\n  new THREE.Vector3(-1, 0, 0),\n  new THREE.Vector3(0, 1, 0),\n  new THREE.Vector3(1, 0, 0),\n]);\nnew THREE.TubeGeometry(curve, 64, 0.2, 8, false);\n```\n\n### Text Geometry\n\n```javascript\nimport { FontLoader } from \"three\u002Fexamples\u002Fjsm\u002Floaders\u002FFontLoader.js\";\nimport { TextGeometry } from \"three\u002Fexamples\u002Fjsm\u002Fgeometries\u002FTextGeometry.js\";\n\nconst loader = new FontLoader();\nloader.load(\"fonts\u002Fhelvetiker_regular.typeface.json\", (font) => {\n  const geometry = new TextGeometry(\"Hello\", {\n    font: font,\n    size: 1,\n    depth: 0.2, \u002F\u002F Was 'height' in older versions\n    curveSegments: 12,\n    bevelEnabled: true,\n    bevelThickness: 0.03,\n    bevelSize: 0.02,\n    bevelSegments: 5,\n  });\n\n  \u002F\u002F Center text\n  geometry.computeBoundingBox();\n  geometry.center();\n\n  const mesh = new THREE.Mesh(geometry, material);\n  scene.add(mesh);\n});\n```\n\n## BufferGeometry\n\nThe base class for all geometries. Stores data as typed arrays for GPU efficiency.\n\n### Custom BufferGeometry\n\n```javascript\nconst geometry = new THREE.BufferGeometry();\n\n\u002F\u002F Vertices (3 floats per vertex: x, y, z)\nconst vertices = new Float32Array([\n  -1,\n  -1,\n  0, \u002F\u002F vertex 0\n  1,\n  -1,\n  0, \u002F\u002F vertex 1\n  1,\n  1,\n  0, \u002F\u002F vertex 2\n  -1,\n  1,\n  0, \u002F\u002F vertex 3\n]);\ngeometry.setAttribute(\"position\", new THREE.BufferAttribute(vertices, 3));\n\n\u002F\u002F Indices (for indexed geometry - reuse vertices)\nconst indices = new Uint16Array([\n  0,\n  1,\n  2, \u002F\u002F triangle 1\n  0,\n  2,\n  3, \u002F\u002F triangle 2\n]);\ngeometry.setIndex(new THREE.BufferAttribute(indices, 1));\n\n\u002F\u002F Normals (required for lighting)\nconst normals = new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\ngeometry.setAttribute(\"normal\", new THREE.BufferAttribute(normals, 3));\n\n\u002F\u002F UVs (for texturing)\nconst uvs = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);\ngeometry.setAttribute(\"uv\", new THREE.BufferAttribute(uvs, 2));\n\n\u002F\u002F Colors (per-vertex colors)\nconst colors = new Float32Array([\n  1,\n  0,\n  0, \u002F\u002F red\n  0,\n  1,\n  0, \u002F\u002F green\n  0,\n  0,\n  1, \u002F\u002F blue\n  1,\n  1,\n  0, \u002F\u002F yellow\n]);\ngeometry.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\u002F\u002F Use with: material.vertexColors = true\n```\n\n### BufferAttribute Types\n\n```javascript\n\u002F\u002F Common attribute types\nnew THREE.BufferAttribute(array, itemSize);\n\n\u002F\u002F Typed array options\nnew Float32Array(count * itemSize); \u002F\u002F Positions, normals, UVs\nnew Uint16Array(count); \u002F\u002F Indices (up to 65535 vertices)\nnew Uint32Array(count); \u002F\u002F Indices (larger meshes)\nnew Uint8Array(count * itemSize); \u002F\u002F Colors (0-255 range)\n\n\u002F\u002F Item sizes\n\u002F\u002F Position: 3 (x, y, z)\n\u002F\u002F Normal: 3 (x, y, z)\n\u002F\u002F UV: 2 (u, v)\n\u002F\u002F Color: 3 (r, g, b) or 4 (r, g, b, a)\n\u002F\u002F Index: 1\n```\n\n### Modifying BufferGeometry\n\n```javascript\nconst positions = geometry.attributes.position;\n\n\u002F\u002F Modify vertex\npositions.setXYZ(index, x, y, z);\n\n\u002F\u002F Access vertex\nconst x = positions.getX(index);\nconst y = positions.getY(index);\nconst z = positions.getZ(index);\n\n\u002F\u002F Flag for GPU update\npositions.needsUpdate = true;\n\n\u002F\u002F Recompute normals after position changes\ngeometry.computeVertexNormals();\n\n\u002F\u002F Recompute bounding box\u002Fsphere after changes\ngeometry.computeBoundingBox();\ngeometry.computeBoundingSphere();\n```\n\n### Interleaved Buffers (Advanced)\n\n```javascript\n\u002F\u002F More efficient memory layout for large meshes\nconst interleavedBuffer = new THREE.InterleavedBuffer(\n  new Float32Array([\n    \u002F\u002F pos.x, pos.y, pos.z, uv.u, uv.v (repeated per vertex)\n    -1, -1, 0, 0, 0, 1, -1, 0, 1, 0, 1, 1, 0, 1, 1, -1, 1, 0, 0, 1,\n  ]),\n  5, \u002F\u002F stride (floats per vertex)\n);\n\ngeometry.setAttribute(\n  \"position\",\n  new THREE.InterleavedBufferAttribute(interleavedBuffer, 3, 0),\n); \u002F\u002F size 3, offset 0\ngeometry.setAttribute(\n  \"uv\",\n  new THREE.InterleavedBufferAttribute(interleavedBuffer, 2, 3),\n); \u002F\u002F size 2, offset 3\n```\n\n## EdgesGeometry & WireframeGeometry\n\n```javascript\n\u002F\u002F Edge lines (only hard edges)\nconst edges = new THREE.EdgesGeometry(boxGeometry, 15); \u002F\u002F 15 = threshold angle\nconst edgeMesh = new THREE.LineSegments(\n  edges,\n  new THREE.LineBasicMaterial({ color: 0xffffff }),\n);\n\n\u002F\u002F Wireframe (all triangles)\nconst wireframe = new THREE.WireframeGeometry(boxGeometry);\nconst wireMesh = new THREE.LineSegments(\n  wireframe,\n  new THREE.LineBasicMaterial({ color: 0xffffff }),\n);\n```\n\n## Points\n\n```javascript\n\u002F\u002F Create point cloud\nconst geometry = new THREE.BufferGeometry();\nconst positions = new Float32Array(1000 * 3);\n\nfor (let i = 0; i \u003C 1000; i++) {\n  positions[i * 3] = (Math.random() - 0.5) * 10;\n  positions[i * 3 + 1] = (Math.random() - 0.5) * 10;\n  positions[i * 3 + 2] = (Math.random() - 0.5) * 10;\n}\n\ngeometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n\nconst material = new THREE.PointsMaterial({\n  size: 0.1,\n  sizeAttenuation: true, \u002F\u002F Size decreases with distance\n  color: 0xffffff,\n});\n\nconst points = new THREE.Points(geometry, material);\nscene.add(points);\n```\n\n## Lines\n\n```javascript\n\u002F\u002F Line (connected points)\nconst points = [\n  new THREE.Vector3(-1, 0, 0),\n  new THREE.Vector3(0, 1, 0),\n  new THREE.Vector3(1, 0, 0),\n];\nconst geometry = new THREE.BufferGeometry().setFromPoints(points);\nconst line = new THREE.Line(\n  geometry,\n  new THREE.LineBasicMaterial({ color: 0xff0000 }),\n);\n\n\u002F\u002F LineLoop (closed loop)\nconst loop = new THREE.LineLoop(geometry, material);\n\n\u002F\u002F LineSegments (pairs of points)\nconst segmentsGeometry = new THREE.BufferGeometry();\nsegmentsGeometry.setAttribute(\n  \"position\",\n  new THREE.BufferAttribute(\n    new Float32Array([\n      -1,\n      0,\n      0,\n      0,\n      1,\n      0, \u002F\u002F segment 1\n      0,\n      1,\n      0,\n      1,\n      0,\n      0, \u002F\u002F segment 2\n    ]),\n    3,\n  ),\n);\nconst segments = new THREE.LineSegments(segmentsGeometry, material);\n```\n\n## InstancedMesh\n\nEfficiently render many copies of the same geometry.\n\n```javascript\nconst geometry = new THREE.BoxGeometry(1, 1, 1);\nconst material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });\nconst count = 1000;\n\nconst instancedMesh = new THREE.InstancedMesh(geometry, material, count);\n\n\u002F\u002F Set transforms for each instance\nconst dummy = new THREE.Object3D();\nconst matrix = new THREE.Matrix4();\n\nfor (let i = 0; i \u003C count; i++) {\n  dummy.position.set(\n    (Math.random() - 0.5) * 20,\n    (Math.random() - 0.5) * 20,\n    (Math.random() - 0.5) * 20,\n  );\n  dummy.rotation.set(Math.random() * Math.PI, Math.random() * Math.PI, 0);\n  dummy.scale.setScalar(0.5 + Math.random());\n  dummy.updateMatrix();\n\n  instancedMesh.setMatrixAt(i, dummy.matrix);\n}\n\n\u002F\u002F Flag for GPU update\ninstancedMesh.instanceMatrix.needsUpdate = true;\n\n\u002F\u002F Optional: per-instance colors\ninstancedMesh.instanceColor = new THREE.InstancedBufferAttribute(\n  new Float32Array(count * 3),\n  3,\n);\nfor (let i = 0; i \u003C count; i++) {\n  instancedMesh.setColorAt(\n    i,\n    new THREE.Color(Math.random(), Math.random(), Math.random()),\n  );\n}\ninstancedMesh.instanceColor.needsUpdate = true;\n\nscene.add(instancedMesh);\n```\n\n### Update Instance at Runtime\n\n```javascript\n\u002F\u002F Update single instance\nconst matrix = new THREE.Matrix4();\ninstancedMesh.getMatrixAt(index, matrix);\n\u002F\u002F Modify matrix...\ninstancedMesh.setMatrixAt(index, matrix);\ninstancedMesh.instanceMatrix.needsUpdate = true;\n\n\u002F\u002F Raycasting with instanced mesh\nconst intersects = raycaster.intersectObject(instancedMesh);\nif (intersects.length > 0) {\n  const instanceId = intersects[0].instanceId;\n}\n```\n\n## InstancedBufferGeometry (Advanced)\n\nFor custom per-instance attributes beyond transform\u002Fcolor.\n\n```javascript\nconst geometry = new THREE.InstancedBufferGeometry();\ngeometry.copy(new THREE.BoxGeometry(1, 1, 1));\n\n\u002F\u002F Add per-instance attribute\nconst offsets = new Float32Array(count * 3);\nfor (let i = 0; i \u003C count; i++) {\n  offsets[i * 3] = Math.random() * 10;\n  offsets[i * 3 + 1] = Math.random() * 10;\n  offsets[i * 3 + 2] = Math.random() * 10;\n}\ngeometry.setAttribute(\"offset\", new THREE.InstancedBufferAttribute(offsets, 3));\n\n\u002F\u002F Use in shader\n\u002F\u002F attribute vec3 offset;\n\u002F\u002F vec3 transformed = position + offset;\n```\n\n## Geometry Utilities\n\n```javascript\nimport * as BufferGeometryUtils from \"three\u002Fexamples\u002Fjsm\u002Futils\u002FBufferGeometryUtils.js\";\n\n\u002F\u002F Merge geometries (must have same attributes)\nconst merged = BufferGeometryUtils.mergeGeometries([geo1, geo2, geo3]);\n\n\u002F\u002F Merge with groups (for multi-material)\nconst merged = BufferGeometryUtils.mergeGeometries([geo1, geo2], true);\n\n\u002F\u002F Compute tangents (required for normal maps)\nBufferGeometryUtils.computeTangents(geometry);\n\n\u002F\u002F Interleave attributes for better performance\nconst interleaved = BufferGeometryUtils.interleaveAttributes([\n  geometry.attributes.position,\n  geometry.attributes.normal,\n  geometry.attributes.uv,\n]);\n```\n\n## Common Patterns\n\n### Center Geometry\n\n```javascript\ngeometry.computeBoundingBox();\ngeometry.center(); \u002F\u002F Move vertices so center is at origin\n```\n\n### Scale to Fit\n\n```javascript\ngeometry.computeBoundingBox();\nconst size = new THREE.Vector3();\ngeometry.boundingBox.getSize(size);\nconst maxDim = Math.max(size.x, size.y, size.z);\ngeometry.scale(1 \u002F maxDim, 1 \u002F maxDim, 1 \u002F maxDim);\n```\n\n### Clone and Transform\n\n```javascript\nconst clone = geometry.clone();\nclone.rotateX(Math.PI \u002F 2);\nclone.translate(0, 1, 0);\nclone.scale(2, 2, 2);\n```\n\n### Morph Targets\n\n```javascript\n\u002F\u002F Base geometry\nconst geometry = new THREE.BoxGeometry(1, 1, 1, 4, 4, 4);\n\n\u002F\u002F Create morph target\nconst morphPositions = geometry.attributes.position.array.slice();\nfor (let i = 0; i \u003C morphPositions.length; i += 3) {\n  morphPositions[i] *= 2; \u002F\u002F Scale X\n  morphPositions[i + 1] *= 0.5; \u002F\u002F Squash Y\n}\n\ngeometry.morphAttributes.position = [\n  new THREE.BufferAttribute(new Float32Array(morphPositions), 3),\n];\n\nconst mesh = new THREE.Mesh(geometry, material);\nmesh.morphTargetInfluences[0] = 0.5; \u002F\u002F 50% blend\n```\n\n## Performance Tips\n\n1. **Use indexed geometry**: Reuse vertices with indices\n2. **Merge static meshes**: Reduce draw calls with `mergeGeometries`\n3. **Use InstancedMesh**: For many identical objects\n4. **Choose appropriate segment counts**: More segments = smoother but slower\n5. **Dispose unused geometry**: `geometry.dispose()`\n\n```javascript\n\u002F\u002F Good segment counts for common uses\nnew THREE.SphereGeometry(1, 32, 32); \u002F\u002F Good quality\nnew THREE.SphereGeometry(1, 64, 64); \u002F\u002F High quality\nnew THREE.SphereGeometry(1, 16, 16); \u002F\u002F Performance mode\n\n\u002F\u002F Dispose when done\ngeometry.dispose();\n```\n\n## See Also\n\n- `threejs-fundamentals` - Scene setup and Object3D\n- `threejs-materials` - Material types for meshes\n- `threejs-shaders` - Custom vertex manipulation\n","# Three.js Geometry\n\n## Quick Start\n\n```javascript\nimport * as THREE from \"three\";\n\n\u002F\u002F Built-in geometry\nconst box = new THREE.BoxGeometry(1, 1, 1);\nconst sphere = new THREE.SphereGeometry(0.5, 32, 32);\nconst plane = new THREE.PlaneGeometry(10, 10);\n\n\u002F\u002F Create mesh\nconst material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });\nconst mesh = new THREE.Mesh(box, material);\nscene.add(mesh);\n```\n\n## Built-in Geometries\n\n### Basic Shapes\n\n```javascript\n\u002F\u002F Box - width, height, depth, widthSegments, heightSegments, depthSegments\nnew THREE.BoxGeometry(1, 1, 1, 1, 1, 1);\n\n\u002F\u002F Sphere - radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength\nnew THREE.SphereGeometry(1, 32, 32);\nnew THREE.SphereGeometry(1, 32, 32, 0, Math.PI * 2, 0, Math.PI); \u002F\u002F Full sphere\nnew THREE.SphereGeometry(1, 32, 32, 0, Math.PI); \u002F\u002F Hemisphere\n\n\u002F\u002F Plane - width, height, widthSegments, heightSegments\nnew THREE.PlaneGeometry(10, 10, 1, 1);\n\n\u002F\u002F Circle - radius, segments, thetaStart, thetaLength\nnew THREE.CircleGeometry(1, 32);\nnew THREE.CircleGeometry(1, 32, 0, Math.PI); \u002F\u002F Semicircle\n\n\u002F\u002F Cylinder - radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded\nnew THREE.CylinderGeometry(1, 1, 2, 32, 1, false);\nnew THREE.CylinderGeometry(0, 1, 2, 32); \u002F\u002F Cone\nnew THREE.CylinderGeometry(1, 1, 2, 6); \u002F\u002F Hexagonal prism\n\n\u002F\u002F Cone - radius, height, radialSegments, heightSegments, openEnded\nnew THREE.ConeGeometry(1, 2, 32, 1, false);\n\n\u002F\u002F Torus - radius, tube, radialSegments, tubularSegments, arc\nnew THREE.TorusGeometry(1, 0.4, 16, 100);\n\n\u002F\u002F TorusKnot - radius, tube, tubularSegments, radialSegments, p, q\nnew THREE.TorusKnotGeometry(1, 0.4, 100, 16, 2, 3);\n\n\u002F\u002F Ring - innerRadius, outerRadius, thetaSegments, phiSegments\nnew THREE.RingGeometry(0.5, 1, 32, 1);\n```\n\n### Advanced Shapes\n\n```javascript\n\u002F\u002F Capsule - radius, length, capSegments, radialSegments\nnew THREE.CapsuleGeometry(0.5, 1, 4, 8);\n\n\u002F\u002F Dodecahedron - radius, detail\nnew THREE.DodecahedronGeometry(1, 0);\n\n\u002F\u002F Icosahedron - radius, detail (0 = 20 faces, higher = smoother)\nnew THREE.IcosahedronGeometry(1, 0);\n\n\u002F\u002F Octahedron - radius, detail\nnew THREE.OctahedronGeometry(1, 0);\n\n\u002F\u002F Tetrahedron - radius, detail\nnew THREE.TetrahedronGeometry(1, 0);\n\n\u002F\u002F Polyhedron - vertices, indices, radius, detail\nconst vertices = [1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1];\nconst indices = [2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1];\nnew THREE.PolyhedronGeometry(vertices, indices, 1, 0);\n```\n\n### Path-Based Shapes\n\n```javascript\n\u002F\u002F Lathe - points[], segments, phiStart, phiLength\nconst points = [\n  new THREE.Vector2(0, 0),\n  new THREE.Vector2(0.5, 0),\n  new THREE.Vector2(0.5, 1),\n  new THREE.Vector2(0, 1),\n];\nnew THREE.LatheGeometry(points, 32);\n\n\u002F\u002F Extrude - shape, options\nconst shape = new THREE.Shape();\nshape.moveTo(0, 0);\nshape.lineTo(1, 0);\nshape.lineTo(1, 1);\nshape.lineTo(0, 1);\nshape.lineTo(0, 0);\n\nconst extrudeSettings = {\n  steps: 2,\n  depth: 1,\n  bevelEnabled: true,\n  bevelThickness: 0.1,\n  bevelSize: 0.1,\n  bevelSegments: 3,\n};\nnew THREE.ExtrudeGeometry(shape, extrudeSettings);\n\n\u002F\u002F Tube - path, tubularSegments, radius, radialSegments, closed\nconst curve = new THREE.CatmullRomCurve3([\n  new THREE.Vector3(-1, 0, 0),\n  new THREE.Vector3(0, 1, 0),\n  new THREE.Vector3(1, 0, 0),\n]);\nnew THREE.TubeGeometry(curve, 64, 0.2, 8, false);\n```\n\n### Text Geometry\n\n```javascript\nimport { FontLoader } from \"three\u002Fexamples\u002Fjsm\u002Floaders\u002FFontLoader.js\";\nimport { TextGeometry } from \"three\u002Fexamples\u002Fjsm\u002Fgeometries\u002FTextGeometry.js\";\n\nconst loader = new FontLoader();\nloader.load(\"fonts\u002Fhelvetiker_regular.typeface.json\", (font) => {\n  const geometry = new TextGeometry(\"Hello\", {\n    font: font,\n    size: 1,\n    depth: 0.2, \u002F\u002F Was 'height' in older versions\n    curveSegments: 12,\n    bevelEnabled: true,\n    bevelThickness: 0.03,\n    bevelSize: 0.02,\n    bevelSegments: 5,\n  });\n\n  \u002F\u002F Center text\n  geometry.computeBoundingBox();\n  geometry.center();\n\n  const mesh = new THREE.Mesh(geometry, material);\n  scene.add(mesh);\n});\n```\n\n## BufferGeometry\n\nThe base class for all geometries. Stores data as typed arrays for GPU efficiency.\n\n### Custom BufferGeometry\n\n```javascript\nconst geometry = new THREE.BufferGeometry();\n\n\u002F\u002F Vertices (3 floats per vertex: x, y, z)\nconst vertices = new Float32Array([\n  -1,\n  -1,\n  0, \u002F\u002F vertex 0\n  1,\n  -1,\n  0, \u002F\u002F vertex 1\n  1,\n  1,\n  0, \u002F\u002F vertex 2\n  -1,\n  1,\n  0, \u002F\u002F vertex 3\n]);\ngeometry.setAttribute(\"position\", new THREE.BufferAttribute(vertices, 3));\n\n\u002F\u002F Indices (for indexed geometry - reuse vertices)\nconst indices = new Uint16Array([\n  0,\n  1,\n  2, \u002F\u002F triangle 1\n  0,\n  2,\n  3, \u002F\u002F triangle 2\n]);\ngeometry.setIndex(new THREE.BufferAttribute(indices, 1));\n\n\u002F\u002F Normals (required for lighting)\nconst normals = new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\ngeometry.setAttribute(\"normal\", new THREE.BufferAttribute(normals, 3));\n\n\u002F\u002F UVs (for texturing)\nconst uvs = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);\ngeometry.setAttribute(\"uv\", new THREE.BufferAttribute(uvs, 2));\n\n\u002F\u002F Colors (per-vertex colors)\nconst colors = new Float32Array([\n  1,\n  0,\n  0, \u002F\u002F red\n  0,\n  1,\n  0, \u002F\u002F green\n  0,\n  0,\n  1, \u002F\u002F blue\n  1,\n  1,\n  0, \u002F\u002F yellow\n]);\ngeometry.setAttribute(\"color\", new THREE.BufferAttribute(colors, 3));\n\u002F\u002F Use with: material.vertexColors = true\n```\n\n### BufferAttribute Types\n\n```javascript\n\u002F\u002F Common attribute types\nnew THREE.BufferAttribute(array, itemSize);\n\n\u002F\u002F Typed array options\nnew Float32Array(count * itemSize); \u002F\u002F Positions, normals, UVs\nnew Uint16Array(count); \u002F\u002F Indices (up to 65535 vertices)\nnew Uint32Array(count); \u002F\u002F Indices (larger meshes)\nnew Uint8Array(count * itemSize); \u002F\u002F Colors (0-255 range)\n\n\u002F\u002F Item sizes\n\u002F\u002F Position: 3 (x, y, z)\n\u002F\u002F Normal: 3 (x, y, z)\n\u002F\u002F UV: 2 (u, v)\n\u002F\u002F Color: 3 (r, g, b) or 4 (r, g, b, a)\n\u002F\u002F Index: 1\n```\n\n### Modifying BufferGeometry\n\n```javascript\nconst positions = geometry.attributes.position;\n\n\u002F\u002F Modify vertex\npositions.setXYZ(index, x, y, z);\n\n\u002F\u002F Access vertex\nconst x = positions.getX(index);\nconst y = positions.getY(index);\nconst z = positions.getZ(index);\n\n\u002F\u002F Flag for GPU update\npositions.needsUpdate = true;\n\n\u002F\u002F Recompute normals after position changes\ngeometry.computeVertexNormals();\n\n\u002F\u002F Recompute bounding box\u002Fsphere after changes\ngeometry.computeBoundingBox();\ngeometry.computeBoundingSphere();\n```\n\n### Interleaved Buffers (Advanced)\n\n```javascript\n\u002F\u002F More efficient memory layout for large meshes\nconst interleavedBuffer = new THREE.InterleavedBuffer(\n  new Float32Array([\n    \u002F\u002F pos.x, pos.y, pos.z, uv.u, uv.v (repeated per vertex)\n    -1, -1, 0, 0, 0, 1, -1, 0, 1, 0, 1, 1, 0, 1, 1, -1, 1, 0, 0, 1,\n  ]),\n  5, \u002F\u002F stride (floats per vertex)\n);\n\ngeometry.setAttribute(\n  \"position\",\n  new THREE.InterleavedBufferAttribute(interleavedBuffer, 3, 0),\n); \u002F\u002F size 3, offset 0\ngeometry.setAttribute(\n  \"uv\",\n  new THREE.InterleavedBufferAttribute(interleavedBuffer, 2, 3),\n); \u002F\u002F size 2, offset 3\n```\n\n## EdgesGeometry & WireframeGeometry\n\n```javascript\n\u002F\u002F Edge lines (only hard edges)\nconst edges = new THREE.EdgesGeometry(boxGeometry, 15); \u002F\u002F 15 = threshold angle\nconst edgeMesh = new THREE.LineSegments(\n  edges,\n  new THREE.LineBasicMaterial({ color: 0xffffff }),\n);\n\n\u002F\u002F Wireframe (all triangles)\nconst wireframe = new THREE.WireframeGeometry(boxGeometry);\nconst wireMesh = new THREE.LineSegments(\n  wireframe,\n  new THREE.LineBasicMaterial({ color: 0xffffff }),\n);\n```\n\n## Points\n\n```javascript\n\u002F\u002F Create point cloud\nconst geometry = new THREE.BufferGeometry();\nconst positions = new Float32Array(1000 * 3);\n\nfor (let i = 0; i \u003C 1000; i++) {\n  positions[i * 3] = (Math.random() - 0.5) * 10;\n  positions[i * 3 + 1] = (Math.random() - 0.5) * 10;\n  positions[i * 3 + 2] = (Math.random() - 0.5) * 10;\n}\n\ngeometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\n\nconst material = new THREE.PointsMaterial({\n  size: 0.1,\n  sizeAttenuation: true, \u002F\u002F Size decreases with distance\n  color: 0xffffff,\n});\n\nconst points = new THREE.Points(geometry, material);\nscene.add(points);\n```\n\n## Lines\n\n```javascript\n\u002F\u002F Line (connected points)\nconst points = [\n  new THREE.Vector3(-1, 0, 0),\n  new THREE.Vector3(0, 1, 0),\n  new THREE.Vector3(1, 0, 0),\n];\nconst geometry = new THREE.BufferGeometry().setFromPoints(points);\nconst line = new THREE.Line(\n  geometry,\n  new THREE.LineBasicMaterial({ color: 0xff0000 }),\n);\n\n\u002F\u002F LineLoop (closed loop)\nconst loop = new THREE.LineLoop(geometry, material);\n\n\u002F\u002F LineSegments (pairs of points)\nconst segmentsGeometry = new THREE.BufferGeometry();\nsegmentsGeometry.setAttribute(\n  \"position\",\n  new THREE.BufferAttribute(\n    new Float32Array([\n      -1,\n      0,\n      0,\n      0,\n      1,\n      0, \u002F\u002F segment 1\n      0,\n      1,\n      0,\n      1,\n      0,\n      0, \u002F\u002F segment 2\n    ]),\n    3,\n  ),\n);\nconst segments = new THREE.LineSegments(segmentsGeometry, material);\n```\n\n## InstancedMesh\n\nEfficiently render many copies of the same geometry.\n\n```javascript\nconst geometry = new THREE.BoxGeometry(1, 1, 1);\nconst material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });\nconst count = 1000;\n\nconst instancedMesh = new THREE.InstancedMesh(geometry, material, count);\n\n\u002F\u002F Set transforms for each instance\nconst dummy = new THREE.Object3D();\nconst matrix = new THREE.Matrix4();\n\nfor (let i = 0; i \u003C count; i++) {\n  dummy.position.set(\n    (Math.random() - 0.5) * 20,\n    (Math.random() - 0.5) * 20,\n    (Math.random() - 0.5) * 20,\n  );\n  dummy.rotation.set(Math.random() * Math.PI, Math.random() * Math.PI, 0);\n  dummy.scale.setScalar(0.5 + Math.random());\n  dummy.updateMatrix();\n\n  instancedMesh.setMatrixAt(i, dummy.matrix);\n}\n\n\u002F\u002F Flag for GPU update\ninstancedMesh.instanceMatrix.needsUpdate = true;\n\n\u002F\u002F Optional: per-instance colors\ninstancedMesh.instanceColor = new THREE.InstancedBufferAttribute(\n  new Float32Array(count * 3),\n  3,\n);\nfor (let i = 0; i \u003C count; i++) {\n  instancedMesh.setColorAt(\n    i,\n    new THREE.Color(Math.random(), Math.random(), Math.random()),\n  );\n}\ninstancedMesh.instanceColor.needsUpdate = true;\n\nscene.add(instancedMesh);\n```\n\n### Update Instance at Runtime\n\n```javascript\n\u002F\u002F Update single instance\nconst matrix = new THREE.Matrix4();\ninstancedMesh.getMatrixAt(index, matrix);\n\u002F\u002F Modify matrix...\ninstancedMesh.setMatrixAt(index, matrix);\ninstancedMesh.instanceMatrix.needsUpdate = true;\n\n\u002F\u002F Raycasting with instanced mesh\nconst intersects = raycaster.intersectObject(instancedMesh);\nif (intersects.length > 0) {\n  const instanceId = intersects[0].instanceId;\n}\n```\n\n## InstancedBufferGeometry (Advanced)\n\nFor custom per-instance attributes beyond transform\u002Fcolor.\n\n```javascript\nconst geometry = new THREE.InstancedBufferGeometry();\ngeometry.copy(new THREE.BoxGeometry(1, 1, 1));\n\n\u002F\u002F Add per-instance attribute\nconst offsets = new Float32Array(count * 3);\nfor (let i = 0; i \u003C count; i++) {\n  offsets[i * 3] = Math.random() * 10;\n  offsets[i * 3 + 1] = Math.random() * 10;\n  offsets[i * 3 + 2] = Math.random() * 10;\n}\ngeometry.setAttribute(\"offset\", new THREE.InstancedBufferAttribute(offsets, 3));\n\n\u002F\u002F Use in shader\n\u002F\u002F attribute vec3 offset;\n\u002F\u002F vec3 transformed = position + offset;\n```\n\n## Geometry Utilities\n\n```javascript\nimport * as BufferGeometryUtils from \"three\u002Fexamples\u002Fjsm\u002Futils\u002FBufferGeometryUtils.js\";\n\n\u002F\u002F Merge geometries (must have same attributes)\nconst merged = BufferGeometryUtils.mergeGeometries([geo1, geo2, geo3]);\n\n\u002F\u002F Merge with groups (for multi-material)\nconst merged = BufferGeometryUtils.mergeGeometries([geo1, geo2], true);\n\n\u002F\u002F Compute tangents (required for normal maps)\nBufferGeometryUtils.computeTangents(geometry);\n\n\u002F\u002F Interleave attributes for better performance\nconst interleaved = BufferGeometryUtils.interleaveAttributes([\n  geometry.attributes.position,\n  geometry.attributes.normal,\n  geometry.attributes.uv,\n]);\n```\n\n## Common Patterns\n\n### Center Geometry\n\n```javascript\ngeometry.computeBoundingBox();\ngeometry.center(); \u002F\u002F Move vertices so center is at origin\n```\n\n### Scale to Fit\n\n```javascript\ngeometry.computeBoundingBox();\nconst size = new THREE.Vector3();\ngeometry.boundingBox.getSize(size);\nconst maxDim = Math.max(size.x, size.y, size.z);\ngeometry.scale(1 \u002F maxDim, 1 \u002F maxDim, 1 \u002F maxDim);\n```\n\n### Clone and Transform\n\n```javascript\nconst clone = geometry.clone();\nclone.rotateX(Math.PI \u002F 2);\nclone.translate(0, 1, 0);\nclone.scale(2, 2, 2);\n```\n\n### Morph Targets\n\n```javascript\n\u002F\u002F Base geometry\nconst geometry = new THREE.BoxGeometry(1, 1, 1, 4, 4, 4);\n\n\u002F\u002F Create morph target\nconst morphPositions = geometry.attributes.position.array.slice();\nfor (let i = 0; i \u003C morphPositions.length; i += 3) {\n  morphPositions[i] *= 2; \u002F\u002F Scale X\n  morphPositions[i + 1] *= 0.5; \u002F\u002F Squash Y\n}\n\ngeometry.morphAttributes.position = [\n  new THREE.BufferAttribute(new Float32Array(morphPositions), 3),\n];\n\nconst mesh = new THREE.Mesh(geometry, material);\nmesh.morphTargetInfluences[0] = 0.5; \u002F\u002F 50% blend\n```\n\n## Performance Tips\n\n1. **Use indexed geometry**: Reuse vertices with indices\n2. **Merge static meshes**: Reduce draw calls with `mergeGeometries`\n3. **Use InstancedMesh**: For many identical objects\n4. **Choose appropriate segment counts**: More segments = smoother but slower\n5. **Dispose unused geometry**: `geometry.dispose()`\n\n```javascript\n\u002F\u002F Good segment counts for common uses\nnew THREE.SphereGeometry(1, 32, 32); \u002F\u002F Good quality\nnew THREE.SphereGeometry(1, 64, 64); \u002F\u002F High quality\nnew THREE.SphereGeometry(1, 16, 16); \u002F\u002F Performance mode\n\n\u002F\u002F Dispose when done\ngeometry.dispose();\n```\n\n## See Also\n\n- `threejs-fundamentals` - Scene setup and Object3D\n- `threejs-materials` - Material types for meshes\n- `threejs-shaders` - Custom vertex manipulation\n",{"name":5,"description":7},"main","4c6d8d65f3d6096e2fc25b0845e481dda73c2794","skills\u002Fthreejs-geometry",0,"https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions","Building deterministic AI governance and continuity systems. Workflow architect + visual storyteller","2026-11-11 16:42:59",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add nexuslinkproductions\u002Fyuri-os --skill threejs-geometry",{"tool":50,"command":51},"bunx","bunx skills add nexuslinkproductions\u002Fyuri-os --skill threejs-geometry",{"tool":53,"command":54},"pnpm","pnpm dlx skills add nexuslinkproductions\u002Fyuri-os --skill threejs-geometry","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fthreejs-geometry\u002FSKILL.md",true,[],[59,79,103,133,162,181],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":31},"01M71CG1AME5WC0A79AE65WT0X","zoom-out","Tell the agent to zoom out and give broader context or a higher-level perspective. Use when you're unfamiliar with a section of code or need to understand how it fits into the bigger picture.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fzoom-out\u002FSKILL.md",[],[66,67,28,68,69,70,71,72,73,26,74,27,75,76,77,78],"zoom out","zoom","harness","how","section","re","true","understand","perspective","you","code","it","context",{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":31},"01M71CFY9ATD0BAXV6B14HFG7C","yuri-shura","6-perspective adversarial review for high-stakes turns (architecture decisions, refactor planning, deployment review) — fans out architect, adversary (7-vector attack), maintainer, ops, product, and security perspectives in parallel, then consolidates. Use when user says 'review this decision', '\u002Fshura', 'adversarial review', 'what could go wrong', 'architecture review', or 'deployment review'.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-shura\u002FSKILL.md",[],[86,87,68,88,89,90,91,92,93,94,95,26,96,27,97,98,99,100,101,102],"yuri shura","parallel","architecture review","planning","for","deployment","vector","strategic review","decision","strategic","ops","workflow","decisions","architecture","review","perspectives","adversarial",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":114,"publishedAt":31},"01M71CFTTYW1HA2MNX38EV1GJ5","yuri-sales-intelligence","Unified sales and outreach skill generating cold outreach openers, social selling sequences, objection rebuttals, and ad creative for any paid platform — multi-persona aware, adapting tone and offer frame to buyer type. Use when user says 'write a cold email', 'outreach sequence', 'objection handling', 'ad copy', or 'sales pitch'.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-sales-intelligence\u002FSKILL.md",[109],{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000005","邮件与沟通","SCENARIO","使用场景",[115,116,117,118,119,120,121,122,123,27,124,125,126,127,128,129,130,90,131,132],"intelligence","sales intelligence","yuri sales intelligence","sales","cold","paid","social","persona","pitch","cold email","ad creative","write","sequences","sequence","platform","email","cold outreach","frame",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":147,"publishedAt":31},"01M71CFQMBFTFADJNGP0Z2WCYK","yuri-code-intelligence","Unified code quality intelligence layer that diagnoses code smells (Long Method, Feature Envy, design pattern issues), prescribes targeted Fowler refactoring techniques, and reviews code for security, performance, and clarity. Use when user says 'review this code', 'refactor this', 'what's wrong with this method', 'code smells', or 'clean this up'.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-code-intelligence\u002FSKILL.md",[139,142],{"categoryNo":140,"categoryName":141,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":143,"categoryName":144,"taxonomyType":145,"taxonomyTypeDesc":146},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[148,76,149,115,68,150,151,152,90,153,154,155,156,157,158,159,160,161,26,27],"yuri code intelligence","code intelligence","reviews","code quality","feature","performance","code review","long","up","issues","clean","techniques","improve","design",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":31},"01M71CFP32RT6GD3GKNHCJP8VP","yuri-adw","Invoke when user asks to run the ADW loop \u002F agentic engineering loop \u002F software factory workflow.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-adw\u002FSKILL.md",[],[169,170,171,172,173,174,175,176,177,27,178,97,179,180],"yuri adw","run","engineering loop","software factory","software","agentic engineering","factory","loop","invoke","engineering","agentic","user",{"skillNo":182,"name":183,"nameZh":6,"description":184,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":185,"categories":186,"keywords":199,"publishedAt":31},"01M71CFK4VPEKY6A73237P7RSN","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fwriting-skills\u002FSKILL.md",[187,190,193,196],{"categoryNo":188,"categoryName":189,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":191,"categoryName":192,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":194,"categoryName":195,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":197,"categoryName":198,"taxonomyType":145,"taxonomyTypeDesc":146},"01JBSEEDCAT000000000000036","内容创作者",[200,201,202,27,97,203,68,204,91,26,205],"writing","writing skills","new","work","editing","Existing"]