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.
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/gh-release-notes/SKILL.md +140 -55
- copilot_session_usage-0.8.4/.github/skills/gh-release-notes/scripts/generate_release_notes.py +487 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/workflows/ci.yml +9 -0
- copilot_session_usage-0.8.4/.github/workflows/publish.yml +98 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/workflows/release-notes.yml +44 -8
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/workflows/release.yml +66 -15
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/CONTRIBUTING.md +19 -5
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/PKG-INFO +1 -1
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/internal/automated_release_proces.md +55 -32
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/data/models-and-pricing.lock +3 -3
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/data/models-and-pricing.yml +104 -0
- copilot_session_usage-0.8.4/tests/test_generate_release_notes.py +631 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_release_notes.py +50 -3
- copilot_session_usage-0.8.0/.github/skills/gh-release-notes/scripts/generate_release_notes.py +0 -298
- copilot_session_usage-0.8.0/.github/workflows/publish.yml +0 -35
- copilot_session_usage-0.8.0/tests/test_generate_release_notes.py +0 -226
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.editorconfig +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.gitattributes +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/changes/requests/skill-breakdown/01-request.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/guidelines/git-commit-message.guideline.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/guidelines/knowledge-base.guidelines.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/pull_request_template.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/consolidate-knowledge-base/SKILL.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/gh-commit-changes/SKILL.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/gh-create-pull-request/SKILL.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/record-finding/SKILL.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/workflows/refresh-pricing.yml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.gitignore +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.readthedocs.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/AGENTS.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/CHANGELOG.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/CONSTITUTION.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/LICENSE +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/README.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/articles/presentation.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/_static/changelog.js +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/_static/custom.css +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/changelog.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/conf.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/explanation/how-cost-estimation-works.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/explanation/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/add-commit-trailer.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/analyze-specific-session.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/batch-and-spending.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/copilot-cli-provider.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/export-json.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/how-to/wsl2.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/installation.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/reference/api.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/reference/cli.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/reference/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/reference/pricing.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/tutorials/getting-started.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/docs/source/tutorials/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/guidelines.yml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/justfile +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Base.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Concept.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Experiment.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Finding.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Hypothesis.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Outcome.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Playbook.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Principle.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Reference.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/_schema/Structure.schema.yaml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/copilot-cli.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/overview.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/session-cost-analysis.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/concepts/threshold-based-pricing.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/experiments/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/experiments/verify-subagent-cost-attribution.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/findings/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/guides/automation-scripts.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/guides/cost-optimization.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/guides/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/guides/wsl2-setup.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/ideas/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/ideas/multi-session-efficiency-analytics.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/log.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/principles/findings-are-immutable.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/principles/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/reference/debug-log-format.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/reference/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/reference/pricing-formats.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/cache-cost-approximation.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/index.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/knowledge-base-information-types.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/session-discovery-algorithm.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/subagent-cost-tracking.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/knowledge/structures/vscode-copilot-extension.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/pyproject.toml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/scripts/refresh_pricing.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/skills/copilot-session-usage/SKILL.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/skills/copilot-session-usage/references/span-analysis-template.md +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/__init__.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/__init__.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/copilot_cli.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/core.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/git.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/_internal/vscode.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/api.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/cli.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/data/__init__.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/src/copilot_session_usage/data/custom-models-pricing.yml +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/conftest.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_api.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_cli.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_copilot_cli.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_core.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_coverage_gaps.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_git.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_pricing_runtime.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_rendering.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_vscode.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/tests/test_vscode_platform.py +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/uv.lock +0 -0
- {copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/uv.toml +0 -0
{copilot_session_usage-0.8.0 → copilot_session_usage-0.8.4}/.github/skills/gh-release-notes/SKILL.md
RENAMED
|
@@ -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
|
-
-
|
|
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
|
-
-
|
|
48
|
-
|
|
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
|
|
90
|
+
Generate notes for an exact range using the script's installed path:
|
|
54
91
|
|
|
55
92
|
```bash
|
|
56
|
-
python
|
|
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`
|
|
67
|
-
|
|
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
|
|
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
|
|
213
|
+
git diff --no-ext-diff v1.0.0..v1.1.0
|
|
156
214
|
```
|
|
157
|
-
Read actual
|
|
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.
|
|
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
|
-
|
|
244
|
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
- [
|
|
286
|
-
|
|
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
|
-
|
|
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. **
|
|
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. **
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
- [
|
|
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`)
|
|
378
|
-
-
|
|
379
|
-
-
|
|
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
|
|
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
|
-
-
|
|
399
|
-
|
|
400
|
-
-
|
|
401
|
-
-
|
|
402
|
-
-
|
|
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
|
-
-
|
|
406
|
-
-
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|
-
-
|
|
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
|