Skip to content

feat: automate release development versions - #62

Merged
IceCodeNew merged 4 commits into
masterfrom
codex/release-1.1.0
Jul 17, 2026
Merged

feat: automate release development versions#62
IceCodeNew merged 4 commits into
masterfrom
codex/release-1.1.0

Conversation

@IceCodeNew

@IceCodeNew IceCodeNew commented Jul 17, 2026

Copy link
Copy Markdown
Owner

Summary

  • make the release workflow create a release commit and tag, then advance master to the next patch -dev version in a second commit
  • replace free-form version input with a required major/minor/patch choice derived from the version stored in pyproject.toml
  • keep the README deployment example on the latest stable release
  • report Git SHA and dirty state from --version for development builds in a Git worktree, with safe fallback outside Git

Why

The 1.1.0 release needs an immutable tag at the release snapshot while ongoing development immediately continues as 1.1.1-dev. Development CLI output also needs enough revision context to identify the exact checkout state.

Impact

Running the release workflow from 1.0.0 with the minor choice tags the release commit as 1.1.0, then pushes a following 1.1.1-dev commit to master atomically with the tag. Major and minor choices reset lower components; patch releases an existing -dev target without incrementing it again. Formal releases keep their embedded version output; source development builds add g<short-sha> and, when applicable, dirty.

Validation

  • 662 tests passed with branch coverage enabled
  • line coverage 99.82%, branch coverage 99.39% (unchanged from baseline)
  • full prek run --all-files passed, including Ruff, ty, actionlint, zizmor, secret scanning, and workflow checks
  • release flow simulated to verify the tag points at the release commit and master advances to the development commit
  • release version matrix verified for major/minor/patch from both stable and -dev versions
  • real Git dirty-state probe produced the required 1.1.1-dirty-g<sha> form

Summary by CodeRabbit

  • New Features

    • Development builds now show a -dev version formatted with the short Git revision, and include a -dirty marker when there are uncommitted changes.
    • --version gracefully falls back to the embedded version if Git info can’t be retrieved.
  • Release Improvements

    • Release automation now accepts major/minor/patch bump choices and performs a two-phase release: published version commit + tag, then the next development -dev commit.
  • Documentation

    • Updated release/version documentation, including development-version labeling rules and workflow steps.
  • Tests

    • Expanded CLI version-flag coverage for clean/dirty and Git-failure fallback cases.

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@IceCodeNew, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 41 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 633e1663-d3e4-454a-83bc-71757b2da5b9

📥 Commits

Reviewing files that changed from the base of the PR and between b3ae2dd and 4ee4f98.

📒 Files selected for processing (4)
  • docs/design.md
  • docs/requirements.md
  • tests/test_cli.py
  • weather_briefing/cli.py
📝 Walkthrough

Walkthrough

The release workflow now separates stable-release and next-development commits. The CLI augments -dev versions with Git metadata, while tests and documentation cover the updated release and version-display rules.

Changes

Release and version display

Layer / File(s) Summary
Release and next-development commit flow
.github/workflows/release.yml, docs/design.md, docs/notes.md, docs/requirements.md
The workflow computes versions from a selected bump, creates a tagged stable-release commit, then commits the next -dev version; documentation records the revised release process and version-display behavior, while removing the obsolete OCI label section.
Git-aware development version output
weather_briefing/cli.py, tests/test_cli.py
Development --version output includes the short Git revision and optional dirty marker, while release versions and Git failures use the embedded version. Tests cover these behaviors and avoid Git probes for other commands.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Sequence Diagram(s)

sequenceDiagram
  participant ReleaseWorkflow
  participant VersionFiles
  participant Git
  ReleaseWorkflow->>VersionFiles: write stable release version
  ReleaseWorkflow->>Git: commit release and create annotated tag
  ReleaseWorkflow->>VersionFiles: write next -dev version
  ReleaseWorkflow->>Git: commit development version
