guitar-tui 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. guitar_tui-0.1.0/.claude/claudify +1 -0
  2. guitar_tui-0.1.0/.claude/claudify.md +31 -0
  3. guitar_tui-0.1.0/.claude/commands/continue.md +10 -0
  4. guitar_tui-0.1.0/.claude/commands/log.md +20 -0
  5. guitar_tui-0.1.0/.claude/commands/prep.md +19 -0
  6. guitar_tui-0.1.0/.claude/commands/pulse.md +21 -0
  7. guitar_tui-0.1.0/.claude/commands/save.md +20 -0
  8. guitar_tui-0.1.0/.claude/hooks/pre-tool-use/guard-naming.sh +24 -0
  9. guitar_tui-0.1.0/.claude/hooks/stop/session-wrap.sh +57 -0
  10. guitar_tui-0.1.0/.claude/settings.local.json +17 -0
  11. guitar_tui-0.1.0/.env.example +7 -0
  12. guitar_tui-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
  13. guitar_tui-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
  14. guitar_tui-0.1.0/.gitignore +35 -0
  15. guitar_tui-0.1.0/.python-version +1 -0
  16. guitar_tui-0.1.0/CLAUDE.md +77 -0
  17. guitar_tui-0.1.0/CODE_OF_CONDUCT.md +41 -0
  18. guitar_tui-0.1.0/CONTRIBUTING.md +52 -0
  19. guitar_tui-0.1.0/LICENSE +21 -0
  20. guitar_tui-0.1.0/Makefile +70 -0
  21. guitar_tui-0.1.0/PKG-INFO +113 -0
  22. guitar_tui-0.1.0/README.md +86 -0
  23. guitar_tui-0.1.0/SECURITY.md +11 -0
  24. guitar_tui-0.1.0/demo.gif +0 -0
  25. guitar_tui-0.1.0/demo.tape +139 -0
  26. guitar_tui-0.1.0/docs/ARCHITECTURE.md +170 -0
  27. guitar_tui-0.1.0/docs/CONTEXT.md +8 -0
  28. guitar_tui-0.1.0/docs/CURRICULUM.md +521 -0
  29. guitar_tui-0.1.0/docs/PERSONAS.md +80 -0
  30. guitar_tui-0.1.0/docs/PLAN.md +124 -0
  31. guitar_tui-0.1.0/docs/REDESIGN.md +363 -0
  32. guitar_tui-0.1.0/docs/ROADMAP.md +38 -0
  33. guitar_tui-0.1.0/docs/models/METRONOME.md +182 -0
  34. guitar_tui-0.1.0/docs/reviews/2026-03-05_reviewer_assessment.md +115 -0
  35. guitar_tui-0.1.0/docs/reviews/2026-03-07_reviewer_assessment.md +144 -0
  36. guitar_tui-0.1.0/docs/reviews/2026-03-11_reviewer_assessment.md +114 -0
  37. guitar_tui-0.1.0/docs/reviews/2026-03-18_reviewer_assessment.md +113 -0
  38. guitar_tui-0.1.0/docs/reviews/2026-07-11_reviewer_assessment.md +178 -0
  39. guitar_tui-0.1.0/guitar_tui/__init__.py +3 -0
  40. guitar_tui-0.1.0/guitar_tui/app.py +130 -0
  41. guitar_tui-0.1.0/guitar_tui/content/exercises/alternate_picking.md +67 -0
  42. guitar_tui-0.1.0/guitar_tui/content/exercises/barre_strength.md +76 -0
  43. guitar_tui-0.1.0/guitar_tui/content/exercises/chromatic_warmup.md +48 -0
  44. guitar_tui-0.1.0/guitar_tui/content/exercises/major_scale_sequences.md +52 -0
  45. guitar_tui-0.1.0/guitar_tui/content/exercises/major_scale_three_nps.md +66 -0
  46. guitar_tui-0.1.0/guitar_tui/content/exercises/natural_minor_positions.md +63 -0
  47. guitar_tui-0.1.0/guitar_tui/content/exercises/one_minute_changes.md +62 -0
  48. guitar_tui-0.1.0/guitar_tui/content/exercises/open_chord_arpeggio.md +61 -0
  49. guitar_tui-0.1.0/guitar_tui/content/exercises/pentatonic_licks_1.md +74 -0
  50. guitar_tui-0.1.0/guitar_tui/content/exercises/pentatonic_sequences.md +69 -0
  51. guitar_tui-0.1.0/guitar_tui/content/exercises/position_shifts.md +54 -0
  52. guitar_tui-0.1.0/guitar_tui/content/exercises/seventh_voicings.md +80 -0
  53. guitar_tui-0.1.0/guitar_tui/content/exercises/spider_exercise.md +49 -0
  54. guitar_tui-0.1.0/guitar_tui/content/exercises/string_skipping.md +53 -0
  55. guitar_tui-0.1.0/guitar_tui/content/index.yaml +157 -0
  56. guitar_tui-0.1.0/guitar_tui/content/lessons/.gitkeep +0 -0
  57. guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/reading_chord_diagrams.md +89 -0
  58. guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/reading_scale_diagrams.md +73 -0
  59. guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/reading_tab.md +101 -0
  60. guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/the_fretboard.md +76 -0
  61. guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/tuning_your_guitar.md +84 -0
  62. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/bm_chord.md +91 -0
  63. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/f_major_chord.md +86 -0
  64. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_a_chord.md +61 -0
  65. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_am_chord.md +72 -0
  66. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_c_chord.md +61 -0
  67. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_d_chord.md +57 -0
  68. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_dm_chord.md +68 -0
  69. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_e_chord.md +61 -0
  70. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_em_chord.md +65 -0
  71. guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_g_chord.md +59 -0
  72. guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/a_d_e_progression.md +102 -0
  73. guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/c_g_am_f_progression.md +116 -0
  74. guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/g_d_em_c_progression.md +133 -0
  75. guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/one_four_five.md +90 -0
  76. guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/strumming_basics.md +144 -0
  77. guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/twelve_bar_blues_a.md +154 -0
  78. guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/chord_construction.md +90 -0
  79. guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/intervals.md +72 -0
  80. guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/key_signatures.md +81 -0
  81. guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/major_scale_construction.md +100 -0
  82. guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/musical_alphabet.md +70 -0
  83. guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/relative_minor.md +103 -0
  84. guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/roman_numerals.md +96 -0
  85. guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/sharps_and_flats.md +74 -0
  86. guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/a_shape_major.md +100 -0
  87. guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/a_shape_minor.md +98 -0
  88. guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/barre_intro.md +70 -0
  89. guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/barre_progressions.md +130 -0
  90. guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/caged_overview.md +107 -0
  91. guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/e_shape_major.md +99 -0
  92. guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/e_shape_minor.md +92 -0
  93. guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/blues_scale.md +90 -0
  94. guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/major_pentatonic_intro.md +61 -0
  95. guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_intro.md +51 -0
  96. guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_p2.md +59 -0
  97. guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_p3.md +66 -0
  98. guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_p4.md +68 -0
  99. guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_p5.md +69 -0
  100. guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/pentatonic_connections.md +93 -0
  101. guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/pentatonic_major_vs_minor.md +91 -0
  102. guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/minor_scale_chords.md +113 -0
  103. guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_intro.md +72 -0
  104. guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p1.md +70 -0
  105. guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p2.md +56 -0
  106. guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p3.md +56 -0
  107. guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p4.md +62 -0
  108. guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p5.md +64 -0
  109. guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/diatonic_progressions.md +104 -0
  110. guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_chords.md +108 -0
  111. guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p1.md +71 -0
  112. guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p2.md +60 -0
  113. guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p3.md +55 -0
  114. guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p4.md +60 -0
  115. guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p5.md +71 -0
  116. guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/dominant_7th.md +78 -0
  117. guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/major_7th.md +82 -0
  118. guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/minor_7th.md +80 -0
  119. guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/seventh_progressions.md +93 -0
  120. guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/sus_and_add.md +100 -0
  121. guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/dorian_mode.md +87 -0
  122. guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/lydian_mode.md +89 -0
  123. guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/mixolydian_mode.md +91 -0
  124. guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/modes_in_context.md +80 -0
  125. guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/modes_intro.md +55 -0
  126. guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/phrygian_mode.md +88 -0
  127. guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/analysing_common_progressions.md +97 -0
  128. guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/chord_function_analysis.md +92 -0
  129. guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/ear_training_basics.md +80 -0
  130. guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/finding_the_key.md +68 -0
  131. guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/major_or_minor.md +61 -0
  132. guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/modal_progressions.md +85 -0
  133. guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/putting_it_together.md +96 -0
  134. guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/scale_selection.md +75 -0
  135. guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/what_is_song_analysis.md +66 -0
  136. guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/combining_techniques.md +90 -0
  137. guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/hammer_ons_pull_offs.md +91 -0
  138. guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/slides.md +89 -0
  139. guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/string_bending.md +73 -0
  140. guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/vibrato_technique.md +82 -0
  141. guitar_tui-0.1.0/guitar_tui/content/licks/blues_bb_king_box.md +53 -0
  142. guitar_tui-0.1.0/guitar_tui/content/licks/blues_tritone_pass.md +53 -0
  143. guitar_tui-0.1.0/guitar_tui/content/licks/dorian_groove.md +57 -0
  144. guitar_tui-0.1.0/guitar_tui/content/licks/legato_phrase.md +44 -0
  145. guitar_tui-0.1.0/guitar_tui/content/licks/lydian_raised_fourth.md +61 -0
  146. guitar_tui-0.1.0/guitar_tui/content/licks/major_pent_country_walk.md +55 -0
  147. guitar_tui-0.1.0/guitar_tui/content/licks/major_scale_lower_run.md +56 -0
  148. guitar_tui-0.1.0/guitar_tui/content/licks/major_scale_upper_phrase.md +56 -0
  149. guitar_tui-0.1.0/guitar_tui/content/licks/mixolydian_b7_phrase.md +63 -0
  150. guitar_tui-0.1.0/guitar_tui/content/licks/mixolydian_chord_riff.md +56 -0
  151. guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_descent.md +57 -0
  152. guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_pos2.md +53 -0
  153. guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_pos3.md +55 -0
  154. guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_pos4.md +54 -0
  155. guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_pos5.md +56 -0
  156. guitar_tui-0.1.0/guitar_tui/content/licks/pent_bend_release.md +57 -0
  157. guitar_tui-0.1.0/guitar_tui/content/licks/pent_blues_turnaround.md +70 -0
  158. guitar_tui-0.1.0/guitar_tui/content/licks/pent_box1_run.md +50 -0
  159. guitar_tui-0.1.0/guitar_tui/content/licks/pent_position2_run.md +60 -0
  160. guitar_tui-0.1.0/guitar_tui/content/licks/pent_position3_run.md +55 -0
  161. guitar_tui-0.1.0/guitar_tui/content/licks/pent_position4_run.md +54 -0
  162. guitar_tui-0.1.0/guitar_tui/content/licks/pent_position5_run.md +55 -0
  163. guitar_tui-0.1.0/guitar_tui/content/licks/phrygian_flamenco.md +56 -0
  164. guitar_tui-0.1.0/guitar_tui/content/licks/phrygian_half_step.md +60 -0
  165. guitar_tui-0.1.0/guitar_tui/content/licks/slide_connector.md +45 -0
  166. guitar_tui-0.1.0/guitar_tui/content/reference/.gitkeep +0 -0
  167. guitar_tui-0.1.0/guitar_tui/data/chords/.gitkeep +0 -0
  168. guitar_tui-0.1.0/guitar_tui/data/chords/barre_chords.yaml +514 -0
  169. guitar_tui-0.1.0/guitar_tui/data/chords/extended_chords.yaml +102 -0
  170. guitar_tui-0.1.0/guitar_tui/data/chords/open_chords.yaml +69 -0
  171. guitar_tui-0.1.0/guitar_tui/data/chords/seventh_chords.yaml +110 -0
  172. guitar_tui-0.1.0/guitar_tui/data/scales/.gitkeep +0 -0
  173. guitar_tui-0.1.0/guitar_tui/data/scales/blues_scale.yaml +115 -0
  174. guitar_tui-0.1.0/guitar_tui/data/scales/dorian.yaml +135 -0
  175. guitar_tui-0.1.0/guitar_tui/data/scales/lydian.yaml +137 -0
  176. guitar_tui-0.1.0/guitar_tui/data/scales/major.yaml +140 -0
  177. guitar_tui-0.1.0/guitar_tui/data/scales/major_pentatonic.yaml +107 -0
  178. guitar_tui-0.1.0/guitar_tui/data/scales/mixolydian.yaml +137 -0
  179. guitar_tui-0.1.0/guitar_tui/data/scales/natural_minor.yaml +130 -0
  180. guitar_tui-0.1.0/guitar_tui/data/scales/pentatonic_minor.yaml +110 -0
  181. guitar_tui-0.1.0/guitar_tui/data/scales/phrygian.yaml +137 -0
  182. guitar_tui-0.1.0/guitar_tui/data/tunings.yaml +26 -0
  183. guitar_tui-0.1.0/guitar_tui/engine/__init__.py +19 -0
  184. guitar_tui-0.1.0/guitar_tui/engine/chord_renderer.py +108 -0
  185. guitar_tui-0.1.0/guitar_tui/engine/dispatcher.py +59 -0
  186. guitar_tui-0.1.0/guitar_tui/engine/fretboard_renderer.py +83 -0
  187. guitar_tui-0.1.0/guitar_tui/engine/models.py +212 -0
  188. guitar_tui-0.1.0/guitar_tui/engine/scale_renderer.py +78 -0
  189. guitar_tui-0.1.0/guitar_tui/engine/tab_renderer.py +210 -0
  190. guitar_tui-0.1.0/guitar_tui/loaders/__init__.py +19 -0
  191. guitar_tui-0.1.0/guitar_tui/loaders/data_loader.py +105 -0
  192. guitar_tui-0.1.0/guitar_tui/loaders/lesson_loader.py +361 -0
  193. guitar_tui-0.1.0/guitar_tui/loaders/lick_loader.py +222 -0
  194. guitar_tui-0.1.0/guitar_tui/loaders/models.py +166 -0
  195. guitar_tui-0.1.0/guitar_tui/settings.py +62 -0
  196. guitar_tui-0.1.0/guitar_tui/theory/__init__.py +1 -0
  197. guitar_tui-0.1.0/guitar_tui/theory/keys.py +227 -0
  198. guitar_tui-0.1.0/guitar_tui/ui/__init__.py +1 -0
  199. guitar_tui-0.1.0/guitar_tui/ui/app.tcss +303 -0
  200. guitar_tui-0.1.0/guitar_tui/ui/screens/__init__.py +7 -0
  201. guitar_tui-0.1.0/guitar_tui/ui/screens/lesson.py +279 -0
  202. guitar_tui-0.1.0/guitar_tui/ui/screens/practice.py +163 -0
  203. guitar_tui-0.1.0/guitar_tui/ui/screens/size_warning.py +40 -0
  204. guitar_tui-0.1.0/guitar_tui/ui/screens/tools.py +447 -0
  205. guitar_tui-0.1.0/guitar_tui/ui/screens/welcome.py +165 -0
  206. guitar_tui-0.1.0/guitar_tui/ui/widgets/__init__.py +1 -0
  207. guitar_tui-0.1.0/guitar_tui/ui/widgets/full_neck.py +156 -0
  208. guitar_tui-0.1.0/guitar_tui/ui/widgets/metronome.py +199 -0
  209. guitar_tui-0.1.0/pyproject.toml +51 -0
  210. guitar_tui-0.1.0/schemas/diagram_spec.md +351 -0
  211. guitar_tui-0.1.0/schemas/diagram_taxonomy.md +106 -0
  212. guitar_tui-0.1.0/schemas/lesson_format.md +202 -0
  213. guitar_tui-0.1.0/tests/__init__.py +0 -0
  214. guitar_tui-0.1.0/tests/test_app.py +36 -0
  215. guitar_tui-0.1.0/tests/test_data_loader.py +382 -0
  216. guitar_tui-0.1.0/tests/test_engine_chord.py +256 -0
  217. guitar_tui-0.1.0/tests/test_engine_dispatcher.py +137 -0
  218. guitar_tui-0.1.0/tests/test_engine_fretboard.py +226 -0
  219. guitar_tui-0.1.0/tests/test_engine_scale.py +181 -0
  220. guitar_tui-0.1.0/tests/test_engine_tab.py +934 -0
  221. guitar_tui-0.1.0/tests/test_lesson_loader.py +565 -0
  222. guitar_tui-0.1.0/tests/test_lick_loader.py +208 -0
  223. guitar_tui-0.1.0/tests/test_placeholder.py +7 -0
  224. guitar_tui-0.1.0/tests/test_settings.py +127 -0
  225. guitar_tui-0.1.0/tests/test_theory_keys.py +214 -0
  226. guitar_tui-0.1.0/uv.lock +1062 -0
