copilot-session-usage 0.8.0__tar.gz → 0.8.4__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 (130) hide show
  1. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/gh-release-notes/SKILL.md +140 -55
  2. copilot_session_usage-0.8.4/.github/skills/gh-release-notes/scripts/generate_release_notes.py +487 -0
  3. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/workflows/ci.yml +9 -0
  4. copilot_session_usage-0.8.4/.github/workflows/publish.yml +98 -0
  5. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/workflows/release-notes.yml +44 -8
  6. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/workflows/release.yml +66 -15
  7. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/CONTRIBUTING.md +19 -5
  8. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/PKG-INFO +1 -1
  9. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/internal/automated_release_proces.md +55 -32
  10. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/data/models-and-pricing.lock +3 -3
  11. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/data/models-and-pricing.yml +104 -0
  12. copilot_session_usage-0.8.4/tests/test_generate_release_notes.py +631 -0
  13. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_release_notes.py +50 -3
  14. copilot_session_usage-0.8.0/.github/skills/gh-release-notes/scripts/generate_release_notes.py +0 -298
  15. copilot_session_usage-0.8.0/.github/workflows/publish.yml +0 -35
  16. copilot_session_usage-0.8.0/tests/test_generate_release_notes.py +0 -226
  17. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.editorconfig +0 -0
  18. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.gitattributes +0 -0
  19. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  21. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/changes/requests/skill-breakdown/01-request.md +0 -0
  22. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/guidelines/git-commit-message.guideline.md +0 -0
  23. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/guidelines/knowledge-base.guidelines.md +0 -0
  24. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/pull_request_template.md +0 -0
  25. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/consolidate-knowledge-base/SKILL.md +0 -0
  26. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/gh-commit-changes/SKILL.md +0 -0
  27. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/gh-create-pull-request/SKILL.md +0 -0
  28. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/record-finding/SKILL.md +0 -0
  29. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/workflows/refresh-pricing.yml +0 -0
  30. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.gitignore +0 -0
  31. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.readthedocs.yaml +0 -0
  32. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/AGENTS.md +0 -0
  33. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/CHANGELOG.md +0 -0
  34. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/CONSTITUTION.md +0 -0
  35. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/LICENSE +0 -0
  36. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/README.md +0 -0
  37. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/articles/presentation.md +0 -0
  38. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/_static/changelog.js +0 -0
  39. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/_static/custom.css +0 -0
  40. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/changelog.md +0 -0
  41. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/conf.py +0 -0
  42. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/explanation/how-cost-estimation-works.md +0 -0
  43. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/explanation/index.md +0 -0
  44. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/add-commit-trailer.md +0 -0
  45. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/analyze-specific-session.md +0 -0
  46. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/batch-and-spending.md +0 -0
  47. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/copilot-cli-provider.md +0 -0
  48. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/export-json.md +0 -0
  49. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/index.md +0 -0
  50. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/wsl2.md +0 -0
  51. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/index.md +0 -0
  52. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/installation.md +0 -0
  53. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/reference/api.md +0 -0
  54. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/reference/cli.md +0 -0
  55. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/reference/index.md +0 -0
  56. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/reference/pricing.md +0 -0
  57. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/tutorials/getting-started.md +0 -0
  58. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/tutorials/index.md +0 -0
  59. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/guidelines.yml +0 -0
  60. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/justfile +0 -0
  61. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Base.schema.yaml +0 -0
  62. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Concept.schema.yaml +0 -0
  63. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Experiment.schema.yaml +0 -0
  64. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Finding.schema.yaml +0 -0
  65. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Hypothesis.schema.yaml +0 -0
  66. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Outcome.schema.yaml +0 -0
  67. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Playbook.schema.yaml +0 -0
  68. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Principle.schema.yaml +0 -0
  69. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Reference.schema.yaml +0 -0
  70. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Structure.schema.yaml +0 -0
  71. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/copilot-cli.md +0 -0
  72. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/index.md +0 -0
  73. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/overview.md +0 -0
  74. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/session-cost-analysis.md +0 -0
  75. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/threshold-based-pricing.md +0 -0
  76. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/experiments/index.md +0 -0
  77. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/experiments/verify-subagent-cost-attribution.md +0 -0
  78. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/findings/2026.07.02-00.00-subagent-logs-runsubagent-prefix.md +0 -0
  79. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/findings/2026.07.02-22.00-title-generation-not-counted-as-model-turn.md +0 -0
  80. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/findings/2026.07.02-23.00-cache-write-approximation.md +0 -0
  81. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/findings/2026.07.13-14.27-release-notes-overreported-maintainer-changes.md +0 -0
  82. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/findings/2026.07.24-15.01-actions-token-cannot-create-pr.md +0 -0
  83. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/findings/2026.08.05-16.24-utility-models-appear-in-logs-but-are-not-billed.md +0 -0
  84. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/findings/index.md +0 -0
  85. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/guides/automation-scripts.md +0 -0
  86. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/guides/cost-optimization.md +0 -0
  87. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/guides/index.md +0 -0
  88. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/guides/wsl2-setup.md +0 -0
  89. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/ideas/index.md +0 -0
  90. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/ideas/multi-session-efficiency-analytics.md +0 -0
  91. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/index.md +0 -0
  92. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/log.md +0 -0
  93. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/principles/findings-are-immutable.md +0 -0
  94. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/principles/index.md +0 -0
  95. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/reference/debug-log-format.md +0 -0
  96. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/reference/index.md +0 -0
  97. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/reference/pricing-formats.md +0 -0
  98. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/cache-cost-approximation.md +0 -0
  99. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/index.md +0 -0
  100. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/knowledge-base-information-types.md +0 -0
  101. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/session-discovery-algorithm.md +0 -0
  102. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/subagent-cost-tracking.md +0 -0
  103. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/vscode-copilot-extension.md +0 -0
  104. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/pyproject.toml +0 -0
  105. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/scripts/refresh_pricing.py +0 -0
  106. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/skills/copilot-session-usage/SKILL.md +0 -0
  107. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/skills/copilot-session-usage/references/span-analysis-template.md +0 -0
  108. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/__init__.py +0 -0
  109. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/__init__.py +0 -0
  110. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/copilot_cli.py +0 -0
  111. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/core.py +0 -0
  112. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/git.py +0 -0
  113. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/vscode.py +0 -0
  114. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/api.py +0 -0
  115. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/cli.py +0 -0
  116. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/data/__init__.py +0 -0
  117. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/data/custom-models-pricing.yml +0 -0
  118. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/conftest.py +0 -0
  119. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_api.py +0 -0
  120. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_cli.py +0 -0
  121. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_copilot_cli.py +0 -0
  122. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_core.py +0 -0
  123. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_coverage_gaps.py +0 -0
  124. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_git.py +0 -0
  125. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_pricing_runtime.py +0 -0
  126. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_rendering.py +0 -0
  127. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_vscode.py +0 -0
  128. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_vscode_platform.py +0 -0
  129. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/uv.lock +0 -0
  130. {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/uv.toml +0 -0
@@ -10,6 +10,20 @@ user-invocable: true
10
10
  Generate **end-user-friendly, user-impact-only** release notes by analyzing the actual changes between releases.
11
11
  Interactive use requires no script; automated generation and validation use the bundled script described below.
12
12
 
13
+ ## Portability
14
+
15
+ This skill works with any Git repository, regardless of language, framework,
16
+ directory layout, documentation host, or release workflow. Discover the target
17
+ product and its public documentation from the requested repository; do not assume
18
+ the skill's own repository is the product being released.
19
+
20
+ The bundled script uses only the Python standard library (Python 3.10+), Git,
21
+ and `gh copilot`. Install this skill where Copilot can discover it in the target
22
+ repository or user-level skill directory. The script may live outside the target
23
+ repository; select that repository with `--repo`. No project package, task runner,
24
+ configuration file, or particular CI workflow is required. Documentation links
25
+ come from repository evidence, not a built-in domain allowlist.
26
+
13
27
  The output is meant to be **copy-pasted into a GitHub Release**. It must contain
14
28
  release-note sections only: never add a document title, version heading, preamble,
15
29
  file summary, commit summary, or closing separator. GitHub already displays the
@@ -18,13 +32,22 @@ Markdown.
18
32
 
19
33
  ## Non-negotiable output contract
20
34
 
35
+ - Describe each user outcome once, in one concise bullet. End that same bullet
36
+ with the closest verified documentation link when available. Do not collect
37
+ those links at the bottom or repeat the change in Documentation or Examples.
38
+ - Scale notes to the actual change: one pricing refresh or small fix normally
39
+ needs one bullet; a large feature release needs distinct outcomes, not a
40
+ bullet for every commit, field, edge case, or implementation detail.
21
41
  - Render every public documentation URL as an inline Markdown link with concise
22
42
  descriptive text: `See the [pricing reference for details](https://example.com/pricing)`.
23
43
  - Never expose a documentation URL as plain text, after a colon, in parentheses,
24
44
  or on its own line. A bare `https://...` URL is invalid release-note output.
25
45
  - Never include CI, release automation, Git evidence, generator internals,
26
- governance, contributor or agent guidance, tests, repository housekeeping, or
46
+ internal governance, contributor or agent guidance, tests, repository housekeeping, or
27
47
  maintainer process.
48
+ - Apply internal-material exclusions by audience, not filename. If the target
49
+ repository publishes skills, documentation, or test utilities as its product,
50
+ describe evidenced changes for that product's users.
28
51
  - Never include `## Maintenance` together with any user-facing section. When a
29
52
  user-facing change qualifies, omit Maintenance and discard all internal-only
30
53
  candidates.
@@ -41,30 +64,65 @@ Markdown.
41
64
  The skill includes `scripts/generate_release_notes.py`, a standalone Python script that:
42
65
 
43
66
  - verifies the requested Git range and Copilot skill availability;
44
- - precomputes the commit log and complete diff locally so generation also works
67
+ - writes the deterministic `## Maintenance` output without invoking Copilot when the
68
+ requested Git range contains no commits or the caller explicitly requests
69
+ `--maintenance-only`;
70
+ - precomputes the commit log, complete diff summary, and full diff locally so generation also works
45
71
  when the Copilot CLI cannot inspect Git history inside its tool environment;
46
72
  - invokes the Copilot CLI with `/gh-release-notes`;
47
- - captures the final Markdown response and writes the requested output file; and
48
- - verifies only that the requested output file is readable and non-empty. The
73
+ - exposes Copilot's `view`, `glob`, and `grep` tools for reading and finding
74
+ skill instructions and exact documentation pages (`read` is a permission
75
+ category, not a builtin tool name);
76
+ - invokes Copilot with `--output-format json`, reads JSONL events, and selects
77
+ only the completed `assistant.message` with `phase: final_answer`; commentary,
78
+ streaming deltas, tool results, and telemetry never become release notes;
79
+ - validates the final Markdown and writes the requested file itself, without
80
+ depending on the model's file-writing tools;
81
+ - retries generation up to three times with validation feedback, with a five-minute
82
+ timeout per request, clearing rejected output before each retry;
83
+ - refuses publication after exhausted attempts, never substituting Maintenance
84
+ for a failed request; and
85
+ - verifies that the requested output file follows the release-note output contract. The
49
86
  script does not normalize Markdown or decide user impact, categorize changes,
50
87
  discover documentation, infer breaking changes, or require examples; those
51
88
  decisions belong to this skill.
52
89
 
53
- Generate notes for an exact range from the repository root:
90
+ Generate notes for an exact range using the script's installed path:
54
91
 
55
92
  ```bash
56
- python .github/skills/gh-release-notes/scripts/generate_release_notes.py \
93
+ python /path/to/gh-release-notes/scripts/generate_release_notes.py \
94
+ --repo /path/to/repo \
57
95
  --from-ref v1.0.0 \
58
96
  --to-ref v1.1.0 \
59
97
  --output release-notes.md
60
98
  ```
61
99
 
100
+ For an intentional maintenance-only release whose range contains internal commits,
101
+ pass `--maintenance-only` to write the deterministic Maintenance section without
102
+ invoking Copilot.
103
+
104
+ `release-notes.md` is the default output filename, relative to the target repository.
105
+ An explicitly supplied `--output` path is honored exactly; absolute output paths
106
+ are also supported. A release workflow can consume the validated file through
107
+ `gh release --notes-file` or another publishing tool. This skill does not require
108
+ or create that workflow and does not publish releases itself.
109
+ For a non-empty range, the generator clears stale output
110
+ before invoking Copilot and persists only a validated structured final answer.
111
+ Copilot has reading and Git tools, but no file-writing tools. The CLI must support
112
+ JSONL output with final-answer phases and a successful terminal `result` event.
113
+ Malformed or incomplete streams fail validation; no Markdown is scraped from
114
+ surrounding chatter or tool traces.
115
+ An empty range produces the valid maintenance output
116
+ directly and does not require Copilot authentication or skill discovery.
117
+
62
118
  The range is Git's two-dot range, `from_ref..to_ref`: `from_ref` itself is excluded
63
119
  and `to_ref` is included. Both refs may be tags, branches, or commit IDs.
64
120
 
65
121
  Set `COPILOT_MODEL` or pass `--model` to make model selection explicit. The script also
66
- supports `--validate FILE` when an existing release-note file should be checked for
67
- readability and non-empty content without invoking Copilot.
122
+ supports `--validate FILE` to enforce section structure, flat non-empty bullets,
123
+ HTTPS Markdown links, exact duplicate rejection, and Maintenance exclusivity
124
+ without invoking Copilot. Semantic accuracy and paraphrased repetition still
125
+ require the skill's audience review.
68
126
 
69
127
  ---
70
128
 
@@ -90,7 +148,7 @@ What changed since the last release tag?
90
148
  2. **Applies a strict user-impact gate** — includes a change only when an end user can do, observe, configure, rely on, or learn something different
91
149
  3. **Interprets for end-users** — no technical jargon, functions, variable names, file paths, or implementation summaries
92
150
  4. **Categorizes intelligently** — Features, Enhancements, Bug Fixes, Breaking Changes, Examples, Documentation, and Maintenance
93
- 5. **Adds concrete examples** — shows what users see or can do after a qualifying change
151
+ 5. **Adds examples when useful** — includes short inline syntax only when it helps users act
94
152
  6. **Links to relevant public docs** — links each user-facing change to the closest published documentation page with concise inline Markdown link text when one exists, even if that page was not changed in the release
95
153
  7. **Consolidates related changes** — groups related diffs and eliminates back-and-forth noise
96
154
  8. **Outputs clean markdown** — ready to paste into a GitHub Release note
@@ -152,9 +210,12 @@ Gather all commits in the specified range with their messages.
152
210
 
153
211
  ### Step 2: Examine relevant diffs
154
212
  ```bash
155
- git diff v1.0.0..v1.1.0 -- . ':(exclude).github' ':(exclude)skills' ':(exclude)guidelines'
213
+ git diff --no-ext-diff v1.0.0..v1.1.0
156
214
  ```
157
- Read actual code changes line-by-line to understand behavior. Inspect excluded paths only when needed to verify whether they caused a direct user-visible consequence; never report the paths themselves.
215
+ Read actual changes to understand behavior. Determine which files form the
216
+ published product before narrowing the analysis. Do not exclude directories by
217
+ name: a skill catalog, documentation site, or testing library may publish skills,
218
+ guidelines, knowledge, or test utilities as its actual product.
158
219
 
159
220
  Treat these as non-release content, and exclude them entirely unless the diff
160
221
  also proves a direct change to the published user experience:
@@ -169,7 +230,9 @@ also proves a direct change to the published user experience:
169
230
 
170
231
  These exclusions can be overridden only when the diff proves a direct user
171
232
  impact, such as a packaging change that changes the installable artifact or a
172
- security fix that changes behavior for users. In that case, describe the user
233
+ security fix that changes behavior for users. Published skills, guidelines, or
234
+ test utilities also qualify when they are the requested repository's product,
235
+ rather than internal support material. In that case, describe the user
173
236
  outcome, not the internal mechanism or workflow that enabled it.
174
237
 
175
238
  After identifying a qualifying change, inspect the repository's user-facing
@@ -206,6 +269,21 @@ Do not wait for the documentation page itself to be modified. For example, a
206
269
  pricing or model-data change should link to the project's pricing/model reference
207
270
  page if that page explains the affected behavior.
208
271
 
272
+ Keep the link at the end of the bullet that describes the change, before starting
273
+ the next item. For a fictional reporting application, for example:
274
+
275
+ ```markdown
276
+ ## New Features
277
+ - **PDF report exports** with `report export --format pdf`. [Export guide](https://docs.example.com/reports/export).
278
+ - **Scheduled reports** with configurable delivery times. [Scheduling guide](https://docs.example.com/reports/scheduling).
279
+ ```
280
+
281
+ These are layout examples, not claims about the requested range. Verify syntax
282
+ and URLs from the checked-out product documentation. Use a section fragment only
283
+ when its anchor is verified; do not guess one from a heading. Do not add a
284
+ Documentation section linking these guides again. A guide modified alongside its
285
+ feature belongs with the feature, not in a second bullet saying the guide changed.
286
+
209
287
  If no trustworthy public documentation URL can be established, omit the
210
288
  Documentation section and documentation bullets rather than writing a text-only
211
289
  documentation entry. Never emit `## Documentation` unless its body contains at
@@ -230,6 +308,14 @@ Breaking changes come from:
230
308
  - If a feature was added then removed → don't mention it
231
309
  - If something changed multiple times → only note the final state
232
310
  - If multiple commits fix the same issue → merge into one bullet
311
+ - Assign each outcome to exactly one section. A breaking change belongs in
312
+ Breaking Changes, not again in New Features or Enhancements.
313
+ - Put useful command syntax inline in the outcome's bullet. Add Examples only
314
+ for a distinct workflow that cannot be explained by that short syntax; do not
315
+ restate the same capability under a second heading.
316
+ - Delete unchanged defaults, generic benefits, "also updated documentation",
317
+ "improved reliability", and "no breaking changes" unless they convey a specific
318
+ evidenced difference users need to know.
233
319
 
234
320
  ### Step 6: Categorize & Format
235
321
 
@@ -240,8 +326,9 @@ Fixes`, `## Breaking Changes`, `## Examples`, `## Documentation`, and
240
326
  `## Maintenance`. Do not add headings such as `Internal`, `User impact`, `Upgrade
241
327
  notes`, or `Summary`; fold useful user impact into the permitted sections instead.
242
328
 
243
- Treat Documentation as a link-only section: include it only when at least one
244
- trustworthy public documentation URL was found, and make every Documentation
329
+ Reserve Documentation for documentation-only changes that help users operate the
330
+ product and are not already covered by another bullet. Never use it as a link
331
+ collection for features or fixes. Make every Documentation
245
332
  bullet an inline Markdown link with descriptive link text and an absolute HTTPS
246
333
  target. If no such URL was found, omit the entire Documentation section. Do not
247
334
  replace the missing URL with a repository path, an unlinked description, or a
@@ -262,8 +349,8 @@ Documentation bullet remains, remove `## Maintenance` and all of its bullets.
262
349
 
263
350
  ```markdown
264
351
  ## New Features
265
- - Added dark mode toggle in settings
266
- - New PDF export option
352
+ - Added a dark mode toggle in settings. [Appearance guide](https://docs.example.com/settings#dark-mode).
353
+ - Export reports as PDF from the File menu. [Export guide](https://docs.example.com/export).
267
354
 
268
355
  ## Enhancements
269
356
  - Improved search performance (now supports partial matches)
@@ -274,20 +361,19 @@ Documentation bullet remains, remove `## Maintenance` and all of its bullets.
274
361
  - Resolved crash when uploading 10MB+ files
275
362
 
276
363
  ## Breaking Changes
277
- - Database schema updated — run migration before upgrading
278
- - CSV export removed; use Excel or PDF instead
279
-
280
- ## Examples
281
- - Dark mode can be enabled in Settings → Appearance → Theme
282
- - CSV export is no longer available; choose Excel or PDF from Export menu
364
+ - Run the database migration before upgrading. [Migration guide](https://docs.example.com/upgrade#database).
365
+ - CSV export removed; use Excel or PDF instead. [Export guide](https://docs.example.com/export).
283
366
 
284
367
  ## Documentation
285
- - [Dark mode guide](https://docs.example.com/settings#dark-mode)
286
- - [Migration notes](https://docs.example.com/upgrade#database)
368
+ - New [account recovery guide](https://docs.example.com/accounts/recovery).
369
+ ```
287
370
 
371
+ The example above illustrates a user-facing release. A maintenance-only release
372
+ instead contains only:
373
+
374
+ ```markdown
288
375
  ## Maintenance
289
- This release contains maintenance and internal improvements. No user-facing behavior
290
- changed.
376
+ This release contains maintenance and internal improvements. No user-facing behavior changed.
291
377
  ```
292
378
 
293
379
  Omit `## Breaking Changes` completely when the actual range contains no breaking
@@ -304,7 +390,7 @@ directly observe a supported behavior that the mechanism enables.
304
390
  1. **Parse input** — extract `from_ref`, `to_ref`, `repo_path`, and optional filters
305
391
  2. **Discover public documentation** — inspect the repository's available user-facing documentation surfaces and any published links they expose. Do not assume a particular language, documentation generator, directory layout, metadata file, or URL naming scheme. Prefer the closest trustworthy public page for each qualifying change.
306
392
  For hosting services like readthedocs that propose latest/stable URLs, prefer the stable version.
307
- Infere fragment identifiers to point to specific sections when available.
393
+ Use fragment identifiers only when their anchors can be verified.
308
394
  Use absolute HTTPS URLs, and omit a documentation link when no public page can be established rather than inventing one.
309
395
  3. **Fetch commits** — run `git log` with range, collect hashes and messages
310
396
  4. **Read diffs per file** — use `git show <hash>` for each relevant commit and examine changed behavior, not just filenames
@@ -312,13 +398,13 @@ Use absolute HTTPS URLs, and omit a documentation link when no public page can b
312
398
  6. **Interpret impact** — state what users can do, observe, configure, rely on, or learn differently
313
399
  7. **Detect breaking changes** — scan for BREAKING markers, public API removals, format changes, migrations, and changed defaults
314
400
  8. **Group by category** — assign each qualifying change to **New Features**, **Enhancements**, **Bug Fixes**, **Breaking Changes**, **Examples**, **Documentation**, or **Maintenance**
315
- 9. **Build examples** — for each user-facing change, use README, public docs, tests, or CLI help as evidence; add a concrete example for every added or changed CLI command, public API call, configuration option, or before/after workflow
401
+ 9. **Add useful syntax** — use public docs or CLI help to verify short inline command/API examples; add an Examples section only when a distinct workflow needs it
316
402
  10. **Consolidate** — merge related items, remove duplicates and flip-flops
317
403
  11. **Handle an empty range** — if no product change qualifies, generate exactly one concise `## Maintenance` section
318
404
  12. **Format markdown** — generate clean section headings and bullets with no title, preamble, footer, file summary, or commit summary
319
- 13. **Use concise relevant public docs links** — every Documentation bullet must contain an inline Markdown link with descriptive link text and an absolute HTTPS target to the closest relevant published page. Every qualifying feature, enhancement, bug-fix, breaking-change, or example bullet should use the same concise Markdown-link style when a page exists, using a fragment identifier when the page has a matching section. Do not expose bare URLs in prose or use bare URLs as the only link form. Do not require the page to have changed in the range. If no trustworthy public URL exists, omit Documentation entirely.
405
+ 13. **Attach documentation locally** — end each outcome's bullet with its closest verified public HTTPS Markdown link. Do not repeat it in Documentation; that section is only for independent documentation-only changes. Do not invent URLs or fragments.
320
406
  14. **Run the final audience review** — inspect every bullet and remove anything about CI, workflows, release tooling, Git evidence, validation, governance, contributor or agent guidance, repository housekeeping, changed files, or maintainer process. Remove the entire section if that leaves it empty. Also remove Documentation bullets whose links target contributor, governance, engineering, or maintainer material.
321
- 15. **Run the final format review** — ensure every `https://` occurrence is inside `[visible text](https://target)`, with no bare URL in prose, and remove `## Maintenance` whenever another qualifying section exists.
407
+ 15. **Run the final format review** — ensure every `https://` occurrence is inside `[visible text](https://target)`, with no bare URL in prose, remove duplicate outcomes and empty sections, and remove `## Maintenance` whenever another qualifying section exists.
322
408
 
323
409
  ---
324
410
 
@@ -340,8 +426,8 @@ Start directly with the release-note section instead:
340
426
 
341
427
  ```markdown
342
428
  ## New Features
343
- - Added dark mode toggle in settings
344
- - New PDF export option
429
+ - Added a dark mode toggle in settings. [Appearance guide](https://docs.example.com/settings#dark-mode).
430
+ - Export reports as PDF from the File menu. [Export guide](https://docs.example.com/export).
345
431
 
346
432
  ## Enhancements
347
433
  - Improved search performance (supports partial matches)
@@ -352,15 +438,10 @@ Start directly with the release-note section instead:
352
438
  - Resolved crash when uploading 10MB+ files
353
439
 
354
440
  ## Breaking Changes
355
- - Database schema updated — run migration before upgrading
356
-
357
- ## Examples
358
- - Enable dark mode from Settings → Appearance → Theme
359
- - Export a report as PDF from the File → Export menu
441
+ - Run the database migration before upgrading. [Migration guide](https://docs.example.com/upgrade#database).
360
442
 
361
443
  ## Documentation
362
- - [Dark mode guide](https://docs.example.com/settings#dark-mode)
363
- - [Upgrade instructions](https://docs.example.com/upgrade#database)
444
+ - New [account recovery guide](https://docs.example.com/accounts/recovery).
364
445
  ```
365
446
 
366
447
  **Key Rules:**
@@ -374,9 +455,9 @@ Start directly with the release-note section instead:
374
455
  for maintenance-only releases
375
456
  - Use public documentation URLs; never use repo-relative paths like `docs/...` or `README.md`
376
457
  - For each user-facing bullet, search existing documentation for the closest page about the impacted behavior and link it inline with descriptive Markdown text when available, even when the documentation file was unchanged
377
- - Use fragment identifiers (`#section-name`) to point to specific docs sections
378
- - Add a concrete **Examples** section for every added or changed CLI command, public API call, configuration option, or user-visible before/after behavior. Derive syntax from the project's public help, API docs, README, or supported usage examples; do not invent it
379
- - Add a **Documentation** section only when at least one trustworthy public documentation URL exists; every bullet in that section must contain an absolute HTTPS Markdown link with descriptive link text. If no public URL can be established, omit the section and do not emit a text-only documentation bullet
458
+ - Use fragment identifiers (`#section-name`) only for verified section anchors
459
+ - Prefer short inline examples in the relevant bullet; use **Examples** only for a distinct useful workflow, never to repeat a feature
460
+ - Use **Documentation** only for independent documentation-only changes with a verified HTTPS link; never repeat links or outcomes already covered elsewhere
380
461
  - Prefer concise inline Markdown links in every section, such as `See the [pricing reference for details](https://example.com/pricing)`, rather than exposing a full URL after a colon or in parentheses
381
462
  - Multiple links OK if they point to different topics
382
463
  - Omit any section that has no bullets
@@ -392,18 +473,22 @@ Start directly with the release-note section instead:
392
473
 
393
474
  ## Non-interactive automation mode
394
475
 
395
- When this skill is invoked by a CI job with an explicit output-file request:
476
+ When invoked by the bundled generator or a CI job using structured output:
396
477
 
397
478
  - Honor the requested tag range and repository path exactly.
398
- - Treat the requested output file as mandatory. Writing it is the only successful completion condition.
399
- - Use the `create` file tool when the requested file does not exist, or the `edit` file tool when it already exists.
400
- - After writing, use the `read` file tool to verify that the requested file exists and contains the final release-note Markdown.
401
- - Do not modify, commit, or push any other repository files.
402
- - The output file must contain only the final release-note Markdown, without an explanation, title heading, or code fence.
479
+ - Return only the complete release-note Markdown in the final answer. The Python
480
+ caller selects its structured event, validates it, and writes the requested file.
481
+ - Do not create, edit, commit, or push any repository files. There is no model-side
482
+ output-file handoff or file verification step.
483
+ - Use `view`, `glob`, `grep`, and read-only Git commands to inspect the evidence,
484
+ skill instructions, public syntax, and documentation destinations as needed.
485
+ - The final answer must contain only release-note Markdown, without an
486
+ explanation, title heading, or code fence.
403
487
  - The first line must be exactly one of: `## New Features`, `## Enhancements`, `## Bug Fixes`, `## Breaking Changes`, `## Examples`, `## Documentation`, or `## Maintenance`.
404
- - Do not write a preamble, title, code fence, or explanatory text before the first release-note section.
405
- - Never use the Copilot response stream as output. The caller may discard it after the file is written.
406
- - Do not report the release notes only in the response. If the file cannot be written or verified, the task has failed.
488
+ - Do not write a preamble, tool-call transcript, title, code fence, or explanatory text before the first release-note section.
489
+ - Do not add progress prose, an explanation, or a tool trace to the final answer.
490
+ - Never infer "no user-facing changes" because writing, authentication, or
491
+ generation failed. Maintenance requires evidence about the requested range.
407
492
  - Preserve the user-impact categories, concrete examples, evidence-based breaking-change detection, and repository-derived public documentation links described above.
408
493
 
409
494
  ## How to Use This Skill in a Session
@@ -434,9 +519,9 @@ Generate release notes from v2.1.0 to v2.2.0 for /path/to/my-app
434
519
  - Include breaking changes prominently
435
520
  - Omit the entire Breaking Changes section when no breaking change is evidenced
436
521
  - Group related changes
437
- - Add a concrete example for every changed CLI command, public API, configuration option, or before/after workflow, drawing syntax from README, public docs, or CLI/API help
522
+ - Add verified inline syntax only when useful; do not require an Examples section or repeat the same outcome
438
523
  - Discover and link to the project's public documentation when a trustworthy page is available
439
- - Link each qualifying user-facing change to the closest relevant public documentation page when one exists, whether or not that page changed in the release
524
+ - End each qualifying change's bullet with its closest verified public documentation link when available; never move these links into a bottom-of-notes collection
440
525
  - Omit empty sections
441
526
  - If a candidate cannot pass the normal-user audience test, omit it rather than placing it under Maintenance or Documentation
442
527
 
@@ -477,8 +562,8 @@ Generate release notes from v2.1.0 to v2.2.0 for /path/to/my-app
477
562
 
478
563
  ## Limitations
479
564
 
480
- - Requires a git repository with proper tags
565
+ - Requires a Git repository with available ancestor refs; tags are optional
481
566
  - Complex changes may need human interpretation
482
567
  - Very large diffs should be reduced to their evidenced user impact; never summarize them by file count
483
- - Works best with semantic versioning (v1.0.0 format)
568
+ - Accepts tags, branches, or commit IDs; no version naming convention is required
484
569
  - Needs meaningful commit messages for best results, but commit messages alone are never evidence of user impact