Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions .github/workflows/publish-openclaw.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Release @or3/openclaw

on:
workflow_dispatch:
inputs:
publish:
description: Publish the qualified @or3/openclaw tarball
required: true
type: boolean
default: false
version:
description: Exact package version to qualify (must match package.json)
required: true
type: string
push:
branches:
- main
tags:
- "openclaw-v*"
paths:
- "packages/openclaw-or3/**"
- ".github/workflows/publish-openclaw.yml"
pull_request:
paths:
- "packages/openclaw-or3/**"
- ".github/workflows/publish-openclaw.yml"

permissions:
contents: read
id-token: write

jobs:
qualify:
runs-on: ubuntu-latest
defaults:
run:
working-directory: packages/openclaw-or3
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
registry-url: https://registry.npmjs.org
package-manager-cache: false
- name: Pin npm for trusted publishing
run: |
npm install --global npm@11.5.1
node --version
npm --version
- name: Verify release version and immutable registry target
env:
DISPATCH_VERSION: ${{ inputs.version }}
run: |
package_version="$(node -p 'require("./package.json").version')"
if [[ "$GITHUB_REF" == refs/tags/openclaw-v* ]]; then
test "$package_version" = "${GITHUB_REF_NAME#openclaw-v}"
elif [[ "$GITHUB_EVENT_NAME" == "workflow_dispatch" ]]; then
test "$package_version" = "$DISPATCH_VERSION"
fi
if [[ "$GITHUB_REF" == refs/tags/openclaw-v* || "$GITHUB_EVENT_NAME" == "workflow_dispatch" ]]; then
if npm view "@or3/openclaw@$package_version" version >/dev/null 2>&1; then
echo "@or3/openclaw@$package_version is already published" >&2
exit 1
fi
fi
- run: npm pack --ignore-scripts --dry-run
- name: Run bridge tests
run: npm test
- name: Verify the immutable package contents
run: |
test -f package.json
test -f index.js
test -f src/bridge.js
test -f openclaw.plugin.json
test -f LICENSE
node -e 'const p=require("./package.json"); if (p.name !== "@or3/openclaw" || !p.version) process.exit(1)'
- name: Pack the release artifact
run: npm pack --ignore-scripts --pack-destination "$RUNNER_TEMP"
- name: Publish
if: startsWith(github.ref, 'refs/tags/openclaw-v') || inputs.publish
run: npm publish "$RUNNER_TEMP"/or3-openclaw-*.tgz --access public
275 changes: 275 additions & 0 deletions app/assets/css/docs-prose.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,275 @@
/*
* Documentation-specific prose refinements.
*
* Loaded only by DocumentationShell.vue (scoped import) and layered on top of
* the shared or3-prose base. All selectors use :deep() so they pierce into the
* StreamMarkdown render output when compiled as scoped styles.
*
* NOTE: root font-size is themed (20px default), so px values are used for
* predictable docs typography.
*/

.docs-prose {
--docs-prose-border: var(--md-border-color);
--docs-prose-border-strong: color-mix(
in oklab,
var(--md-outline) 45%,
transparent
);
--docs-prose-shadow: 0 1px 2px color-mix(in srgb, var(--md-shadow) 5%, transparent);
font-size: 15.5px;
line-height: 1.75;
letter-spacing: -0.004em;
color: var(--md-on-surface);
}

.docs-prose :deep(::selection) {
background: color-mix(in oklab, var(--md-primary) 22%, transparent);
}

/* ---------- Headings ---------- */

.docs-prose :deep(h1),
.docs-prose :deep(h2),
.docs-prose :deep(h3),
.docs-prose :deep(h4),
.docs-prose :deep(h5),
.docs-prose :deep(h6) {
color: var(--md-on-surface);
letter-spacing: -0.015em;
scroll-margin-top: 84px;
text-wrap: balance;
}

.docs-prose :deep(h1) {
font-size: 32px;
font-weight: 700;
letter-spacing: -0.025em;
line-height: 1.2;
margin-top: 0;
margin-bottom: 1.25rem;
padding-bottom: 0.75rem;
border-bottom: 1px solid var(--docs-prose-border);
}

.docs-prose :deep(h2) {
font-size: 24px;
font-weight: 650;
line-height: 1.3;
margin-top: 2.75rem;
margin-bottom: 0.875rem;
}

.docs-prose :deep(h3) {
font-size: 19px;
font-weight: 600;
line-height: 1.35;
margin-top: 2.25rem;
margin-bottom: 0.625rem;
}

.docs-prose :deep(h4) {
font-size: 16px;
font-weight: 600;
line-height: 1.4;
margin-top: 1.75rem;
margin-bottom: 0.5rem;
}

/* No excess top gap when a heading opens the page */
.docs-prose > :deep(h1:first-child),
.docs-prose > :deep(h2:first-child),
.docs-prose > :deep(h3:first-child),
.docs-prose > :deep(h4:first-child) {
margin-top: 0;
}

