Skip to content

Commit 224aa76

Browse files
ivanmilevtuesampagentSvilen-Stefanovclaude
authored
fix: install CodeBoarding engine from PyPI (#44)
* fix: install CodeBoarding engine from PyPI Amp-Thread-ID: https://ampcode.com/threads/T-019edcb0-130a-713d-8e97-997ec5e29b33 Co-authored-by: Amp <amp@ampcode.com> * fix: pin engine to codeboarding 0.12.3 and use Python 3.12 Bump the codeboarding_version default to 0.12.3 (latest published) across action.yml and the README. Also switch the action's setup-python from 3.13 to 3.12: the codeboarding package's transitive dep langchain-cerebras (>=0.8) is published only for >=3.11,<3.13, so a 3.13 runner cannot resolve the engine install (true for both 0.12.2 and 0.12.3). Verified 0.12.3 installs cleanly on 3.12 and the codeboarding-setup entry point is present. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix: check out PR head for /codeboarding (issue_comment) runs The review workflow dogfoods via `uses: ./`, but on issue_comment events actions/checkout defaults to the repo's default branch (the event isn't tied to a PR), so /codeboarding ran main's action code instead of the PR's. Pass an explicit ref (refs/pull/<n>/head) for issue_comment so the comment path exercises the PR under review too; pull_request events keep checkout's default (the PR merge ref), so they are unchanged. Takes effect once on main, since GitHub reads the issue_comment workflow definition from the default branch. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: Svilen Stefanov <svilen.ks@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 7339fbf commit 224aa76

5 files changed

Lines changed: 71 additions & 81 deletions

File tree

.github/workflows/codeboarding.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,18 @@ jobs:
3737
# exercises the action code under review, not the last published release.
3838
# The action reads its scripts via github.action_path and checks the engine
3939
# and target repo into subdirectories, so this local checkout is untouched.
40+
#
41+
# On issue_comment events, checkout's default ref is the repo's DEFAULT
42+
# BRANCH (the event isn't tied to a PR), so `uses: ./` would run main's
43+
# action code, not this PR's — /codeboarding would silently test the wrong
44+
# version. Check out the PR head explicitly for that event so the comment
45+
# path dogfoods the PR under review too. pull_request events keep checkout's
46+
# default (the PR merge ref), which already points at the PR. On-demand runs
47+
# are restricted to same-repo PRs, so refs/pull/<n>/head resolves in this
48+
# repo (no fork-repo override needed).
4049
- uses: actions/checkout@v4
50+
with:
51+
ref: ${{ github.event_name == 'issue_comment' && format('refs/pull/{0}/head', github.event.issue.number) || '' }}
4152
- name: Detect CodeBoarding GitHub App credentials
4253
id: codeboarding-app-config
4354
shell: bash

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ Review mode does not need `contents: write`: PR-specific generated files are sto
264264
| `mode` | both | `review` | `review` posts the PR architecture-diff comment; `sync` analyzes on push and commits the architecture (`analysis.json` + rendered docs) to `target_branch`, keeping it versioned and current. |
265265
| `github_token` | both | `${{ github.token }}` | Token for GitHub API calls; in review mode it posts or updates the PR comment. |
266266
| `push_token` | sync | `${{ github.token }}` | Token used for sync-mode pushes to `target_branch`. The workflow token can push when the workflow grants `permissions: contents: write`. Separate from `github_token` so commenting can use a GitHub App token while the push uses the workflow token. |
267-
| `engine_ref` | both | `v0.12.1` | CodeBoarding engine ref. Pin for reproducibility. |
267+
| `codeboarding_version` | both | `0.12.3` | CodeBoarding PyPI package version used as the analysis engine. Pin for reproducibility. |
268268
| `depth_level` | both | empty (`2` for cold starts) | Analysis depth, 1 to 3, used for first analysis and `force_full` rebuilds. Once `.codeboarding/analysis.json` exists, its `metadata.depth_level` is the source of truth for incremental analysis and fallback-full recovery. |
269269
| `render_depth` | review | `1` | Display depth for the PR diagram. Keep `1` for a clean top-level view. |
270270
| `diagram_direction` | review | `LR` | Mermaid direction: `LR`, `TD`, `TB`, `RL`, or `BT`. |
@@ -298,7 +298,7 @@ Outputs of the mode that did not run are empty strings.
298298

299299
## Notes
300300

301-
- No checkout step is required in your workflow. This action checks out the target (the PR in review mode, the pushed commit in sync mode) and the CodeBoarding engine internally.
301+
- No checkout step is required in your workflow. This action checks out the target (the PR in review mode, the pushed commit in sync mode) and installs the CodeBoarding engine from PyPI internally.
302302
- GitHub withholds secrets from fork PRs on `pull_request`, so fork runs fail early if an LLM key is unavailable.
303303
- Do not use `pull_request_target` for this action. It can expose secrets to PR-head code.
304304
- GitHub renders Mermaid in strict mode, so node click-through links are not supported in the PR diagram.
@@ -315,8 +315,9 @@ Full local pipeline:
315315

316316
```bash
317317
export OPENROUTER_API_KEY=sk-or-...
318-
scripts/run_local.sh --repo /path/to/repo --base <base-ref> --head <head-ref> \
319-
--engine /path/to/CodeBoarding
318+
python -m pip install codeboarding==0.12.3
319+
codeboarding-setup --auto-install-npm
320+
scripts/run_local.sh --repo /path/to/repo --base <base-ref> --head <head-ref>
320321
```
321322

322323
Useful flags:

action.yml

Lines changed: 37 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ inputs:
3131
description: 'Token used for sync-mode git pushes to target_branch. Defaults to the workflow github.token, which can push when the calling workflow grants "permissions: contents: write". Kept separate from github_token so commenting can use a GitHub App token while the push uses the workflow token (whose write access the consumer controls).'
3232
required: false
3333
default: ${{ github.token }}
34-
engine_ref:
35-
description: 'Git ref (tag/branch/SHA) of CodeBoarding/CodeBoarding used as the analysis engine. Pinned to a release for reproducibility; override to track a newer ref.'
34+
codeboarding_version:
35+
description: 'CodeBoarding PyPI package version used as the analysis engine. Pin for reproducibility; set to a newer released version to opt into newer engine releases.'
3636
required: false
37-
default: 'v0.12.1'
37+
default: '0.12.3'
3838
depth_level:
3939
description: 'Analysis depth (1-3) for cold-start or force_full rebuilds. Once .codeboarding/analysis.json exists, its metadata.depth_level is the source of truth for incremental analysis and fallback-full recovery. Empty (default): 2 for cold starts.'
4040
required: false
@@ -142,7 +142,7 @@ runs:
142142
# interleave only because they share the LLM-key lifecycle, NOT because they
143143
# are unrelated:
144144
# 1. GUARD — resolve mode + event eligibility + SHAs (one source of truth)
145-
# 2. SHARED SETUP — checkout engine + target, Python/Node/uv, caches, LLM-key prep
145+
# 2. SHARED SETUP — checkout target, Python/Node/uv, install CodeBoarding, caches, LLM-key prep
146146
# 3. ANALYSIS (key live) — review: base/seed/head/health ; sync: seed/analyze
147147
# 4. Drop LLM key, then OUTPUT (no key) — review: diff→artifact→comment ; sync: render→commit
148148
# The binding between the modes is the committed .codeboarding/analysis.json
@@ -425,15 +425,6 @@ runs:
425425
9.0.x
426426
10.0.x
427427
428-
- name: Checkout CodeBoarding engine
429-
if: steps.guard.outputs.skip != 'true'
430-
uses: actions/checkout@v4
431-
with:
432-
repository: CodeBoarding/CodeBoarding
433-
ref: ${{ inputs.engine_ref }}
434-
path: codeboarding-engine
435-
persist-credentials: false
436-
437428
# Review mode: the PR head repo at the head SHA. Sync mode: this repo at the
438429
# pushed/selected SHA. Always credential-free — sync pushes authenticate
439430
# explicitly via push_token.
@@ -496,48 +487,52 @@ runs:
496487
echo "depth=$DEPTH" >> "$GITHUB_OUTPUT"
497488
echo "Using default cold-start depth_level=$DEPTH."
498489
499-
- name: Set up Python 3.13
490+
- name: Set up Python 3.12
500491
if: steps.guard.outputs.skip != 'true'
501492
uses: actions/setup-python@v5
502493
with:
503-
python-version: '3.13'
494+
# 3.12, not 3.13: the codeboarding package's transitive dep
495+
# langchain-cerebras (>=0.8) is published only for >=3.11,<3.13, so a 3.13
496+
# runner can't resolve the engine install. The engine itself supports
497+
# <3.14, so bump this back to 3.13 once langchain-cerebras ships a 3.13 wheel.
498+
python-version: '3.12'
504499

505500
- name: Set up Node.js 20
506501
if: steps.guard.outputs.skip != 'true'
507502
uses: actions/setup-node@v4
508503
with:
509504
node-version: '20'
510505

511-
- name: Install uv
512-
if: steps.guard.outputs.skip != 'true'
513-
uses: astral-sh/setup-uv@v4
514-
with:
515-
enable-cache: true # cache ~/.cache/uv (wheels/builds) for fast cold installs
516-
517506
- name: Cache LSP servers
518507
if: steps.guard.outputs.skip != 'true'
519508
uses: actions/cache@v4
520509
with:
521510
path: |
522-
codeboarding-engine/static_analyzer/servers/node_modules
523-
codeboarding-engine/static_analyzer/servers/bin
524-
key: cb-lsp-${{ runner.os }}-v1
511+
~/.codeboarding/servers
512+
key: cb-lsp-${{ runner.os }}-${{ inputs.codeboarding_version }}-v1
525513
restore-keys: |
526514
cb-lsp-${{ runner.os }}-
527515
528-
- name: Install Python dependencies
516+
- name: Install CodeBoarding package
529517
if: steps.guard.outputs.skip != 'true'
530518
shell: bash
531-
working-directory: codeboarding-engine
519+
env:
520+
CODEBOARDING_VERSION: ${{ inputs.codeboarding_version }}
532521
run: |
533-
uv pip install -e .
522+
set -euo pipefail
523+
SPEC="$CODEBOARDING_VERSION"
524+
case "$SPEC" in
525+
'' ) SPEC='' ;;
526+
[0-9]* ) SPEC="==$SPEC" ;;
527+
esac
528+
python -m pip install --upgrade pip
529+
python -m pip install "codeboarding${SPEC}"
534530
535531
- name: Install LSP servers
536532
if: steps.guard.outputs.skip != 'true'
537533
shell: bash
538-
working-directory: codeboarding-engine
539534
run: |
540-
uv run python install.py --auto-install-npm
535+
codeboarding-setup --auto-install-npm
541536
542537
- name: Prepare & verify LLM key
543538
if: steps.guard.outputs.skip != 'true'
@@ -784,7 +779,7 @@ runs:
784779
# inputs. So a free-tier run (oidc, forced Gemini) and a BYO OpenRouter-key
785780
# run with no model pinned would share a key yet produce different base
786781
# analyses; the mode discriminator keeps them from reusing each other's cache.
787-
key: cb-base-v2-${{ runner.os }}-${{ steps.base.outputs.baseline_sha }}-d${{ steps.resolve_depth.outputs.depth }}-${{ inputs.engine_ref }}-${{ steps.llm.outputs.mode }}-${{ inputs.llm_provider }}-${{ inputs.agent_model }}-${{ inputs.parsing_model }}
782+
key: cb-base-v2-${{ runner.os }}-${{ steps.base.outputs.baseline_sha }}-d${{ steps.resolve_depth.outputs.depth }}-${{ inputs.codeboarding_version }}-${{ steps.llm.outputs.mode }}-${{ inputs.llm_provider }}-${{ inputs.agent_model }}-${{ inputs.parsing_model }}
788783

