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>
12 KiB
12 KiB
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
- YAGNI Principle: Don't restructure until you actually need it
- Flat is Better: Avoid unnecessary nesting
- Convention > Configuration: Follow standards for your project type
- Measure Twice, Cut Once: Restructuring is expensive
- Technical Justification: Need clear technical benefit, not just aesthetics
- Team Agreement: Get consensus before major changes
- Migration Plan: Never restructure without a detailed plan
- Test Everything: Structure changes break things subtly
Last Updated: November 23, 2025 Use this guide for all future structure decisions!