@@ -0,0 +1 @@
1
+ blueprint: python-tui
@@ -0,0 +1,31 @@
1
+ <!-- This project uses claudify — a Claude Code configuration kit.
2
+ Commands: /continue, /save, /log, /prep, /pulse
3
+ To update kit files: /claudify update
4
+ Learn more: https://github.com/konoerik/claudify -->
5
+
6
+ ## Context Loading
7
+
8
+ Read on every session:
9
+ - `docs/CONTEXT.md` — current focus, last decisions, next action
10
+
11
+ Read when the user mentions tasks, features, bugs, or current work:
12
+ - `docs/PLAN.md` — `## Active` section only
13
+
14
+ Read when writing or editing code:
15
+ - `docs/CONVENTIONS.md` — canonical style reference; pattern-match before writing
16
+
17
+ Read when touching code structure, architecture, or making structural decisions:
18
+ - `docs/ARCHITECTURE.md` — `## Quick Reference` first; full file only if needed
19
+
20
+ Load only when explicitly asked about goals or priorities:
21
+ - `docs/ROADMAP.md`
22
+
23
+ Never auto-load:
24
+ - `.claude/archive/`
25
+
26
+ ## Behavior Rules
27
+ - Prefer editing existing files over creating new ones
28
+ - Do not create `BACKLOG.md`, `TASKS.md`, `TODO.md`, or similar — use `PLAN.md`
29
+ - When making an architectural decision, record it with `/log` before ending the session
30
+ - Keep `PLAN.md ## Active` short — if it exceeds 10 items, triage before adding more
31
+ - Never commit or push without explicit instruction — `/save` and `/prep` are the checkpoints before that happens
@@ -0,0 +1,10 @@
1
+ Read docs/CONTEXT.md and the ## Active section of docs/PLAN.md.
2
+
3
+ Summarize:
4
+ 1. Current focus and next action from docs/CONTEXT.md
5
+ 2. Active tasks as a numbered list with their status
6
+ 3. Any blockers that need attention
7
+
8
+ Then ask: "What do you want to work on?"
9
+
10
+ Do not load docs/PLAN.md ## Backlog or docs/ROADMAP.md unless I ask about priorities.
@@ -0,0 +1,20 @@
1
+ Record an architectural decision in docs/ARCHITECTURE.md under ## Decisions (ADRs).
2
+
3
+ First, read docs/ARCHITECTURE.md to find the next ADR number.
4
+
5
+ Then ask me:
6
+ 1. What is the decision? (title)
7
+ 2. What was the context or problem?
8
+ 3. What alternatives were considered?
9
+ 4. What are the consequences or trade-offs?
10
+
11
+ Append to docs/ARCHITECTURE.md ## Decisions using this format:
12
+
13
+ ### ADR-N: <Title>
14
+ **Date:** YYYY-MM-DD
15
+ **Context:** <Why this decision was needed>
16
+ **Decision:** <What was decided>
17
+ **Alternatives considered:** <What else was evaluated>
18
+ **Consequences:** <Trade-offs, follow-up work, or constraints introduced>
19
+
20
+ Also update docs/CONTEXT.md **Last session** to mention the decision was recorded.
@@ -0,0 +1,19 @@
1
+ Run a pre-ship checklist before I open a PR or push a release.
2
+
3
+ Work through each item and report pass/fail/skip with a brief reason:
4
+
5
+ **Code**
6
+ - [ ] All tests pass
7
+ - [ ] No leftover debug logs, commented-out code, or TODOs in changed files
8
+ - [ ] No hardcoded secrets or environment-specific values
9
+
10
+ **Docs**
11
+ - [ ] docs/PLAN.md ## Active updated — completed items moved to ## Done
12
+ - [ ] If an architectural decision was made, it's recorded in docs/ARCHITECTURE.md
13
+ - [ ] docs/CONTEXT.md reflects the current state
14
+
15
+ **Review**
16
+ - [ ] Changes are scoped to what was planned — no unrelated modifications
17
+ - [ ] Any new dependencies are intentional and noted in docs/ARCHITECTURE.md ## Quick Reference
18
+
19
+ If any item fails, surface it clearly and ask whether to fix it now or proceed anyway.
@@ -0,0 +1,21 @@
1
+ Take stock of where the project is and whether it's still pointed at the right thing.
2
+
3
+ 1. Read docs/CONTEXT.md, docs/PLAN.md (## Active and ## Done), and the ## Quick Reference section of docs/ARCHITECTURE.md.
4
+
5
+ 2. In 2–3 sentences, summarize: what the project set out to do, and what it has actually been doing lately. Be factual, not evaluative.
6
+
7
+ 3. Then ask these three questions together — don't wait for answers one at a time:
8
+
9
+ - **Right problem?** Is what we're building still solving the problem we originally set out to solve?
10
+ - **Off track?** Is there anything we've spent real time on that, in hindsight, wasn't the point?
11
+ - **Avoiding something?** Is there something we keep not doing that is probably the actual next thing?
12
+
13
+ 4. After I respond, do one of the following based on what I say:
14
+
15
+ - **If the direction has shifted unintentionally:** Help me refocus. Update docs/PLAN.md ## Active to reflect the real next thing, and update docs/CONTEXT.md **Next action** to match.
16
+
17
+ - **If the direction has shifted intentionally (a pivot):** Treat it as a decision. Run /log to record it as an ADR, then update docs/CONTEXT.md to reflect the new direction.
18
+
19
+ - **If we're on track:** Say so clearly, in one sentence. No need to change anything.
20
+
21
+ Keep the tone curious, not corrective. This is a gut-check, not a postmortem.
@@ -0,0 +1,20 @@
1
+ Wrap up this session by updating docs/CONTEXT.md and docs/PLAN.md.
2
+
3
+ 1. Read docs/CONTEXT.md and docs/PLAN.md ## Active (if not already in context).
4
+
5
+ 2. Based on what we did this session, rewrite docs/CONTEXT.md with:
6
+ - **Current focus:** what is still actively in progress (not done yet)
7
+ - **Last session:** one concise sentence — what was accomplished and any decisions made
8
+ - **Blocking:** anything unresolved, waiting on input, or unclear
9
+ - **Next action:** the single most important thing to do next session
10
+
11
+ Keep the whole file under 8 lines. Add a hidden sentinel on the last line:
12
+ `<!-- wrapped: YYYY-MM-DD -->`
13
+ (use today's actual date)
14
+
15
+ 3. Review docs/PLAN.md ## Active. For any tasks completed this session, move them to ## Done.
16
+ Do not add new tasks unless I explicitly ask.
17
+
18
+ 4. Confirm what was updated. Do not summarize the whole session — just state:
19
+ - What changed in docs/CONTEXT.md
20
+ - How many tasks moved to Done (if any)
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env bash
2
+ # Hook: pre-tool-use/guard-naming.sh
3
+ # Fires before file edits/writes. Blocks creation of non-canonical doc files.
4
+
5
+ set -euo pipefail
6
+
7
+ INPUT=$(cat)
8
+ TOOL_NAME=$(echo "$INPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('tool_name',''))" 2>/dev/null || true)
9
+
10
+ if [[ "$TOOL_NAME" != "Write" && "$TOOL_NAME" != "Edit" ]]; then
11
+ exit 0
12
+ fi
13
+
14
+ FILE_PATH=$(echo "$INPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('tool_input',{}).get('file_path',''))" 2>/dev/null || true)
15
+ BASENAME=$(basename "$FILE_PATH")
16
+
17
+ DISALLOWED=("BACKLOG.md" "TASKS.md" "TODO.md" "TODOS.md" "TASK.md")
18
+
19
+ for name in "${DISALLOWED[@]}"; do
20
+ if [[ "$BASENAME" == "$name" ]]; then
21
+ echo "Blocked: '$BASENAME' is not a canonical filename. Use PLAN.md with ## Active and ## Backlog sections instead." >&2
22
+ exit 1
23
+ fi
24
+ done
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env bash
2
+ # Hook: stop/session-wrap.sh
3
+ # Fires at the end of every Claude Code session.
4
+ # 1. Archives completed tasks from docs/PLAN.md ## Done to .claude/archive/YYYY-MM.md
5
+ # 2. Warns if docs/PLAN.md ## Active is getting long
6
+ # 3. Flags docs/CONTEXT.md as stale if /save was not run this session
7
+
8
+ set -euo pipefail
9
+
10
+ PLAN="docs/PLAN.md"
11
+ ARCHIVE_DIR=".claude/archive"
12
+ ARCHIVE_FILE="$ARCHIVE_DIR/$(date +%Y-%m).md"
13
+
14
+ # --- Archive completed tasks ---
15
+
16
+ if [[ ! -f "$PLAN" ]]; then
17
+ exit 0
18
+ fi
19
+
20
+ DONE_CONTENT=$(awk '/^## Done/{found=1; next} found && /^## /{exit} found{print}' "$PLAN")
21
+ DONE_CONTENT=$(echo "$DONE_CONTENT" | sed '/./,$!d' | sed -e :a -e '/^\s*$/{ $d; N; ba }')
22
+
23
+ if [[ -n "$DONE_CONTENT" ]]; then
24
+ mkdir -p "$ARCHIVE_DIR"
25
+ {
26
+ echo ""
27
+ echo "## Archived $(date +%Y-%m-%d)"
28
+ echo "$DONE_CONTENT"
29
+ } >> "$ARCHIVE_FILE"
30
+
31
+ awk '
32
+ /^## Done/ { print; in_done=1; next }
33
+ in_done && /^## / { in_done=0 }
34
+ !in_done { print }
35
+ ' "$PLAN" > "$PLAN.tmp" && mv "$PLAN.tmp" "$PLAN"
36
+
37
+ echo "[session-wrap] Archived $(echo "$DONE_CONTENT" | grep -c '^\- \[x\]' || true) completed task(s) to $ARCHIVE_FILE"
38
+ fi
39
+
40
+ # --- Warn if Active section is long ---
41
+
42
+ ACTIVE_COUNT=$(awk '/^## Active/{found=1; next} found && /^## /{exit} found && /^\- /{print}' "$PLAN" | wc -l | tr -d ' ')
43
+
44
+ if [[ "$ACTIVE_COUNT" -gt 10 ]]; then
45
+ echo "[session-wrap] Warning: docs/PLAN.md ## Active has $ACTIVE_COUNT items. Consider moving lower-priority items to ## Backlog."
46
+ fi
47
+
48
+ # --- Check if CONTEXT.md was updated this session ---
49
+
50
+ CONTEXT="docs/CONTEXT.md"
51
+ TODAY=$(date +%Y-%m-%d)
52
+
53
+ if [[ -f "$CONTEXT" ]]; then
54
+ if ! grep -q "wrapped: $TODAY" "$CONTEXT" 2>/dev/null; then
55
+ echo "[session-wrap] docs/CONTEXT.md was not updated this session. Run /save before your next session to keep context fresh."
56
+ fi
57
+ fi
@@ -0,0 +1,17 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(~/.local/bin/uv run:*)",
5
+ "Bash(git:*)",
6
+ "Bash(~/.local/bin/uv sync:*)",
7
+ "Bash(grep -hv \"^$\" /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/07-natural-minor/minor_scale_chords.md /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/08-major-scale/major_scale_chords.md /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/08-major-scale/diatonic_progressions.md)",
8
+ "Bash(grep -hv \"^$\" /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/01-orientation/the_fretboard.md /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/01-orientation/tuning_your_guitar.md /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/01-orientation/reading_scale_diagrams.md)",
9
+ "Bash(grep -B2 -A2 -E \"[A-G]\\(#|b\\)?\\(m|maj7|m7|7|dim\\)?\\( ?[–-] ?[A-G]\\(#|b\\)?\\(m|maj7|m7|dim|7\\)?\\){2,}|major scale of|key of [A-G]|= [A-G] \")",
10
+ "Bash(grep -hv \"^$\" /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/05-barre-chords/e_shape_major.md /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/05-barre-chords/a_shape_major.md)",
11
+ "Bash(grep -hv \"^$\" /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/06-pentatonic-scale/pentatonic_major_vs_minor.md)",
12
+ "Bash(grep -hv \"^$\" /Users/erik/Sandbox/guitar-tui/guitar_tui/content/lessons/01-orientation/reading_chord_diagrams.md)",
13
+ "Bash(~/.local/bin/uv build *)",
14
+ "Bash(python3 -c ' *)"
15
+ ]
16
+ }
17
+ }
@@ -0,0 +1,7 @@
1
+ # Copy this file to .env and fill in your values. .env is gitignored — never commit it.
2
+
3
+ # PyPI API token for publishing (create at https://pypi.org/manage/account/token/)
4
+ # Usage: set -x UV_PUBLISH_TOKEN (grep '^UV_PUBLISH_TOKEN' .env | cut -d= -f2) # fish
5
+ # export $(grep -v '^#' .env | xargs) # bash/zsh
6
+ # then: uv publish
7
+ UV_PUBLISH_TOKEN=pypi-REPLACE_ME
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something isn't working correctly
4
+ labels: bug
5
+ ---
6
+
7
+ **Describe the bug**
8
+ A clear description of what happened and what you expected instead.
9
+
10
+ **To reproduce**
11
+ Steps to reproduce the behaviour:
12
+ 1.
13
+ 2.
14
+ 3.
15
+
16
+ **Environment**
17
+ - OS and version (e.g. macOS 14.4, Ubuntu 24.04):
18
+ - Terminal emulator (e.g. iTerm2, Kitty, Windows Terminal):
19
+ - Python version (`python --version`):
20
+ - Install method (uv tool install / pip install / cloned repo):
21
+ - App version (`guitar-tui --version` if available):
22
+
23
+ **If a diagram rendered incorrectly**
24
+ Paste the relevant `diagram` YAML block from the lesson file, and describe what was wrong with the output.
25
+
26
+ **Additional context**
27
+ Any other information that might help — screenshots, error messages, relevant lesson slug.
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea or improvement
4
+ labels: enhancement
5
+ ---
6
+
7
+ **What problem does this solve, or what would it enable?**
8
+ A clear description of the gap or use case.
9
+
10
+ **Proposed solution**
11
+ What you'd like to see. Be as specific or as rough as you like — a sketch is fine.
12
+
13
+ **Alternatives considered**
14
+ Any other approaches you thought about and why they didn't fit.
15
+
16
+ **Additional context**
17
+ Anything else — related lessons, relevant music theory, similar tools that do this well.
@@ -0,0 +1,35 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.pyo
5
+ .Python
6
+
7
+ # Virtual environment (uv)
8
+ .venv/
9
+
10
+ # Distribution / packaging
11
+ dist/
12
+ build/
13
+ *.egg-info/
14
+
15
+ # Testing
16
+ .pytest_cache/
17
+ .coverage
18
+ htmlcov/
19
+
20
+ # Textual devtools
21
+ .textual/
22
+
23
+ # OS
24
+ .DS_Store
25
+ Thumbs.db
26
+
27
+ # Editor
28
+ .vscode/
29
+ .idea/
30
+ *.swp
31
+ *.swo
32
+ .claude/archive/
33
+
34
+ # Secrets — never commit; see .env.example
35
+ .env
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,77 @@
1
+ # Guitar TUI — Claude Context
2
+
3
+ ## Project
4
+
5
+ Guitar TUI is a Python terminal application built with Textual that teaches guitar music theory interactively. It presents chord diagrams, scale patterns, fretboard visualizations, and structured lessons entirely within the terminal. The application is designed for guitarists who prefer keyboard-driven tools and want a fast, distraction-free reference for theory concepts.
6
+
7
+ ## Architecture
8
+
9
+ Four-layer model, built bottom-up:
10
+
11
+ ```
12
+ Data Layer guitar_tui/data/ YAML chord/scale data, tunings
13
+ Engine Layer guitar_tui/engine/ DiagramSpec renderers (music-agnostic)
14
+ Content Layer guitar_tui/loaders/ Lesson parser, diagram block dispatcher
15
+ TUI Layer guitar_tui/ui/ Screens, widgets, stylesheet
16
+ ```
17
+
18
+ **Critical rule**: the engine is music-agnostic. It renders DiagramSpec objects — it does not know chord names or scale theory. Music knowledge lives exclusively in the data layer and lesson content.
19
+
20
+ **Data validation**: the data loader validates all YAML files against Pydantic schemas on startup. Invalid data is a hard error, not a warning.
21
+
22
+ **Schema contract**: `schemas/` defines the interface between the Developer and Instructor personas. Both must agree on schema changes before acting.
23
+
24
+ **Diagram taxonomy**: `schemas/diagram_taxonomy.md` — full catalog of all diagram types (Groups A–F) identified during planning, with M2 scope vs. deferred notes. Read before implementing any new renderer.
25
+
26
+ ## Personas
27
+
28
+ Three distinct roles share this codebase. See [PERSONAS.md](docs/PERSONAS.md) for full details.
29
+
30
+ - **Developer** — owns engine, loaders, UI, schemas, tooling
31
+ - **Instructor** — owns `guitar_tui/data/` and `guitar_tui/content/`; [CURRICULUM.md](docs/CURRICULUM.md) is the Instructor's primary planning document — read it before adding any lesson or reference content
32
+ - **Reviewer** — external perspective; periodic assessments live in `docs/reviews/`
33
+
34
+ ## Key Commands
35
+
36
+ Prefer `make` targets — they wrap `uv run` and are the canonical interface:
37
+
38
+ ```bash
39
+ make setup # uv sync — install / refresh dependencies
40
+ make run # launch the application
41
+ make dev # launch with Textual devtools (live reload + inspector)
42
+ make test # run the test suite
43
+ make check # verify the package is importable
44
+ make clean # remove .venv, caches, build artifacts
45
+ make build # build distribution packages (future)
46
+ ```
47
+
48
+ Raw `uv run` equivalents if needed:
49
+ ```bash
50
+ uv run guitar-tui
51
+ uv run pytest
52
+ uv run textual run --dev guitar_tui/app.py
53
+ ```
54
+
55
+ ## Conventions
56
+
57
+ - **Python**: type hints on all functions, Pydantic models for all data schemas
58
+ - **Data files**: YAML for music data (`guitar_tui/data/`), Markdown+YAML frontmatter for lessons (`guitar_tui/content/lessons/`)
59
+ - **Naming**: `snake_case` for files and identifiers; diagram types use lowercase strings (`"chord"`, `"scale"`, `"tab"`, `"fretboard"`)
60
+ - **Diagram directives**: fenced code blocks with type `diagram` in lesson Markdown; YAML body per `schemas/diagram_spec.md`
61
+ - **Tests**: all engine renderers require tests; use `pytest-asyncio` for Textual widget tests
62
+
63
+ ## Session Resumption
64
+
65
+ 1. Read `docs/CONTEXT.md` — current focus and next action
66
+ 2. Read `docs/PLAN.md` — find the highest-priority unchecked item in Active
67
+ 3. Read `docs/ROADMAP.md` — review the current phase's goals if needed
68
+ 4. Check `schemas/` if working on content or engine boundary code
69
+ 5. Check `docs/ARCHITECTURE.md` § Decisions before questioning an established pattern — the trade-offs were considered during planning
70
+
71
+ ## Critical Rules
72
+
73
+ - Engine renders DiagramSpec objects only — never raw chord/scale data
74
+ - Data layer validates on startup; startup failure is acceptable, silent corruption is not
75
+ - `schemas/` is the dev-instructor contract; no unilateral changes
76
+ - Instructor does not modify engine or UI code
77
+ - Developer does not curate lesson content or decide music theory accuracy
@@ -0,0 +1,41 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as contributors and maintainers pledge to make participation in this project a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
6
+
7
+ We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
8
+
9
+ ## Our Standards
10
+
11
+ Examples of behavior that contributes to a positive environment:
12
+
13
+ - Using welcoming and inclusive language
14
+ - Being respectful of differing viewpoints and experiences
15
+ - Gracefully accepting constructive criticism
16
+ - Focusing on what is best for the community
17
+ - Showing empathy towards other community members
18
+
19
+ Examples of unacceptable behavior:
20
+
21
+ - The use of sexualized language or imagery, and sexual attention or advances of any kind
22
+ - Trolling, insulting or derogatory comments, and personal or political attacks
23
+ - Public or private harassment
24
+ - Publishing others' private information without explicit permission
25
+ - Other conduct which could reasonably be considered inappropriate in a professional setting
26
+
27
+ ## Enforcement Responsibilities
28
+
29
+ The project maintainer is responsible for clarifying and enforcing standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior deemed inappropriate, threatening, offensive, or harmful.
30
+
31
+ ## Scope
32
+
33
+ This Code of Conduct applies within all project spaces — GitHub issues, pull requests, and any other project communication channels.
34
+
35
+ ## Enforcement
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening a GitHub issue or contacting the maintainer directly via GitHub. All complaints will be reviewed and investigated promptly and fairly.
38
+
39
+ ## Attribution
40
+
41
+ This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1.
@@ -0,0 +1,52 @@
1
+ # Contributing to Guitar TUI
2
+
3
+ Thank you for your interest in contributing. This is a small, focused project — contributions are welcome, but please read this first so your effort isn't wasted.
4
+
5
+ ## What kind of contributions are welcome
6
+
7
+ - **Bug reports** — something renders incorrectly, crashes, or behaves unexpectedly
8
+ - **Content corrections** — a chord voicing is wrong, a scale position has an error, lesson prose is inaccurate
9
+ - **Small fixes** — typos, broken links, off-by-one errors in diagrams
10
+ - **Feature proposals** — open an issue before writing code; the roadmap is deliberate and not everything fits
11
+
12
+ ## What is out of scope
13
+
14
+ - Copyrighted note sequences or transcriptions
15
+ - Audio playback (deferred by design — see architecture notes)
16
+ - User-configurable content paths or plugin systems
17
+ - Python < 3.12 support
18
+
19
+ ## Reporting a bug
20
+
21
+ Open a GitHub issue and include:
22
+
23
+ - OS and terminal emulator (e.g. macOS 14, iTerm2)
24
+ - Python version (`python --version`)
25
+ - How you installed the app (`uv tool install`, `pip install`, cloned repo)
26
+ - What you expected vs. what happened
27
+ - If a diagram rendered incorrectly, paste the diagram YAML from the lesson file
28
+
29
+ ## Suggesting content changes
30
+
31
+ Content lives in `guitar_tui/content/` (lessons, exercises, licks) and `guitar_tui/data/` (YAML chord/scale data). The schema contract is in `schemas/`. If you spot an error in a chord voicing or scale pattern, open an issue with the correct value and a reference — a reputable source, a published book, or a clear theoretical derivation.
32
+
33
+ ## Submitting a pull request
34
+
35
+ 1. Fork the repository and create a branch from `main`
36
+ 2. Install dependencies: `uv sync`
37
+ 3. Make your changes
38
+ 4. Run the test suite: `uv run pytest` — all tests must pass
39
+ 5. Open a PR with a clear description of what changed and why
40
+
41
+ For anything beyond a small fix, open an issue first so we can discuss whether it fits before you invest the time.
42
+
43
+ ## Development setup
44
+
45
+ ```bash
46
+ git clone https://github.com/konoerik/guitar-tui
47
+ cd guitar-tui
48
+ uv sync
49
+ uv run guitar-tui # run the app
50
+ uv run pytest # run tests
51
+ uv run textual run --dev guitar_tui/app.py # run with Textual devtools
52
+ ```
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Erikton Konomi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,70 @@
1
+ .DEFAULT_GOAL := help
2
+
3
+ UV := uv
4
+
5
+ # ── Help ──────────────────────────────────────────────────────────────────────
6
+
7
+ .PHONY: help
8
+ help:
9
+ @echo "Guitar TUI — available targets"
10
+ @echo ""
11
+ @echo " Setup"
12
+ @echo " setup Install all dependencies (runs uv sync)"
13
+ @echo ""
14
+ @echo " Run"
15
+ @echo " run Launch the application"
16
+ @echo " dev Launch with Textual devtools (live reload + inspector)"
17
+ @echo ""
18
+ @echo " Test & verify"
19
+ @echo " test Run the test suite"
20
+ @echo " check Verify the package is importable"
21
+ @echo ""
22
+ @echo " Clean"
23
+ @echo " clean Remove venv, caches, and build artifacts"
24
+ @echo " clean-pyc Remove compiled Python files only"
25
+ @echo ""
26
+ @echo " Package (future)"
27
+ @echo " build Build distribution packages"
28
+
29
+ # ── Setup ─────────────────────────────────────────────────────────────────────
30
+
31
+ .PHONY: setup
32
+ setup:
33
+ $(UV) sync
34
+
35
+ # ── Run ───────────────────────────────────────────────────────────────────────
36
+
37
+ .PHONY: run
38
+ run:
39
+ $(UV) run guitar-tui
40
+
41
+ .PHONY: dev
42
+ dev:
43
+ $(UV) run textual run --dev guitar_tui/app.py
44
+
45
+ # ── Test & verify ─────────────────────────────────────────────────────────────
46
+
47
+ .PHONY: test
48
+ test:
49
+ $(UV) run pytest
50
+
51
+ .PHONY: check
52
+ check:
53
+ $(UV) run python -c "import guitar_tui; print('OK:', guitar_tui.__version__)"
54
+
55
+ # ── Clean ─────────────────────────────────────────────────────────────────────
56
+
57
+ .PHONY: clean
58
+ clean: clean-pyc
59
+ rm -rf .venv .pytest_cache dist
60
+
61
+ .PHONY: clean-pyc
62
+ clean-pyc:
63
+ find . -path './.venv' -prune -o -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
64
+ find . -path './.venv' -prune -o -type f -name '*.pyc' -delete 2>/dev/null || true
65
+
66
+ # ── Package (future) ──────────────────────────────────────────────────────────
67
+
68
+ .PHONY: build
69
+ build:
70
+ $(UV) build