Get started
Start with the local CLI preview. It reads the checkout's tags
and conventional commits, writes evidence under
.landmark/run/, and produces static release
artifacts under docs/releases/.
Local CLI preview
cargo run --locked -p landmark -- run --provider local --repo-root .
This is the README's first-run command for a source checkout. It requires no GitHub token and no LLM provider key.
Executable quickstart oracle
cargo run --locked -p landmark -- replay-action --scenario first_run_local_preview
Use the replay when you want a repeatable check that the local preview path still works.
GitHub Action adoption
name: Release
on:
workflow_run:
workflows:
- CI
types:
- completed
workflow_dispatch:
concurrency:
group: release-${{ github.repository }}-${{ github.event.repository.default_branch }}
cancel-in-progress: false
jobs:
release:
if: |
(github.event_name == 'workflow_dispatch' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)) ||
(github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'push' && github.event.workflow_run.head_branch == github.event.repository.default_branch)
runs-on: ubuntu-latest
permissions:
contents: write
issues: write
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.head_sha || github.sha }}
fetch-depth: 0
persist-credentials: false
- name: Skip if default branch has advanced
id: bound
env:
GH_TOKEN: ${{ github.token }}
TESTED_SHA: ${{ github.event.workflow_run.head_sha || github.sha }}
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
run: |
set -euo pipefail
head="$(gh api "repos/${GITHUB_REPOSITORY}/commits/${DEFAULT_BRANCH}" --jq .sha)"
if [ "${head}" != "${TESTED_SHA}" ]; then
echo "stale=true" >> "${GITHUB_OUTPUT}"
echo "::notice::Skipping stale Landmark run tested=${TESTED_SHA} origin/${DEFAULT_BRANCH}=${head}"
else
echo "stale=false" >> "${GITHUB_OUTPUT}"
fi
- if: steps.bound.outputs.stale != 'true'
uses: misty-step/landmark@v0
with:
github-token: ${{ secrets.GH_RELEASE_TOKEN }}
llm-api-key: ${{ secrets.OPENROUTER_API_KEY }}
Full mode wraps semantic-release, then Landmark synthesizes and publishes the user-facing release body.
Agent surface
landmark describe --json
Agents should start with the self-description contract instead of scraping README prose.