789784
- name: Reassert committed base analysis after cache restore
790785
if: steps.guard.outputs.skip != 'true' && steps.guard.outputs.mode == 'review' && steps.base.outputs.committed == 'true'
@@ -818,10 +813,7 @@ runs:
818813
id: seedbase
819814
continue-on-error: true
820815
shell: bash
821-
working-directory: codeboarding-engine
822816
env:
823-
STATIC_ANALYSIS_CONFIG: ${{ github.workspace }}/codeboarding-engine/static_analysis_config.yml
824-
PROJECT_ROOT: ${{ github.workspace }}/codeboarding-engine
825817
CACHING_DOCUMENTATION: 'false'
826818
ENABLE_MONITORING: 'false'
827819
ACTION_PATH: ${{ github.action_path }}
@@ -836,7 +828,7 @@ runs:
836828
git -C "$TARGET" worktree prune
837829
rm -rf "$BASE_SRC"
838830
git -C "$TARGET" worktree add --detach "$BASE_SRC" "$BASELINE_SHA"
839-
if uv run python "$ACTION_PATH/scripts/engine_adapter.py" seed \
831+
if python "$ACTION_PATH/scripts/engine_adapter.py" seed \
840832
--repo "$BASE_SRC" \
841833
--out "$BASE_DIR" \
842834
--source-sha "$BASELINE_SHA" \
@@ -855,10 +847,7 @@ runs:
855847
- name: Generate base analysis (no committed baseline)
856848
if: steps.guard.outputs.skip != 'true' && steps.guard.outputs.mode == 'review' && steps.base.outputs.empty_base != 'true' && steps.base.outputs.committed == 'false' && steps.basecache.outputs.cache-hit != 'true'
857849
shell: bash
858-
working-directory: codeboarding-engine
859850
env:
860-
STATIC_ANALYSIS_CONFIG: ${{ github.workspace }}/codeboarding-engine/static_analysis_config.yml
861-
PROJECT_ROOT: ${{ github.workspace }}/codeboarding-engine
862851
DIAGRAM_DEPTH_LEVEL: ${{ steps.resolve_depth.outputs.depth }}
863852
CACHING_DOCUMENTATION: 'false'
864853
ENABLE_MONITORING: 'false'
@@ -896,7 +885,7 @@ runs:
896885
git -C "$TARGET" worktree prune
897886
rm -rf "$BASE_SRC"
898887
git -C "$TARGET" worktree add --detach "$BASE_SRC" "$BASE_SHA"
899-
uv run python "$ACTION_PATH/scripts/engine_adapter.py" base \
888+
python "$ACTION_PATH/scripts/engine_adapter.py" base \
900889
--repo "$BASE_SRC" \
901890
--out "$BASE_DIR" \
902891
--name "$REPO_NAME" \
@@ -924,16 +913,13 @@ runs:
924913
# inputs. So a free-tier run (oidc, forced Gemini) and a BYO OpenRouter-key
925914
# run with no model pinned would share a key yet produce different base
926915
# analyses; the mode discriminator keeps them from reusing each other's cache.
927-
key: cb-base-v2-${{ runner.os }}-${{ steps.base.outputs.baseline_sha }}-d${{ steps.resolve_depth.outputs.depth }}-${{ inputs.engine_ref }}-${{ steps.llm.outputs.mode }}-${{ inputs.llm_provider }}-${{ inputs.agent_model }}-${{ inputs.parsing_model }}
916+
key: cb-base-v2-${{ runner.os }}-${{ steps.base.outputs.baseline_sha }}-d${{ steps.resolve_depth.outputs.depth }}-${{ inputs.codeboarding_version }}-${{ steps.llm.outputs.mode }}-${{ inputs.llm_provider }}-${{ inputs.agent_model }}-${{ inputs.parsing_model }}
928917