/* ---------- Inline text ---------- */

.docs-prose :deep(p) {
margin-top: 1.05rem;
margin-bottom: 1.05rem;
line-height: 1.75;
text-wrap: pretty;
}

.docs-prose :deep(strong) {
font-weight: 600;
color: var(--md-on-surface);
}

.docs-prose :deep(a) {
color: var(--md-primary);
font-weight: 450;
text-decoration-line: underline;
text-decoration-thickness: 1px;
text-underline-offset: 3px;
text-decoration-color: color-mix(
in oklab,
var(--md-primary) 40%,
transparent
);
transition:
color 0.15s ease,
text-decoration-color 0.15s ease;
}

.docs-prose :deep(a:hover) {
color: var(--md-primary);
text-decoration-color: var(--md-primary);
}

/* ---------- Lists ---------- */

.docs-prose :deep(ul),
.docs-prose :deep(ol) {
margin: 1.1rem 0;
padding-left: 1.4rem;
}

.docs-prose :deep(li) {
margin: 0.4rem 0;
padding-left: 0.25rem;
}

.docs-prose :deep(li::marker) {
color: color-mix(in oklab, var(--md-on-surface-variant), transparent 40%);
}

.docs-prose :deep(li > p) {
margin: 0.4rem 0;
}

.docs-prose :deep(li > ul),
.docs-prose :deep(li > ol) {
margin: 0.4rem 0;
}

/* ---------- Inline code & kbd ---------- */

/* The typography plugin decorates inline code with backtick pseudo-elements */
.docs-prose :deep(code)::before,
.docs-prose :deep(code)::after {
content: none;
}

.docs-prose :deep(code) {
background: var(--md-surface-container);
border: 1px solid var(--docs-prose-border);
padding: 0.12em 0.38em;
border-radius: 5px;
color: var(--md-on-surface);
font-size: 0.855em;
font-weight: 450;
}

.docs-prose :deep(pre code),
.docs-prose :deep([data-streamdown='code']) {
background: transparent;
border: none;
padding: 0;
border-radius: 0;
}

.docs-prose :deep(kbd) {
display: inline-block;
padding: 0.1em 0.45em;
border: 1px solid var(--docs-prose-border-strong);
border-bottom-width: 2px;
border-radius: 5px;
background: var(--md-surface-container-low);
color: var(--md-on-surface);
font-family: inherit;
font-size: 0.8em;
font-weight: 600;
line-height: 1.4;
}

/* ---------- Code blocks ---------- */

.docs-prose :deep(pre) {
border-radius: 10px;
border: 1px solid var(--docs-prose-border);
box-shadow: var(--docs-prose-shadow);
}

.docs-prose :deep([data-streamdown='code-block']) {
margin: 1.5rem 0;
border: 1px solid var(--docs-prose-border);
border-radius: 10px;
box-shadow: var(--docs-prose-shadow);
}

.docs-prose :deep([data-streamdown='code-block-header']) {
min-height: 2.4rem;
font-size: 12px;
}

/* ---------- Blockquote ---------- */

.docs-prose :deep(blockquote) {
border-left: 3px solid color-mix(in oklab, var(--md-primary) 45%, transparent);
border-radius: 0 8px 8px 0;
background: color-mix(in oklab, var(--md-primary) 5%, transparent);
padding: 0.75rem 1rem;
margin: 1.5rem 0;
font-style: normal;
color: var(--md-on-surface-variant);
}

.docs-prose :deep(blockquote p) {
margin: 0.35rem 0;
}

/* ---------- Tables ---------- */

.docs-prose :deep([data-streamdown='table-wrapper']) {
border: 1px solid var(--docs-prose-border);
border-radius: 10px;
box-shadow: var(--docs-prose-shadow);
margin-top: 1.75rem !important;
margin-bottom: 1.75rem;
}

.docs-prose :deep(th) {
font-size: 12.5px;
font-weight: 650;
letter-spacing: 0.02em;
padding: 0.625rem 0.875rem;
}

.docs-prose :deep(td) {
font-size: 13.5px;
padding: 0.625rem 0.875rem;
}

.docs-prose :deep(td code) {
white-space: nowrap;
}

/* ---------- Misc ---------- */

.docs-prose :deep(hr) {
border: none;
height: 1px;
background: var(--docs-prose-border);
margin: 2.75rem 0;
}

.docs-prose :deep(img) {
border-radius: 10px;
border: 1px solid var(--docs-prose-border);
}

.docs-prose :deep(details) {
border: 1px solid var(--docs-prose-border);
border-radius: 10px;
padding: 0.75rem 1rem;
margin: 1.25rem 0;
}

.docs-prose :deep(summary) {
font-weight: 600;
cursor: pointer;
color: var(--md-on-surface);
}
Loading
Loading