copilot-session-usage 0.5.0__tar.gz → 0.6.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 (109) hide show
  1. copilot_session_usage-0.6.0/.gitattributes +196 -0
  2. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/skills/gh-release-notes/SKILL.md +46 -25
  3. copilot_session_usage-0.6.0/.readthedocs.yaml +36 -0
  4. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/CHANGELOG.md +12 -0
  5. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/PKG-INFO +1 -1
  6. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/how-to/add-commit-trailer.md +6 -6
  7. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/skills/copilot-session-usage/SKILL.md +3 -3
  8. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/_internal/core.py +6 -5
  9. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/data/models-and-pricing.lock +3 -3
  10. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/data/models-and-pricing.yml +60 -0
  11. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/tests/test_core.py +5 -5
  12. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/tests/test_git.py +15 -15
  13. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/uv.lock +373 -342
  14. copilot_session_usage-0.5.0/.readthedocs.yaml +0 -24
  15. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.editorconfig +0 -0
  16. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  17. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  18. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/changes/requests/skill-breakdown/01-request.md +0 -0
  19. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/guidelines/git-commit-message.guideline.md +0 -0
  20. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/guidelines/knowledge-base.guidelines.md +0 -0
  21. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/pull_request_template.md +0 -0
  22. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/skills/consolidate-knowledge-base/SKILL.md +0 -0
  23. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/skills/record-finding/SKILL.md +0 -0
  24. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/workflows/ci.yml +0 -0
  25. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.github/workflows/publish.yml +0 -0
  26. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/.gitignore +0 -0
  27. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/AGENTS.md +0 -0
  28. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/CONTRIBUTING.md +0 -0
  29. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/LICENSE +0 -0
  30. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/README.md +0 -0
  31. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/_static/changelog.js +0 -0
  32. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/_static/custom.css +0 -0
  33. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/changelog.md +0 -0
  34. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/conf.py +0 -0
  35. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/explanation/how-cost-estimation-works.md +0 -0
  36. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/explanation/index.md +0 -0
  37. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/how-to/analyze-specific-session.md +0 -0
  38. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/how-to/batch-and-spending.md +0 -0
  39. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/how-to/export-json.md +0 -0
  40. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/how-to/index.md +0 -0
  41. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/how-to/wsl2.md +0 -0
  42. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/index.md +0 -0
  43. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/installation.md +0 -0
  44. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/reference/api.md +0 -0
  45. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/reference/cli.md +0 -0
  46. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/reference/index.md +0 -0
  47. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/reference/pricing.md +0 -0
  48. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/tutorials/getting-started.md +0 -0
  49. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/docs/source/tutorials/index.md +0 -0
  50. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/justfile +0 -0
  51. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Base.schema.yaml +0 -0
  52. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Concept.schema.yaml +0 -0
  53. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Experiment.schema.yaml +0 -0
  54. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Finding.schema.yaml +0 -0
  55. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Hypothesis.schema.yaml +0 -0
  56. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Outcome.schema.yaml +0 -0
  57. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Playbook.schema.yaml +0 -0
  58. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Principle.schema.yaml +0 -0
  59. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Reference.schema.yaml +0 -0
  60. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/_schema/Structure.schema.yaml +0 -0
  61. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/concepts/copilot-cli.md +0 -0
  62. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/concepts/index.md +0 -0
  63. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/concepts/overview.md +0 -0
  64. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/concepts/session-cost-analysis.md +0 -0
  65. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/concepts/threshold-based-pricing.md +0 -0
  66. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/experiments/index.md +0 -0
  67. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/experiments/verify-subagent-cost-attribution.md +0 -0
  68. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/findings/2026.07.02-00.00-subagent-logs-runsubagent-prefix.md +0 -0
  69. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/findings/2026.07.02-22.00-title-generation-not-counted-as-model-turn.md +0 -0
  70. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/findings/2026.07.02-23.00-cache-write-approximation.md +0 -0
  71. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/findings/index.md +0 -0
  72. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/guides/automation-scripts.md +0 -0
  73. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/guides/cost-optimization.md +0 -0
  74. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/guides/index.md +0 -0
  75. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/guides/wsl2-setup.md +0 -0
  76. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/ideas/index.md +0 -0
  77. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/ideas/multi-session-efficiency-analytics.md +0 -0
  78. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/index.md +0 -0
  79. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/log.md +0 -0
  80. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/principles/findings-are-immutable.md +0 -0
  81. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/principles/index.md +0 -0
  82. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/reference/debug-log-format.md +0 -0
  83. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/reference/index.md +0 -0
  84. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/reference/pricing-formats.md +0 -0
  85. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/structures/cache-cost-approximation.md +0 -0
  86. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/structures/index.md +0 -0
  87. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/structures/knowledge-base-information-types.md +0 -0
  88. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/structures/session-discovery-algorithm.md +0 -0
  89. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/structures/subagent-cost-tracking.md +0 -0
  90. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/knowledge/structures/vscode-copilot-extension.md +0 -0
  91. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/pyproject.toml +0 -0
  92. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/scripts/refresh_pricing.py +0 -0
  93. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/__init__.py +0 -0
  94. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/_internal/__init__.py +0 -0
  95. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/_internal/copilot_cli.py +0 -0
  96. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/_internal/git.py +0 -0
  97. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/_internal/vscode.py +0 -0
  98. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/api.py +0 -0
  99. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/cli.py +0 -0
  100. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/data/__init__.py +0 -0
  101. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/src/copilot_session_usage/data/custom-models-pricing.yml +0 -0
  102. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/tests/conftest.py +0 -0
  103. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/tests/test_api.py +0 -0
  104. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/tests/test_cli.py +0 -0
  105. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/tests/test_coverage_gaps.py +0 -0
  106. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/tests/test_rendering.py +0 -0
  107. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/tests/test_vscode.py +0 -0
  108. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/tests/test_vscode_platform.py +0 -0
  109. {copilot_session_usage-0.5.0 → copilot_session_usage-0.6.0}/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