Loading
sequenceDiagram
  participant CLI
  participant GitRevision
  participant GitStatus
  CLI->>GitRevision: query short commit hash
  CLI->>GitStatus: query porcelain status
  GitStatus-->>CLI: return clean or dirty state
  GitRevision-->>CLI: return short revision
  CLI-->>CLI: format development version
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: automating release progression and development version bumps.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/release-1.1.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@IceCodeNew
IceCodeNew requested a review from Copilot July 17, 2026 08:23
@codecov

codecov Bot commented Jul 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.74%. Comparing base (f4834a9) to head (4ee4f98).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##           master      #62   +/-   ##
=======================================
  Coverage   99.74%   99.74%           
=======================================
  Files          39       39           
  Lines        7083     7144   +61     
  Branches      409      411    +2     
=======================================
+ Hits         7065     7126   +61     
  Misses         13       13           
  Partials        5        5           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@IceCodeNew
IceCodeNew marked this pull request as ready for review July 17, 2026 08:25
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Automate release commit+tag and next -dev bump; add Git info to dev --version

✨ Enhancement ⚙️ Configuration changes 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Update release workflow to tag the release commit, then bump master to next patch -dev.
• Keep README deployment example pinned to latest stable release during the dev bump.
• Enhance --version for -dev builds to include git short SHA and dirty state when available.
Diagram

graph TD
  A["Release workflow"] --> C["Commit release"] --> D["Tag X.Y.Z"] --> E["Commit next -dev"] --> F["Atomic push"]
  G["CLI --version"] --> H{"Dev build & Git?"} -->|"no"| K["Print version"]
  H -->|"yes"| K
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Adopt release-please / semantic-release
  • ➕ Standardizes tagging/versioning and reduces custom scripting in workflows
  • ➕ Can automate changelog/release notes generation
  • ➖ More moving parts and opinionated conventions
  • ➖ May not fit the two-commit (release + next -dev) requirement cleanly
  • ➖ Still needs custom handling for uv.lock and README pinning
2. Derive versions from Git tags (setuptools_scm / hatch-vcs)
  • ➕ Eliminates manual version bump commits for development builds
  • ➕ Built-in support for sha/dirty-style local versions
  • ➖ Adds build-time tooling and changes packaging/versioning model
  • ➖ May complicate reproducible release version strings for installed artifacts
  • ➖ Requires careful behavior definition when Git metadata is absent
3. Use git describe for dev version decoration
  • ➕ Captures nearest tag + distance + sha in one command
  • ➕ Often more informative than only short SHA
  • ➖ Output format can be unstable across tag patterns
  • ➖ Still requires Git availability and clear fallback rules

Recommendation: The PR’s approach is a good fit for the stated goals: it keeps release artifacts immutable (tagged release commit), advances master immediately to the next -dev version, and avoids introducing new release tooling dependencies. The lightweight runtime Git probing is appropriately guarded (only for -dev, safe fallback when Git is unavailable), preserving reproducible release version output for installed packages.

Files changed (5) +112 / -15

Enhancement (1) +28 / -1
cli.pyDecorate -dev versions with git short SHA and dirty state when available +28/-1

Decorate -dev versions with git short SHA and dirty state when available

• Introduces _display_version() and routes argparse --version through it. For versions ending with -dev, attempts to read git short SHA and porcelain status; on success prints X.Y.Z(-dirty)-g<sha>, otherwise returns the embedded version unchanged.

weather_briefing/cli.py

Tests (1) +38 / -1
test_cli.pyAdd tests for release vs dev --version formatting and Git fallback paths +38/-1

Add tests for release vs dev --version formatting and Git fallback paths

• Splits --version behavior into explicit test cases for embedded release versions and decorated development versions. Uses monkeypatched subprocess.run to simulate git revision/status output and to validate fallback behavior on Git errors.

tests/test_cli.py

Documentation (2) +4 / -2
notes.mdDocument two-commit release flow and dev --version Git decoration behavior +3/-1

Document two-commit release flow and dev --version Git decoration behavior

