chess/docs/STRUCTURE_DECISION_TREE.md
Christoph Wagner 5ad0700b41 refactor: Consolidate repository structure - flatten from workspace pattern
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>
2025-11-23 10:05:26 +01:00

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

  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!