@@ -3,6 +3,8 @@
3
3
  Generate **end-user friendly** release notes by analyzing actual code changes between releases.
4
4
  No scripts required — uses git commands to understand what changed and why it matters.
5
5
 
6
+ The output is meant to be **copy-pasted into a GitHub Release** (or similar).
7
+
6
8
  ---
7
9
 
8
10
  ## Quick Start
@@ -26,8 +28,10 @@ What changed since the last release tag?
26
28
  1. **Reads actual diffs** — examines code changes, not just commit messages
27
29
  2. **Interprets for end-users** — no technical jargon, functions, or variable names
28
30
  3. **Categorizes intelligently** — Features, Enhancements, Bug Fixes, Breaking Changes
29
- 4. **Consolidates related changes** — groups related diffs, eliminates back-and-forth noise
30
- 5. **Outputs clean markdown** — Slack-ready format suitable for announcements
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
31
35
 
32
36
  ---
33
37
 
@@ -88,7 +92,7 @@ Breaking changes come from:
88
92
 
89
93
  ### Step 6: Categorize & Format
90
94
 
91
- Organize changes into buckets:
95
+ Organize changes into buckets. **Only include sections that have content.** Omit empty sections entirely.
92
96
 
93
97
  ```markdown
94
98
  # Release Notes - v1.1.0
@@ -109,10 +113,13 @@ Organize changes into buckets:
109
113
  - Database schema updated — run migration before upgrading
110
114
  - CSV export removed; use Excel or PDF instead
111
115
 
112
- ---
113
- **Notes:**
114
- - Dark mode requires display driver update on Windows 7
115
- - Migration tool available at: docs/migrate-db.md
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)
116
123
  ```
117
124
 
118
125
  ---
@@ -120,27 +127,30 @@ Organize changes into buckets:
120
127
  ## Workflow for Agent
121
128
 
122
129
  1. **Parse input** — extract `from_tag`, `to_tag`, `repo_path`, and optional filters
123
- 2. **Fetch commits** — run `git log` with range, collect hashes & messages
124
- 3. **Read diffs per file** — `git show <hash>` for each commit, examine changed files
125
- 4. **Interpret impact** — what does each change mean to users?
126
- 5. **Detect breaking changes** — scan for BREAKING markers, API removals, schema changes
127
- 6. **Group by category** — assign each change to Features/Enhancements/Bug Fixes/Breaking/Other
128
- 7. **Consolidate** — merge related items, remove duplicates and flip-flops
129
- 8. **Format markdown** — generate clean bullet points with proper headings
130
- 9. **Add footnotes** — include migration notes, setup requirements, important links
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
131
141
 
132
142
  ---
133
143
 
134
144
  ## Output Format
135
145
 
136
- **Ultra-concise markdown** (aim for 100-200 words total):
146
+ **Clean markdown** for a GitHub Release:
137
147
 
