@jarrodmedrano/claude-skills 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/bevy/SKILL.md +406 -0
- package/.claude/skills/bevy/references/bevy_specific_tips.md +385 -0
- package/.claude/skills/bevy/references/common_pitfalls.md +217 -0
- package/.claude/skills/bevy/references/ecs_patterns.md +277 -0
- package/.claude/skills/bevy/references/project_structure.md +116 -0
- package/.claude/skills/bevy/references/ui_development.md +147 -0
- package/.claude/skills/domain-driven-design/SKILL.md +459 -0
- package/.claude/skills/domain-driven-design/references/ddd_foundations_and_patterns.md +664 -0
- package/.claude/skills/domain-driven-design/references/rich_hickey_principles.md +406 -0
- package/.claude/skills/domain-driven-design/references/visualization_examples.md +790 -0
- package/.claude/skills/domain-driven-design/references/wlaschin_patterns.md +639 -0
- package/.claude/skills/game-design-theory/SKILL.md +102 -0
- package/.claude/skills/game-design-theory/design-principles.md +308 -0
- package/.claude/skills/game-design-theory/gameplay-elements.md +213 -0
- package/.claude/skills/game-design-theory/player-psychology.md +175 -0
- package/.claude/skills/game-design-theory/playtesting.md +321 -0
- package/.claude/skills/game-design-theory/storytelling.md +219 -0
- package/.claude/skills/game-feel/SKILL.md +305 -0
- package/.claude/skills/game-feel/references/adsr-tuning.md +271 -0
- package/.claude/skills/game-feel/references/classic-profiles.md +279 -0
- package/.claude/skills/game-feel/references/perception-thresholds.md +160 -0
- package/.claude/skills/game-feel/references/polish-effects.md +246 -0
- package/.claude/skills/game-feel/references/simulation-recipes.md +306 -0
- package/.claude/skills/game-feel/references/six-metrics.md +239 -0
- package/.claude/skills/godot/SKILL.md +728 -0
- package/.claude/skills/godot/assets/templates/attribute_template.gd +109 -0
- package/.claude/skills/godot/assets/templates/component_template.gd +76 -0
- package/.claude/skills/godot/assets/templates/interaction_template.gd +108 -0
- package/.claude/skills/godot/assets/templates/item_resource.tres +11 -0
- package/.claude/skills/godot/assets/templates/spell_resource.tres +20 -0
- package/.claude/skills/godot/references/architecture-patterns.md +608 -0
- package/.claude/skills/godot/references/common-pitfalls.md +518 -0
- package/.claude/skills/godot/references/file-formats.md +491 -0
- package/.claude/skills/godot/references/godot4-physics-api.md +302 -0
- package/.claude/skills/godot/scripts/validate_tres.py +145 -0
- package/.claude/skills/godot/scripts/validate_tscn.py +170 -0
- package/.claude/skills/level-design/SKILL.md +249 -0
- package/.claude/skills/level-design/anticipatory-play.md +223 -0
- package/.claude/skills/level-design/hiding-linearity.md +181 -0
- package/.claude/skills/level-design/indie-practices.md +286 -0
- package/.claude/skills/level-design/open-world-planning.md +294 -0
- package/.claude/skills/level-design/play-personas.md +240 -0
- package/.claude/skills/level-design/procedural-handmade.md +271 -0
- package/.claude/skills/level-design/themed-environments.md +264 -0
- package/.claude/skills/react-three-fiber/SKILL.md +2055 -0
- package/.claude/skills/react-three-fiber/scripts/build-scene.ts +171 -0
- package/package.json +3 -1
- package/scripts/install.js +16 -1
- package/templates/github-actions/README.md +36 -0
- /package/.claude/{commands/design-review → agents}/design-review-agent.md +0 -0
- /package/.claude/{commands/code-review → agents}/pragmatic-code-review-subagent.md +0 -0
- /package/{.claude/commands/code-review → templates/github-actions}/claude-code-review-custom.yml +0 -0
- /package/{.claude/commands/code-review → templates/github-actions}/claude-code-review.yml +0 -0
- /package/{.claude/commands/security-review → templates/github-actions}/security.yml +0 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Three.js Scene Builder Helper
|
|
5
|
+
* Quickly scaffold Three.js scenes with common configurations
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
|
|
11
|
+
async function main() {
|
|
12
|
+
const args = process.argv.slice(2);
|
|
13
|
+
|
|
14
|
+
if (args.includes('--help') || args.includes('-h') || args.length === 0) {
|
|
15
|
+
console.log(`
|
|
16
|
+
Three.js Scene Builder
|
|
17
|
+
|
|
18
|
+
Usage:
|
|
19
|
+
bun run build-scene.ts <scene-name> [options]
|
|
20
|
+
|
|
21
|
+
Options:
|
|
22
|
+
--basic Create basic scene (default)
|
|
23
|
+
--vr Create VR-ready scene
|
|
24
|
+
--physics Include physics setup
|
|
25
|
+
--lighting Advanced lighting setup
|
|
26
|
+
--output <dir> Output directory (default: ./src/scenes)
|
|
27
|
+
--help, -h Show this help message
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
bun run build-scene.ts MyScene
|
|
31
|
+
bun run build-scene.ts GameScene --vr --physics
|
|
32
|
+
`);
|
|
33
|
+
process.exit(args.length === 0 ? 1 : 0);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const sceneName = args[0];
|
|
37
|
+
const outputDir = args[args.indexOf('--output') + 1] || './src/scenes';
|
|
38
|
+
const isVR = args.includes('--vr');
|
|
39
|
+
const hasPhysics = args.includes('--physics');
|
|
40
|
+
const advancedLighting = args.includes('--lighting');
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
await mkdir(outputDir, { recursive: true });
|
|
44
|
+
|
|
45
|
+
const sceneTemplate = `import * as THREE from 'three';
|
|
46
|
+
${isVR ? "import { VRButton } from 'three/examples/jsm/webxr/VRButton.js';" : ''}
|
|
47
|
+
${hasPhysics ? "import * as CANNON from 'cannon-es';" : ''}
|
|
48
|
+
|
|
49
|
+
export class ${sceneName} {
|
|
50
|
+
scene: THREE.Scene;
|
|
51
|
+
camera: THREE.PerspectiveCamera;
|
|
52
|
+
renderer: THREE.WebGLRenderer;
|
|
53
|
+
${hasPhysics ? 'world: CANNON.World;' : ''}
|
|
54
|
+
|
|
55
|
+
constructor() {
|
|
56
|
+
this.scene = new THREE.Scene();
|
|
57
|
+
this.camera = new THREE.PerspectiveCamera(
|
|
58
|
+
75,
|
|
59
|
+
window.innerWidth / window.innerHeight,
|
|
60
|
+
0.1,
|
|
61
|
+
1000
|
|
62
|
+
);
|
|
63
|
+
this.renderer = new THREE.WebGLRenderer({ antialias: true });
|
|
64
|
+
|
|
65
|
+
this.init();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
init() {
|
|
69
|
+
// Renderer setup
|
|
70
|
+
this.renderer.setSize(window.innerWidth, window.innerHeight);
|
|
71
|
+
this.renderer.shadowMap.enabled = true;
|
|
72
|
+
${isVR ? 'this.renderer.xr.enabled = true;' : ''}
|
|
73
|
+
document.body.appendChild(this.renderer.domElement);
|
|
74
|
+
|
|
75
|
+
${isVR ? "document.body.appendChild(VRButton.createButton(this.renderer));" : ''}
|
|
76
|
+
|
|
77
|
+
${hasPhysics ? this.getPhysicsSetup() : ''}
|
|
78
|
+
|
|
79
|
+
// Lighting
|
|
80
|
+
${advancedLighting ? this.getAdvancedLighting() : this.getBasicLighting()}
|
|
81
|
+
|
|
82
|
+
// Camera position
|
|
83
|
+
this.camera.position.set(0, 2, 5);
|
|
84
|
+
this.camera.lookAt(0, 0, 0);
|
|
85
|
+
|
|
86
|
+
// Window resize handler
|
|
87
|
+
window.addEventListener('resize', () => this.onWindowResize());
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
${hasPhysics ? `
|
|
91
|
+
initPhysics() {
|
|
92
|
+
this.world = new CANNON.World();
|
|
93
|
+
this.world.gravity.set(0, -9.82, 0);
|
|
94
|
+
}
|
|
95
|
+
` : ''}
|
|
96
|
+
|
|
97
|
+
onWindowResize() {
|
|
98
|
+
this.camera.aspect = window.innerWidth / window.innerHeight;
|
|
99
|
+
this.camera.updateProjectionMatrix();
|
|
100
|
+
this.renderer.setSize(window.innerWidth, window.innerHeight);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
animate() {
|
|
104
|
+
${isVR ? 'this.renderer.setAnimationLoop(() => {' : 'requestAnimationFrame(() => this.animate());'}
|
|
105
|
+
${hasPhysics ? 'this.world.step(1 / 60);' : ''}
|
|
106
|
+
this.renderer.render(this.scene, this.camera);
|
|
107
|
+
${isVR ? '});' : ''}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
start() {
|
|
111
|
+
this.animate();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
`;
|
|
115
|
+
|
|
116
|
+
const filepath = join(outputDir, `${sceneName}.ts`);
|
|
117
|
+
await writeFile(filepath, sceneTemplate);
|
|
118
|
+
|
|
119
|
+
console.log(`✓ Created scene: ${filepath}`);
|
|
120
|
+
console.log(`
|
|
121
|
+
Next steps:
|
|
122
|
+
1. Import and instantiate: import { ${sceneName} } from './scenes/${sceneName}';
|
|
123
|
+
2. Create instance: const scene = new ${sceneName}();
|
|
124
|
+
3. Start rendering: scene.start();
|
|
125
|
+
`);
|
|
126
|
+
} catch (error) {
|
|
127
|
+
console.error('Failed to create scene:', error);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function getBasicLighting(): string {
|
|
132
|
+
return `const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
|
|
133
|
+
this.scene.add(ambientLight);
|
|
134
|
+
|
|
135
|
+
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
|
|
136
|
+
directionalLight.position.set(5, 10, 5);
|
|
137
|
+
directionalLight.castShadow = true;
|
|
138
|
+
this.scene.add(directionalLight);`;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function getAdvancedLighting(): string {
|
|
142
|
+
return `// Ambient light
|
|
143
|
+
const ambientLight = new THREE.AmbientLight(0x404040, 0.3);
|
|
144
|
+
this.scene.add(ambientLight);
|
|
145
|
+
|
|
146
|
+
// Main directional light (sun)
|
|
147
|
+
const sunLight = new THREE.DirectionalLight(0xffffff, 1.0);
|
|
148
|
+
sunLight.position.set(10, 20, 10);
|
|
149
|
+
sunLight.castShadow = true;
|
|
150
|
+
sunLight.shadow.mapSize.width = 2048;
|
|
151
|
+
sunLight.shadow.mapSize.height = 2048;
|
|
152
|
+
sunLight.shadow.camera.near = 0.5;
|
|
153
|
+
sunLight.shadow.camera.far = 50;
|
|
154
|
+
this.scene.add(sunLight);
|
|
155
|
+
|
|
156
|
+
// Fill light
|
|
157
|
+
const fillLight = new THREE.DirectionalLight(0x8888ff, 0.3);
|
|
158
|
+
fillLight.position.set(-5, 5, -5);
|
|
159
|
+
this.scene.add(fillLight);
|
|
160
|
+
|
|
161
|
+
// Hemisphere light for sky/ground gradient
|
|
162
|
+
const hemisphereLight = new THREE.HemisphereLight(0x8888ff, 0x888888, 0.5);
|
|
163
|
+
this.scene.add(hemisphereLight);`;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function getPhysicsSetup(): string {
|
|
167
|
+
return `this.initPhysics();`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jarrodmedrano/claude-skills",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Reusable Claude Code skills for web development projects",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
"files": [
|
|
24
24
|
".claude/skills/**/*",
|
|
25
25
|
".claude/commands/**/*",
|
|
26
|
+
".claude/agents/**/*",
|
|
27
|
+
"templates/**/*",
|
|
26
28
|
"scripts/**/*",
|
|
27
29
|
"bin/**/*",
|
|
28
30
|
"README.md"
|
package/scripts/install.js
CHANGED
|
@@ -38,8 +38,10 @@ function copySkills() {
|
|
|
38
38
|
|
|
39
39
|
const skillsTargetDir = path.join(projectRoot, '.claude', 'skills');
|
|
40
40
|
const commandsTargetDir = path.join(projectRoot, '.claude', 'commands');
|
|
41
|
+
const agentsTargetDir = path.join(projectRoot, '.claude', 'agents');
|
|
41
42
|
const skillsSourceDir = path.join(packageRoot, '.claude', 'skills');
|
|
42
43
|
const commandsSourceDir = path.join(packageRoot, '.claude', 'commands');
|
|
44
|
+
const agentsSourceDir = path.join(packageRoot, '.claude', 'agents');
|
|
43
45
|
|
|
44
46
|
// Create .claude directories if they don't exist
|
|
45
47
|
if (!fs.existsSync(skillsTargetDir)) {
|
|
@@ -52,7 +54,12 @@ function copySkills() {
|
|
|
52
54
|
console.log('✓ Created .claude/commands directory');
|
|
53
55
|
}
|
|
54
56
|
|
|
55
|
-
|
|
57
|
+
if (!fs.existsSync(agentsTargetDir)) {
|
|
58
|
+
fs.mkdirSync(agentsTargetDir, { recursive: true });
|
|
59
|
+
console.log('✓ Created .claude/agents directory');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Copy skills, commands, and agents
|
|
56
63
|
try {
|
|
57
64
|
if (fs.existsSync(skillsSourceDir)) {
|
|
58
65
|
copyRecursive(skillsSourceDir, skillsTargetDir);
|
|
@@ -64,6 +71,11 @@ function copySkills() {
|
|
|
64
71
|
console.log(`✓ Commands copied to ${commandsTargetDir}`);
|
|
65
72
|
}
|
|
66
73
|
|
|
74
|
+
if (fs.existsSync(agentsSourceDir)) {
|
|
75
|
+
copyRecursive(agentsSourceDir, agentsTargetDir);
|
|
76
|
+
console.log(`✓ Agents copied to ${agentsTargetDir}`);
|
|
77
|
+
}
|
|
78
|
+
|
|
67
79
|
console.log('\n✓ Claude Code skills installed successfully!');
|
|
68
80
|
console.log('\nAvailable skills:');
|
|
69
81
|
console.log(' /new-website - Create frontend projects');
|
|
@@ -74,6 +86,9 @@ function copySkills() {
|
|
|
74
86
|
console.log(' /code-review - Code review workflows');
|
|
75
87
|
console.log(' /design-review - Design review workflows');
|
|
76
88
|
console.log(' /security-review - Security review workflows');
|
|
89
|
+
console.log('\nAvailable agents:');
|
|
90
|
+
console.log(' design-review - Design review subagent');
|
|
91
|
+
console.log(' pragmatic-code-review - Code review subagent');
|
|
77
92
|
console.log('\nTo update later, run: npm run update-skills');
|
|
78
93
|
} catch (error) {
|
|
79
94
|
console.error('Error copying skills:', error.message);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# GitHub Actions Templates
|
|
2
|
+
|
|
3
|
+
This directory contains GitHub Actions workflow templates for automating Claude Code reviews in your CI/CD pipeline.
|
|
4
|
+
|
|
5
|
+
## Available Templates
|
|
6
|
+
|
|
7
|
+
### Code Review Workflows
|
|
8
|
+
|
|
9
|
+
- **`claude-code-review.yml`** - Basic Claude Code review workflow
|
|
10
|
+
- **`claude-code-review-custom.yml`** - Customizable Claude Code review workflow with advanced options
|
|
11
|
+
|
|
12
|
+
### Security Review Workflow
|
|
13
|
+
|
|
14
|
+
- **`security.yml`** - Automated security review workflow
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
To use these templates in your project:
|
|
19
|
+
|
|
20
|
+
1. Copy the desired `.yml` file to your repository's `.github/workflows/` directory:
|
|
21
|
+
```bash
|
|
22
|
+
cp templates/github-actions/claude-code-review.yml .github/workflows/
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
2. Set up required secrets in your GitHub repository settings:
|
|
26
|
+
- `CLAUDE_CODE_OAUTH_TOKEN` or `CLAUDE_API_KEY`
|
|
27
|
+
|
|
28
|
+
3. Customize the workflow as needed for your project
|
|
29
|
+
|
|
30
|
+
4. The workflow will automatically run on pull requests
|
|
31
|
+
|
|
32
|
+
## Documentation
|
|
33
|
+
|
|
34
|
+
For more information about setting up Claude Code in GitHub Actions, see:
|
|
35
|
+
- [Code Review Documentation](../../.claude/commands/code-review/README.md)
|
|
36
|
+
- [Security Review Documentation](../../.claude/commands/security-review/README.md)
|
|
File without changes
|
|
File without changes
|
/package/{.claude/commands/code-review → templates/github-actions}/claude-code-review-custom.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|