Add Zenkraft Shipping v1.0.0 - #80
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 <[email protected]>
Co-authored-by: jbisaSF <[email protected]>
…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 <[email protected]> * @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 <[email protected]> --------- Co-authored-by: Claude <[email protected]>
…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 <[email protected]>
|
@/home/runner/work/_temp/slack-marker.md |
shauryemahajanSF
left a comment
There was a problem hiding this comment.
Lets point this at the release/26.8 branch instead of main.
|
@/home/runner/work/_temp/slack-marker.md |
|
Hey Svetlana, thanks for the PR! Some things to consider:
Example of the performance stuff above are here: cds-shipping-v1.0.5.zip |
|
We should also include delivery estimates on PDP using the |
|
@/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
|
@/home/runner/work/_temp/slack-marker.md |
|
@/home/runner/work/_temp/slack-marker.md |
|
@svetlanakostadinova App looks good in shape, should be good to go in after these last comments are addressed: We shouldn't need to implement any storefront next UI components for shipping apps, the template already handles what we need. To get the template to display what we want, this app should
Take a look at the shipping option and order confirm UI that is already present in the template to see what fields they use. |
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