138
148
  ```markdown
139
149
  # Release Notes - v1.1.0
140
150
 
141
151
  ## New Features
142
- - Dark mode toggle in settings
143
- - PDF export option
152
+ - Added dark mode toggle in settings
153
+ - New PDF export option
144
154
 
145
155
  ## Enhancements
146
156
  - Improved search performance (supports partial matches)
@@ -153,19 +163,26 @@ Organize changes into buckets:
153
163
  ## Breaking Changes
154
164
  - Database schema updated — run migration before upgrading
155
165
 
156
- **Learn more:**
157
- - [Dark Mode Guide](https://docs.example.com/settings#dark-mode)
158
- - [Upgrade Instructions](https://docs.example.com/upgrade#database)
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)
159
173
  ```
160
174
 
161
175
  **Key Rules:**
162
176
  - One line per bullet point
163
177
  - No sub-bullets or elaborate descriptions
164
- - Total length: <200 words
165
178
  - User impact only (not implementation details)
179
+ - Use public documentation URLs; never use repo-relative paths like `docs/...` or `README.md`
166
180
  - Use fragment identifiers (`#section-name`) to point to specific docs sections
167
- - Multiple links OK if they point to different topics (Skill Analysis, Aggregation, etc.)
168
- - Link from feature description → to exact readthedocs section where users will find details
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
169
186
 
170
187
  ---
171
188
 
@@ -195,13 +212,17 @@ Generate release notes from v2.1.0 to v2.2.0 for /path/to/my-app
195
212
  - Use end-user language ("improved performance" not "optimized O(n) loop")
196
213
  - Include breaking changes prominently
197
214
  - Group related changes
198
- - Add notes about migrations or setup
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
199
218
 
200
219
  ❌ **Don't:**
201
220
  - Copy commit messages verbatim
202
221
  - Include function/variable names
203
222
  - Mention internal refactors users won't notice
223
+ - Include dependency bumps or build changes unless they are user-visible
204
224
  - Include secrets, passwords, or internal URLs
225
+ - Use repo-relative paths like `docs/source/how-to/...` or `README.md`
205
226
  - Make up changes not shown in diffs
206
227
 
207
228
  ---
@@ -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
@@ -2,6 +2,18 @@
2
2
 
3
3
  ### Feat
4
4
 
5
+ - integrate GPT5.6 pricing
6
+
7
+ ## v0.5.1 (2026-07-10)
8
+
9
+ ### Fix
10
+
11
+ - bad computation of AIC in trailers
12
+
13
+ ## v0.5.0 (2026-07-09)
14
+
15
+ ### Feat
16
+
5
17
  - **cli**: add amend-commit command to inject session cost trailers
6
18
 
7
19
  ## v0.4.0 (2026-07-08)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: copilot-session-usage
3
- Version: 0.5.0
3
+ Version: 0.6.0
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/
@@ -10,9 +10,9 @@ One `Copilot-Session-Usage-Acc` trailer is added per model used in the
10
10
  session, followed by a single `Copilot-Session-Usage-AIC` total-cost trailer:
11
11
 
12
12
  ```text
13
- Copilot-Session-Usage-Acc: Moonshot AI:Kimi K2.7 Code,in:24.90,out:0.06,cache:21.88,aic:2.31
14
- Copilot-Session-Usage-Acc: Anthropic:Claude Haiku 4.5,in:0.03,out:0,cache:0,aic:0.01
15
- Copilot-Session-Usage-AIC: 23
13
+ Copilot-Session-Usage-Acc: Moonshot AI:Kimi K2.7 Code,in:24.90,out:0.06,cache:21.88,aic:231
14
+ Copilot-Session-Usage-Acc: Anthropic:Claude Haiku 4.5,in:0.03,out:0,cache:0,aic:1
15
+ Copilot-Session-Usage-AIC: 232
16
16
  ```
17
17
 
18
18
  Beware, the costs are **accumulated** for the entire session, not just the current commit.
@@ -31,7 +31,7 @@ and model names keep the casing from `data/models-and-pricing.yml`.
31
31
 
32
32
  Token counts are expressed in millions of tokens with two decimals. The
33
33
  `aic` value and the `Copilot-Session-Usage-AIC` line show the cost in AI
34
- credits (USD) with two decimals. If the commit already contains
34
+ credits (1 AIC = $0.01) with two decimals. If the commit already contains
35
35
  `Copilot-Session-Usage-Acc` or `Copilot-Session-Usage-AIC` trailers, they are
36
36
  replaced so the values stay fresh. Other trailers, such as `Signed-off-by`,
37
37
  are preserved and kept at the end of the message.
