113 Commits
Author SHA1 Message Date
tiennm99 cf612bc23f feat: host cc4e-course quiz and advanced-claude-workflows lesson on the unified Pages site
The quiz app is a pure client-side Next.js page, so it static-exports with
output: 'export' and a basePath under the site; the lesson thumbnail is a
self-contained HTML file served as that directory's index.
2026-08-11 11:45:21 +07:00
tiennm99 462e1fff6d chore: unify the labs under one GitHub Pages site
Each web demo builds with its base path under /ai-coding-workflow-labs/,
a single deploy workflow assembles them with a root index, and the
per-directory workflows from the standalone repos are removed.
2026-08-10 18:04:52 +07:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
b49b9dfe1a chore(deps): bump next from 16.2.3 to 16.2.11 in /quiz-project (#6)
Bumps [next](https://github.com/vercel/next.js) from 16.2.3 to 16.2.11.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Commits](https://github.com/vercel/next.js/compare/v16.2.3...v16.2.11)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 16.2.11
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-25 16:16:10 +07:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
75aad39a73 chore(deps-dev): bump js-yaml from 4.1.1 to 4.3.0 in /quiz-project (#5)
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.1 to 4.3.0.
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.1.1...4.3.0)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.3.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-25 16:15:42 +07:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
06c27cf942 chore(deps-dev): bump flatted from 3.3.4 to 3.4.2 in /quiz-project (#2)
Bumps [flatted](https://github.com/WebReflection/flatted) from 3.3.4 to 3.4.2.
- [Commits](https://github.com/WebReflection/flatted/compare/v3.3.4...v3.4.2)

---
updated-dependencies:
- dependency-name: flatted
  dependency-version: 3.4.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 13:35:12 +07:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2cfd2ea11d chore(deps): bump picomatch in /quiz-project (#3)
Bumps  and [picomatch](https://github.com/micromatch/picomatch). These dependencies needed to be updated together.

Updates `picomatch` from 2.3.1 to 2.3.2
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)

Updates `picomatch` from 4.0.3 to 4.0.4
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 2.3.2
  dependency-type: indirect
- dependency-name: picomatch
  dependency-version: 4.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 13:33:22 +07:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
9e9989e04d chore(deps): bump next from 16.1.6 to 16.2.3 in /quiz-project (#4)
Bumps [next](https://github.com/vercel/next.js) from 16.1.6 to 16.2.3.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v16.1.6...v16.2.3)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 16.2.3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 13:33:17 +07:00
78572c205c v0.0.4.0 feat(module-2): tam giác đồng dạng (lớp 8, scale slider) (#4)
* feat(component): similarity-scale slider controller

Single-slider similarity demo for Module 2. Fixed △ABC, scaled △A'B'C' computed
each frame as `centroid_target + k · (vertex − centroid_ABC)` for k ∈ [0.5, 2].
The slider's input event is the only event listener — no Pointer Events here
(we're not dragging vertices in this MVP). AbortController teardown on
astro:before-swap as before.

The renderTicks helper is duplicated from congruence-sss.ts for now — when
Module 4 lands we'll factor it out into a shared module. Premature
abstraction would force a circular import structure for one helper.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(module-2): tam giác đồng dạng (lớp 8) with scale slider

Page at /lop-8/tam-giac-dong-dang/. △ABC fixed on the left at scalene scale-72.8 / 83.2 / 93.4 sides. △A'B'C' is the runtime scaled image, controlled by a
single range input k ∈ [0.5, 2] step 0.05.

Live readout table shows all six side lengths and all three ratios. The killer
moment: drag the slider, watch all 3 ratios stay numerically equal to each
other (= 1/k). That equality IS the definition of similarity, made visible.

Tick marks per Decision D3: 1/2/3 ticks color-paired (#D7263D / #1B998B /
#F46036). Triangle 1 ticks rendered once on mount; triangle 2 ticks redrawn
on every slider input.

Hub: lớp 8 card flips to live status. All 3 grade cards now active —
the autoplan 3-module hero set is complete.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: VERSION 0.0.4.0 + CHANGELOG + TODOS update

v0.0.4.0 = scaffold + Module 3 (góc nội tiếp) + Module 1 (tam giác bằng nhau)
+ Module 2 (tam giác đồng dạng). All three MVP modules from autoplan now live.

Move 2 P1 items to Completed (scale slider, ratio readout) and reduce Module 2
remaining items to P2 (free-drag mode) + P3 (numeric angle readouts).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 00:25:08 +07:00
1d347027f6 v0.0.3.0 feat(module-1): drag-to-explore tam giác bằng nhau (lớp 7, SSS) (#3)
* feat(geom-engine): triangle module + position-strict congruentSSS

Third pure module under src/geom-engine/. Adds Triangle type, sides() (returns
named AB / BC / CA lengths), and congruentSSS() with position-strict semantics:
labels define the correspondence (AB↔A'B', BC↔B'C', CA↔C'A'), permuted matches
are NOT counted as congruent. This preserves SGK pedagogy where the labels and
the matched-pair encoding (color + tick marks) carry meaning.

10 new unit tests: identical, translated-congruent, similar-not-congruent (2x scale),
shape-different, EPSILON_LEN tolerance (within and just outside), label-permutation
rejection, and symmetry of the relation.

Total tests: 29 → 39.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(module-1): drag-to-explore tam giác bằng nhau (lớp 7, SSS)

Second interactive theorem demo. Page at /lop-7/tam-giac-bang-nhau/.

Component: src/components/congruence-sss.ts owns 6 draggable vertices (3 per
triangle), each independently captured via setPointerCapture per vertex.
Drag-clamping (16px viewBox padding) keeps every vertex on-screen.

Encoding per autoplan Decision D3 (a11y + SGK-correct in one move):
  AB / A'B' → pair1 #D7263D + 1 tick
  BC / B'C' → pair2 #1B998B + 2 ticks
  CA / C'A' → pair3 #F46036 + 3 ticks
Tick marks are SVG line segments perpendicular to each side at the midpoint,
spaced 5 viewBox-units apart for multi-tick. Redrawn live during drag.

Page: viewBox 400x300 (4:3, side-by-side triangles), single 6KB page including
inline JS bundle (entire geom-engine + canvas controller, minified).

Live side-length readout table + green badge "Hai tam giác bằng nhau (c.c.c)"
that appears when SSS condition holds within EPSILON_LEN. Badge has
role="status" + aria-live="polite" so screen readers announce the moment the
triangles become congruent.

Rigid-motion overlay animation EXPLICITLY DROPPED per autoplan — color+tick
match is the success state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(hub): activate lớp 7 card linking to tam giác bằng nhau module

Status flips from sap-ra-mat to live; href points at the new module.
i18n/vi.ts gains module1.* strings (intro, instruction, theorem, example,
SGK-aligned theorem statement) so every user-facing string still routes
through t() — adding English in the future is one en.ts file away.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: VERSION 0.0.3.0 + CHANGELOG + TODOS update

v0.0.3.0 = scaffold + Module 3 (góc nội tiếp) + Module 1 (tam giác bằng nhau).
2 of 3 MVP modules now live. Module 2 (tam giác đồng dạng) is next.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: TODOS Module 1 reflects v0.0.3.0 (SSS shipped)

Original P1 items "SSS detector" + "SGK tick-mark encoding" already moved to
Completed in the previous commit. Replace the still-pending M1 section with
the actual remaining work: P2 toggles for SAS/ASA/AAS/cạnh huyền cases, P3 for
extra examples.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 00:17:26 +07:00
776e155cd5 v0.0.2.0 feat(module-3): drag-to-explore góc nội tiếp (lớp 9) (#2)
* chore: ignore .gstack/ deploy reports

/land-and-deploy writes per-deploy artifacts to .gstack/deploy-reports/. Those
shouldn't enter the repo. Captured here so future runs don't surface stale diffs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(geom-engine): circle module + inscribed-angle invariance test

Add the second pure module per autoplan eng decision E1: src/geom-engine/circle.ts
with circle(), pointOnCircle(), projectToCircle() (snap-to-circle for Module 3 drag),
and angleAtVertex() (clamped against IEEE-754 drift to prevent acos NaN at exactly
collinear angles).

The killer-demo property test pins the inscribed-angle theorem as a CI gate: pick
two fixed points A and B on a unit circle, sample 7 different M positions on the
major arc, and assert all sampled inscribed angles AMB stay within 0.5° of the
reference. If this test ever fails, Module 3's central premise is broken.

13 new unit tests, total 29 passing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(module-3): drag-to-explore góc nội tiếp page (lớp 9)

Ship the first interactive theorem demo. Page lives at /lop-9/goc-noi-tiep/.

Component: src/components/inscribed-angle.ts wires Pointer Events +
setPointerCapture per autoplan eng decision E1. Drag M; on every pointermove,
project the pointer to the circle (M = center + r·normalize(pointer − center))
so M never escapes the circle. Live readouts: ∠AMB at M (inscribed, pair1 red),
∠AOB at center O (central, pair2 teal). All listeners use AbortController
keyed on astro:before-swap so view-transition navigation doesn't leak.

Page: src/pages/lop-9/goc-noi-tiep.astro holds the SVG canvas (viewBox 400x400,
touch-action: none scoped to canvas), theorem panel, and one worked example
walking the 120°/60° canonical case. Astro bundles the script inline so the
single page ships ~7KB total (including the entire geom-engine + component).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(hub): link lớp 9 card to góc nội tiếp module

Hub landing page now branches each grade card on grade.href:
- live cards render as <a> with hover affordance (lớp 9 only, for now)
- coming-soon cards stay as <li> with opacity 0.7 and "Sắp ra mắt" badge

Status taxonomy extended: 'sap-ra-mat' | 'live' so future modules just flip the
status when their page ships.

i18n/vi.ts gains module3.* (intro, theorem, example, instruction copy) plus a new
'live' status string ("Khám phá") so every user-facing string stays inside vi.ts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: VERSION 0.0.2.0 + CHANGELOG entry

First feature release. v0.0.2.0 = scaffold + Module 3 góc nội tiếp.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: mark TODOS items completed by v0.0.2.0

- Drag M with circle constraint → DONE in src/components/inscribed-angle.ts
- TheoremCanvas primitive first cut → DONE (built directly in Astro)
- Theorem panel + worked examples → PARTIAL (1 of 3 examples shipped)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 00:03:34 +07:00
6fdee1a5de v0.0.1.0 chore: scaffold Hình Học Sống (Astro + GitHub Pages) (#1)
* chore: add gstack skill routing rules to CLAUDE.md

Append a "## Skill routing" section so future Claude Code sessions in this repo route
each task through the matching gstack skill (e.g., /investigate for bugs, /ship for PRs,
/office-hours for product brainstorming).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: scaffold Astro 5 + TypeScript strict with base /try-gstack/

Initialize the project per the autoplan-locked decisions:
- Astro 5 SSG, output static, base path /try-gstack/ for GitHub Pages subdirectory hosting
- TypeScript strict (Astro's strict tsconfig + path alias ~/* -> src/*)
- @astrojs/sitemap for SEO meta
- bun as the package manager (lockfile committed)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: Vietnamese landing page with Be Vietnam Pro + i18n stub

Implement the locked design decisions D2 (typography) and D3 (palette) plus the i18n
discipline from autoplan eng review:
- Be Vietnam Pro single family (woff2, weights 400/500/700, vietnamese subset) self-hosted
  via @fontsource so KaTeX/CDN-blocking ISPs cannot break the page
- font-feature-settings: "kern", "locl" for proper VN diacritic positioning
- 17px body / 1.6 line-height / max-w-prose 56ch (denser than English)
- 3-color SGK-aligned palette in tailwind config: pair1 #D7263D, pair2 #1B998B, pair3 #F46036
- BaseLayout with lang="vi", canonical URL, OpenGraph (vi_VN), X-Frame-Options DENY
- src/i18n/vi.ts holds every user-facing string; t() helper resolves the active locale.
  Adding English later means adding en.ts; no string churn through templates.
- Landing page lists three grade cards with "Sắp ra mắt" status (modules ship later)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test: bootstrap Vitest with pure geom-engine vec module

Establish the math-engine boundary and test discipline from autoplan eng decision E2:
- src/geom-engine/ is pure (no DOM imports allowed); first module is vec.ts
- Vec2 helpers: vec, add, sub, scale, dot, len, dist, normalize, approxEqualLen
- EPSILON_LEN=0.5 viewBox units justified vs ~4px human drag precision
- scale() normalizes IEEE-754 -0 back to +0 so consumers don't see signed-zero ghosts
- Vitest config gates the module at 95% line/function/statement, 90% branch
- 16 unit tests covering commutativity, mutation safety, orthogonality, normalization,
  and EPSILON tolerance behavior

Property tests via fast-check come with the first canvas module; this commit establishes
the test scaffold so adding them later is one dependency away.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ci: GitHub Actions test workflow + Pages deploy via deploy-pages@v4

Wire the autoplan-locked CI/CD pipeline (decision E3) for GitHub Pages hosting:
- ci.yml: typecheck + tests + build on every PR and push to main
- deploy.yml: build + actions/deploy-pages@v4 on push to main, concurrency-grouped
  so a force-push retry doesn't abort an in-flight rollback
- Build env pins SITE_URL=https://tiennm99.github.io and SITE_BASE=/try-gstack so
  astro.config.mjs produces correct canonical/OG URLs against the subdirectory host
- bun 1.3.13 pinned for both workflows

Lighthouse-CI + size-limit gates deferred until the first canvas module ships
(no JS bundle to budget yet — current pages are zero-JS).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: VERSION 0.0.1.0 + CHANGELOG + RUNBOOK + README rewrite

Initial 4-digit gstack version (matches package.json), changelog entry for the scaffold,
operations runbook covering rollback and the deferred .vn domain trigger (500 sessions/30d
OR 1 organic teacher share OR 5+ modules shipped). README rewritten as the project README
for Hình Học Sống with the locked architectural decisions visible to teammates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: TODOS.md tracking deferred autoplan items

Capture the deferred work surfaced by the /office-hours + /autoplan reviews so the
backlog is visible to teammates and bisectable from the source-of-truth design doc.
Organized by component (Phase 0 distribution, TheoremCanvas, Module 3/1/2, testing
infrastructure, retention, domain) then priority P0–P4. Per the gstack TODOS.md
format conventions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 23:43:37 +07:00
tiennm99 ac2440c5f9 chore: add Apache-2.0 license 2026-04-29 21:33:41 +07:00
tiennm99 1534a219bc chore: add Apache-2.0 license 2026-04-29 21:33:27 +07:00
tiennm99andClaude Opus 4.7 242bafe13e Add CLAUDE.md so teammates pick up gstack
Documents the one-time install steps, the /browse-only browsing policy,
and lists the available gstack slash commands so a Claude Code session
in this repo has the convention loaded.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 13:08:07 +07:00
tiennm99andClaude Opus 4.7 8bbde21f46 Initial commit: sandbox for trying gstack
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 11:31:32 +07:00
tiennm99 1ee0a89d5c feat: v3 — tiers, drones, medals, bonus waves, announcer, hit-stop, top-5 leaderboard
Chicken-Invaders + 1942-inspired additions: stack a booster to level it
(L1-L3, larger spread / faster fire / deeper pierce), new drone
power-up spawning 1-2 orbital companions that fire along with you,
medal pickups that fly up on kill for bonus score and combo, a
meteor-rain bonus wave every 4th non-boss wave, flavor-specific
announcer banners (ROLL CALL, SHOOTERS JOIN, BOSS APPROACHING,
PERFECT WAVE), hit-stop on boss kills and combo bumps, and a
persistent top-5 local leaderboard with game-over placement
highlight. Verifier approved with zero blockers.
2026-04-19 10:25:28 +07:00
tiennm99 de63dd095a feat: v2 — power-ups, dash, boss waves, starfield, floaters, settings
Adds Chicken-Invaders-style booster drops (rapidfire/spread/pierce/
shield/heal/bomb) with magnetism pickup, Shift-dash with invuln +
ghost trail, boss fight every 5th wave (radial + aimed attacks),
shooter enemy with projectiles from wave 3+, parallax starfield,
combo score floaters, and a pause-screen settings overlay (volume
+ shake toggle) persisted to localStorage. Built in parallel by a
4-worker OMC team; blockers found by verifier were patched in place.
2026-04-19 09:56:27 +07:00
tiennm99 ff3d1bf199 ci: deploy static site to GitHub Pages on push to main 2026-04-19 09:31:15 +07:00
tiennm99 d0209942be feat: add OMC Neon Arena webgame demo
Browser arcade survival shooter built to showcase oh-my-claudecode
multi-agent orchestration: engine, gameplay, UI, and docs delivered
in parallel by specialist workers with dependency-gated task graph.
2026-04-19 09:27:32 +07:00
tiennm99 d8666b87d3 chore: add oh-my-claudecode project configuration
Enable the oh-my-claudecode plugin and vendor the OMC project
instructions plus the omc-reference skill so session-start guidance
and agent catalog are available without plugin re-install.

Confidence: high
Scope-risk: narrow
2026-04-19 08:36:49 +07:00
tiennm99andGitHub 928a35cc7b Initial commit 2026-04-19 08:26:27 +07:00
tiennm99 9ff9425b2d fix: update package-lock.json libc fields for cross-platform compatibility 2026-04-14 12:28:30 +07:00
tiennm99 ef852839cd fix: use separate CSS translate/scale properties for smooth animations
Tile pop and merge @keyframes were setting transform: scale() which
overrode transform: translate() used for tile positioning, causing
tiles to jump to (0,0) during animation. Fix by using individual CSS
properties: translate for positioning, scale in keyframes.
2026-04-14 10:48:37 +07:00
tiennm99 959536319a fix: resolve Svelte 5 effect_update_depth_exceeded infinite loop
- ScoreBoard: wrap floats mutation in untrack() to prevent $effect
  from re-triggering when it reads+writes floats in same cycle
- App: split bestScore effect and use untrack() to prevent read/write
  loop on bestScore within the same $effect
2026-04-14 10:25:40 +07:00
tiennm99 f822dd1f74 feat: add tile glow, dynamic font sizing, and GitHub Pages deployment (Epic 5, Stories 5.1-5.3)
- Add box-shadow glow effect on tiles with value 128+
- Dynamic font sizing already implemented in Epic 4 responsive work (Story 5.2 = no-op)
- Set Vite base path to /try-bmad/ for GitHub Pages
- Add GitHub Actions workflow for automated deploy on push to main
- Production bundle 22.4KB gzipped (under 50KB target)
2026-04-14 09:43:14 +07:00
tiennm99 ee3e8f8548 feat: add multi-input support and responsive layout (Epic 4, Stories 4.1-4.3)
- Add WASD and Vim hjkl keyboard mappings to input handler
- Add touch/swipe input with 10px threshold and dominant-axis detection
- Refactor all component dimensions to CSS custom properties
- Add responsive breakpoint at 520px (500px→280px container, scaled fonts)
- Add 31 new tests (21 input-handler + 10 swipe), 90 total passing
2026-04-14 09:27:35 +07:00
tiennm99 450be21d9d feat: add pop, bounce, score float, and overlay fade animations (Stories 3.2-3.5)
Tile spawn pop (200ms scale 0→1), merge bounce (200ms scale 1→1.2→1),
score "+N" float (600ms rise+fade), overlay fade-in (800ms opacity).
All CSS @keyframes, all respect prefers-reduced-motion. Epic 3 complete.
2026-04-13 22:56:38 +07:00
tiennm99 67929027a6 feat: add tile slide animation with identity tracking (Story 3.1)
Tiles now slide smoothly to new positions with 100ms CSS transitions.
New tile-tracker.js module manages tile identity across moves, enabling
Svelte to reuse DOM nodes for CSS transition animation. Input queuing
prevents moves during animation. Supports prefers-reduced-motion.
59 tests passing (10 new tile-tracker tests).
2026-04-13 22:52:28 +07:00
tiennm99 fe8353fa31 docs: complete Epic 2 — Story 2.3 keep-playing verified, no code changes
All Story 2.3 ACs already satisfied by Stories 1.2, 1.6, and 2.2.
Keep-playing mode works: flag persists across sessions, win overlay
suppressed, game over still triggers. Epic 2 done.
2026-04-13 22:45:59 +07:00
tiennm99 fd7610b2fa feat: add game state persistence with localStorage (Story 2.2)
Game state saved after every move, restored on page load. Best score
persisted separately. New Game clears game state but preserves best
score. Schema validation prevents crashes from corrupted localStorage.
49 tests passing (11 new storage tests).
2026-04-13 22:44:56 +07:00
tiennm99 d5a4fd191d feat: add best score tracking (Story 2.1)
Best score updates when current score exceeds it and persists
across New Game resets within the session. localStorage persistence
comes in Story 2.2.
2026-04-13 22:37:12 +07:00
tiennm99 4e452dfe19 docs: complete Epic 1 review, create story 2.1 best score tracking
Epic 1 code review passed with 0 patches needed — all 6 stories
marked done. 6 deferred items logged for Epics 2-5. Created story
2-1-best-score-tracking as ready-for-dev to begin Epic 2.
2026-04-13 22:28:15 +07:00
tiennm99andClaude Opus 4.6 45de4b46cb feat: add header, scores, keyboard input, and overlays (Stories 1.4-1.6)
ScoreBoard shows current/best score. Keyboard arrow keys control
gameplay via input-handler module. GameMessage overlay shows win/game
over states with Keep Going, Try Again, and New Game actions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:52:31 +07:00
tiennm99andClaude Opus 4.6 51fb0ba35c feat: add game board and tile rendering (Story 1.3)
Grid.svelte renders 4x4 board with empty cell placeholders.
Tile.svelte renders colored numbered tiles with absolute positioning
and ARIA roles. App.svelte owns game state via Svelte 5 $state rune.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:48:21 +07:00
tiennm99andClaude Opus 4.6 21b7ac468a feat: implement game logic module with 38 tests (Story 1.2)
Pure JS game engine with initGame, move, canMove, isGameOver.
Implements leading-edge merge order, once-per-move rule, 90/10 tile
spawning, win detection (2048), and immutable state updates.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:41:30 +07:00
tiennm99andClaude Opus 4.6 685ccf8e90 feat: scaffold Svelte + Tailwind + Vite project (Story 1.1)
Initialize project with Svelte 5, Vite 8, Tailwind CSS v4, and Vitest.
Set up folder structure (src/lib, src/components, public/fonts),
constants module with game values and 12-tier tile colors, Clear Sans
font, and page background styling.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:35:26 +07:00
tiennm99andClaude Opus 4.6 877c0ad599 docs: create story 1.1 project scaffold and update sprint status
Epic 1 now in-progress, Story 1.1 ready-for-dev with comprehensive
implementation guide for Svelte + Tailwind + Vite project setup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:16:34 +07:00
tiennm99andClaude Opus 4.6 c08847f7fe docs: add sprint status tracking for 5 epics and 20 stories
All stories in backlog status, ready for implementation starting
with Epic 1 Story 1.1 (project scaffold).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:14:43 +07:00
tiennm99andClaude Opus 4.6 e1165ada62 docs: add implementation readiness assessment report
All 6 validation categories passed: 31/31 FRs covered, full UX
alignment, no critical issues. Project is ready for sprint planning.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:13:00 +07:00
tiennm99andClaude Opus 4.6 58687ac116 docs: add epics and stories breakdown for 2048 clone
5 epics, 20 stories covering all 31 functional requirements,
9 NFRs, and 20 UX design requirements.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:52:41 +07:00
tiennm99 13adf590e2 docs: add architecture decision document
Complete 8-step architecture workflow covering project context,
starter template evaluation (Svelte 5 + Vite 9 + Tailwind v4),
core decisions, implementation patterns, project structure,
and validation. Ready for implementation.
2026-04-13 00:31:04 +07:00
tiennm99 b8e6503dfc docs: add UX design specification and design direction mockups
Complete 14-step UX design workflow covering project understanding,
core experience, emotional response, visual foundation, user journeys,
component strategy, UX patterns, and responsive/accessibility strategy.
2026-04-12 23:37:55 +07:00
tiennm99 02b01dc33c docs: add project scoping and phased development plan to PRD 2026-04-12 20:26:07 +07:00
tiennm99 a43bdb247c docs: add web app specific requirements to PRD 2026-04-12 20:22:27 +07:00
tiennm99 d3469db198 docs: skip domain and innovation steps in PRD (low complexity, no innovation) 2026-04-12 20:20:12 +07:00
tiennm99 f9c3c23f43 docs: add user journeys to PRD 2026-04-12 20:18:59 +07:00
tiennm99 5d18fb22e8 docs: add success criteria and product scope to PRD 2026-04-12 20:17:03 +07:00
tiennm99 530d4094a7 docs: add executive summary and project classification to PRD 2026-04-12 20:14:49 +07:00
tiennm99 3217825521 docs: add project classification and vision discovery to PRD 2026-04-12 20:00:55 +07:00
tiennm99 b139e0842b docs: initialize PRD with workflow state and input documents 2026-04-12 19:58:01 +07:00