• Updates release workflow notes to reflect the new release commit + tag followed by next -dev commit behavior. Adds documentation on how development builds append short SHA and dirty state only when running inside a Git worktree, with a non-Git fallback.

docs/notes.md

requirements.mdClarify release vs master image tagging and dev version reporting rules +1/-1

Clarify release vs master image tagging and dev version reporting rules

• Extends the runtime/environment requirements to describe the new release workflow sequencing and README pinning behavior. Documents the dev-only Git SHA/dirty reporting for --version and the fallback behavior when Git context is not available.

docs/requirements.md

Other (1) +42 / -11
release.ymlCreate release commit+tag, then bump to next patch -dev in a second commit +42/-11

Create release commit+tag, then bump to next patch -dev in a second commit

• Reworks the release job to (1) refuse existing tags up front, (2) create a release commit and annotated tag, then (3) compute the next patch -dev version, commit it, and push master+tag atomically. The dev bump commit intentionally avoids touching README while still updating uv.lock for the new development version.

.github/workflows/release.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
weather_briefing/cli.py (1)

60-60: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Delay Git subprocess execution until --version is explicitly requested.

Currently, _display_version() is evaluated eagerly when build_parser() is called. During the development cycle, __version__ will end with -dev, causing every CLI invocation (e.g., run forecast) and every test that parses arguments to spawn two git processes.

Consider using a custom argparse.Action to lazily evaluate the version string only when the -V/--version flag is passed.

⚡ Proposed fix using a custom Action
-    parser.add_argument("-V", "--version", action="version", version=f"%(prog)s {_display_version()}")
+    class _VersionAction(argparse.Action):
+        def __init__(self, option_strings, dest=argparse.SUPPRESS, default=argparse.SUPPRESS, help="show program's version number and exit"):
+            super().__init__(
+                option_strings=option_strings,
+                dest=dest,
+                default=default,
+                nargs=0,
+                help=help,
+            )
+
+        def __call__(self, parser, namespace, values, option_string=None):
+            print(f"{parser.prog} {_display_version()}")
+            parser.exit()
+
+    parser.add_argument("-V", "--version", action=_VersionAction)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@weather_briefing/cli.py` at line 60, Update build_parser’s -V/--version
argument to defer _display_version() until argparse processes an explicitly
supplied version flag, using a custom argparse.Action or equivalent lazy
mechanism. Ensure ordinary CLI parsing does not invoke Git, while -V and
--version still print the dynamically computed version and exit.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@weather_briefing/cli.py`:
- Line 60: Update build_parser’s -V/--version argument to defer
_display_version() until argparse processes an explicitly supplied version flag,
using a custom argparse.Action or equivalent lazy mechanism. Ensure ordinary CLI
parsing does not invoke Git, while -V and --version still print the dynamically
computed version and exit.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2dced156-5aea-4a77-9dcc-39eaf45c2f5e

📥 Commits

Reviewing files that changed from the base of the PR and between f4834a9 and 9fd621f.

📒 Files selected for processing (5)
  • .github/workflows/release.yml
  • docs/notes.md
  • docs/requirements.md
  • tests/test_cli.py
  • weather_briefing/cli.py

@qodo-code-review

qodo-code-review Bot commented Jul 17, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 31 rules
✅ REVIEW.md

Grey Divider


Action required

1. Release workflow commits unguarded ✓ Resolved 🐞 Bug ☼ Reliability
Description
The release workflow runs both git commit operations unconditionally, but the Python replace()
edits for pyproject.toml and weather_briefing/__init__.py do not assert that the target strings
exist (or that a change occurred), so the job can fail with “nothing to commit” or produce a tagged
release commit with only partial version updates. This is especially risky because the tag is
created immediately after the first commit, so any incomplete version update can become the
immutable release tag snapshot.
Code

.github/workflows/release.yml[R82-113]

          git add pyproject.toml weather_briefing/__init__.py README.md uv.lock
