copilot-session-usage 0.4.0__tar.gz → 0.5.1__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 (110) hide show
  1. copilot_session_usage-0.5.1/.gitattributes +196 -0
  2. copilot_session_usage-0.5.1/.github/guidelines/git-commit-message.guideline.md +99 -0
  3. copilot_session_usage-0.5.1/.github/skills/gh-release-notes/SKILL.md +255 -0
  4. copilot_session_usage-0.5.1/.readthedocs.yaml +36 -0
  5. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/AGENTS.md +1 -0
  6. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/CHANGELOG.md +13 -0
  7. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/PKG-INFO +2 -1
  8. copilot_session_usage-0.5.1/docs/source/how-to/add-commit-trailer.md +133 -0
  9. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/how-to/index.md +1 -0
  10. copilot_session_usage-0.5.1/docs/source/reference/cli.md +11 -0
  11. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/justfile +3 -0
  12. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/pyproject.toml +1 -0
  13. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/skills/copilot-session-usage/SKILL.md +55 -0
  14. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/_internal/core.py +258 -91
  15. copilot_session_usage-0.5.1/src/copilot_session_usage/_internal/git.py +126 -0
  16. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/_internal/vscode.py +43 -0
  17. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/cli.py +110 -1
  18. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/tests/test_cli.py +137 -0
  19. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/tests/test_core.py +213 -5
  20. copilot_session_usage-0.5.1/tests/test_git.py +176 -0
  21. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/tests/test_rendering.py +11 -10
  22. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/uv.lock +35 -0
  23. copilot_session_usage-0.4.0/.readthedocs.yaml +0 -24
  24. copilot_session_usage-0.4.0/docs/source/reference/cli.md +0 -7
  25. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.editorconfig +0 -0
  26. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  28. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.github/changes/requests/skill-breakdown/01-request.md +0 -0
  29. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.github/guidelines/knowledge-base.guidelines.md +0 -0
  30. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.github/pull_request_template.md +0 -0
  31. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.github/skills/consolidate-knowledge-base/SKILL.md +0 -0
  32. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.github/skills/record-finding/SKILL.md +0 -0
  33. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.github/workflows/ci.yml +0 -0
  34. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.github/workflows/publish.yml +0 -0
  35. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/.gitignore +0 -0
  36. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/CONTRIBUTING.md +0 -0
  37. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/LICENSE +0 -0
  38. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/README.md +0 -0
  39. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/_static/changelog.js +0 -0
  40. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/_static/custom.css +0 -0
  41. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/changelog.md +0 -0
  42. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/conf.py +0 -0
  43. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/explanation/how-cost-estimation-works.md +0 -0
  44. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/explanation/index.md +0 -0
  45. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/how-to/analyze-specific-session.md +0 -0
  46. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/how-to/batch-and-spending.md +0 -0
  47. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/how-to/export-json.md +0 -0
  48. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/how-to/wsl2.md +0 -0
  49. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/index.md +0 -0
  50. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/installation.md +0 -0
  51. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/reference/api.md +0 -0
  52. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/reference/index.md +0 -0
  53. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/reference/pricing.md +0 -0
  54. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/tutorials/getting-started.md +0 -0
  55. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/docs/source/tutorials/index.md +0 -0
  56. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Base.schema.yaml +0 -0
  57. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Concept.schema.yaml +0 -0
  58. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Experiment.schema.yaml +0 -0
  59. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Finding.schema.yaml +0 -0
  60. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Hypothesis.schema.yaml +0 -0
  61. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Outcome.schema.yaml +0 -0
  62. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Playbook.schema.yaml +0 -0
  63. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Principle.schema.yaml +0 -0
  64. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Reference.schema.yaml +0 -0
  65. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/_schema/Structure.schema.yaml +0 -0
  66. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/concepts/copilot-cli.md +0 -0
  67. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/concepts/index.md +0 -0
  68. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/concepts/overview.md +0 -0
  69. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/concepts/session-cost-analysis.md +0 -0
  70. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/concepts/threshold-based-pricing.md +0 -0
  71. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/experiments/index.md +0 -0
  72. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/experiments/verify-subagent-cost-attribution.md +0 -0
  73. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/findings/2026.07.02-00.00-subagent-logs-runsubagent-prefix.md +0 -0
  74. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/findings/2026.07.02-22.00-title-generation-not-counted-as-model-turn.md +0 -0
  75. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/findings/2026.07.02-23.00-cache-write-approximation.md +0 -0
  76. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/findings/index.md +0 -0
  77. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/guides/automation-scripts.md +0 -0
  78. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/guides/cost-optimization.md +0 -0
  79. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/guides/index.md +0 -0
  80. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/guides/wsl2-setup.md +0 -0
  81. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/ideas/index.md +0 -0
  82. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/ideas/multi-session-efficiency-analytics.md +0 -0
  83. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/index.md +0 -0
  84. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/log.md +0 -0
  85. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/principles/findings-are-immutable.md +0 -0
  86. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/principles/index.md +0 -0
  87. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/reference/debug-log-format.md +0 -0
  88. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/reference/index.md +0 -0
  89. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/reference/pricing-formats.md +0 -0
  90. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/structures/cache-cost-approximation.md +0 -0
  91. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/structures/index.md +0 -0
  92. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/structures/knowledge-base-information-types.md +0 -0
  93. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/structures/session-discovery-algorithm.md +0 -0
  94. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/structures/subagent-cost-tracking.md +0 -0
  95. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/knowledge/structures/vscode-copilot-extension.md +0 -0
  96. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/scripts/refresh_pricing.py +0 -0
  97. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/__init__.py +0 -0
  98. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/_internal/__init__.py +0 -0
  99. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/_internal/copilot_cli.py +0 -0
  100. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/api.py +0 -0
  101. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/data/__init__.py +0 -0
  102. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/data/custom-models-pricing.yml +0 -0
  103. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/data/models-and-pricing.lock +0 -0
  104. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/src/copilot_session_usage/data/models-and-pricing.yml +0 -0
  105. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/tests/conftest.py +0 -0
  106. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/tests/test_api.py +0 -0
  107. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/tests/test_coverage_gaps.py +0 -0
  108. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/tests/test_vscode.py +0 -0
  109. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/tests/test_vscode_platform.py +0 -0
  110. {copilot_session_usage-0.4.0 → copilot_session_usage-0.5.1}/uv.toml +0 -0