@@ -103,8 +103,8 @@ This produces:
103
103
  ```text
104
104
  Copilot-Session-Usage-Session-ID: abc-123
105
105
  Copilot-Session-Usage-Session-ID: def-456
106
- Copilot-Session-Usage-Acc: Moonshot AI:Kimi K2.7 Code,in:24.90,out:0.06,cache:21.88,aic:2.31
107
- Copilot-Session-Usage-AIC: 23
106
+ Copilot-Session-Usage-Acc: Moonshot AI:Kimi K2.7 Code,in:24.90,out:0.06,cache:21.88,aic:231
107
+ Copilot-Session-Usage-AIC: 232
108
108
  ```
109
109
 
110
110
  This will allow another process, not done by Copilot-Session-Cost, to later rewrite
@@ -195,8 +195,8 @@ as Git commit-message trailers. One line is emitted per model, plus a total
195
195
  AIC (AI credits) summary line:
196
196
 
197
197
  ```
198
- Copilot-Session-Usage-Acc: Moonshot AI:Kimi K2.7 Code,in:24.90,out:0.06,cache:21.88,aic:2.31
199
- Copilot-Session-Usage-AIC: 23
198
+ Copilot-Session-Usage-Acc: Moonshot AI:Kimi K2.7 Code,in:24.90,out:0.06,cache:21.88,aic:231
199
+ Copilot-Session-Usage-AIC: 232
200
200
  ```
201
201
 