929918
- name: Analyze PR head (incremental from base)
930919
if: steps.guard.outputs.skip != 'true' && steps.guard.outputs.mode == 'review'
931920
id: analyze
932921
shell: bash
933-
working-directory: codeboarding-engine
934922
env:
935-
STATIC_ANALYSIS_CONFIG: ${{ github.workspace }}/codeboarding-engine/static_analysis_config.yml
936-
PROJECT_ROOT: ${{ github.workspace }}/codeboarding-engine
937923
DIAGRAM_DEPTH_LEVEL: ${{ steps.resolve_depth.outputs.depth }}
938924
CACHING_DOCUMENTATION: 'false'
939925
ENABLE_MONITORING: 'false'
@@ -986,32 +972,28 @@ runs:
986972
if [ "$EMPTY_BASE" = "true" ]; then
987973
head_args+=(--force-full)
988974
fi
989-
uv run python "$ACTION_PATH/scripts/engine_adapter.py" "${head_args[@]}"
975+
python "$ACTION_PATH/scripts/engine_adapter.py" "${head_args[@]}"
990976
if [ ! -f "$HEAD_DIR/analysis.json" ]; then
991977
echo "::error::Head analysis ran but analysis.json is missing."
992978
exit 1
993979
fi
994-
echo "base_analysis=$BASE_DIR/analysis.json"
995-
$GITHUB_OUTPUT
980+
echo "base_analysis=$BASE_DIR/analysis.json" >> "$GITHUB_OUTPUT"
996981
echo "head_analysis=$HEAD_DIR/analysis.json" >> $GITHUB_OUTPUT
997982
998983
- name: Architecture health check (best-effort)
999984
if: steps.guard.outputs.skip != 'true' && steps.guard.outputs.mode == 'review'
1000985
id: health
1001986
continue-on-error: true
1002987
shell: bash
1003-
working-directory: codeboarding-engine
1004988
env:
1005-
STATIC_ANALYSIS_CONFIG: ${{ github.workspace }}/codeboarding-engine/static_analysis_config.yml
1006-
PROJECT_ROOT: ${{ github.workspace }}/codeboarding-engine
1007989
ACTION_PATH: ${{ github.action_path }}
1008990
ARTIFACT_DIR: ${{ steps.base.outputs.head_dir }}
1009991
TARGET_REPO: ${{ github.workspace }}/target-repo
1010992
REPO_NAME: ${{ github.event.repository.name }}
1011993
run: |
1012994
rm -f /tmp/cb-issues.txt
1013995
# engine_adapter writes the WARNING/CRITICAL count (0 on any failure — best-effort).
1014-
uv run python "$ACTION_PATH/scripts/engine_adapter.py" health \
996+
python "$ACTION_PATH/scripts/engine_adapter.py" health \
1015997
--artifact-dir "$ARTIFACT_DIR" \
1016998
--repo "$TARGET_REPO" \
1017999
--name "$REPO_NAME" \
@@ -1085,7 +1067,7 @@ runs:
10851067
path: |
10861068
${{ runner.temp }}/cb-sync/static_analysis.pkl
10871069
${{ runner.temp }}/cb-sync/static_analysis.sha
1088-
key: cb-sync-${{ runner.os }}-${{ inputs.engine_ref }}-d${{ steps.resolve_depth.outputs.depth }}-${{ steps.llm.outputs.cache_provider }}-${{ steps.llm.outputs.cache_agent_model }}-${{ steps.llm.outputs.cache_parsing_model }}-${{ steps.sync_seed.outputs.baseline_sha }}
1070+
key: cb-sync-${{ runner.os }}-${{ inputs.codeboarding_version }}-d${{ steps.resolve_depth.outputs.depth }}-${{ steps.llm.outputs.cache_provider }}-${{ steps.llm.outputs.cache_agent_model }}-${{ steps.llm.outputs.cache_parsing_model }}-${{ steps.sync_seed.outputs.baseline_sha }}
10891071

