Add Zenkraft Shipping v1.0.0 - #80
Open
svetlanakostadinova wants to merge 14 commits into
Open
Conversation
…oud#48) Delete the Avalara app package and catalog, and remove its manifest and translation entries so it no longer appears as an installable app. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: jbisaSF <100236257+jbisaSF@users.noreply.github.com>
…ssions (SalesforceCommerceCloud#50) * @W-23544905: auto-file GUS security-review WIs for external CAP submissions Automate the security-review kickoff for third-party Commerce App submissions. Two independent workflows share a single classifier so their gating stays in lock-step and neither depends on the other running: - `.github/scripts/classify-cap-pr.sh` — one JSON blob describing the added ZIP, ISV directory, manifest fields, author identity, and whether the PR qualifies for the GUS gate (external author AND net-new ISV dir). Anchored regex on the author email so a crafted `"@salesforce.com"` payload can't spoof internal-authorship. - `.github/scripts/test-classify-cap-pr.sh` — five fixture cases exercising net-new external, version-bump, Salesforce-authored, non-ZIP-only, and hostile-email inputs. 26/26 assertions pass. - `.github/workflows/gus-security-review.yml` — creates one `ADM_Work__c` under the C360 PSA: Commerce Apps - Submissions epic when the classifier says so, then comments back on the PR with the WI link. Idempotent via a hidden `<!-- gus-security-review-wi -->` marker so `synchronize` events don't file duplicates. - `.github/workflows/notify-slack-cap-pr.yml` — canary that posts one Slack message per CAP PR regardless of author, so operators can distinguish a trigger-side failure from a GUS-gate skip. Idempotent via `<!-- slack-cap-notify -->`. - `docs/maintainer-setup.md` — how to configure the `GUS_SFDX_AUTH_URL` and `SLACK_WEBHOOK_URL` repo secrets and rotate them. Every untrusted PR field (title, author login/email, manifest values) is passed via `env:` and referenced as a shell variable inside `run:` — never interpolated directly through `${{ ... }}`. JSON envelopes are built with `jq --arg` / `--argjson` so a hostile PR title or manifest name cannot break the JSON or escape into shell. Co-Authored-By: Claude <noreply@anthropic.com> * @W-23544905: switch to pull_request_target so fork PRs work External CAP submissions arrive from forks. Under the default `pull_request` trigger, fork PRs get empty `secrets.*` and read-only `GITHUB_TOKEN` — so the GUS auth step, the Slack post, and the marker-comment writes would all fail on the exact PRs these workflows exist to handle. Switch both workflows to `pull_request_target` and follow the fetch-but-do-not-execute pattern: - Checkout the base ref only (`ref: base.sha`). Every script that runs — classifier, jq payload builders, Slack action reference — comes from the trusted base commit, not the PR head. - `git fetch` the PR head into `refs/remotes/origin/pr/N`. HEAD content is reachable for `git show` / `git diff` but never lands on the working tree. - The classifier now reads the PR-head manifest via `git show "$HEAD_SHA:$MANIFEST_PATH"` instead of a working-tree file read, so a fork's manipulated manifest can't influence anything beyond the string fields we then pass through `jq --arg`. Docs updated with a "Why pull_request_target" section that spells out the threat model and warns against adding any `checkout head.sha` or `bash <head-content>` step in the future. All 26 classifier tests still pass. shellcheck + actionlint clean. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
…ed (SalesforceCommerceCloud#55) The refresh-token backing `GUS_SFDX_AUTH_URL` is bound to a Connected App whose OAuth policy enforces IP restrictions. GitHub-hosted runners come from Azure IP ranges outside any Salesforce trusted-IP list, so the auth step fails on every external CAP PR with: Error (RefreshTokenAuthError): Error authenticating with the refresh token due to: ip restricted Gate the job on `if: false` for now so external PRs stop turning red on the WI-file step. The Slack canary in `notify-slack-cap-pr.yml` keeps posting, so operators still get a signal per submission. Re-enable by removing the `if: false` once a Connected App with "Relax IP restrictions" is provisioned and `GUS_SFDX_AUTH_URL` is regenerated against it.
* Update Salesforce Payments to v1.0.1 Deprecates v1.0.0 in catalog.json. * Fix Salesforce Payments v1.0.1 - update zip and sha256
Co-authored-by: jbisaSF <100236257+jbisaSF@users.noreply.github.com>
Contributor
|
@/home/runner/work/_temp/slack-marker.md |
shauryemahajanSF
left a comment
Contributor
There was a problem hiding this comment.
Lets point this at the release/26.8 branch instead of main.
Contributor
|
@/home/runner/work/_temp/slack-marker.md |
Contributor
|
Hey Svetlana, thanks for the PR! Some things to consider:
Example of the performance stuff above are here: cds-shipping-v1.0.5.zip |
Contributor
|
We should also include delivery estimates on PDP using the |
jbisaSF
reviewed
Aug 7, 2026
jbisaSF
reviewed
Aug 7, 2026
jbisaSF
reviewed
Aug 7, 2026
Contributor
|
@/home/runner/work/_temp/slack-marker.md |
# Conflicts: # commerce-apps-manifest/translations/ar-MA.json # commerce-apps-manifest/translations/de.json # commerce-apps-manifest/translations/en-US.json # commerce-apps-manifest/translations/es.json # commerce-apps-manifest/translations/fr.json # commerce-apps-manifest/translations/it.json # commerce-apps-manifest/translations/ja.json # commerce-apps-manifest/translations/ko.json # commerce-apps-manifest/translations/nl.json # commerce-apps-manifest/translations/pl.json # commerce-apps-manifest/translations/pt.json # commerce-apps-manifest/translations/zh-CN.json # commerce-apps-manifest/translations/zh-TW.json
Contributor
|
@/home/runner/work/_temp/slack-marker.md |
Contributor
|
@/home/runner/work/_temp/slack-marker.md |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Commerce App Submission
App Name: zenkraft-shipping
Display Name: Zenrkaft Shipping
Domain: shipping
ISV/Vendor Name: Zenkraft
Version: 1.0.0
Type of Change
Architecture
Description
This commerce app integrates the Zenkraft rate API with Storefront Next storefronts. The backend cartridge (int_zenkraft_sfnext) fetches real-time rates and estimated delivery dates from carriers at checkout and persists them to session and shipment custom attributes. The Storefront Next extension replaces the standard shipping options step at checkout with a component that displays those enriched shipping methods.
Checklist
Required Files
{appName}-v{version}.zipcommerce-{appName}-app-v{version}/manifest.jsonincludes all required fields (id, name, description, iconName, domain, version, zip, sha256)commerce-{appName}-app-v{version}/icons/(CI extracts automatically)iconNamefield in root manifestcommerce-apps-manifest/translations/en-US.json(minimum requirement)catalog.jsonincluded for new apps only (with INIT values)catalog.json(CI handles this)"deprecated": trueto existing version incatalog.jsonVersion and Hash Validation
versioninmanifest.jsonmatchesversionincommerce-app.jsonzipfield inmanifest.jsonmatches actual ZIP filenamesha256inmanifest.jsonmatches computed hash of ZIP fileshasum -a 256 [path-to-zip]ZIP Content Validation
.DS_Store,__MACOSX,Thumbs.db, hidden files)tax/,domain/, etc.)commerce-app.json,README.md,app-configuration/tasksList.jsonDirectory Structure
{domain}/{appName}/where{appName}matches the "id" field in manifestcommerce-*-app-v*/) committed.DS_Store,Thumbs.db) committedValidation (if using Claude Code)
/validate-appskill/validate-impexskill (if app contains impex files)Impex Files (if applicable)
mode="delete"Testing
Additional Notes