-          if git diff --cached --quiet; then
-            echo "No changes to commit"
-          else
-            git commit -m "chore: bump version to ${WEATHER_BRIEFING_VERSION}"
-          fi
+          git commit -m "chore: release ${WEATHER_BRIEFING_VERSION}"
+          git tag -a "${WEATHER_BRIEFING_VERSION}" -m "Release ${WEATHER_BRIEFING_VERSION}"

-          if git rev-parse "refs/tags/${WEATHER_BRIEFING_VERSION}" >/dev/null 2>&1; then
-            echo "Refusing to reuse existing release tag ${WEATHER_BRIEFING_VERSION}"
-            exit 1
-          fi
+          python3 -c "
+          import pathlib
+
+          release_version = '${WEATHER_BRIEFING_VERSION}'
+          development_version = '${NEXT_DEVELOPMENT_VERSION}'
+
+          toml_path = pathlib.Path('pyproject.toml')
+          toml_path.write_text(
+              toml_path.read_text().replace(
+                  f'version = \"{release_version}\"',
+                  f'version = \"{development_version}\"',
+                  1,
+              )
+          )
+
+          init_path = pathlib.Path('weather_briefing/__init__.py')
+          init_path.write_text(
+              init_path.read_text().replace(
+                  f'__version__ = \"{release_version}\"',
+                  f'__version__ = \"{development_version}\"',
+                  1,
+              )
+          )
+          "
+
+          uv lock
+          git add pyproject.toml weather_briefing/__init__.py uv.lock
+          git commit -m "chore: start ${NEXT_DEVELOPMENT_VERSION} development"
Relevance

⭐⭐⭐ High

Team hardens CI/release workflows; accepted workflow guard changes (PR18) and multiple release/tag
hardening discussions (PR30/54).

PR-#18
PR-#30
PR-#54

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The workflow commits without checking for staged changes, while both version-update scripts perform
plain string replacement on the version files without any guard that the old text exists; this
combination can result in empty commits or partial version updates getting tagged.

.github/workflows/release.yml[51-65]
.github/workflows/release.yml[82-85]
.github/workflows/release.yml[86-113]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The release workflow unconditionally runs `git commit` for both the release and the next `-dev` bump, but the scripts that update `pyproject.toml` and `weather_briefing/__init__.py` rely on `str.replace()` without validating that replacements occurred. This can (a) fail the workflow when no changes are staged, or (b) create a tagged release commit with inconsistent version metadata.

### Issue Context
- The README update *does* validate presence before replacing; the version-file updates do not.
- The release tag is created immediately after the first commit, so correctness of that commit is critical.

### Fix Focus Areas
- .github/workflows/release.yml[51-115]

### Expected fix
- In both Python snippets, assert that the expected old string exists exactly once before replacement (or check that the content changed after replacement) and `raise`/exit non-zero if not.
- Before each `git commit`, check `git diff --cached --quiet`:
 - If empty, fail with a clear message explaining which file update did not apply (preferred for releases), or explicitly skip committing only when that behavior is intended.
- Consider adding `set -euo pipefail` at the top of the `run:` script for safer shell behavior.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. Git probe runs on startup ✓ Resolved 🐞 Bug ➹ Performance
Description
build_parser() interpolates _display_version() when defining the --version argument, and
main() always calls build_parser().parse_args(), so git rev-parse/git status are executed on
every dev-build CLI invocation even when --version is not requested. This adds unnecessary
subprocess overhead and can slow normal command execution in development builds.
Code

weather_briefing/cli.py[R57-61]

def build_parser() -> argparse.ArgumentParser:
    """Build the command-line parser for runs, daemon, and diagnostics."""
    parser = argparse.ArgumentParser(description="Generate a stateful weather briefing")
-    parser.add_argument("-V", "--version", action="version", version=f"%(prog)s {__version__}")
+    parser.add_argument("-V", "--version", action="version", version=f"%(prog)s {_display_version()}")
    subparsers = parser.add_subparsers(dest="command", required=True)