10901072
# Same rationale as the review pipeline's seed step: the committed
10911073
# analysis.json supplies component ids, but the incremental path also needs
@@ -1095,10 +1077,7 @@ runs:
10951077
id: sync_seedcache
10961078
continue-on-error: true
10971079
shell: bash
1098-
working-directory: codeboarding-engine
10991080
env:
1100-
STATIC_ANALYSIS_CONFIG: ${{ github.workspace }}/codeboarding-engine/static_analysis_config.yml
1101-
PROJECT_ROOT: ${{ github.workspace }}/codeboarding-engine
11021081
# The seed subcommand defaults to github_action attribution; sync-mode
11031082
# telemetry must report as sync (setdefault never clobbers this).
11041083
CODEBOARDING_SOURCE: 'sync'
@@ -1123,7 +1102,7 @@ runs:
11231102
git -C "$TARGET_REPO" worktree prune
11241103
rm -rf "$BASE_SRC"
11251104
git -C "$TARGET_REPO" worktree add --detach "$BASE_SRC" "$BASELINE_SHA"
1126-
if uv run python "$ACTION_PATH/scripts/engine_adapter.py" seed \
1105+
if python "$ACTION_PATH/scripts/engine_adapter.py" seed \
11271106
--repo "$BASE_SRC" \
11281107
--out "$ANALYSIS_DIR" \
11291108
--source-sha "$BASELINE_SHA" \
@@ -1140,10 +1119,7 @@ runs:
11401119
if: steps.guard.outputs.skip != 'true' && steps.guard.outputs.mode == 'sync'
11411120
id: sync_analyze
11421121
shell: bash
1143-
working-directory: codeboarding-engine
11441122
env:
1145-
STATIC_ANALYSIS_CONFIG: ${{ github.workspace }}/codeboarding-engine/static_analysis_config.yml
1146-
PROJECT_ROOT: ${{ github.workspace }}/codeboarding-engine
11471123
DIAGRAM_DEPTH_LEVEL: ${{ steps.resolve_depth.outputs.depth }}
11481124
CACHING_DOCUMENTATION: 'false'
11491125
ENABLE_MONITORING: 'false'
@@ -1186,7 +1162,7 @@ runs:
11861162
)
11871163
[ "$FORCE_FULL" = "true" ] && args+=(--force-full)
11881164
LOG="${RUNNER_TEMP}/cb-sync-analyze.log"
1189-
uv run python "$ACTION_PATH/scripts/engine_adapter.py" analyze "${args[@]}" | tee "$LOG"
1165+
python "$ACTION_PATH/scripts/engine_adapter.py" analyze "${args[@]}" | tee "$LOG"
11901166
MODE="$(sed -n 's/^analysis_mode=//p' "$LOG" | tail -1)"
11911167
MODE="${MODE:-unknown}"
11921168
echo "analysis_mode=$MODE" >> "$GITHUB_OUTPUT"
@@ -1417,9 +1393,7 @@ runs:
14171393
if: steps.guard.outputs.skip != 'true' && steps.guard.outputs.mode == 'sync'
14181394
id: sync_render
14191395
shell: bash
1420-
working-directory: codeboarding-engine
14211396
env:
1422-
PROJECT_ROOT: ${{ github.workspace }}/codeboarding-engine
14231397
ACTION_PATH: ${{ github.action_path }}
14241398
ANALYSIS_DIR: ${{ steps.sync_seed.outputs.cb_dir }}
14251399
RENDER_DIR: ${{ steps.sync_seed.outputs.render_dir }}
@@ -1433,14 +1407,14 @@ runs:
14331407
run: |
14341408
set -euo pipefail
14351409
REPO_REF="https://github.com/${REPOSITORY}/blob/${TARGET_BRANCH}/${OUTPUT_DIR}"
1436-
uv run python "$ACTION_PATH/scripts/engine_adapter.py" render \
1410+
python "$ACTION_PATH/scripts/engine_adapter.py" render \
14371411
--analysis "$ANALYSIS_DIR/analysis.json" \
14381412
--out "$RENDER_DIR" \
14391413
--repo-name "$REPO_NAME" \
14401414
--repo-ref "$REPO_REF" \
14411415
--format "$OUTPUT_FORMAT"
14421416
if [ "$WRITE_ARCHITECTURE_MD" = "true" ]; then
1443-
uv run python "$ACTION_PATH/scripts/engine_adapter.py" concat \
1417+
python "$ACTION_PATH/scripts/engine_adapter.py" concat \
14441418
--docs-dir "$RENDER_DIR" \
14451419
--out "$ARCHITECTURE_FILE"
14461420
fi
@@ -1470,7 +1444,7 @@ runs:
14701444
path: |
14711445
${{ runner.temp }}/cb-sync/static_analysis.pkl
14721446
${{ runner.temp }}/cb-sync/static_analysis.sha
1473-
key: cb-sync-${{ runner.os }}-${{ inputs.engine_ref }}-d${{ steps.resolve_depth.outputs.depth }}-${{ steps.llm.outputs.cache_provider }}-${{ steps.llm.outputs.cache_agent_model }}-${{ steps.llm.outputs.cache_parsing_model }}-${{ steps.guard.outputs.target_sha }}
1447+
key: cb-sync-${{ runner.os }}-${{ inputs.codeboarding_version }}-d${{ steps.resolve_depth.outputs.depth }}-${{ steps.llm.outputs.cache_provider }}-${{ steps.llm.outputs.cache_agent_model }}-${{ steps.llm.outputs.cache_parsing_model }}-${{ steps.guard.outputs.target_sha }}
14741448

14751449
- name: Commit and push synced architecture
14761450
if: steps.guard.outputs.skip != 'true' && steps.guard.outputs.mode == 'sync'

0 commit comments

Comments
 (0)