@@ -0,0 +1,196 @@
1
+ ################################################################################
2
+ #
3
+ # Gitattributes - defining git attributes per path
4
+ #
5
+ # this .gitattributes file converts most binary format to git-lfs
6
+ #
7
+ # Resources:
8
+ #
9
+ # - https://git-lfs.com/
10
+ # - https://docs.gitlab.com/ee/topics/git/lfs/
11
+ # - https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes
12
+ #
13
+ ################################################################################
14
+
15
+ # Git will always convert line endings to LF on checkout.
16
+ # You should use this for files that must keep LF endings, even on Windows.
17
+ # (in case people don't have core.autocrlf set)
18
+ * text=auto eol=lf
19
+
20
+ # All files with '.lfs.' in its name will be placed in Git LFS automatically
21
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
22
+
23
+ # Denote all files that are truly filter=lfs diff=lfs merge=lfs -text
24
+ # and should not be modified.
25
+
26
+ # Executables
27
+ *.exe filter=lfs diff=lfs merge=lfs -text
28
+ *.dll filter=lfs diff=lfs merge=lfs -text
29
+
30
+ # documents
31
+ *.csv filter=lfs diff=lfs merge=lfs -text
32
+ *.doc filter=lfs diff=lfs merge=lfs -text
33
+ *.docx filter=lfs diff=lfs merge=lfs -text
34
+ *.odf filter=lfs diff=lfs merge=lfs -text
35
+ *.odp filter=lfs diff=lfs merge=lfs -text
36
+ *.odt filter=lfs diff=lfs merge=lfs -text
37
+ *.pdf filter=lfs diff=lfs merge=lfs -text
38
+ *.ppt filter=lfs diff=lfs merge=lfs -text
39
+ *.pptx filter=lfs diff=lfs merge=lfs -text
40
+ *.xls filter=lfs diff=lfs merge=lfs -text
41
+ *.xls filter=lfs diff=lfs merge=lfs -text
42
+ *.xlsm filter=lfs diff=lfs merge=lfs -text
43
+ *.xlsx filter=lfs diff=lfs merge=lfs -text
44
+
45
+ # Fonts
46
+ *.eot filter=lfs diff=lfs merge=lfs -text
47
+ *.otf filter=lfs diff=lfs merge=lfs -text
48
+ *.ttc filter=lfs diff=lfs merge=lfs -text
49
+ *.ttf filter=lfs diff=lfs merge=lfs -text
50
+ *.woff filter=lfs diff=lfs merge=lfs -text
51
+ *.woff2 filter=lfs diff=lfs merge=lfs -text
52
+
53
+ # Images
54
+ *.ai filter=lfs diff=lfs merge=lfs -text
55
+ *.bmp filter=lfs diff=lfs merge=lfs -text
56
+ *.eps filter=lfs diff=lfs merge=lfs -text
57
+ *.gif filter=lfs diff=lfs merge=lfs -text
58
+ *.ico filter=lfs diff=lfs merge=lfs -text
59
+ *.jng filter=lfs diff=lfs merge=lfs -text
60
+ *.jp2 filter=lfs diff=lfs merge=lfs -text
61
+ *.jpg filter=lfs diff=lfs merge=lfs -text
62
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
63
+ *.jpx filter=lfs diff=lfs merge=lfs -text
64
+ *.jxr filter=lfs diff=lfs merge=lfs -text
65
+ *.png filter=lfs diff=lfs merge=lfs -text
66
+ *.psb filter=lfs diff=lfs merge=lfs -text
67
+ *.psd filter=lfs diff=lfs merge=lfs -text
68
+ *.svg text
69
+ *.svgz filter=lfs diff=lfs merge=lfs -text
70
+ *.tif filter=lfs diff=lfs merge=lfs -text
71
+ *.tiff filter=lfs diff=lfs merge=lfs -text
72
+ *.wbmp filter=lfs diff=lfs merge=lfs -text
73
+ *.webp filter=lfs diff=lfs merge=lfs -text
74
+
75
+ # Audio
76
+ *.kar filter=lfs diff=lfs merge=lfs -text
77
+ *.m4a filter=lfs diff=lfs merge=lfs -text
78
+ *.mid filter=lfs diff=lfs merge=lfs -text
79
+ *.midi filter=lfs diff=lfs merge=lfs -text
80
+ *.mp3 filter=lfs diff=lfs merge=lfs -text
81
+ *.ogg filter=lfs diff=lfs merge=lfs -text
82
+ *.ra filter=lfs diff=lfs merge=lfs -text
83
+
84
+ ## VIDEO
85
+ *.3gpp filter=lfs diff=lfs merge=lfs -text
86
+ *.3gp filter=lfs diff=lfs merge=lfs -text
87
+ *.as filter=lfs diff=lfs merge=lfs -text
88
+ *.asf filter=lfs diff=lfs merge=lfs -text
89
+ *.asx filter=lfs diff=lfs merge=lfs -text
90
+ *.fla filter=lfs diff=lfs merge=lfs -text
91
+ *.flv filter=lfs diff=lfs merge=lfs -text
92
+ *.m4v filter=lfs diff=lfs merge=lfs -text
93
+ *.mng filter=lfs diff=lfs merge=lfs -text
94
+ *.mov filter=lfs diff=lfs merge=lfs -text
95
+ *.mp4 filter=lfs diff=lfs merge=lfs -text
96
+ *.mpeg filter=lfs diff=lfs merge=lfs -text
97
+ *.mpg filter=lfs diff=lfs merge=lfs -text
98
+ *.ogv filter=lfs diff=lfs merge=lfs -text
99
+ *.swc filter=lfs diff=lfs merge=lfs -text
100
+ *.swf filter=lfs diff=lfs merge=lfs -text
101
+ *.webm filter=lfs diff=lfs merge=lfs -text
102
+
103
+ # Archives
104
+ *.7z filter=lfs diff=lfs merge=lfs -text
105
+ *.cab filter=lfs diff=lfs merge=lfs -text
106
+ *.ear filter=lfs diff=lfs merge=lfs -text
107
+ *.gz filter=lfs diff=lfs merge=lfs -text
108
+ *.jar filter=lfs diff=lfs merge=lfs -text
109
+ *.aar filter=lfs diff=lfs merge=lfs -text
110
+ *.apk filter=lfs diff=lfs merge=lfs -text
111
+ *.rar filter=lfs diff=lfs merge=lfs -text
112
+ *.tar filter=lfs diff=lfs merge=lfs -text
113
+ *.tgz filter=lfs diff=lfs merge=lfs -text
114
+ *.war filter=lfs diff=lfs merge=lfs -text
115
+ *.zip filter=lfs diff=lfs merge=lfs -text
116
+ *.pdf filter=lfs diff=lfs merge=lfs -text
117
+ *.eot filter=lfs diff=lfs merge=lfs -text
118
+ *.otf filter=lfs diff=lfs merge=lfs -text
119
+ *.ttc filter=lfs diff=lfs merge=lfs -text
120
+ *.ttf filter=lfs diff=lfs merge=lfs -text
121
+ *.woff filter=lfs diff=lfs merge=lfs -text
122
+ *.ai filter=lfs diff=lfs merge=lfs -text
123
+ *.bmp filter=lfs diff=lfs merge=lfs -text
124
+ *.eps filter=lfs diff=lfs merge=lfs -text
125
+ *.gif filter=lfs diff=lfs merge=lfs -text
126
+ *.ico filter=lfs diff=lfs merge=lfs -text
127
+ *.jng filter=lfs diff=lfs merge=lfs -text
128
+ *.jp2 filter=lfs diff=lfs merge=lfs -text
129
+ *.jpg filter=lfs diff=lfs merge=lfs -text
130
+ *.jpx filter=lfs diff=lfs merge=lfs -text
131
+ *.jxr filter=lfs diff=lfs merge=lfs -text
132
+ *.png filter=lfs diff=lfs merge=lfs -text
133
+ *.psb filter=lfs diff=lfs merge=lfs -text
134
+ *.psd filter=lfs diff=lfs merge=lfs -text
135
+ *.tif filter=lfs diff=lfs merge=lfs -text
136
+ *.kar filter=lfs diff=lfs merge=lfs -text
137
+ *.m4a filter=lfs diff=lfs merge=lfs -text
138
+ *.mid filter=lfs diff=lfs merge=lfs -text
139
+ *.mp3 filter=lfs diff=lfs merge=lfs -text
140
+ *.ogg filter=lfs diff=lfs merge=lfs -text
141
+ *.ra filter=lfs diff=lfs merge=lfs -text
142
+ *.3gp filter=lfs diff=lfs merge=lfs -text
143
+ *.as filter=lfs diff=lfs merge=lfs -text
144
+ *.asf filter=lfs diff=lfs merge=lfs -text
145
+ *.asx filter=lfs diff=lfs merge=lfs -text
146
+ *.fla filter=lfs diff=lfs merge=lfs -text
147
+ *.flv filter=lfs diff=lfs merge=lfs -text
148
+ *.m4v filter=lfs diff=lfs merge=lfs -text
149
+ *.mng filter=lfs diff=lfs merge=lfs -text
150
+ *.mov filter=lfs diff=lfs merge=lfs -text
151
+ *.mp4 filter=lfs diff=lfs merge=lfs -text
152
+ *.mpg filter=lfs diff=lfs merge=lfs -text
153
+ *.ogv filter=lfs diff=lfs merge=lfs -text
154
+ *.swc filter=lfs diff=lfs merge=lfs -text
155
+ *.swf filter=lfs diff=lfs merge=lfs -text
156
+ *.7z filter=lfs diff=lfs merge=lfs -text
157
+ *.cab filter=lfs diff=lfs merge=lfs -text
158
+ *.ear filter=lfs diff=lfs merge=lfs -text
159
+ *.gz filter=lfs diff=lfs merge=lfs -text
160
+ *.jar filter=lfs diff=lfs merge=lfs -text
161
+ *.aar filter=lfs diff=lfs merge=lfs -text
162
+ *.rar filter=lfs diff=lfs merge=lfs -text
163
+ *.tar filter=lfs diff=lfs merge=lfs -text
164
+ *.tgz filter=lfs diff=lfs merge=lfs -text
165
+ *.war filter=lfs diff=lfs merge=lfs -text
166
+ *.zip filter=lfs diff=lfs merge=lfs -text
167
+
168
+ # Matlab binary format
169
+ *.slx filter=lfs diff=lfs merge=lfs -text
170
+ *.mat filter=lfs diff=lfs merge=lfs -text
171
+ *.mltbx filter=lfs diff=lfs merge=lfs -text
172
+ *.mlapp filter=lfs diff=lfs merge=lfs -text
173
+
174
+ # Autosar
175
+ *.arxml filter=lfs diff=lfs merge=lfs -text
176
+
177
+ # 3D objects
178
+ *.ive filter=lfs diff=lfs merge=lfs -text
179
+ *.sketch filter=lfs diff=lfs merge=lfs -text
180
+ *.osgb filter=lfs diff=lfs merge=lfs -text
181
+
182
+ # FMU
183
+ *.fmu filter=lfs diff=lfs merge=lfs -text
184
+
185
+ # Misc
186
+ *.rgb filter=lfs diff=lfs merge=lfs -text
187
+ *.cbf filter=lfs diff=lfs merge=lfs -text
188
+ *.csb filter=lfs diff=lfs merge=lfs -text
189
+ *.db filter=lfs diff=lfs merge=lfs -text
190
+ *.exp filter=lfs diff=lfs merge=lfs -text
191
+ *.lst filter=lfs diff=lfs merge=lfs -text
192
+ *.tptbin filter=lfs diff=lfs merge=lfs -text
193
+ *.vopt filter=lfs diff=lfs merge=lfs -text
194
+ *.res filter=lfs diff=lfs merge=lfs -text
195
+ *.tlog filter=lfs diff=lfs merge=lfs -text
196
+ *.sol filter=lfs diff=lfs merge=lfs -text
@@ -0,0 +1,99 @@
1
+ ---
2
+ name: Git Commit Message Guideline 1.0
3
+ description: Guidelines for writing conventional commits that communicate intent and user impact
4
+ metadata:
5
+ owner: Gaetan Semet <gaetan.semet@ampere.cars>
6
+ keywords: [git, commit, conventional, message, changelog]
7
+ guideline-id: 45c42e46-0781-4954-a410-1f380f5553f3
8
+ ---
9
+
10
+ # Git Commit Message Guideline
11
+
12
+ Write clear, focused commit messages following Conventional Commits format. Commit messages communicate *why* changes were made—enabling automated changelog generation, bug investigation, and decision-making during upgrades. Focus on user impact, not implementation details.
13
+
14
+ ## Core Rules
15
+
16
+ ### Rule 1: Use Conventional Commit Format
17
+
18
+ **Apply:** Format every title as `type(scope): description`
19
+
20
+ **Why:** Enables automated changelog generation and consistent pattern parsing.
21
+
22
+ **Types:** `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `ci`, `chore`, `build`, `revert`
23
+
24
+ **Examples:**
25
+ ```
26
+ feat(auth): add two-factor authentication support
27
+ fix(api): resolve request timeout in user endpoint
28
+ docs(readme): update installation instructions
29
+ perf(cache): optimize query performance by 40%
30
+ test(validators): add email format validation tests
31
+ ```
32
+
33
+ ---
34
+
35
+ ### Rule 2: Keep Title Under 50 Characters, Body Under 72 Per Line
36
+
37
+ **Apply:** Enforce character limits for scannability and terminal compatibility.
38
+
39
+ **Why:** Short titles force clarity; wrapped body text maintains readability in terminals and email clients.
40
+
41
+ **Example:**
42
+ ```
43
+ feat(cache): implement LRU eviction policy
44
+
45
+ Reduces memory usage in long-running processes by
46
+ automatically removing least-recently-used items.
47
+
48
+ Changes:
49
+ - Cache drops oldest accessed items upon limit
50
+ - Configurable cache size (default 1000)
51
+ - < 2% performance overhead on reads
52
+
53
+ Users can set CACHE_SIZE environment variable.
54
+ ```
55
+
56
+ ---
57
+
58
+ ### Rule 3: Focus Body on User Impact, Not Implementation Details
59
+
60
+ **Apply:** Describe what users gain and must know; exclude refactoring details, internal functions, and test additions.
61
+
62
+ **Why:** Users deciding whether to upgrade, developers integrating changes, and bug investigators need user-level context—not code structure details.
63
+
64
+ **Example:**
65
+ ```
66
+ fix(api): allow null values in optional response fields
67
+
68
+ Optional fields now omitted from JSON when empty,
69
+ reducing response payload by ~15% for sparse data.
70
+
71
+ Migration:
72
+ - Check `field in response` instead of `field != null`
73
+ - Response schema updated in API reference
74
+ ```
75
+
76
+ ---
77
+
78
+ ### Rule 4: Include Breaking Changes with Migration Guidance
79
+
80
+ **Apply:** Use `!` in title and `BREAKING CHANGE:` section. Provide explicit migration steps.
81
+
82
+ **Why:** Breaking changes require user action; clear guidance reduces upgrade confusion.
83
+
84
+ **Example:**
85
+ ```
86
+ feat(api)!: change pagination to cursor-based tokens
87
+
88
+ Cursors improve performance with large datasets.
89
+
90
+ BREAKING CHANGE: Replaced `pagination_offset` and
91
+ `pagination_limit` with `pagination.cursor`.
92
+
93
+ Migration:
94
+ Old: GET /users?limit=10&offset=20
95
+ New: GET /users?limit=10&cursor=xyz123
96
+
97
+ Update code to use `response.pagination.cursor`
98
+ in next request instead of offset/limit.
99
+ ```
@@ -0,0 +1,255 @@
1
+ # Release Notes Generator (Git Diff Based)
2
+
3
+ Generate **end-user friendly** release notes by analyzing actual code changes between releases.
4
+ No scripts required — uses git commands to understand what changed and why it matters.
5
+
6
+ The output is meant to be **copy-pasted into a GitHub Release** (or similar).
7
+
8
+ ---
9
+
10
+ ## Quick Start
11
+
12
+ Provide your repository and range:
13
+
14
+ ```
15
+ Generate release notes from v1.0.0 to v1.1.0 in /path/to/repo
16
+ ```
17
+
18
+ Or reference the last release:
19
+
20
+ ```
21
+ What changed since the last release tag?
22
+ ```
23
+
24
+ ---
25
+
26
+ ## What It Does
27
+
28
+ 1. **Reads actual diffs** — examines code changes, not just commit messages
29
+ 2. **Interprets for end-users** — no technical jargon, functions, or variable names
30
+ 3. **Categorizes intelligently** — Features, Enhancements, Bug Fixes, Breaking Changes
31
+ 4. **Adds concrete examples** — shows what users see or can do after the change
32
+ 5. **Links to public docs** — points to published documentation, not repo paths
33
+ 6. **Consolidates related changes** — groups related diffs, eliminates back-and-forth noise
34
+ 7. **Outputs clean markdown** — ready to paste into a GitHub Release note
35
+
36
+ ---
37
+
38
+ ## Input
39
+
40
+ Accept either:
41
+
42
+ - **Natural language**: "Show release notes from v1.2.0 to v1.3.0"
43
+ - **Range spec**: `from_tag=v1.2.0 to_tag=v1.3.0 repo_path=/path/to/repo`
44
+ - **Last release**: `since_tag=v1.2.0` (everything from tag to HEAD)
45
+
46
+ Required:
47
+ - Repository path (optional: defaults to current directory)
48
+ - Range: `from_tag` + `to_tag`, OR `since_tag`, OR `last_n_commits`
49
+
50
+ ---
51
+
52
+ ## Analysis Process
53
+
54
+ ### Step 1: Collect Commits
55
+ ```bash
56
+ git log v1.0.0..v1.1.0 --oneline --no-merges
57
+ ```
58
+ Gather all commits in the specified range with their messages.
59
+
60
+ ### Step 2: Examine Diffs
61
+ ```bash
62
+ git diff v1.0.0..v1.1.0 -- src/
63
+ ```
64
+ Read actual code changes line-by-line to understand what changed.
65
+
66
+ ### Step 3: Interpret Changes
67
+
68
+ Translate technical changes into user impact:
69
+
70
+ | Code Change | User Impact |
71
+ |-------------|------------|
72
+ | `+ const darkMode = true` in settings | "Dark mode toggle now available in settings" |
73
+ | Deleted login retry logic | "Removed automatic retry on login timeout" |
74
+ | `+ validateEmail()` function | "Email validation improved during signup" |
75
+ | Updated database schema version | "Database schema upgraded (run migration)" |
76
+ | Added 10+ calls to cache layer | "Improved performance on large operations" |
77
+ | Removed old CSV export code | "CSV export removed; use Excel or PDF instead" |
78
+
79
+ **Key: Focus on the user's experience, not the code implementation.**
80
+
81
+ ### Step 4: Identify Breaking Changes
82
+
83
+ Breaking changes come from:
84
+ - **Commit messages** containing: "BREAKING", "Breaking", "!:"
85
+ - **Diffs showing**: removed public APIs, changed file formats, data migrations
86
+ - **Config changes**: renamed settings, changed defaults
87
+
88
+ ### Step 5: Consolidate
89
+ - If a feature was added then removed → don't mention it
90
+ - If something changed multiple times → only note the final state
91
+ - If multiple commits fix the same issue → merge into one bullet
92
+
93
+ ### Step 6: Categorize & Format
94
+
95
+ Organize changes into buckets. **Only include sections that have content.** Omit empty sections entirely.
96
+
97
+ ```markdown
98
+ # Release Notes - v1.1.0
99
+
100
+ ## New Features
101
+ - Added dark mode toggle in settings
102
+ - New PDF export option
103
+
104
+ ## Enhancements
105
+ - Improved search performance (now supports partial matches)
106
+ - Faster file opening for large documents
107
+
108
+ ## Bug Fixes
109
+ - Fixed login failures on slow connections
110
+ - Resolved crash when uploading 10MB+ files
111
+
112
+ ## Breaking Changes
113
+ - Database schema updated — run migration before upgrading
114
+ - CSV export removed; use Excel or PDF instead
115
+
116
+ ## Examples
117
+ - Dark mode can be enabled in Settings → Appearance → Theme
118
+ - CSV export is no longer available; choose Excel or PDF from Export menu
119
+
120
+ ## Documentation
121
+ - [Dark mode guide](https://docs.example.com/settings#dark-mode)
122
+ - [Migration notes](https://docs.example.com/upgrade#database)
123
+ ```
124
+
125
+ ---
126
+
127
+ ## Workflow for Agent
128
+
129
+ 1. **Parse input** — extract `from_tag`, `to_tag`, `repo_path`, and optional filters
130
+ 2. **Discover public docs URL** — inspect `README.md`, `pyproject.toml`, `mkdocs.yml`, `docs/conf.py`, or `.readthedocs.yml` for the published documentation URL. Prefer ReadTheDocs, GitHub Pages, or the project's public docs site. If none is found, omit doc links.
131
+ 3. **Fetch commits** — run `git log` with range, collect hashes & messages
132
+ 4. **Read diffs per file** — `git show <hash>` for each commit, examine changed files
133
+ 5. **Interpret impact** — what does each change mean to users?
134
+ 6. **Detect breaking changes** — scan for BREAKING markers, API removals, schema changes
135
+ 7. **Group by category** — assign each change to **New Features**, **Enhancements**, **Bug Fixes**, **Breaking Changes**, **Examples**, or **Documentation**
136
+ 8. **Build examples** — for each user-facing change, look at README, docs, tests, or CLI help in the diff and add a short "what the user gets" example when it clarifies the change
137
+ 9. **Consolidate** — merge related items, remove duplicates and flip-flops
138
+ 10. **Format markdown** — generate clean bullet points with proper headings
139
+ 11. **Omit empty sections** — do not print a section if it has no bullets
140
+ 12. **Use public docs links** — every Documentation bullet and every feature/enhancement docs reference must use the public URL with a fragment identifier, not a repo-relative path
141
+
142
+ ---
143
+
144
+ ## Output Format
145
+
146
+ **Clean markdown** for a GitHub Release:
147
+
148
+ ```markdown
149
+ # Release Notes - v1.1.0
150
+
151
+ ## New Features
152
+ - Added dark mode toggle in settings
153
+ - New PDF export option
154
+
155
+ ## Enhancements
156
+ - Improved search performance (supports partial matches)
157
+ - Faster file opening for large documents
158
+
159
+ ## Bug Fixes
160
+ - Fixed login failures on slow connections
161
+ - Resolved crash when uploading 10MB+ files
162
+
163
+ ## Breaking Changes
164
+ - Database schema updated — run migration before upgrading
165
+
166
+ ## Examples
167
+ - Enable dark mode from Settings → Appearance → Theme
168
+ - Export a report as PDF from the File → Export menu
169
+
170
+ ## Documentation
171
+ - [Dark mode guide](https://docs.example.com/settings#dark-mode)
172
+ - [Upgrade instructions](https://docs.example.com/upgrade#database)
173
+ ```
174
+
175
+ **Key Rules:**
176
+ - One line per bullet point
177
+ - No sub-bullets or elaborate descriptions
178
+ - User impact only (not implementation details)
179
+ - Use public documentation URLs; never use repo-relative paths like `docs/...` or `README.md`
180
+ - Use fragment identifiers (`#section-name`) to point to specific docs sections
181
+ - Add an **Examples** section when the diff shows a CLI command, API call, config snippet, or before/after behavior
182
+ - Add a **Documentation** section when docs were added or updated, linking to the published page
183
+ - Multiple links OK if they point to different topics
184
+ - Omit any section that has no bullets
185
+ - Do not add a "Notes", "Miscellaneous", or "Other" catch-all section
186
+
187
+ ---
188
+
189
+ ## How to Use This Skill in a Session
190
+
191
+ **User Query:**
192
+ ```
193
+ Generate release notes from v2.1.0 to v2.2.0 for /path/to/my-app
194
+ ```
195
+
196
+ **Agent Workflow:**
197
+ 1. Navigate to repo: `cd /path/to/my-app`
198
+ 2. Fetch commits: `git log v2.1.0..v2.2.0 --oneline --no-merges`
199
+ 3. For each commit, examine changes: `git show <hash>`
200
+ 4. Interpret: What's the user impact? (not the code details)
201
+ 5. Categorize: Feature? Bug fix? Breaking change?
202
+ 6. Consolidate: Merge similar items
203
+ 7. Format: Clean markdown with categories
204
+ 8. Output: Save to RELEASE_NOTES.md
205
+
206
+ ---
207
+
208
+ ## Best Practices
209
+
210
+ ✅ **Do:**
211
+ - Read actual diffs to understand changes
212
+ - Use end-user language ("improved performance" not "optimized O(n) loop")
213
+ - Include breaking changes prominently
214
+ - Group related changes
215
+ - Add concrete examples drawn from README, docs, tests, or CLI help in the diff
216
+ - Link to the project's public documentation site (ReadTheDocs, GitHub Pages, etc.)
217
+ - Omit empty sections
218
+
219
+ ❌ **Don't:**
220
+ - Copy commit messages verbatim
221
+ - Include function/variable names
222
+ - Mention internal refactors users won't notice
223
+ - Include dependency bumps or build changes unless they are user-visible
224
+ - Include secrets, passwords, or internal URLs
225
+ - Use repo-relative paths like `docs/source/how-to/...` or `README.md`
226
+ - Make up changes not shown in diffs
227
+
228
+ ---
229
+
230
+ ## Common Patterns
231
+
232
+ **Performance improvements:**
233
+ > "Improved search speed when filtering 1000+ records"
234
+
235
+ **New integrations:**
236
+ > "Added support for OAuth login via GitHub"
237
+
238
+ **Data format changes:**
239
+ > "Settings file now uses JSON instead of YAML (auto-converted on first run)"
240
+
241
+ **Removed features:**
242
+ > "Removed IE 11 support to modernize codebase"
243
+
244
+ **API changes:**
245
+ > "Changed user profile endpoint response format (see migration guide)"
246
+
247
+ ---
248
+
249
+ ## Limitations
250
+
251
+ - Requires git repository with proper tags
252
+ - Complex changes may need human interpretation
253
+ - Very large diffs (1000+ files) summarized by file count
254
+ - Works best with semantic versioning (v1.0.0 format)
255
+ - Needs meaningful commit messages for best results
@@ -0,0 +1,36 @@
1
+ # Read the Docs configuration file
2
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3
+
4
+ version: 2
5
+
6
+ build:
7
+ os: ubuntu-24.04
8
+ tools:
9
+ python: "3.13"
10
+ jobs:
11
+ post_checkout:
12
+ - git fetch --tags
13
+ # Download and uncompress git-lfs binary
14
+ - wget https://github.com/git-lfs/git-lfs/releases/download/v3.6.1/git-lfs-linux-amd64-v3.6.1.tar.gz
15
+ - tar xvfz git-lfs-linux-amd64-v3.6.1.tar.gz
16
+ - cp git-lfs-*/git-lfs ./git-lfs
17
+ # Configure LFS to use the downloaded binary
18
+ - git config filter.lfs.process "`pwd`/git-lfs filter-process"
19
+ - git config filter.lfs.smudge "`pwd`/git-lfs smudge -- %f"
20
+ - git config filter.lfs.clean "`pwd`/git-lfs clean -- %f"
21
+ # Make LFS available in the current repository and fetch/check out content
22
+ - ./git-lfs install
23
+ - ./git-lfs fetch
24
+ - ./git-lfs checkout
25
+ pre_build:
26
+ - uv run cz changelog
27
+
28
+ sphinx:
29
+ configuration: docs/source/conf.py
30
+
31
+ python:
32
+ install:
33
+ - method: uv
34
+ command: sync
35
+ groups:
36
+ - dev
@@ -7,6 +7,7 @@
7
7
  - **[README](README.md)** — User-facing overview and quickstart
8
8
  - **[CONTRIBUTING](CONTRIBUTING.md)** — Developer setup and conventions
9
9
  - **[.github/guidelines/knowledge-base.guidelines.md](.github/guidelines/knowledge-base.guidelines.md)** - How to use, update and maintain the knowledge base
10
+ - **[.github/guidelines/git-commit-message.guideline.md](.github/guidelines/git-commit-message.guideline.md)** — Commit message conventions
10
11
 
11
12
  ## Technology Stack
12
13
 
@@ -1,7 +1,20 @@
1
1
  ## Unreleased
2
2
 
3
+ ### Fix
4
+
5
+ - bad computation of AIC in trailers
6
+
7
+ ## v0.5.0 (2026-07-09)
8
+
9
+ ### Feat
10
+
11
+ - **cli**: add amend-commit command to inject session cost trailers
12
+
13
+ ## v0.4.0 (2026-07-08)
14
+
3
15
  ### Feat
4
16
 
17
+ - skill-aware cost attribution and tool-call tracking
5
18
  - add session filtering/aggregation/summaries/field extraction
6
19
 
7
20
  ## v0.3.0 (2026-07-06)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: copilot-session-usage
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: Usage and cost analytics for GitHub Copilot and Copilot-CLI session logs
5
5
  Project-URL: Homepage, https://github.com/gsemet/copilot-session-usage
6
6
  Project-URL: Documentation, https://copilot-session-usage.readthedocs.io/en/stable/
@@ -11,6 +11,7 @@ License-Expression: MIT
11
11
  License-File: LICENSE
12
12
  Requires-Python: >=3.10
13
13
  Requires-Dist: click>=8.0
14
+ Requires-Dist: gitpython>=3.1.0
14
15
  Requires-Dist: ruamel-yaml>=0.18.0
15
16
  Description-Content-Type: text/markdown
16
17