Restructured project from nested workspace pattern to flat single-repo layout. This eliminates redundant nesting and consolidates all project files under version control. ## Migration Summary **Before:** ``` alex/ (workspace, not versioned) ├── chess-game/ (git repo) │ ├── js/, css/, tests/ │ └── index.html └── docs/ (planning, not versioned) ``` **After:** ``` alex/ (git repo, everything versioned) ├── js/, css/, tests/ ├── index.html ├── docs/ (project documentation) ├── planning/ (historical planning docs) ├── .gitea/ (CI/CD) └── CLAUDE.md (configuration) ``` ## Changes Made ### Structure Consolidation - Moved all chess-game/ contents to root level - Removed redundant chess-game/ subdirectory - Flattened directory structure (eliminated one nesting level) ### Documentation Organization - Moved chess-game/docs/ → docs/ (project documentation) - Moved alex/docs/ → planning/ (historical planning documents) - Added CLAUDE.md (workspace configuration) - Added IMPLEMENTATION_PROMPT.md (original project prompt) ### Version Control Improvements - All project files now under version control - Planning documents preserved in planning/ folder - Merged .gitignore files (workspace + project) - Added .claude/ agent configurations ### File Updates - Updated .gitignore to include both workspace and project excludes - Moved README.md to root level - All import paths remain functional (relative paths unchanged) ## Benefits ✅ **Simpler Structure** - One level of nesting removed ✅ **Complete Versioning** - All documentation now in git ✅ **Standard Layout** - Matches open-source project conventions ✅ **Easier Navigation** - Direct access to all project files ✅ **CI/CD Compatible** - All workflows still functional ## Technical Validation - ✅ Node.js environment verified - ✅ Dependencies installed successfully - ✅ Dev server starts and responds - ✅ All core files present and accessible - ✅ Git repository functional ## Files Preserved **Implementation Files:** - js/ (3,517 lines of code) - css/ (4 stylesheets) - tests/ (87 test cases) - index.html - package.json **CI/CD Pipeline:** - .gitea/workflows/ci.yml - .gitea/workflows/release.yml **Documentation:** - docs/ (12+ documentation files) - planning/ (historical planning materials) - README.md **Configuration:** - jest.config.js, babel.config.cjs, playwright.config.js - .gitignore (merged) - CLAUDE.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
402 lines
12 KiB
Markdown
402 lines
12 KiB
Markdown
# Repository Structure Decision Tree
|
|
|
|
Quick reference guide for making structure decisions as the project evolves.
|
|
|
|
---
|
|
|
|
## When to Consider Restructuring
|
|
|
|
Use this decision tree when you encounter structure questions:
|
|
|
|
```
|
|
START: Should we change the directory structure?
|
|
│
|
|
├─► Are we adding a build step? (TypeScript, Webpack, Vite, etc.)
|
|
│ │
|
|
│ ├─► YES → Consider `/src/` + `/dist/` structure
|
|
│ │ Benefits: Source vs. compiled separation
|
|
│ │ Cost: Migration effort (15-20 hours)
|
|
│ │ Recommended: Only if build is necessary
|
|
│ │
|
|
│ └─► NO → Keep current structure ✅
|
|
│
|
|
├─► Is the project becoming a monorepo? (multiple packages)
|
|
│ │
|
|
│ ├─► YES → Consider `/packages/` structure
|
|
│ │ Benefits: Multiple publishable packages
|
|
│ │ Cost: High (new tooling, CI/CD changes)
|
|
│ │ Recommended: Only with 3+ independent packages
|
|
│ │
|
|
│ └─► NO → Keep current structure ✅
|
|
│
|
|
├─► Are imports becoming complex? (../../../components/...)
|
|
│ │
|
|
│ ├─► YES → Fix imports, DON'T restructure
|
|
│ │ Solution: Use path aliases in jsconfig.json
|
|
│ │ Example: "@/pieces" instead of "../../pieces"
|
|
│ │
|
|
│ └─► NO → Keep current structure ✅
|
|
│
|
|
├─► Is a directory growing too large? (>20 files)
|
|
│ │
|
|
│ ├─► YES → Create logical subdirectories WITHIN that directory
|
|
│ │ Example: /js/pieces/ → /js/pieces/standard/ + /js/pieces/variants/
|
|
│ │ DON'T: Move entire directory structure
|
|
│ │
|
|
│ └─► NO → Keep current structure ✅
|
|
│
|
|
├─► Are we converting to a library/package?
|
|
│ │
|
|
│ ├─► YES → Consider `/lib/` or `/dist/` for publishable code
|
|
│ │ Benefits: Clear library entry point
|
|
│ │ Cost: Medium (package.json updates, build config)
|
|
│ │
|
|
│ └─► NO → Keep current structure ✅
|
|
│
|
|
└─► Is this purely aesthetic or "feeling wrong"?
|
|
│
|
|
├─► YES → DON'T change ⛔
|
|
│ Rationale: Current structure follows best practices
|
|
│ Risk: Unnecessary churn, broken imports, CI/CD updates
|
|
│
|
|
└─► NO → Evaluate with technical criteria above
|
|
```
|
|
|
|
---
|
|
|
|
## Adding Features Decision Tree
|
|
|
|
```
|
|
START: Where should I add this new feature?
|
|
│
|
|
├─► Is it a new chess piece type?
|
|
│ └─► Add to /js/pieces/
|
|
│ Example: /js/pieces/Archbishop.js (chess variant)
|
|
│
|
|
├─► Is it a new game rule or validation?
|
|
│ └─► Add to /js/engine/
|
|
│ Example: /js/engine/DrawConditions.js
|
|
│
|
|
├─► Is it a new UI component?
|
|
│ ├─► Rendering logic? → /js/views/
|
|
│ │ Example: /js/views/ThemeRenderer.js
|
|
│ │
|
|
│ └─► User interaction? → /js/controllers/
|
|
│ Example: /js/controllers/TouchHandler.js
|
|
│
|
|
├─► Is it a major new feature domain? (AI, Network, Puzzles)
|
|
│ └─► Create new top-level directory in /js/
|
|
│ Examples:
|
|
│ - /js/ai/ (AI opponent)
|
|
│ - /js/network/ (Multiplayer)
|
|
│ - /js/puzzles/ (Puzzle mode)
|
|
│ - /js/analysis/ (Game analysis)
|
|
│
|
|
├─► Is it a utility function?
|
|
│ └─► Add to /js/utils/
|
|
│ Example: /js/utils/FENParser.js
|
|
│
|
|
├─► Is it a new stylesheet?
|
|
│ └─► Add to /css/
|
|
│ Example: /css/themes.css, /css/animations.css
|
|
│
|
|
├─► Is it test-related?
|
|
│ └─► Mirror source structure in /tests/
|
|
│ Example: /js/ai/MinimaxEngine.js → /tests/unit/ai/MinimaxEngine.test.js
|
|
│
|
|
└─► Is it documentation?
|
|
└─► Add to /docs/
|
|
Example: /docs/AI_DESIGN.md
|
|
```
|
|
|
|
---
|
|
|
|
## File Size Guidelines
|
|
|
|
```
|
|
File Size Thresholds:
|
|
─────────────────────────────────────────────────
|
|
|
|
< 300 lines ✅ Optimal size
|
|
300-500 lines ⚠️ Consider refactoring soon
|
|
500-800 lines 🔴 Should refactor into modules
|
|
> 800 lines ⛔ MUST refactor immediately
|
|
|
|
Action when file is too large:
|
|
1. Extract related functions into new files
|
|
2. Create subdirectory if needed
|
|
3. Update imports
|
|
4. Update tests
|
|
```
|
|
|
|
---
|
|
|
|
## Directory Size Guidelines
|
|
|
|
```
|
|
Files per Directory:
|
|
─────────────────────────────────────────────────
|
|
|
|
1-7 files ✅ Optimal (easy to scan)
|
|
8-15 files ⚠️ Still manageable
|
|
16-25 files 🔴 Consider grouping into subdirectories
|
|
> 25 files ⛔ MUST create subdirectories
|
|
|
|
Action when directory is too large:
|
|
1. Group related files logically
|
|
2. Create subdirectories by feature/concern
|
|
3. Maintain flat structure where possible
|
|
4. DON'T go deeper than 4 levels
|
|
```
|
|
|
|
---
|
|
|
|
## Import Path Complexity Guidelines
|
|
|
|
```
|
|
Relative Import Depth:
|
|
─────────────────────────────────────────────────
|
|
|
|
./file.js ✅ Same directory (best)
|
|
../other.js ✅ Parent directory (good)
|
|
../../file.js ⚠️ Two levels up (acceptable)
|
|
../../../file.js 🔴 Three levels up (refactor structure)
|
|
../../../../ ⛔ NEVER acceptable (broken structure)
|
|
|
|
Solutions for deep imports:
|
|
1. Restructure directories to reduce depth
|
|
2. Use path aliases (jsconfig.json)
|
|
3. Create barrel exports (index.js files)
|
|
```
|
|
|
|
---
|
|
|
|
## When to Use Subdirectories
|
|
|
|
### ✅ Create Subdirectory When:
|
|
- Grouping related files (≥3 files with same concern)
|
|
- Feature domain is distinct (AI, Network, Puzzles)
|
|
- Files share common dependencies
|
|
- Clear boundary exists (pieces/standard vs. pieces/variants)
|
|
|
|
### ❌ DON'T Create Subdirectory When:
|
|
- Only 1-2 files would be in it
|
|
- No clear logical grouping
|
|
- Just to reduce directory size aesthetically
|
|
- It would increase import complexity
|
|
|
|
---
|
|
|
|
## Migration Checklist
|
|
|
|
If you MUST restructure (e.g., adding TypeScript), follow this checklist:
|
|
|
|
### Phase 1: Planning (Day 1)
|
|
- [ ] Document current import paths
|
|
- [ ] List all files to be moved
|
|
- [ ] Identify CI/CD dependencies
|
|
- [ ] Review HTML script tags
|
|
- [ ] Check web server configurations
|
|
- [ ] Backup current state (git tag)
|
|
|
|
### Phase 2: Code Changes (Day 2-3)
|
|
- [ ] Create new directory structure
|
|
- [ ] Move files with git mv (preserves history)
|
|
- [ ] Update ALL import paths
|
|
- [ ] Update HTML script tags
|
|
- [ ] Update package.json scripts
|
|
- [ ] Update jsconfig.json / tsconfig.json
|
|
|
|
### Phase 3: Infrastructure (Day 4)
|
|
- [ ] Update CI/CD workflows (.gitea/workflows/*.yml)
|
|
- [ ] Update linter configuration
|
|
- [ ] Update test configurations
|
|
- [ ] Update .gitignore if needed
|
|
- [ ] Update web server configs
|
|
|
|
### Phase 4: Documentation (Day 5)
|
|
- [ ] Update README.md examples
|
|
- [ ] Update all /docs/ file references
|
|
- [ ] Update API documentation
|
|
- [ ] Create migration notes
|
|
- [ ] Update CLAUDE.md instructions
|
|
|
|
### Phase 5: Testing (Day 6-7)
|
|
- [ ] Run full test suite
|
|
- [ ] Verify CI/CD pipeline
|
|
- [ ] Test local development server
|
|
- [ ] Test production build
|
|
- [ ] Test all import paths
|
|
- [ ] Manual QA testing
|
|
|
|
### Phase 6: Deployment
|
|
- [ ] Create pull request
|
|
- [ ] Team review
|
|
- [ ] Merge and deploy
|
|
- [ ] Monitor for issues
|
|
- [ ] Update team documentation
|
|
|
|
**Estimated Effort:** 15-20 hours minimum
|
|
**Risk Level:** High
|
|
**Only proceed if benefits clearly outweigh costs!**
|
|
|
|
---
|
|
|
|
## Common Scenarios & Decisions
|
|
|
|
### Scenario 1: "We want to add TypeScript"
|
|
```
|
|
Question: Should we restructure?
|
|
Answer: YES - Create /src/ and /dist/
|
|
|
|
New Structure:
|
|
chess-game/
|
|
├── src/ ← TypeScript source
|
|
│ ├── js/ (rename to /ts/)
|
|
│ ├── css/
|
|
│ └── index.html
|
|
├── dist/ ← Compiled JavaScript
|
|
└── tsconfig.json
|
|
|
|
Rationale: Build step justifies source/output separation
|
|
Effort: 15-20 hours
|
|
```
|
|
|
|
---
|
|
|
|
### Scenario 2: "We want to add Vite bundler"
|
|
```
|
|
Question: Should we restructure?
|
|
Answer: MAYBE - Vite works with current structure
|
|
|
|
Option A: Keep current (easier)
|
|
- Vite serves from root
|
|
- vite.config.js points to index.html
|
|
- No migration needed
|
|
|
|
Option B: Move to /src/ (standard Vite pattern)
|
|
- Follows Vite conventions
|
|
- Requires migration effort
|
|
|
|
Recommendation: Start with Option A, migrate to B only if needed
|
|
```
|
|
|
|
---
|
|
|
|
### Scenario 3: "The /js/pieces/ directory has 20 files"
|
|
```
|
|
Question: Should we restructure entire project?
|
|
Answer: NO - Restructure ONLY /js/pieces/
|
|
|
|
Solution:
|
|
js/pieces/
|
|
├── standard/ ← FIDE pieces
|
|
│ ├── Pawn.js
|
|
│ ├── Knight.js, etc.
|
|
├── variants/ ← Chess variants
|
|
│ ├── Archbishop.js
|
|
│ └── Chancellor.js
|
|
└── Piece.js ← Base class stays at top
|
|
|
|
Impact: Minimal (only pieces/ imports change)
|
|
Effort: 2-3 hours
|
|
```
|
|
|
|
---
|
|
|
|
### Scenario 4: "Imports are getting messy"
|
|
```
|
|
Question: Should we restructure?
|
|
Answer: NO - Use path aliases
|
|
|
|
Solution: Create jsconfig.json
|
|
{
|
|
"compilerOptions": {
|
|
"baseUrl": ".",
|
|
"paths": {
|
|
"@/pieces/*": ["js/pieces/*"],
|
|
"@/engine/*": ["js/engine/*"],
|
|
"@/utils/*": ["js/utils/*"]
|
|
}
|
|
}
|
|
}
|
|
|
|
Before: import { Piece } from '../../pieces/Piece.js';
|
|
After: import { Piece } from '@/pieces/Piece.js';
|
|
|
|
Impact: None (aliases only)
|
|
Effort: 1 hour
|
|
```
|
|
|
|
---
|
|
|
|
### Scenario 5: "We're building a mobile app too"
|
|
```
|
|
Question: Should we restructure to monorepo?
|
|
Answer: MAYBE - Depends on code sharing
|
|
|
|
Option A: Separate repos (if little code sharing)
|
|
chess-game/ (web)
|
|
chess-game-mobile/ (mobile)
|
|
|
|
Option B: Monorepo (if significant code sharing)
|
|
chess-project/
|
|
├── packages/
|
|
│ ├── web/ (current project)
|
|
│ ├── mobile/ (React Native)
|
|
│ └── shared/ (chess engine, shared logic)
|
|
|
|
Recommendation: Start with Option A, move to B only if needed
|
|
```
|
|
|
|
---
|
|
|
|
## Red Flags: When NOT to Restructure
|
|
|
|
### 🚩 Don't restructure if:
|
|
- "It just feels wrong" (aesthetic preference)
|
|
- "Other projects do it differently" (context matters)
|
|
- "We might need it someday" (YAGNI principle)
|
|
- "I read an article about /src/" (blindly following trends)
|
|
- "The folder has too many files" (create subdirectories, don't restructure all)
|
|
|
|
### ✅ Do restructure if:
|
|
- Adding build/compilation step (TypeScript, bundling)
|
|
- Converting to monorepo (multiple packages)
|
|
- Technical constraint requires it (framework convention)
|
|
- Import complexity is unmanageable (>3 levels)
|
|
- Team consensus with clear technical benefit
|
|
|
|
---
|
|
|
|
## Quick Reference: Project Type → Structure
|
|
|
|
| Project Type | Structure | Rationale |
|
|
|-------------|-----------|-----------|
|
|
| **Vanilla JS Web App** | Root-level /js/, /css/ | ✅ Current (optimal) |
|
|
| **TypeScript Project** | /src/ + /dist/ | Build step justifies separation |
|
|
| **React/Vue/Angular** | /src/ | Framework convention |
|
|
| **Library/Package** | /lib/ or /dist/ | Publishable output |
|
|
| **Monorepo** | /packages/ | Multiple independent packages |
|
|
| **Static Site** | Root-level files | Direct web serving |
|
|
|
|
**Our Project:** Vanilla JS Web App → Current structure is correct ✅
|
|
|
|
---
|
|
|
|
## Summary: Golden Rules
|
|
|
|
1. **YAGNI Principle:** Don't restructure until you actually need it
|
|
2. **Flat is Better:** Avoid unnecessary nesting
|
|
3. **Convention > Configuration:** Follow standards for your project type
|
|
4. **Measure Twice, Cut Once:** Restructuring is expensive
|
|
5. **Technical Justification:** Need clear technical benefit, not just aesthetics
|
|
6. **Team Agreement:** Get consensus before major changes
|
|
7. **Migration Plan:** Never restructure without a detailed plan
|
|
8. **Test Everything:** Structure changes break things subtly
|
|
|
|
---
|
|
|
|
**Last Updated:** November 23, 2025
|
|
**Use this guide for all future structure decisions!**
|