Skip to content

Commit 8806dfe

Browse files
committed
Flip docs default to released + support doc-only releases
Add a private @salesforce/b2c-dx-docs workspace package to enable: - Doc-only releases via changesets without bumping CLI/SDK/MCP versions - Automatic docs rebuild when SDK changes (via updateInternalDependencies cascade) - Changelog tracking for documentation changes Flip the docs deployment so released/stable docs are served at the root URL and dev docs live at /dev/. Previously dev was at root and released docs were at /release/. Update deploy-docs workflow to build stable docs at root from the latest tag (matching both @salesforce/* and docs@* patterns) and nest dev docs under /dev/. Update publish workflow to create docs@<version> tags and trigger docs deployment on stable releases.
1 parent 03b2b84 commit 8806dfe

6 files changed

Lines changed: 109 additions & 31 deletions

File tree

.github/workflows/deploy-docs.yml

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ permissions:
1212

1313
concurrency:
1414
group: pages
15-
cancel-in-progress: false
15+
cancel-in-progress: true
1616

1717
jobs:
1818
build:
@@ -54,20 +54,44 @@ jobs:
5454
- name: Get latest release tag
5555
id: release
5656
run: |
57-
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
57+
# Find the most recent package tag and docs tag
58+
PKG_TAG=$(git describe --tags --abbrev=0 --match '@salesforce/*' 2>/dev/null || echo "")
59+
DOCS_TAG=$(git describe --tags --abbrev=0 --match 'docs@*' 2>/dev/null || echo "")
60+
61+
# Pick whichever tag is closer to HEAD (fewer commits behind)
62+
LATEST_TAG=""
63+
if [[ -n "$PKG_TAG" && -n "$DOCS_TAG" ]]; then
64+
PKG_DISTANCE=$(git rev-list --count "${PKG_TAG}..HEAD")
65+
DOCS_DISTANCE=$(git rev-list --count "${DOCS_TAG}..HEAD")
66+
if [[ "$DOCS_DISTANCE" -le "$PKG_DISTANCE" ]]; then
67+
LATEST_TAG="$DOCS_TAG"
68+
else
69+
LATEST_TAG="$PKG_TAG"
70+
fi
71+
elif [[ -n "$PKG_TAG" ]]; then
72+
LATEST_TAG="$PKG_TAG"
73+
elif [[ -n "$DOCS_TAG" ]]; then
74+
LATEST_TAG="$DOCS_TAG"
75+
fi
76+
5877
echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT
5978
echo "exists=$([[ -n $LATEST_TAG ]] && echo true || echo false)" >> $GITHUB_OUTPUT
6079
61-
- name: Build main documentation
62-
run: pnpm run docs:build
63-
env:
64-
RELEASE_VERSION: ${{ steps.release.outputs.tag }}
80+
- name: Read CLI version for display
81+
id: cli-version
82+
run: |
83+
CLI_VERSION=$(node -p "require('./packages/b2c-cli/package.json').version")
84+
echo "version=$CLI_VERSION" >> $GITHUB_OUTPUT
6585
66-
- name: Build release documentation
86+
- name: Build dev documentation
87+
run: |
88+
IS_DEV_BUILD=true RELEASE_VERSION=${{ steps.cli-version.outputs.version }} pnpm run docs:build
89+
mv docs/.vitepress/dist docs/.vitepress/dist-dev
90+
91+
- name: Build stable documentation from release tag
6792
if: steps.release.outputs.exists == 'true'
6893
run: |
69-
# Save main build and config (config has version dropdown code)
70-
mv docs/.vitepress/dist docs/.vitepress/dist-main
94+
# Save config from main (has version dropdown and dynamic base path)
7195
cp docs/.vitepress/config.mts /tmp/config.mts
7296
7397
# Remove S3-extracted uxstudio files before checkout to avoid conflicts
@@ -87,14 +111,17 @@ jobs:
87111
# Restore config from main (has version dropdown and dynamic base path)
88112
cp /tmp/config.mts docs/.vitepress/config.mts
89113
90-
# Build at release tag with main's config
114+
# Build at release tag with main's config (no IS_DEV_BUILD = stable at root)
91115
pnpm install --frozen-lockfile
92116
pnpm -r run build
93-
RELEASE_VERSION=${{ steps.release.outputs.tag }} IS_RELEASE_BUILD=true pnpm run docs:build
117+
RELEASE_VERSION=${{ steps.cli-version.outputs.version }} pnpm run docs:build
118+
119+
# Combine: stable at root, dev in /dev/
120+
mv docs/.vitepress/dist-dev docs/.vitepress/dist/dev
94121
95-
# Combine: main at root, release in /release/
96-
mv docs/.vitepress/dist docs/.vitepress/dist-main/release
97-
mv docs/.vitepress/dist-main docs/.vitepress/dist
122+
- name: Use dev as root when no release exists
123+
if: steps.release.outputs.exists != 'true'
124+
run: mv docs/.vitepress/dist-dev docs/.vitepress/dist
98125

99126
- name: Upload artifact
100127
uses: actions/upload-pages-artifact@v3

.github/workflows/publish.yml

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ jobs:
2727
steps:
2828
- name: Checkout
2929
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
30+
with:
31+
fetch-depth: 0 # Needed for docs tag detection
3032

3133
- name: Determine release type
3234
id: release-type
@@ -81,6 +83,16 @@ jobs:
8183
check_package "@salesforce/b2c-cli" "packages/b2c-cli" "cli"
8284
check_package "@salesforce/b2c-dx-mcp" "packages/b2c-dx-mcp" "mcp"
8385
86+
# Check if docs version changed (private package — not published to npm, uses git tag)
87+
DOCS_VERSION=$(node -p "require('./docs/package.json').version")
88+
if git rev-parse "docs@${DOCS_VERSION}" >/dev/null 2>&1; then
89+
echo "publish_docs=false" >> $GITHUB_OUTPUT
90+
else
91+
echo "publish_docs=true" >> $GITHUB_OUTPUT
92+
echo "version_docs=${DOCS_VERSION}" >> $GITHUB_OUTPUT
93+
fi
94+
echo "@salesforce/b2c-docs: version=${DOCS_VERSION}"
95+
8496
- name: Create snapshot versions
8597
if: steps.release-type.outputs.type == 'nightly'
8698
run: |
@@ -147,6 +159,14 @@ jobs:
147159
echo "No tags to create"
148160
fi
149161
162+
- name: Create docs tag if version changed
163+
if: steps.release-type.outputs.type == 'stable' && steps.packages.outputs.publish_docs == 'true'
164+
run: |
165+
DOCS_TAG="docs@${{ steps.packages.outputs.version_docs }}"
166+
git tag "$DOCS_TAG"
167+
git push origin "$DOCS_TAG"
168+
echo "Created docs tag: $DOCS_TAG"
169+
150170
- name: Extract changelogs for release
151171
if: steps.release-type.outputs.type == 'stable'
152172
run: |
@@ -180,6 +200,13 @@ jobs:
180200
extract_latest packages/b2c-tooling-sdk/CHANGELOG.md
181201
echo ""
182202
fi
203+
204+
if [[ "${{ steps.packages.outputs.publish_docs }}" == "true" && -f docs/CHANGELOG.md ]]; then
205+
echo "## Documentation"
206+
echo ""
207+
extract_latest docs/CHANGELOG.md
208+
echo ""
209+
fi
183210
} > /tmp/release-notes.md
184211
185212
- name: Create GitHub Release
@@ -192,6 +219,8 @@ jobs:
192219
RELEASE_TAG="@salesforce/b2c-tooling-sdk@${{ steps.packages.outputs.version_sdk }}"
193220
elif [[ "${{ steps.packages.outputs.publish_mcp }}" == "true" ]]; then
194221
RELEASE_TAG="@salesforce/b2c-dx-mcp@${{ steps.packages.outputs.version_mcp }}"
222+
elif [[ "${{ steps.packages.outputs.publish_docs }}" == "true" ]]; then
223+
RELEASE_TAG="docs@${{ steps.packages.outputs.version_docs }}"
195224
else
196225
echo "No packages published, skipping release"
197226
exit 0
@@ -224,10 +253,16 @@ jobs:
224253
elif [[ "${{ steps.packages.outputs.publish_mcp }}" == "true" ]]; then
225254
RELEASE_TAG="@salesforce/b2c-dx-mcp@${{ steps.packages.outputs.version_mcp }}"
226255
else
227-
echo "No release to upload to"
256+
echo "No package release to upload to"
228257
exit 0
229258
fi
230259
231260
gh release upload "$RELEASE_TAG" b2c-skills.zip b2c-cli-skills.zip
232261
env:
233262
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
263+
264+
- name: Trigger documentation deployment
265+
if: steps.release-type.outputs.type == 'stable'
266+
run: gh workflow run deploy-docs.yml
267+
env:
268+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

docs/.vitepress/config.mts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import typedocSidebar from '../api/typedoc-sidebar.json';
33

44
// Version configuration from environment
55
const releaseVersion = process.env.RELEASE_VERSION || 'unreleased';
6-
const isReleaseBuild = process.env.IS_RELEASE_BUILD === 'true';
6+
const isDevBuild = process.env.IS_DEV_BUILD === 'true';
77

8-
// Base paths - release build lives in /release/ subdirectory
8+
// Base paths - dev build lives in /dev/ subdirectory, stable/release is at root
99
const siteBase = '/b2c-developer-tooling';
10-
const basePath = isReleaseBuild ? `${siteBase}/release/` : `${siteBase}/`;
10+
const basePath = isDevBuild ? `${siteBase}/dev/` : `${siteBase}/`;
1111

1212
// Build version dropdown items
1313
// VitePress prepends base path to links starting with /, so we use relative paths
@@ -18,19 +18,19 @@ function getVersionItems() {
1818
return [{text: 'Development (main)', link: '/'}];
1919
}
2020

21-
if (isReleaseBuild) {
22-
// Release build: base is /b2c-developer-tooling/release/
23-
// Use ../ to navigate up to main docs
21+
if (isDevBuild) {
22+
// Dev build: base is /b2c-developer-tooling/dev/
23+
// Use ../ to navigate up to stable docs at root
2424
return [
25-
{text: 'Development (main)', link: '../'},
26-
{text: 'Latest Release', link: '/'},
25+
{text: 'Latest Release', link: '../'},
26+
{text: 'Development (main)', link: '/'},
2727
];
2828
}
2929

30-
// Main build: base is /b2c-developer-tooling/
30+
// Stable build: base is /b2c-developer-tooling/
3131
return [
32-
{text: 'Development (main)', link: '/'},
33-
{text: 'Latest Release', link: '/release/'},
32+
{text: 'Latest Release', link: '/'},
33+
{text: 'Development (main)', link: '/dev/'},
3434
];
3535
}
3636

@@ -99,15 +99,15 @@ document.addEventListener('click', (e) => {
9999
if (!link) return;
100100
const href = link.getAttribute('href');
101101
// Check if this is a version switch link
102-
if (href && (href.includes('/release/') || href === '../')) {
102+
if (href && (href.includes('/dev/') || href === '../')) {
103103
e.preventDefault();
104104
e.stopPropagation();
105105
if (href === '../') {
106-
// Navigate from /release/ back to main - construct path explicitly
106+
// Navigate from /dev/ back to stable root - construct path explicitly
107107
// to avoid relative path issues with trailing slashes
108108
const path = window.location.pathname;
109-
const mainPath = path.replace(/\\/release\\/.*$/, '/').replace(/\\/release$/, '/');
110-
window.location.href = mainPath;
109+
const stablePath = path.replace(/\\/dev\\/.*$/, '/').replace(/\\/dev$/, '/');
110+
window.location.href = stablePath;
111111
} else {
112112
window.location.href = link.href;
113113
}
@@ -140,7 +140,7 @@ export default defineConfig({
140140
{text: 'CLI Reference', link: '/cli/'},
141141
{text: 'API Reference', link: '/api/'},
142142
{
143-
text: isReleaseBuild ? 'Latest Release' : 'dev',
143+
text: isDevBuild ? 'dev' : `v${releaseVersion}`,
144144
items: getVersionItems(),
145145
},
146146
],

docs/package.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "@salesforce/b2c-dx-docs",
3+
"version": "1.0.0",
4+
"private": true,
5+
"description": "Documentation for B2C Developer Tooling",
6+
"devDependencies": {
7+
"@salesforce/b2c-tooling-sdk": "workspace:*"
8+
}
9+
}

pnpm-lock.yaml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pnpm-workspace.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
packages:
22
- packages/*
3+
- docs
34

45
catalog:
56
# Production dependencies (exact versions for published packages)

0 commit comments

Comments
 (0)