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.
- guitar_tui-0.1.0/.claude/claudify +1 -0
- guitar_tui-0.1.0/.claude/claudify.md +31 -0
- guitar_tui-0.1.0/.claude/commands/continue.md +10 -0
- guitar_tui-0.1.0/.claude/commands/log.md +20 -0
- guitar_tui-0.1.0/.claude/commands/prep.md +19 -0
- guitar_tui-0.1.0/.claude/commands/pulse.md +21 -0
- guitar_tui-0.1.0/.claude/commands/save.md +20 -0
- guitar_tui-0.1.0/.claude/hooks/pre-tool-use/guard-naming.sh +24 -0
- guitar_tui-0.1.0/.claude/hooks/stop/session-wrap.sh +57 -0
- guitar_tui-0.1.0/.claude/settings.local.json +17 -0
- guitar_tui-0.1.0/.env.example +7 -0
- guitar_tui-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
- guitar_tui-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
- guitar_tui-0.1.0/.gitignore +35 -0
- guitar_tui-0.1.0/.python-version +1 -0
- guitar_tui-0.1.0/CLAUDE.md +77 -0
- guitar_tui-0.1.0/CODE_OF_CONDUCT.md +41 -0
- guitar_tui-0.1.0/CONTRIBUTING.md +52 -0
- guitar_tui-0.1.0/LICENSE +21 -0
- guitar_tui-0.1.0/Makefile +70 -0
- guitar_tui-0.1.0/PKG-INFO +113 -0
- guitar_tui-0.1.0/README.md +86 -0
- guitar_tui-0.1.0/SECURITY.md +11 -0
- guitar_tui-0.1.0/demo.gif +0 -0
- guitar_tui-0.1.0/demo.tape +139 -0
- guitar_tui-0.1.0/docs/ARCHITECTURE.md +170 -0
- guitar_tui-0.1.0/docs/CONTEXT.md +8 -0
- guitar_tui-0.1.0/docs/CURRICULUM.md +521 -0
- guitar_tui-0.1.0/docs/PERSONAS.md +80 -0
- guitar_tui-0.1.0/docs/PLAN.md +124 -0
- guitar_tui-0.1.0/docs/REDESIGN.md +363 -0
- guitar_tui-0.1.0/docs/ROADMAP.md +38 -0
- guitar_tui-0.1.0/docs/models/METRONOME.md +182 -0
- guitar_tui-0.1.0/docs/reviews/2026-03-05_reviewer_assessment.md +115 -0
- guitar_tui-0.1.0/docs/reviews/2026-03-07_reviewer_assessment.md +144 -0
- guitar_tui-0.1.0/docs/reviews/2026-03-11_reviewer_assessment.md +114 -0
- guitar_tui-0.1.0/docs/reviews/2026-03-18_reviewer_assessment.md +113 -0
- guitar_tui-0.1.0/docs/reviews/2026-07-11_reviewer_assessment.md +178 -0
- guitar_tui-0.1.0/guitar_tui/__init__.py +3 -0
- guitar_tui-0.1.0/guitar_tui/app.py +130 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/alternate_picking.md +67 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/barre_strength.md +76 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/chromatic_warmup.md +48 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/major_scale_sequences.md +52 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/major_scale_three_nps.md +66 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/natural_minor_positions.md +63 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/one_minute_changes.md +62 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/open_chord_arpeggio.md +61 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/pentatonic_licks_1.md +74 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/pentatonic_sequences.md +69 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/position_shifts.md +54 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/seventh_voicings.md +80 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/spider_exercise.md +49 -0
- guitar_tui-0.1.0/guitar_tui/content/exercises/string_skipping.md +53 -0
- guitar_tui-0.1.0/guitar_tui/content/index.yaml +157 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/.gitkeep +0 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/reading_chord_diagrams.md +89 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/reading_scale_diagrams.md +73 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/reading_tab.md +101 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/the_fretboard.md +76 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/01-orientation/tuning_your_guitar.md +84 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/bm_chord.md +91 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/f_major_chord.md +86 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_a_chord.md +61 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_am_chord.md +72 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_c_chord.md +61 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_d_chord.md +57 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_dm_chord.md +68 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_e_chord.md +61 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_em_chord.md +65 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/02-open-chords/open_g_chord.md +59 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/a_d_e_progression.md +102 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/c_g_am_f_progression.md +116 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/g_d_em_c_progression.md +133 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/one_four_five.md +90 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/strumming_basics.md +144 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/03-first-progressions/twelve_bar_blues_a.md +154 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/chord_construction.md +90 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/intervals.md +72 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/key_signatures.md +81 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/major_scale_construction.md +100 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/musical_alphabet.md +70 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/relative_minor.md +103 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/roman_numerals.md +96 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/04-theory-basics/sharps_and_flats.md +74 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/a_shape_major.md +100 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/a_shape_minor.md +98 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/barre_intro.md +70 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/barre_progressions.md +130 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/caged_overview.md +107 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/e_shape_major.md +99 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/05-barre-chords/e_shape_minor.md +92 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/blues_scale.md +90 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/major_pentatonic_intro.md +61 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_intro.md +51 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_p2.md +59 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_p3.md +66 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_p4.md +68 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/minor_pentatonic_p5.md +69 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/pentatonic_connections.md +93 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/06-pentatonic-scale/pentatonic_major_vs_minor.md +91 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/minor_scale_chords.md +113 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_intro.md +72 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p1.md +70 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p2.md +56 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p3.md +56 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p4.md +62 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/07-natural-minor/natural_minor_p5.md +64 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/diatonic_progressions.md +104 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_chords.md +108 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p1.md +71 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p2.md +60 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p3.md +55 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p4.md +60 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/08-major-scale/major_scale_p5.md +71 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/dominant_7th.md +78 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/major_7th.md +82 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/minor_7th.md +80 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/seventh_progressions.md +93 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/09-seventh-chords/sus_and_add.md +100 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/dorian_mode.md +87 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/lydian_mode.md +89 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/mixolydian_mode.md +91 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/modes_in_context.md +80 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/modes_intro.md +55 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/10-modes/phrygian_mode.md +88 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/analysing_common_progressions.md +97 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/chord_function_analysis.md +92 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/ear_training_basics.md +80 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/finding_the_key.md +68 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/major_or_minor.md +61 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/modal_progressions.md +85 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/putting_it_together.md +96 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/scale_selection.md +75 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/11-song-analysis/what_is_song_analysis.md +66 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/combining_techniques.md +90 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/hammer_ons_pull_offs.md +91 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/slides.md +89 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/string_bending.md +73 -0
- guitar_tui-0.1.0/guitar_tui/content/lessons/12-expressive-techniques/vibrato_technique.md +82 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/blues_bb_king_box.md +53 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/blues_tritone_pass.md +53 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/dorian_groove.md +57 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/legato_phrase.md +44 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/lydian_raised_fourth.md +61 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/major_pent_country_walk.md +55 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/major_scale_lower_run.md +56 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/major_scale_upper_phrase.md +56 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/mixolydian_b7_phrase.md +63 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/mixolydian_chord_riff.md +56 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_descent.md +57 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_pos2.md +53 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_pos3.md +55 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_pos4.md +54 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/natural_minor_pos5.md +56 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/pent_bend_release.md +57 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/pent_blues_turnaround.md +70 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/pent_box1_run.md +50 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/pent_position2_run.md +60 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/pent_position3_run.md +55 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/pent_position4_run.md +54 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/pent_position5_run.md +55 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/phrygian_flamenco.md +56 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/phrygian_half_step.md +60 -0
- guitar_tui-0.1.0/guitar_tui/content/licks/slide_connector.md +45 -0
- guitar_tui-0.1.0/guitar_tui/content/reference/.gitkeep +0 -0
- guitar_tui-0.1.0/guitar_tui/data/chords/.gitkeep +0 -0
- guitar_tui-0.1.0/guitar_tui/data/chords/barre_chords.yaml +514 -0
- guitar_tui-0.1.0/guitar_tui/data/chords/extended_chords.yaml +102 -0
- guitar_tui-0.1.0/guitar_tui/data/chords/open_chords.yaml +69 -0
- guitar_tui-0.1.0/guitar_tui/data/chords/seventh_chords.yaml +110 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/.gitkeep +0 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/blues_scale.yaml +115 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/dorian.yaml +135 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/lydian.yaml +137 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/major.yaml +140 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/major_pentatonic.yaml +107 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/mixolydian.yaml +137 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/natural_minor.yaml +130 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/pentatonic_minor.yaml +110 -0
- guitar_tui-0.1.0/guitar_tui/data/scales/phrygian.yaml +137 -0
- guitar_tui-0.1.0/guitar_tui/data/tunings.yaml +26 -0
- guitar_tui-0.1.0/guitar_tui/engine/__init__.py +19 -0
- guitar_tui-0.1.0/guitar_tui/engine/chord_renderer.py +108 -0
- guitar_tui-0.1.0/guitar_tui/engine/dispatcher.py +59 -0
- guitar_tui-0.1.0/guitar_tui/engine/fretboard_renderer.py +83 -0
- guitar_tui-0.1.0/guitar_tui/engine/models.py +212 -0
- guitar_tui-0.1.0/guitar_tui/engine/scale_renderer.py +78 -0
- guitar_tui-0.1.0/guitar_tui/engine/tab_renderer.py +210 -0
- guitar_tui-0.1.0/guitar_tui/loaders/__init__.py +19 -0
- guitar_tui-0.1.0/guitar_tui/loaders/data_loader.py +105 -0
- guitar_tui-0.1.0/guitar_tui/loaders/lesson_loader.py +361 -0
- guitar_tui-0.1.0/guitar_tui/loaders/lick_loader.py +222 -0
- guitar_tui-0.1.0/guitar_tui/loaders/models.py +166 -0
- guitar_tui-0.1.0/guitar_tui/settings.py +62 -0
- guitar_tui-0.1.0/guitar_tui/theory/__init__.py +1 -0
- guitar_tui-0.1.0/guitar_tui/theory/keys.py +227 -0
- guitar_tui-0.1.0/guitar_tui/ui/__init__.py +1 -0
- guitar_tui-0.1.0/guitar_tui/ui/app.tcss +303 -0
- guitar_tui-0.1.0/guitar_tui/ui/screens/__init__.py +7 -0
- guitar_tui-0.1.0/guitar_tui/ui/screens/lesson.py +279 -0
- guitar_tui-0.1.0/guitar_tui/ui/screens/practice.py +163 -0
- guitar_tui-0.1.0/guitar_tui/ui/screens/size_warning.py +40 -0
- guitar_tui-0.1.0/guitar_tui/ui/screens/tools.py +447 -0
- guitar_tui-0.1.0/guitar_tui/ui/screens/welcome.py +165 -0
- guitar_tui-0.1.0/guitar_tui/ui/widgets/__init__.py +1 -0
- guitar_tui-0.1.0/guitar_tui/ui/widgets/full_neck.py +156 -0
- guitar_tui-0.1.0/guitar_tui/ui/widgets/metronome.py +199 -0
- guitar_tui-0.1.0/pyproject.toml +51 -0
- guitar_tui-0.1.0/schemas/diagram_spec.md +351 -0
- guitar_tui-0.1.0/schemas/diagram_taxonomy.md +106 -0
- guitar_tui-0.1.0/schemas/lesson_format.md +202 -0
- guitar_tui-0.1.0/tests/__init__.py +0 -0
- guitar_tui-0.1.0/tests/test_app.py +36 -0
- guitar_tui-0.1.0/tests/test_data_loader.py +382 -0
- guitar_tui-0.1.0/tests/test_engine_chord.py +256 -0
- guitar_tui-0.1.0/tests/test_engine_dispatcher.py +137 -0
- guitar_tui-0.1.0/tests/test_engine_fretboard.py +226 -0
- guitar_tui-0.1.0/tests/test_engine_scale.py +181 -0
- guitar_tui-0.1.0/tests/test_engine_tab.py +934 -0
- guitar_tui-0.1.0/tests/test_lesson_loader.py +565 -0
- guitar_tui-0.1.0/tests/test_lick_loader.py +208 -0
- guitar_tui-0.1.0/tests/test_placeholder.py +7 -0
- guitar_tui-0.1.0/tests/test_settings.py +127 -0
- guitar_tui-0.1.0/tests/test_theory_keys.py +214 -0
- 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
|
+
```
|
guitar_tui-0.1.0/LICENSE
ADDED
|
@@ -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
|