202
202
  The vendor and model name come from the actual session context (debug-log
@@ -204,7 +204,7 @@ The vendor and model name come from the actual session context (debug-log
204
204
  human-readable casing (for example, `Moonshot AI` instead of `moonshot_ai`), and
205
205
  model names keep the casing from the pricing data (for example, `Kimi K2.7 Code`
206
206
  instead of the lower-cased log identifier `kimi-k2.7-code`). Token counts are in
207
- millions of tokens with two decimals; AIC values are rounded to two decimals.
207
+ millions of tokens with two decimals; AIC values are USD * 100 and rounded to two decimals (1 AIC = $0.01).
208
208
 
209
209
  When a change spans several VS Code Copilot sessions, pass each session ID
210
210
  with a separate `--session-id` argument. The costs are accumulated and written
@@ -500,11 +500,12 @@ def build_session_usage_acc_trailers(result: dict[str, Any], pricing: dict[str,
500
500
  is the raw name observed in the session logs; the vendor is derived from
501
501
  the bundled pricing data using both the internal normalized key and the
502
502
  original raw model name. Token counts are expressed in millions with two
503
- decimals; the estimated USD cost is appended as ``aic`` (AIC = AI credits).
503
+ decimals; the estimated cost is appended as ``aic`` in AI credits
504
+ (1 AIC = $0.01, so USD * 100).
504
505
 
505
506
  Format::
506
507
 
507
- Copilot-Session-Usage-Acc: <vendor>:<model-name>,in:4.12,out:1.21,cache:3.9,aic:0.42
508
+ Copilot-Session-Usage-Acc: <vendor>:<model-name>,in:4.12,out:1.21,cache:3.9,aic:42
508
509
 
509
510
  The model name keeps the casing from the bundled pricing YAML (for example
510
511
  ``"Claude Sonnet 4.6"``) rather than the lower-cased identifier used in
@@ -521,7 +522,7 @@ def build_session_usage_acc_trailers(result: dict[str, Any], pricing: dict[str,
521
522
  input_m = _format_millions(entry.get("input_tokens", 0))
522
523
  output_m = _format_millions(entry.get("output_tokens", 0))
523
524
  cache_m = _format_millions(entry.get("cached_tokens", 0))
524
- aic = round(entry.get("estimated_usd", 0.0), 2)
525
+ aic = _format_aic(round(entry.get("estimated_usd", 0.0) * 100, 2))
525
526
  trailers.append(
526
527
  f"Copilot-Session-Usage-Acc: "
527
528
  f"{provider}:{display_model},in:{input_m},out:{output_m},cache:{cache_m},aic:{aic}"
@@ -530,7 +531,7 @@ def build_session_usage_acc_trailers(result: dict[str, Any], pricing: dict[str,
530
531
 
531
532
 
532
533
  def _format_aic(value: float) -> str:
533
- """Format an AIC/USD value with at most 2 decimals, dropping trailing zeros."""
534
+ """Format an AIC value with at most 2 decimals, dropping trailing zeros."""
534
535
  formatted = f"{value:.2f}"
535
536
  if "." in formatted:
536
537
  formatted = formatted.rstrip("0").rstrip(".")
@@ -539,7 +540,7 @@ def _format_aic(value: float) -> str:
539
540
 
540
541
  def build_session_usage_aic_trailer(result: dict[str, Any]) -> str:
541
542
  """Build the ``Copilot-Session-Usage-AIC`` trailer with total AIC cost."""
542
- total_aic = round(result.get("total", {}).get("estimated_usd", 0.0), 2)
543
+ total_aic = round(result.get("total", {}).get("estimated_usd", 0.0) * 100, 2)
543
544
  return f"Copilot-Session-Usage-AIC: {_format_aic(total_aic)}"
544
545
 
545
546
 
@@ -1,7 +1,7 @@
1
1
  {
2
- "_captured": "2026-07-02T14:37:57.905235+00:00",
2
+ "_captured": "2026-07-10T07:30:47.222629+00:00",
3
3
  "_source": "https://raw.githubusercontent.com/github/docs/main/data/tables/copilot/models-and-pricing.yml",
4
4
  "_yaml_path": "/Users/az02065/Projects/DevTools/copilot-session-usage/src/copilot_session_usage/data/models-and-pricing.yml",
5
- "model_count": 27,
6
- "checksum": "b20f23ea2f6c0f14"
5
+ "model_count": 33,
6
+ "checksum": "7bae47530bf10fd2"
7
7
  }
@@ -98,6 +98,66 @@
98
98
  cached_input: $1.00
99
99
  output: $45.00
100
100
 
101
+ - model: GPT-5.6 Luna
102
+ provider: openai
103
+ release_status: GA
104
+ category: Lightweight
105
+ threshold: '≤ 200K'
106
+ tier: Default
107
+ input: $1.00
108
+ cached_input: $0.10
109
+ output: $6.00
110
+
111
+ - model: GPT-5.6 Luna
112
+ provider: openai
113
+ release_status: GA
114
+ category: Lightweight
115
+ threshold: '> 200K'
116
+ tier: 'Long context'
117
+ input: $2.00
118
+ cached_input: $0.20
119
+ output: $9.00
120
+
121
+ - model: GPT-5.6 Sol
122
+ provider: openai
123
+ release_status: GA
124
+ category: Powerful
125
+ threshold: '≤ 272K'
126
+ tier: Default
127
+ input: $5.00
128
+ cached_input: $0.50
129
+ output: $30.00
130
+
131
+ - model: GPT-5.6 Sol
132
+ provider: openai
133
+ release_status: GA
134
+ category: Powerful
135
+ threshold: '> 272K'
136
+ tier: 'Long context'
137
+ input: $10.00
138
+ cached_input: $1.00
139
+ output: $45.00
140
+
141
+ - model: GPT-5.6 Terra
142
+ provider: openai
143
+ release_status: GA
144
+ category: Versatile
145
+ threshold: '≤ 272K'
146
+ tier: Default
147
+ input: $2.50
148
+ cached_input: $0.25
149
+ output: $15.00
150
+
151
+ - model: GPT-5.6 Terra
152
+ provider: openai
153
+ release_status: GA
154
+ category: Versatile
155
+ threshold: '> 272K'
156
+ tier: 'Long context'
157
+ input: $5.00
158
+ cached_input: $0.50
159
+ output: $22.50
160
+
101
161
  # Anthropic
102
162
  - model: Claude Haiku 4.5
103
163
  provider: anthropic
@@ -867,18 +867,18 @@ def test_build_session_usage_acc_trailers():
867
867
  trailers = core.build_session_usage_acc_trailers(result, PRICING_WITH_PROVIDERS)
868
868
  assert len(trailers) == 2
869
869
  assert (
870
- "Copilot-Session-Usage-Acc: Moonshot AI:Kimi K2.7 Code,in:4.12,out:1.21,cache:3.9,aic:2.31"
871
- in trailers
870
+ "Copilot-Session-Usage-Acc: Moonshot AI:Kimi K2.7 Code,"
871
+ "in:4.12,out:1.21,cache:3.9,aic:230.55" in trailers
872
872
  )
873
873
  assert (
874
- "Copilot-Session-Usage-Acc: Anthropic:Claude Sonnet 4.6,in:1,out:0.2,cache:0.5,aic:0.42"
875
- in trailers
874
+ "Copilot-Session-Usage-Acc: Anthropic:Claude Sonnet 4.6,"
875
+ "in:1,out:0.2,cache:0.5,aic:42" in trailers
876
876
  )
877
877
 
878
878
 
879
879
  def test_build_session_usage_aic_trailer():
880
880
  result = {"total": {"estimated_usd": 23.4567}}
881
- assert core.build_session_usage_aic_trailer(result) == "Copilot-Session-Usage-AIC: 23.46"
881
+ assert core.build_session_usage_aic_trailer(result) == "Copilot-Session-Usage-AIC: 2345.67"
882
882
 
883
883
 
884
884
  def test_build_session_usage_aic_trailer_zero():