Skip to content

ci: package and app versioning and release cycles#426

Merged
FSM1 merged 39 commits into
mainfrom
feat/package-and-app-versioning-and-release-cycles
Apr 1, 2026
Merged

ci: package and app versioning and release cycles#426
FSM1 merged 39 commits into
mainfrom
feat/package-and-app-versioning-and-release-cycles

Conversation

@FSM1

@FSM1 FSM1 commented Mar 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • Restructure Release Please for independent per-package versioning across all 15 monorepo components
  • Add PR-time release preview action that auto-analyzes commits, maps files to packages, detects dependency cascades, and applies release labels
  • Add post-merge action that reads labels from merged PRs and injects release-as overrides into Release Please config
  • Update staging deployment to date-based tags with triple-tagged Docker images
  • Add 3-platform desktop release workflow triggered by cipherbox-desktop-v* tags with Tauri auto-updater JSON

Key files

File Purpose
.github/scripts/release-constants.cjs Shared constants for release scripts
.github/scripts/pr-release-preview.js PR commit analysis and auto-labeling
.github/scripts/post-merge-release.js Post-merge release-as injection
.github/scripts/create-release-labels.sh One-time label creation script
.github/workflows/pr-release-preview.yml PR preview workflow
.github/workflows/post-merge-release.yml Post-merge workflow
.github/workflows/desktop-release.yml 3-platform desktop build and updater
.github/workflows/deploy-staging.yml Updated staging deploy
.github/workflows/tag-staging.yml Date-based staging tags
release-please-config.json 15 per-package entries, batched releases

Test plan

  • PR release preview: open a test PR touching apps/api/ — verify release:api:feat label applied and preview comment posted
  • Post-merge: merge a labeled PR — verify release-as written to config and committed
  • Staging: trigger tag-staging workflow — verify date-based tag created and deploy succeeds
  • Desktop release: push a cipherbox-desktop-v* tag — verify 3-platform builds and updater JSON published
  • Label script: run .github/scripts/create-release-labels.sh --dry-run — verify 61 labels listed

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Desktop release pipeline: builds and publishes Tauri app artifacts for macOS, Windows, and Linux.
    • PR release preview: per-PR component impact analysis, preview comment, and automatic release labels.
    • Per-component versioning: independent component/package versioning with batched release behavior.
  • Chores

    • Enhanced staging: date-based staging tags and component-version Docker tagging; staging env includes component versions.
    • Post-merge release automation: computes and injects release targets after merges.
    • Release-label tooling: script to pre-create/update release labels with dry-run support.
  • Documentation

    • Added Phase 41 planning, roadmap, verification, and research docs.

FSM1 and others added 27 commits April 1, 2026 00:02
Entire-Checkpoint: b8a772658cb8
Entire-Checkpoint: 158b42ca6104
Entire-Checkpoint: a573c4d54aab
…dated concerns

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: c49b84391852
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Mar 31, 2026

Copy link
Copy Markdown

Release Preview

No version bumps detected. All changes are in unversioned paths or use exempt commit types.

@codecov

codecov Bot commented Mar 31, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 71.80%. Comparing base (7e7f4f4) to head (fe48fb7).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #426      +/-   ##
==========================================
+ Coverage   62.31%   71.80%   +9.48%     
==========================================
  Files         134      113      -21     
  Lines       10081     7164    -2917     
  Branches     1052     1050       -2     
==========================================
- Hits         6282     5144    -1138     
+ Misses       3583     1804    -1779     
  Partials      216      216              
Flag Coverage Δ
api 84.92% <ø> (-0.06%) ⬇️
api-client 84.92% <ø> (-0.06%) ⬇️
core 84.92% <ø> (-0.06%) ⬇️
crypto 84.92% <ø> (-0.06%) ⬇️
desktop 14.40% <ø> (-16.82%) ⬇️
sdk 84.92% <ø> (-0.06%) ⬇️
sdk-core 84.92% <ø> (-0.06%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.
see 35 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

… STATE.md

Root package.json has "type": "module" so .js files are treated as ESM.
Rename to .cjs to ensure require() works on GitHub Actions runners.
Also fix STATE.md: normalize metrics table, add missing plan entries,
update progress counts, prune outdated open concerns.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When commits change via force-push and the computed bump level increases
for a component, replace the existing label instead of treating it as a
manual override. Only preserve existing labels when they represent a
higher or equal bump level.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@FSM1 FSM1 force-pushed the feat/package-and-app-versioning-and-release-cycles branch from 228749b to 78e84f1 Compare March 31, 2026 23:01
@github-actions github-actions Bot removed the release:desktop:fix Patch version bump (bug fix) for desktop label Mar 31, 2026
@FSM1 FSM1 marked this pull request as ready for review March 31, 2026 23:22
@FSM1

FSM1 commented Mar 31, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai please review

@coderabbitai

coderabbitai Bot commented Mar 31, 2026

Copy link
Copy Markdown

@FSM1 Sure! I'll start the review of PR #426 right away.


🧠 Learnings used
Learnt from: FSM1
Repo: FSM1/cipher-box PR: 426
File: .github/scripts/pr-release-preview.js:475-532
Timestamp: 2026-03-31T22:53:09.771Z
Learning: In `FSM1/cipher-box` `.github/scripts/pr-release-preview.js` (PR `#426`, updated in commit 228749b): The label reconciliation logic compares bump levels numerically. If the computed bump is **strictly higher** than an existing `release:<component>:<type>` label, the existing label is replaced automatically (e.g., a force-push that changes a `fix` commit to `feat` will upgrade the label). If the existing label represents a **higher or equal** bump compared to the computed one, it is preserved as a manual override (e.g., a user manually sets `breaking` when the script computes `feat`). There is no auto/manual marker — the bump-level comparison is the sole heuristic. Components whose computed bump disappears entirely still have their labels removed. Do NOT flag the absence of an auto-marker or assert that existing labels are always treated as authoritative regardless of computed bump level.

Learnt from: FSM1
Repo: FSM1/cipher-box PR: 426
File: .github/workflows/desktop-release.yml:59-79
Timestamp: 2026-03-31T22:47:02.877Z
Learning: In `FSM1/cipher-box` `.github/workflows/desktop-release.yml`: `releaseDraft: false` is intentional on all three per-platform `tauri-apps/tauri-actionv0` jobs (macOS, Windows, Linux). Early public visibility of the release is an accepted tradeoff. `tauri-action` PR `#895` (merged Dec 2024) handles updater JSON cumulatively — each job deletes and recreates `latest.json` to reflect all platform assets — so the final state after all three jobs is correct. Draft mode would add unnecessary complexity. Do NOT flag `releaseDraft: false` on individual platform jobs in this workflow as a premature-publication issue.

Learnt from: FSM1
Repo: FSM1/cipher-box PR: 296
File: .release-please-manifest.json:3-6
Timestamp: 2026-03-20T14:25:00.151Z
Learning: In FSM1/cipher-box, the newly extracted packages `packages/core`, `packages/api-client`, `packages/sdk-core`, and `packages/sdk` are all `private: true` and share the monorepo version (`0.24.2`). Their entries in `.release-please-manifest.json` must match the version declared in their respective `package.json` files (currently `0.24.2`). Do NOT suggest initialising them at `0.1.0` — that would create a manifest/package.json mismatch and break Release Please bump calculations. Only `packages/crypto` and the root `"."` were pre-existing; the new packages simply join the same coupled versioning scheme.

Learnt from: FSM1
Repo: FSM1/cipher-box PR: 0
File: :0-0
Timestamp: 2026-03-30T01:40:47.029Z
Learning: In FSM1/cipher-box (`release-gate.yml`), `.github/workflows/ci-e2e.yml` is intentionally excluded from both `WEB_PATTERNS` and `DESKTOP_PATTERNS` in the release gate's change-detection step. Reason: `ci-e2e.yml` self-includes in its own `dorny/paths-filter` for both `web` and `desktop`, so any change to the orchestrator still triggers both E2E suites on `main` pushes. Including it in the release gate patterns would cause a deadlock: the gate detects "desktop changed" but `ci-e2e.yml`'s narrower per-push filter may not schedule a Desktop E2E job, leaving no run for the gate to find. The release gate only needs to block on actual app-code changes, not on CI config changes. Do NOT flag the absence of `ci-e2e.yml` from the release gate pattern lists.
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

FSM1 and others added 2 commits April 1, 2026 01:40
Add missing entries for phases 18, 21-P02, 24, 25, 28-32, 34-P04,
35-P01/P04/P06, 36, 37-P01, 38, 39. Sort all entries by phase/plan
order. Mark missing data with - where older GSD versions didn't
capture metrics in summaries.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Filter non-numeric tag suffixes in tag-staging.yml before sorting
- Guard post-merge commit with staged-diff check to avoid no-op failures
- Update desktop OTP debug doc with PR #425 resolution details

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR overhauls CipherBox’s CI/CD release automation to support independent versioning across monorepo components, with PR-time impact analysis + labeling and post-merge release-as injection to drive Release Please. It also updates staging deployments to date-based tags and adds a dedicated multi-platform desktop release workflow compatible with the Tauri updater.

Changes:

  • Reworked Release Please configuration/manifest for per-component versioning (including new app entries) and batched releases.
  • Added PR-time release preview + labeling and post-merge release-as injection automation (scripts + workflows).
  • Updated staging tag/deploy flows and introduced a tag-triggered desktop release workflow that publishes updater JSON and manages the GitHub “latest” flag.

Reviewed changes

Copilot reviewed 31 out of 33 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
release-please-config.json Enables batched releases and adds per-app entries with component tags and desktop extra-files sync.
.release-please-manifest.json Adds versions for new app package paths to match RP config.
apps/desktop/src-tauri/Cargo.toml Aligns desktop Rust crate version with desktop app versioning strategy.
.github/scripts/release-constants.js Centralizes shared label/path/versioning constants used by release automation scripts.
.github/scripts/pr-release-preview.js Implements PR commit analysis, package mapping, cascade detection, and label/comment automation.
.github/scripts/post-merge-release.js Implements post-merge release-as injection based on merged PR labels.
.github/workflows/pr-release-preview.yml Runs PR-time analysis and applies release labels/comments.
.github/workflows/post-merge-release.yml Serializes and commits release-as targets to main after merges.
.github/workflows/release-please.yml Adds release summary output and “latest” flag management for desktop updater behavior.
.github/workflows/tag-staging.yml Switches to date-based staging tags and deploy trigger wiring.
.github/workflows/deploy-staging.yml Broadens staging tag trigger and adds triple-tag Docker image strategy + version recording.
.github/workflows/desktop-release.yml Adds 3-platform desktop build/release pipeline for cipherbox-desktop-v* tags + mark-latest job.
Planning/docs files under .planning/ Captures Phase 41 decisions, plans, verification, and roadmap/state updates.

Comment thread .github/workflows/tag-staging.yml
Comment thread .github/workflows/pr-release-preview.yml Outdated
Comment thread .github/workflows/post-merge-release.yml Outdated

@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: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/tag-staging.yml:
- Around line 63-65: The workflow is interpolating ${{ inputs.description }}
directly into the inline shell, which can break the script if the description
contains quotes or newlines; update the job/step to pass the input through an
environment variable (e.g. set env: DESCRIPTION: ${{ inputs.description }} on
the step that runs the shell) and then reference that variable inside the script
using a safely quoted expansion ("$DESCRIPTION") when appending to
GITHUB_STEP_SUMMARY so the runner receives the raw value instead of embedded
shell syntax.
- Around line 20-27: Add a new upstream job (e.g., resolve-main) that checks out
main and exposes its commit SHA as an output, then change web-e2e, desktop-e2e
and tag-staging to consume that output instead of using ref: main or default
checkout; specifically create a resolve-main job that runs actions/checkout to
ref: main and sets an output like main_sha=$(git rev-parse HEAD), update web-e2e
and desktop-e2e to use with: ref: ${{ needs.resolve-main.outputs.main_sha }}
(instead of ref: main), and update tag-staging’s actions/checkout to use ref:
${{ needs.resolve-main.outputs.main_sha }} so all jobs use the identical
resolved SHA.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4576e4e5-46e7-423d-9ab8-eb6afad25e9b

📥 Commits

Reviewing files that changed from the base of the PR and between 8139903 and 491d6b5.

📒 Files selected for processing (3)
  • .github/workflows/post-merge-release.yml
  • .github/workflows/tag-staging.yml
  • .planning/debug/resolved/desktop-email-otp-verification-failed.md
✅ Files skipped from review due to trivial changes (1)
  • .github/workflows/post-merge-release.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .planning/debug/resolved/desktop-email-otp-verification-failed.md

Comment thread .github/workflows/tag-staging.yml Outdated
Comment thread .github/workflows/tag-staging.yml Outdated
- Add resolve-main job to tag-staging workflow to pin SHA across all jobs,
  preventing drift between E2E tests and the tagged commit
- Fix shell injection risk by passing inputs.description through env var
- Pin @actions/core@1.11.1 and @actions/github@6.0.0 in CI scripts
- Fix validation doc script filenames (.mjs → .js)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 477a208a5d3e

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 31 out of 33 changed files in this pull request and generated 4 comments.

Comment thread .github/scripts/pr-release-preview.js Outdated
Comment thread .github/scripts/pr-release-preview.js Outdated
Comment thread .github/scripts/post-merge-release.js Outdated
Comment thread .github/workflows/release-please.yml Outdated
Filter by author (github-actions[bot]) when searching for existing
release preview comment to update, not just the HTML marker.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 45e267fee322
@github-actions

github-actions Bot commented Apr 1, 2026

Copy link
Copy Markdown
Contributor

Release Preview

No version bumps detected. All changes are in unversioned paths or use exempt commit types.

FSM1 and others added 2 commits April 1, 2026 02:40
- Preserve manually-added release labels for non-computed components (D-18)
- Clear --latest=false on ALL manifest releases, not just root tag
- Update header comments to reflect runtime-installed deps

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: d1d44edfbdda
Manual override labels (D-18) still work but must be reapplied after
the last commit. Auto-tracking of label provenance is deferred.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 449f63212296

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 31 out of 33 changed files in this pull request and generated no new comments.

@FSM1

FSM1 commented Apr 1, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai please review

@coderabbitai

coderabbitai Bot commented Apr 1, 2026

Copy link
Copy Markdown

@FSM1 Sure! I'll start a fresh review of PR #426 right away.


🧠 Learnings used
Learnt from: FSM1
Repo: FSM1/cipher-box PR: 426
File: .github/scripts/pr-release-preview.js:475-532
Timestamp: 2026-03-31T22:53:09.771Z
Learning: In `FSM1/cipher-box` `.github/scripts/pr-release-preview.js` (PR `#426`, updated in commit 228749b): The label reconciliation logic compares bump levels numerically. If the computed bump is **strictly higher** than an existing `release:<component>:<type>` label, the existing label is replaced automatically (e.g., a force-push that changes a `fix` commit to `feat` will upgrade the label). If the existing label represents a **higher or equal** bump compared to the computed one, it is preserved as a manual override (e.g., a user manually sets `breaking` when the script computes `feat`). There is no auto/manual marker — the bump-level comparison is the sole heuristic. Components whose computed bump disappears entirely still have their labels removed. Do NOT flag the absence of an auto-marker or assert that existing labels are always treated as authoritative regardless of computed bump level.

Learnt from: FSM1
Repo: FSM1/cipher-box PR: 426
File: .github/workflows/desktop-release.yml:59-79
Timestamp: 2026-03-31T22:47:02.877Z
Learning: In `FSM1/cipher-box` `.github/workflows/desktop-release.yml`: `releaseDraft: false` is intentional on all three per-platform `tauri-apps/tauri-actionv0` jobs (macOS, Windows, Linux). Early public visibility of the release is an accepted tradeoff. `tauri-action` PR `#895` (merged Dec 2024) handles updater JSON cumulatively — each job deletes and recreates `latest.json` to reflect all platform assets — so the final state after all three jobs is correct. Draft mode would add unnecessary complexity. Do NOT flag `releaseDraft: false` on individual platform jobs in this workflow as a premature-publication issue.

Learnt from: FSM1
Repo: FSM1/cipher-box PR: 296
File: .release-please-manifest.json:3-6
Timestamp: 2026-03-20T14:25:00.151Z
Learning: In FSM1/cipher-box, the newly extracted packages `packages/core`, `packages/api-client`, `packages/sdk-core`, and `packages/sdk` are all `private: true` and share the monorepo version (`0.24.2`). Their entries in `.release-please-manifest.json` must match the version declared in their respective `package.json` files (currently `0.24.2`). Do NOT suggest initialising them at `0.1.0` — that would create a manifest/package.json mismatch and break Release Please bump calculations. Only `packages/crypto` and the root `"."` were pre-existing; the new packages simply join the same coupled versioning scheme.

Learnt from: FSM1
Repo: FSM1/cipher-box PR: 0
File: :0-0
Timestamp: 2026-03-30T01:40:47.029Z
Learning: In FSM1/cipher-box (`release-gate.yml`), `.github/workflows/ci-e2e.yml` is intentionally excluded from both `WEB_PATTERNS` and `DESKTOP_PATTERNS` in the release gate's change-detection step. Reason: `ci-e2e.yml` self-includes in its own `dorny/paths-filter` for both `web` and `desktop`, so any change to the orchestrator still triggers both E2E suites on `main` pushes. Including it in the release gate patterns would cause a deadlock: the gate detects "desktop changed" but `ci-e2e.yml`'s narrower per-push filter may not schedule a Desktop E2E job, leaving no run for the gate to find. The release gate only needs to block on actual app-code changes, not on CI config changes. Do NOT flag the absence of `ci-e2e.yml` from the release gate pattern lists.

Learnt from: FSM1
Repo: FSM1/cipher-box PR: 419
File: README.md:23-23
Timestamp: 2026-03-31T00:15:59.525Z
Learning: In `README.md` (FSM1/cipher-box): The "30-day soft-delete" bin retention stated in the Recycle Bin feature bullet is intended policy, not yet enforced in code (no `expiresAt`/TTL field in `packages/core/src/bin/types.ts` and no cleanup job). The enforcement point and user-configurable retention period are deferred to Phase 39 (User-configurable vault parameters). Do NOT flag the absence of a TTL/cleanup mechanism for bin entries as a missing enforcement concern ahead of Phase 39.
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@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: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/scripts/pr-release-preview.js:
- Around line 524-532: The loop that unconditionally keeps labels for components
missing from computedLabels should instead remove labels for components that no
longer have a computed bump unless they were explicitly marked as manual; update
the code in the block iterating existingByComponent.entries() to: check
computedLabels.has(component) and if false, test for an explicit manual-override
marker (e.g., a dedicated manual label or flag you already use) and only call
core.info and keep the label when that manual marker is present, otherwise
remove the stale label (and log that removal); adjust the conditional around
existingByComponent, computedLabels.has(component) and the core.info message
accordingly to reflect removal vs manual preservation.
- Around line 259-264: The code only reads commitDetail.data.files from the
single getCommit response, which misses commits with >300 files; update the
logic that calls octokit.rest.repos.getCommit (where commitDetail and
changedFiles are created) to follow Link header pagination: inspect
commitDetail.headers.link for a rel="next" URL, loop fetching each next page
(use octokit.request with the full next URL or perform GET on that URL) and
accumulate all files into changedFiles until no rel="next" remains, then
dedupe/flatten the filenames before using them to compute release labels.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f4e9f37d-57c4-435f-b7b5-492c33750957

📥 Commits

Reviewing files that changed from the base of the PR and between 491d6b5 and d99c10b.

📒 Files selected for processing (7)
  • .github/scripts/post-merge-release.js
  • .github/scripts/pr-release-preview.js
  • .github/workflows/post-merge-release.yml
  • .github/workflows/pr-release-preview.yml
  • .github/workflows/release-please.yml
  • .github/workflows/tag-staging.yml
  • .planning/phases/41-package-and-app-versioning-and-release-cycles/41-VALIDATION.md
✅ Files skipped from review due to trivial changes (1)
  • .github/scripts/post-merge-release.js
🚧 Files skipped from review as they are similar to previous changes (3)
  • .github/workflows/pr-release-preview.yml
  • .github/workflows/release-please.yml
  • .github/workflows/post-merge-release.yml

Comment thread .github/scripts/pr-release-preview.js
Comment thread .github/scripts/pr-release-preview.js Outdated
@FSM1 FSM1 merged commit fd1d9a4 into main Apr 1, 2026
29 checks passed
@FSM1 FSM1 deleted the feat/package-and-app-versioning-and-release-cycles branch April 14, 2026 00:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants