Import Melee matches exports, add tests and local podman stack

- Parse Melee matches exports (one round per file, byes, null GameWins);
  one import form detects matches vs standings exports. Re-importing a
  round replaces just that round and keeps entered decks.
- Per-player deck entry for sessions scored from matches.
- node:test suite with anonymised fixtures; lockfile.
- scripts/local.sh runs the compose stack under podman with its own
  .env.local, project name and volume.
- README and CLAUDE.md docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
derekandClaude Opus 5.5 committed 2026-10-28 16:58:24 +00:00
1 parent a7f440c658
commit 985c85bcef
15 files changed
+2450 -27

No files matched your search

+103
View File
@@ -0,0 +1,103 @@
[
{
"Competitors": [
{
"Team": {
"Players": [
{
"Name": "Eve Evans",
"DisplayName": "eve",
"Username": "eve"
}
]
},
"SortOrder": 0,
"GameByes": 2,
"GameWins": null,
"GameWinsAndGameByes": 2,
"Decklists": []
}
],
"RoundNumber": 4,
"GameDraws": 0,
"HasResult": true
},
{
"Competitors": [
{
"Team": {
"Players": [
{
"Name": "Alice Archer",
"DisplayName": "alice",
"Username": "alice"
}
]
},
"SortOrder": 0,
"GameByes": null,
"GameWins": 2,
"GameWinsAndGameByes": 2,
"Decklists": []
},
{
"Team": {
"Players": [
{
"Name": "Bob Baker",
"DisplayName": "bobb",
"Username": "bobb"
}
]
},
"SortOrder": 1,
"GameByes": null,
"GameWins": null,
"GameWinsAndGameByes": 0,
"Decklists": []
}
],
"RoundNumber": 4,
"GameDraws": 0,
"HasResult": true
},
{
"Competitors": [
{
"Team": {
"Players": [
{
"Name": "Cara Chen",
"DisplayName": "cara",
"Username": "cara"
}
]
},
"SortOrder": 0,
"GameByes": null,
"GameWins": 1,
"GameWinsAndGameByes": 1,
"Decklists": []
},
{
"Team": {
"Players": [
{
"Name": "Dan Doyle",
"DisplayName": "dand",
"Username": "dand"
}
]
},
"SortOrder": 1,
"GameByes": null,
"GameWins": 2,
"GameWinsAndGameByes": 2,
"Decklists": []
}
],
"RoundNumber": 4,
"GameDraws": 0,
"HasResult": true
}
]
+66
View File
@@ -0,0 +1,66 @@
[
{
"Team": {
"Players": [
{
"Name": "Alice Archer",
"DisplayName": "alice",
"Username": "alice"
}
]
},
"RoundNumber": 1,
"Points": 3,
"MatchWins": 1,
"MatchDraws": 0,
"MatchLosses": 0
},
{
"Team": {
"Players": [
{
"Name": "Bob Baker",
"DisplayName": "bobb",
"Username": "bobb"
}
]
},
"RoundNumber": 1,
"Points": 0,
"MatchWins": 0,
"MatchDraws": 0,
"MatchLosses": 1
},
{
"Team": {
"Players": [
{
"Name": "Alice Archer",
"DisplayName": "alice",
"Username": "alice"
}
]
},
"RoundNumber": 2,
"Points": 6,
"MatchWins": 2,
"MatchDraws": 0,
"MatchLosses": 0
},
{
"Team": {
"Players": [
{
"Name": "Bob Baker",
"DisplayName": "bobb",
"Username": "bobb"
}
]
},
"RoundNumber": 2,
"Points": 1,
"MatchWins": 0,
"MatchDraws": 1,
"MatchLosses": 1
}
]