Relevance

⭐⭐ Medium

No prior reviews about lazy argparse --version evaluation or avoiding git subprocess overhead during
normal CLI startup.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The parser embeds _display_version() at argument definition time, and main() always
builds/parses the parser for every command, causing the git probe to run even when --version is
not used.

weather_briefing/cli.py[57-61]
weather_briefing/cli.py[93-116]
weather_briefing/cli.py[569-573]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`_display_version()` is evaluated eagerly during parser construction, so development builds pay the cost of running git commands even when users are executing normal commands (not `--version`).

### Issue Context
`argparse`’s built-in `action="version"` requires a precomputed string; to make it lazy you need a custom action.

### Fix Focus Areas
- weather_briefing/cli.py[57-61]
- weather_briefing/cli.py[569-573]

### Expected fix
- Replace `action="version"` usage with a custom `argparse.Action` that computes `_display_version()` only when `--version` is actually encountered, e.g.:
 - `class _VersionAction(argparse.Action): ... parser.exit(message=f"{parser.prog} {_display_version()}\n")`
 - `parser.add_argument('-V','--version', nargs=0, action=_VersionAction, help=...)`
- Keep the existing `_display_version()` logic, just make it invoked only for the version flag.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Git SHA from wrong repo ✗ Dismissed 🐞 Bug ≡ Correctness
Description
_display_version() shells out to git without setting cwd, so for -dev builds it will report
the HEAD/dirty state of whatever Git repository the user launched the CLI from (current working
directory), which may be unrelated to weather-briefing’s source. This can emit incorrect --version
output and mislead debugging/triage.
Code

weather_briefing/cli.py[R99-110]

+        revision = subprocess.run(
+            ("git", "rev-parse", "--short=7", "HEAD"),
+            check=True,
+            capture_output=True,
+            text=True,
+        ).stdout.strip()
+        status = subprocess.run(
+            ("git", "status", "--porcelain"),
+            check=True,
+            capture_output=True,
+            text=True,
+        ).stdout
Relevance

⭐⭐ Medium

No prior reviews about setting cwd for git subprocesses to avoid reporting SHA/status from unrelated
repositories.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The code executes git commands without cwd=..., so Git resolves the repository based on the
caller’s current directory rather than the package’s source tree.

weather_briefing/cli.py[93-116]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`_display_version()` runs `git rev-parse` and `git status` in the process current working directory. For `-dev` versions, running the CLI from another Git repo can produce unrelated revision/dirty state in the version string.

### Issue Context
The intent is to identify the exact checkout state of the weather-briefing source tree for development builds.

### Fix Focus Areas
- weather_briefing/cli.py[93-116]

### Expected fix
- Run git commands anchored to the project directory, e.g.:
 - `repo_root = Path(__file__).resolve().parents[1]`
 - pass `cwd=repo_root` to both `subprocess.run(...)` calls, or use `git -C <repo_root> ...`.
- Optionally, first verify `git rev-parse --is-inside-work-tree` (with the same `cwd`) before attempting the other commands.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

4. Release workflow docs duplicated ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
docs/requirements.md repeats a detailed description of the release workflow and dev --version
behavior that is already documented in docs/notes.md, instead of linking to a single canonical
source. This increases the risk of the two documents drifting out of sync over time.
Code

docs/requirements.md[63]

+目标为自有服务器。应用支持 Python 3.11–3.14,以当前最新稳定 Python 作为首选开发和测试版本,并在 CI 中覆盖全部受支持版本;项目元数据不设置未经验证的未来 Python 版本上限。项目使用 uv 原生 `uv_build` 构建后端并提交 `uv.lock`,不引入 PDM 工具链。Distroless Debian 13 镜像使用其系统 Python。应用以内置调度器常驻运行,SQLite 位于外部持久目录或卷中。项目维护单一、非 root、由 `uv.lock` 锁定依赖的 OCI 镜像,不使用 Docker Compose;GitHub Actions 仅用于 CI 和独立镜像发布,不预设生产运行 secrets。每次 `X.Y.Z` Git tag 构建更新同名 OCI 标签、`latest` 和 commit SHA 标签;`master` 构建更新 `edge` 和 commit SHA 标签,不修改 `latest` 或版本标签。发布工作流先用输入版本创建正式版提交和同名 tag,再创建下一个 patch 的 `-dev` 提交,并将 master 与 tag 原子推送;README 部署示例保留最新正式版。开发版本在 Git worktree 中通过 `--version` 附加短 commit SHA,有未提交或未跟踪改动时同时标记 dirty;正式版或无法读取 Git 状态时只显示内置版本。
Relevance

⭐ Low

Repo prefers requirements.md as canonical; PR54 review requested notes.md not restate
requirements.md (opposite of finding).

PR-#54

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 2141669 requires avoiding duplicated multi-line conceptual documentation and
linking to a canonical source instead. The release workflow and development --version behavior are
described in detail in docs/notes.md, and the same detailed contract is duplicated inline in
docs/requirements.md rather than referencing the canonical section.

Rule 2141669: Avoid duplicating existing documentation; link to the canonical source instead
docs/notes.md[72-74]
docs/requirements.md[63-63]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The PR adds/keeps the same detailed release-workflow + development `--version` behavior description in multiple docs (`docs/notes.md` and `docs/requirements.md`). This violates the rule to avoid duplicating documentation and to link to a canonical source instead.

## Issue Context
`docs/notes.md` already contains a detailed explanation of the release workflow and the development version string behavior. `docs/requirements.md` now repeats that same information inline.

## Fix Focus Areas
- docs/requirements.md[63-63]
- docs/notes.md[72-74]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment thread .github/workflows/release.yml
Comment thread weather_briefing/cli.py Outdated
Comment thread weather_briefing/cli.py
@IceCodeNew
IceCodeNew force-pushed the codex/release-1.1.0 branch from 9fd621f to 47df845 Compare July 17, 2026 08:33
@IceCodeNew
IceCodeNew requested a review from Copilot July 17, 2026 08:33

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@IceCodeNew
IceCodeNew force-pushed the codex/release-1.1.0 branch from 47df845 to 6d9ac42 Compare July 17, 2026 08:36
@IceCodeNew
IceCodeNew requested a review from Copilot July 17, 2026 08:36

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@IceCodeNew
IceCodeNew requested a review from Copilot July 17, 2026 09:36

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@weather_briefing/cli.py`:
- Around line 114-126: Update the git subprocess calls in the version-query try
block to pass -C with the package/application repository directory before the
existing rev-parse and status arguments. Use the package location rather than
the process current working directory, while preserving the existing failure
fallback for installations without a Git repository.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2c188787-b508-4820-af17-c0ac8c6df558

📥 Commits

Reviewing files that changed from the base of the PR and between 9fd621f and b3ae2dd.

📒 Files selected for processing (6)
  • .github/workflows/release.yml
  • docs/design.md
  • docs/notes.md
  • docs/requirements.md
  • tests/test_cli.py
  • weather_briefing/cli.py
💤 Files with no reviewable changes (1)
  • docs/notes.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/requirements.md

Comment thread weather_briefing/cli.py
@IceCodeNew

Copy link
Copy Markdown
Owner Author

Applied the approved CodeRabbit fix in 4ee4f98: development --version now reads Git metadata only from the weather-briefing source repository, validates the repository root, and falls back to the embedded version for unrelated repositories. Tests and requirements/design documentation were updated; 664 tests pass with unchanged coverage.

@IceCodeNew
IceCodeNew requested a review from Copilot July 17, 2026 09:54

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@IceCodeNew
IceCodeNew merged commit 9f7de42 into master Jul 17, 2026
20 checks passed
@IceCodeNew
IceCodeNew deleted the codex/release-1.1.0 branch July 17, 2026 09:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants