Skip to content

feat(changed-paths): add shared_paths input to trigger full matrix on root-level file changes#155

Open
bedatty wants to merge 12 commits intodevelopfrom
feat/changed-paths-shared-paths
Open

feat(changed-paths): add shared_paths input to trigger full matrix on root-level file changes#155
bedatty wants to merge 12 commits intodevelopfrom
feat/changed-paths-shared-paths

Conversation

@bedatty
Copy link
Contributor

@bedatty bedatty commented Mar 19, 2026

Lerian

GitHub Actions Shared Workflows


Description

Adds a shared_paths input to the changed-paths composite action. When any changed file matches a pattern in shared_paths, all components listed in filter_paths are included in the build matrix — bypassing the normal per-directory filtering.

This fixes the scenario where root-level files like go.mod or go.sum are modified in a monorepo: because their dirname resolves to ., they never matched any filter_paths prefix, causing the matrix to be empty and all builds to be skipped.

Before: go.mod change → matrix=[], has_builds=false → builds skipped → gitops-update fails.
After: go.mod change + shared_paths: go.mod → all filter_paths components included in the matrix.

Example usage:

filter_paths: |-
  components/manager
  components/worker
shared_paths: |-
  go.mod
  go.sum
  libs/
path_level: 2

Type of Change

  • feat: New workflow or new input/output/step in an existing workflow

Breaking Changes

None.

Testing

  • YAML syntax validated locally
  • Verified all existing inputs still work with default values (new input defaults to '', which disables the feature entirely)

Caller repo / workflow run: Reproducer described in issue #108 (Build v1.2.0-beta.7 #22723003821)

Related Issues

Closes #108

Summary by CodeRabbit

  • New Features

    • Added a shared-paths input: when any changed file matches it, the matrix expands to include all configured filter-paths components; supports newline lists and JSON-array input (validated).
  • Chores

    • Standardized reusable workflow/action input keys to kebab-case across workflows.
    • Made workflow output writes more robust by quoting output redirections and added targeted shellcheck annotations.
  • Documentation

    • Updated docs, examples, headings, and input tables to kebab-case and to document shared-paths and path-level behavior.

@bedatty bedatty requested a review from a team as a code owner March 19, 2026 18:49
@coderabbitai
Copy link

coderabbitai bot commented Mar 19, 2026

Walkthrough

Renames the changed-paths action inputs from snake_case to kebab-case and adds a new shared-paths input. When any changed file matches shared-paths, the action expands the matrix to include all entries from filter-paths; otherwise the dirname → optional path-level trim → filter flow remains. Breaking change: callers must update input keys.

Changes

Cohort / File(s) Summary
Documentation
src/config/changed-paths/README.md
Documented new shared-paths input and behavior; updated examples, headings and mentions from snake_case → kebab-case (e.g., normalize_to_filternormalize-to-filter, path_levelpath-level) and adjusted example with: blocks.
Action definition
src/config/changed-paths/action.yml
Renamed inputs from snake_case → kebab-case (filter_pathsfilter-paths, path_levelpath-level, get_app_nameget-app-name, app_name_prefixapp-name-prefix, app_name_overridesapp-name-overrides, normalize_to_filternormalize-to-filter, ignore_dirsignore-dirs, fallback_app_namefallback-app-name, consolidate_to_rootconsolidate-to-root, consolidate_keep_dirsconsolidate-keep-dirs). Added shared-paths input and branching logic: if any changed file matches normalized shared-paths, set DIRS to all filter-paths entries (supports JSON-array or newline lists, validated with jq -er), otherwise run dirname → optional path-level trimming → prefix filtering with same validation and errors. Updated environment bindings and error messages to kebab-case.
Workflow callsites & shell fixes
.github/workflows/...
.github/workflows/build.yml, .github/workflows/gptchangelog.yml, .github/workflows/pr-security-scan.yml, .github/workflows/release.yml, .github/workflows/typescript-build.yml, .github/workflows/typescript-release.yml
Updated reusable-workflow with: parameter names to kebab-case for calls to the changed-paths action. Quoted "$GITHUB_OUTPUT" in shell redirections, added targeted shellcheck disable comments, adjusted some cut/read usage to ignore unused fields, and changed a tmp-file truncation to : > /tmp/.... No functional changes to emitted values or control flow beyond the new shared-paths behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning All workflow files were updated to use kebab-case input names (filter-paths, path-level, etc.) to match the action.yml renames. While this is a breaking change to callers, it is scoped to consistently implement the input renaming across all affected workflows and the action definition. The documentation (README.md) was also updated accordingly. No unrelated changes detected. The PR introduces a breaking change: all input parameters were renamed from snake_case to kebab-case in action.yml, affecting all callers. The PR description and title do not explicitly flag this as a BREAKING CHANGE. Update the description to clearly document the input parameter rename breaking change and migration path for callers.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Title accurately describes the main change: adding a shared_paths input to trigger full matrix inclusion on root-level file changes, which is the core feature introduced in this PR.
Description check ✅ Passed Description covers the feature, root cause, example usage, type (feat), and confirms testing (YAML validated, existing inputs verified with defaults). However, it lists 'shared_paths' and 'filter_paths' in the PR but the action.yml shows these were renamed to kebab-case (shared-paths, filter-paths), creating a discrepancy between the description language and the actual code changes.
Linked Issues check ✅ Passed The PR fully addresses issue #108 objectives: implements shared-paths input, includes all filter-paths components when changed files match shared patterns, fixes the root-level file (.go.mod, go.sum) scenario that was producing empty matrix, and provides example usage matching the suggested fix.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/changed-paths-shared-paths
📝 Coding Plan
  • Generate coding plan for human review comments

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

@bedatty bedatty self-assigned this Mar 19, 2026
@lerian-studio
Copy link

lerian-studio commented Mar 19, 2026

🔍 Lint Analysis

Check Files Scanned Status
YAML Lint 7 file(s) ✅ success
Action Lint 6 file(s) ✅ success
Pinned Actions 7 file(s) ✅ success
Markdown Link Check 1 file(s) ✅ success
Spelling Check 8 file(s) ✅ success
Shell Check 7 file(s) ✅ success
README Check 7 file(s) ✅ success
Composite Schema 1 file(s) ✅ success

🔍 View full scan logs

coderabbitai[bot]
coderabbitai bot previously requested changes Mar 19, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

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 `@src/config/changed-paths/action.yml`:
- Around line 190-196: When DIRS_FROM_SHARED is true and FILTER_PATHS starts
with '[', the JSON parsing using "jq -er '.[]'" for FILTER_PATHS must check jq's
exit status like other parsing blocks; update the branch that sets DIRS to run
the jq command, capture its exit code, and on non-zero print an error
(consistent with existing logging) and exit with a non-zero status so malformed
JSON in FILTER_PATHS fails clearly (refer to the DIRS_FROM_SHARED, FILTER_PATHS,
DIRS variables and the "jq -er '.[]'" invocation).

In `@src/config/changed-paths/README.md`:
- Line 14: Update the README inputs table entry for filter_paths so it matches
action.yml: mention it accepts either a newline-separated list of path prefixes
or a JSON array of path prefixes (both formats supported), and keep the default
value `''`; reference the input name filter_paths and action.yml to locate the
source of truth and ensure the table text mirrors the exact wording used in
action.yml.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 115e3ae0-d6dd-4613-ac86-3c12c35b0eba

📥 Commits

Reviewing files that changed from the base of the PR and between 10aec97 and 33bcf83.

📒 Files selected for processing (2)
  • src/config/changed-paths/README.md
  • src/config/changed-paths/action.yml

coderabbitai[bot]
coderabbitai bot previously requested changes Mar 19, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/config/changed-paths/action.yml (1)

190-196: ⚠️ Potential issue | 🟡 Minor

Missing error handling for malformed JSON in filter-paths when shared path triggers.

Line 193 parses JSON without validating jq exit status. Other branches (lines 167-171, 212-216) include error handling. This inconsistency causes unclear failures if filter-paths is malformed JSON.

Proposed fix
       if [[ "$DIRS_FROM_SHARED" == "true" ]]; then
         # Use all filter_paths as the build targets
         if [[ "$FILTER_PATHS" == "["* ]]; then
-          DIRS=$(echo "$FILTER_PATHS" | jq -er '.[]')
+          DIRS=$(echo "$FILTER_PATHS" | jq -er '.[]' 2>/dev/null)
+          if [[ $? -ne 0 ]]; then
+            echo "::error::filter-paths looks like a JSON array but is malformed: $FILTER_PATHS"
+            exit 1
+          fi
         else
           DIRS="$FILTER_PATHS"
         fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/config/changed-paths/action.yml` around lines 190 - 196, The
DIRS_FROM_SHARED branch parses FILTER_PATHS JSON into DIRS using jq without
checking jq's exit status, so malformed JSON will fail silently; modify the
block handling DIRS_FROM_SHARED (the condition using DIRS_FROM_SHARED,
FILTER_PATHS and assigning to DIRS) to validate jq's result and exit with an
error message if parsing fails—mirror the existing error handling used in the
other branches (lines handling FILTER_PATHS elsewhere) by capturing jq's exit
code, logging a clear error mentioning FILTER_PATHS, and exiting non‑zero when
jq fails.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/config/changed-paths/action.yml`:
- Around line 5-48: The action inputs were renamed from snake_case to kebab-case
(e.g., filter-paths, shared-paths, path-level, get-app-name, app-name-prefix,
app-name-overrides, normalize-to-filter, ignore-dirs, fallback-app-name,
consolidate-to-root, consolidate-keep-dirs) but the README still documents the
old snake_case names; update the changed-paths README to use the new kebab-case
input names everywhere (descriptions, examples, and sample workflows), add a
clear “Breaking change” note plus a short migration mapping table showing each
old snake_case -> new kebab-case name, and update any example usages to
demonstrate the new names (optionally include a one-line compatibility hint for
callers migrating from snake_case).

---

Duplicate comments:
In `@src/config/changed-paths/action.yml`:
- Around line 190-196: The DIRS_FROM_SHARED branch parses FILTER_PATHS JSON into
DIRS using jq without checking jq's exit status, so malformed JSON will fail
silently; modify the block handling DIRS_FROM_SHARED (the condition using
DIRS_FROM_SHARED, FILTER_PATHS and assigning to DIRS) to validate jq's result
and exit with an error message if parsing fails—mirror the existing error
handling used in the other branches (lines handling FILTER_PATHS elsewhere) by
capturing jq's exit code, logging a clear error mentioning FILTER_PATHS, and
exiting non‑zero when jq fails.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 32c500c9-82d8-4a0a-81fa-67e29e159997

📥 Commits

Reviewing files that changed from the base of the PR and between 33bcf83 and cc16a7d.

📒 Files selected for processing (7)
  • .github/workflows/build.yml
  • .github/workflows/gptchangelog.yml
  • .github/workflows/pr-security-scan.yml
  • .github/workflows/release.yml
  • .github/workflows/typescript-build.yml
  • .github/workflows/typescript-release.yml
  • src/config/changed-paths/action.yml

coderabbitai[bot]
coderabbitai bot previously requested changes Mar 19, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/build.yml (1)

256-261: ⚠️ Potential issue | 🟡 Minor

Address SC2001 shellcheck warning (pipeline failure).

The pipeline reports SC2001 on line 255 for the sed substitution. While bash parameter expansion can't replicate this regex, you can suppress the warning with a directive or use an alternative approach.

Option 1: Suppress with shellcheck directive
       - name: Extract version from tag
         id: version
         run: |
           TAG="${GITHUB_REF#refs/tags/}"
           # Strip app prefix by finding -v and extracting from there
           # e.g., agent-v1.0.0-beta.1 -> v1.0.0-beta.1
           # e.g., control-plane-v1.0.0-beta.1 -> v1.0.0-beta.1
+          # shellcheck disable=SC2001
           VERSION=$(echo "$TAG" | sed 's/.*-\(v[0-9]\)/\1/')
           echo "version=$VERSION" >> "$GITHUB_OUTPUT"
           echo "Extracted version: $VERSION from tag: $TAG"
Option 2: Use bash regex match
       - name: Extract version from tag
         id: version
         run: |
           TAG="${GITHUB_REF#refs/tags/}"
           # Strip app prefix by finding -v and extracting from there
           # e.g., agent-v1.0.0-beta.1 -> v1.0.0-beta.1
           # e.g., control-plane-v1.0.0-beta.1 -> v1.0.0-beta.1
-          VERSION=$(echo "$TAG" | sed 's/.*-\(v[0-9]\)/\1/')
+          if [[ "$TAG" =~ (v[0-9].*) ]]; then
+            VERSION="${BASH_REMATCH[1]}"
+          else
+            VERSION="$TAG"
+          fi
           echo "version=$VERSION" >> "$GITHUB_OUTPUT"
           echo "Extracted version: $VERSION from tag: $TAG"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build.yml around lines 256 - 261, The sed command
extracting the version from TAG triggers shellcheck SC2001; replace it with a
bash regex match to avoid the warning: test TAG with if [[ $TAG =~ .*(-v[0-9].*)
]]; then set VERSION="${BASH_REMATCH[1]}"; else set VERSION="$TAG"; fi to
populate VERSION (replacing the current VERSION=$(echo "$TAG" | sed
's/.*-\(v[0-9]\)/\1/') line), or alternatively add a shellcheck disable
directive (# shellcheck disable=SC2001) immediately above the existing sed line
if you prefer to keep sed.
🤖 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/gptchangelog.yml:
- Around line 417-418: The PROMPT assignment is one long string that violates
yamllint's line-length rule; refactor the assignment to span multiple lines or
use a heredoc so each YAML line is under the limit. Replace the single-line
PROMPT="..." with a multiline heredoc (e.g., read -r -d '' PROMPT <<'EOF' ...
EOF) or concatenate multiple quoted strings, then keep ESCAPED_PROMPT=$(echo
"$PROMPT" | jq -Rs .) unchanged; ensure the variable name PROMPT and the
subsequent ESCAPED_PROMPT invocation remain the same.

---

Outside diff comments:
In @.github/workflows/build.yml:
- Around line 256-261: The sed command extracting the version from TAG triggers
shellcheck SC2001; replace it with a bash regex match to avoid the warning: test
TAG with if [[ $TAG =~ .*(-v[0-9].*) ]]; then set VERSION="${BASH_REMATCH[1]}";
else set VERSION="$TAG"; fi to populate VERSION (replacing the current
VERSION=$(echo "$TAG" | sed 's/.*-\(v[0-9]\)/\1/') line), or alternatively add a
shellcheck disable directive (# shellcheck disable=SC2001) immediately above the
existing sed line if you prefer to keep sed.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 83509cbd-3c18-4287-815a-c511c5d21094

📥 Commits

Reviewing files that changed from the base of the PR and between cc16a7d and 7ea0c6f.

📒 Files selected for processing (3)
  • .github/workflows/build.yml
  • .github/workflows/gptchangelog.yml
  • .github/workflows/typescript-build.yml

coderabbitai[bot]
coderabbitai bot previously requested changes Mar 19, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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/gptchangelog.yml:
- Around line 264-265: Remove the unnecessary ShellCheck disable by deleting the
comment "# shellcheck disable=SC2193" that precedes the if statement; leave the
conditional if [[ "${{ github.ref }}" == refs/tags/* ]]; then intact so the
GitHub Actions expression is evaluated at runtime and ShellCheck false-positive
suppression is avoided.
- Around line 297-299: Replace the bare redirection token ">
/tmp/apps_updated.txt" with an explicit no-op command to satisfy shellcheck
SC2188; update the invocation that currently uses "> /tmp/apps_updated.txt" (in
the workflow step initializing files) to use a no-op like the shell builtin
colon or the true command with the same redirection (for example, ": >
/tmp/apps_updated.txt" or "true > /tmp/apps_updated.txt") so the redirection has
a command to execute.
- Around line 531-532: Replace the "useless cat" usage in the APPS_LIST
assignment by feeding /tmp/apps_updated.txt directly to cut; update the
APPS_LIST assignment (the line that sets APPS_LIST) to use input redirection
with cut -d: -f1,2 < /tmp/apps_updated.txt and keep the rest of the pipeline (tr
'\n' ', ' | sed 's/,$//') unchanged so SC2002 is no longer suppressed.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: a1b0f501-6363-479c-9b48-5c2ffea40051

📥 Commits

Reviewing files that changed from the base of the PR and between 7ea0c6f and 7c9370a.

📒 Files selected for processing (3)
  • .github/workflows/build.yml
  • .github/workflows/gptchangelog.yml
  • .github/workflows/release.yml

@bedatty bedatty dismissed stale reviews from coderabbitai[bot], coderabbitai[bot], coderabbitai[bot], and coderabbitai[bot] March 19, 2026 19:57

All comments addressed.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/gptchangelog.yml (1)

586-594: ⚠️ Potential issue | 🟡 Minor

Fix pipeline failure: unused APP_NAME and VERSION variables (SC2034).

The loop reads APP_NAME and VERSION but doesn't use them in the body. Prefix with _ to indicate intentional discard.

Proposed fix
-            while IFS=: read -r APP_NAME VERSION WORKING_DIR; do
+            while IFS=: read -r _APP_NAME _VERSION WORKING_DIR; do
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/gptchangelog.yml around lines 586 - 594, The loop
currently reads variables "APP_NAME" and "VERSION" in the line "while IFS=: read
-r APP_NAME VERSION WORKING_DIR; do" but never uses them, causing SC2034; change
those unused identifiers to be prefixed with an underscore (e.g., "_APP_NAME"
and "_VERSION") so the shell indicates they are intentionally discarded while
keeping "WORKING_DIR" and the rest of the logic (the CHANGELOG_PATH calculation,
git add, and echo) unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In @.github/workflows/gptchangelog.yml:
- Around line 586-594: The loop currently reads variables "APP_NAME" and
"VERSION" in the line "while IFS=: read -r APP_NAME VERSION WORKING_DIR; do" but
never uses them, causing SC2034; change those unused identifiers to be prefixed
with an underscore (e.g., "_APP_NAME" and "_VERSION") so the shell indicates
they are intentionally discarded while keeping "WORKING_DIR" and the rest of the
logic (the CHANGELOG_PATH calculation, git add, and echo) unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 517b238e-bf18-4710-83a2-c05e223ecfb3

📥 Commits

Reviewing files that changed from the base of the PR and between 7c9370a and 3d9c910.

📒 Files selected for processing (3)
  • .github/workflows/gptchangelog.yml
  • .github/workflows/typescript-build.yml
  • .github/workflows/typescript-release.yml

coderabbitai[bot]
coderabbitai bot previously requested changes Mar 19, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
.github/workflows/gptchangelog.yml (1)

583-594: ⚠️ Potential issue | 🟡 Minor

Fix unused variables flagged by shellcheck (pipeline failure).

APP_NAME and VERSION are read but never used in this loop—only WORKING_DIR is referenced. Use underscore prefix to indicate intentionally unused variables, consistent with line 609.

Proposed fix
           if [ -f /tmp/apps_updated.txt ]; then
-            while IFS=: read -r APP_NAME VERSION WORKING_DIR; do
+            while IFS=: read -r _APP_NAME _VERSION WORKING_DIR; do
               if [ "$WORKING_DIR" != "." ]; then
                 CHANGELOG_PATH="${WORKING_DIR}/CHANGELOG.md"
               else
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/gptchangelog.yml around lines 583 - 594, Change the
while-read loop to mark the unused fields as intentionally unused to satisfy
shellcheck: in the loop that currently uses "while IFS=: read -r APP_NAME
VERSION WORKING_DIR; do" replace the unused variables with underscore-prefixed
names (e.g., "_APP_NAME" and "_VERSION") so only WORKING_DIR is treated as used;
keep the rest of the loop (the conditional building of CHANGELOG_PATH, git add,
and echo) unchanged.
src/config/changed-paths/README.md (1)

65-135: 🧹 Nitpick | 🔵 Trivial

Pre-existing snake_case in legacy section headers.

Headers like ### Default (get_app_name: false), ### With ignore_dirs, ### Single app mode (fallback_app_name) still use snake_case. Consider updating for full consistency, though this is lower priority than the new shared-paths section.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/config/changed-paths/README.md` around lines 65 - 135, The README section
headers use legacy snake_case (e.g., "Default (get_app_name: false)", "With
ignore_dirs", "Single app mode (fallback_app_name)") which breaks consistency
with the new kebab-case style (e.g., "shared-paths"); update those headers to
use kebab-case flags and names (for example "Default (get-app-name: false)",
"With ignore-dirs", "Single app mode (fallback-app-name)") and likewise change
any inline flag mentions like get_app_name, ignore_dirs, fallback_app_name to
get-app-name, ignore-dirs, fallback-app-name so all section headers and flag
references match the new naming convention.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/config/changed-paths/action.yml`:
- Around line 37-48: Update the input descriptions to stop referencing internal
snake_case names and instead use the action input identifiers shown in this file
(e.g., use fallback-app-name, consolidate-to-root, consolidate-keep-dirs,
filter-paths, and get-app-name) so the docs match the actual input names; edit
the description strings for fallback-app-name, consolidate-to-root and
consolidate-keep-dirs to replace occurrences of filter_paths, fallback_app_name,
get_app_name, consolidate_keep_dirs, and consolidate_to_root with the
corresponding hyphenated input names used by the action.
- Around line 214-220: The error message uses snake_case `filter_paths` but
elsewhere the input name is kebab-case `filter-paths`; update the echo in the
JSON-array validation block (where FILTER_PATHS is parsed into FILTER_LIST) to
reference `filter-paths` instead of `filter_paths`, and scan other uses of
FILTER_PATHS/FILTER_LIST in the same file to ensure all user-facing messages
consistently use `filter-paths`.

In `@src/config/changed-paths/README.md`:
- Around line 163-181: The README has inconsistent naming: the header and
explanatory text use snake_case "shared_paths" while the rest of the docs and
breaking change use hyphenated "shared-paths"; update the header text "With
shared_paths (monorepo root-level files)" and any occurrences of "shared_paths"
in that example block or explanation to "shared-paths" so the section
consistently references the hyphenated config key (look for the header and the
explanatory sentence around the example and the YAML comment mentioning
shared-paths/shared_paths).

---

Outside diff comments:
In @.github/workflows/gptchangelog.yml:
- Around line 583-594: Change the while-read loop to mark the unused fields as
intentionally unused to satisfy shellcheck: in the loop that currently uses
"while IFS=: read -r APP_NAME VERSION WORKING_DIR; do" replace the unused
variables with underscore-prefixed names (e.g., "_APP_NAME" and "_VERSION") so
only WORKING_DIR is treated as used; keep the rest of the loop (the conditional
building of CHANGELOG_PATH, git add, and echo) unchanged.

In `@src/config/changed-paths/README.md`:
- Around line 65-135: The README section headers use legacy snake_case (e.g.,
"Default (get_app_name: false)", "With ignore_dirs", "Single app mode
(fallback_app_name)") which breaks consistency with the new kebab-case style
(e.g., "shared-paths"); update those headers to use kebab-case flags and names
(for example "Default (get-app-name: false)", "With ignore-dirs", "Single app
mode (fallback-app-name)") and likewise change any inline flag mentions like
get_app_name, ignore_dirs, fallback_app_name to get-app-name, ignore-dirs,
fallback-app-name so all section headers and flag references match the new
naming convention.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 93979df0-8699-42f5-9bf0-53c28f7e803b

📥 Commits

Reviewing files that changed from the base of the PR and between 3d9c910 and 4a311b2.

📒 Files selected for processing (3)
  • .github/workflows/gptchangelog.yml
  • src/config/changed-paths/README.md
  • src/config/changed-paths/action.yml

@bedatty bedatty dismissed coderabbitai[bot]’s stale review March 19, 2026 20:10

All comments addressed.

coderabbitai[bot]
coderabbitai bot previously requested changes Mar 19, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/config/changed-paths/README.md (3)

121-123: 🧹 Nitpick | 🔵 Trivial

Backticked references use snake_case.

Line 123 uses backticks around filter_paths and fallback_app_name, implying these are the actual input names. With kebab-case inputs, these should be filter-paths and fallback-app-name.

Proposed fix
-When `filter_paths` is empty and `fallback_app_name` is set, the composite skips change detection and returns a single-item matrix:
+When `filter-paths` is empty and `fallback-app-name` is set, the composite skips change detection and returns a single-item matrix:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/config/changed-paths/README.md` around lines 121 - 123, Update the README
section titled "Single app mode (fallback_app_name)" to use the actual
kebab-case input names: replace backticked `filter_paths` with `filter-paths`
and `fallback_app_name` with `fallback-app-name` (referencing the README text
around the "Single app mode" heading and the descriptive sentence that explains
the composite behavior when the inputs are set).

189-196: ⚠️ Potential issue | 🟡 Minor

Table header uses snake_case path_level but input is now path-level.

Line 191's table header still shows path_level (snake_case) while the input was renamed to path-level. This table documents the input's behavior, so the header should match the actual input name.

Proposed fix
-| Original Path | path_level | Result |
+| Original Path | path-level | Result |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/config/changed-paths/README.md` around lines 189 - 196, Update the table
header in the "How path-level works" section by replacing the snake_case header
text `path_level` with the actual input name `path-level` so the documentation
matches the current input; locate the header cell containing `path_level` in
that table and change it to `path-level` (leave the other columns like `Original
Path` and `Result` unchanged).

65-135: 🧹 Nitpick | 🔵 Trivial

Section headers still use snake_case while inputs are now kebab-case.

Headers like "Default (get_app_name: false)" (line 65), "With ignore_dirs" (line 106), "Single app mode (fallback_app_name)" (line 121), and "Type 2 monorepo (consolidate_to_root)" (line 135) reference the old snake_case names. Newer sections (lines 163, 183, 189) correctly use kebab-case.

This creates confusion since the breaking change table tells users to migrate to kebab-case. Consider updating these headers for consistency.

Suggested updates
-### Default (get_app_name: false)
+### Default (get-app-name: false)

-### With app names (get_app_name: true)
+### With app names (get-app-name: true)

-### With prefix (app_name_prefix: "myapp")
+### With prefix (app-name-prefix: "myapp")

-### With ignore_dirs
+### With ignore-dirs

-### Single app mode (fallback_app_name)
+### Single app mode (fallback-app-name)

-### Type 2 monorepo (consolidate_to_root)
+### Type 2 monorepo (consolidate-to-root)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/config/changed-paths/README.md` around lines 65 - 135, Update the README
section headers to use kebab-case input names to match the rest of the docs and
the breaking-change guidance: replace "Default (get_app_name: false)" with
"Default (get-app-name: false)", "With ignore_dirs" with "With ignore-dirs",
"Single app mode (fallback_app_name)" with "Single app mode
(fallback-app-name)", and "Type 2 monorepo (consolidate_to_root)" with "Type 2
monorepo (consolidate-to-root)"; keep the example snippets and descriptions
unchanged so only the header strings are modified for consistency.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/config/changed-paths/action.yml`:
- Around line 211-212: The if condition that filters on FILTER_PATHS is
redundant because [[ -n "$FILTER_PATHS" ]] and [[ "$FILTER_PATHS" != "" ]] are
equivalent; simplify the conditional in src/config/changed-paths/action.yml by
removing one of those checks (e.g., keep [[ -n "$FILTER_PATHS" ]] and remove the
[[ "$FILTER_PATHS" != "" ]] clause) while preserving the other checks
(FILTER_PATHS != "[]" and the JSON/newline handling) so the behavior of the
FILTER_PATHS gating remains unchanged.

---

Outside diff comments:
In `@src/config/changed-paths/README.md`:
- Around line 121-123: Update the README section titled "Single app mode
(fallback_app_name)" to use the actual kebab-case input names: replace
backticked `filter_paths` with `filter-paths` and `fallback_app_name` with
`fallback-app-name` (referencing the README text around the "Single app mode"
heading and the descriptive sentence that explains the composite behavior when
the inputs are set).
- Around line 189-196: Update the table header in the "How path-level works"
section by replacing the snake_case header text `path_level` with the actual
input name `path-level` so the documentation matches the current input; locate
the header cell containing `path_level` in that table and change it to
`path-level` (leave the other columns like `Original Path` and `Result`
unchanged).
- Around line 65-135: Update the README section headers to use kebab-case input
names to match the rest of the docs and the breaking-change guidance: replace
"Default (get_app_name: false)" with "Default (get-app-name: false)", "With
ignore_dirs" with "With ignore-dirs", "Single app mode (fallback_app_name)" with
"Single app mode (fallback-app-name)", and "Type 2 monorepo
(consolidate_to_root)" with "Type 2 monorepo (consolidate-to-root)"; keep the
example snippets and descriptions unchanged so only the header strings are
modified for consistency.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: b71a560f-c6d6-4bfd-9df6-0ee4ff7a66c0

📥 Commits

Reviewing files that changed from the base of the PR and between 504a488 and f3ac96b.

📒 Files selected for processing (2)
  • src/config/changed-paths/README.md
  • src/config/changed-paths/action.yml

@bedatty bedatty dismissed coderabbitai[bot]’s stale review March 19, 2026 20:38

All comments addressed.

coderabbitai[bot]
coderabbitai bot previously requested changes Mar 19, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

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 the current code and only fix it if needed.

Inline comments:
In `@src/config/changed-paths/README.md`:
- Around line 28-40: The README inputs table must exactly match action.yml:
remove the trailing text from the path-level row so its default cell is exactly
`0` (i.e., change the `path-level` default from "`0` (disabled)" to just
`\`0\`"), and normalize default-value formatting for the listed inputs
(`filter-paths`, `shared-paths`, `app-name-prefix`, `app-name-overrides`,
`normalize-to-filter`, `ignore-dirs`, `fallback-app-name`,
`consolidate-to-root`, `consolidate-keep-dirs`) by replacing the current
backticked `''` representation with an empty backticked value that matches
action.yml (i.e., use `` for an empty default), ensuring each row follows the
exact pattern `| \`input-name\` | description | No | \`default\` |`.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 26da3f86-8c9b-4874-a4eb-5fb1f07ff52d

📥 Commits

Reviewing files that changed from the base of the PR and between f3ac96b and 32cd57b.

📒 Files selected for processing (1)
  • src/config/changed-paths/README.md

@bedatty bedatty dismissed coderabbitai[bot]’s stale review March 19, 2026 20:46

All comments addressed.

coderabbitai[bot]
coderabbitai bot previously requested changes Mar 19, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

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 the current code and only fix it if needed.

Inline comments:
In `@src/config/changed-paths/README.md`:
- Line 55: The README example references the action tag uses:
LerianStudio/github-actions-shared-workflows@v1.0.0 but demonstrates the new
kebab-case inputs (e.g., filter-paths, path-level) which v1.0.0 does not
support; update that uses: reference to either `@develop` (for testing unreleased
changes), `@feat/changed-paths-shared-paths` (the feature branch), or a future tag
like `@v2.0.0` with a note that the kebab-case syntax requires v2+, so replace the
existing `@v1.0.0` in the uses line accordingly to match the demonstrated input
syntax.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3a0f9cea-911d-4d70-9a5d-51f0b34df2a8

📥 Commits

Reviewing files that changed from the base of the PR and between 32cd57b and e3a1a27.

📒 Files selected for processing (1)
  • src/config/changed-paths/README.md

@bedatty bedatty dismissed coderabbitai[bot]’s stale review March 20, 2026 12:38

All comments addressed.

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