Files
ironclaw/docs/docs.json
Josh Ford f75947032b release(docs): deploy public docs from a docs-live branch moved by stable releases (doc-truth PR 4/5) (#7379)
* release(docs): deploy public docs from a docs-live branch moved by stable releases

The Mintlify GitHub App deployed docs/ on every push to main, so the public
site described unreleased behavior while binaries shipped from ironclaw-v*
tags — the root cause behind #7317's drift reports. The site now tracks the
latest stable release:

- .github/workflows/ironclaw-release.yml: new publish-docs-live job (after
  host, prerelease-guarded via the dist manifest's
  announcement_is_prerelease) force-updates refs/heads/docs-live to the
  released commit through the GitHub refs API, bootstrapping the branch on
  first run. Forced by design: successive stable tags need not be
  ancestor-related, and docs-live is a pointer, not a history. The Mintlify
  dashboard repoint to docs-live is the one out-of-repo step, documented in
  the release strategy.
- scripts/ci/ws12_workflow_contracts.py: the job, the branch ref, and the
  prerelease guard join REQUIRED_MARKERS so a cargo-dist regeneration that
  drops the hand-added job fails Code Style instead of silently unhooking
  docs publication.
- docs/changelog.mdx (new, in en nav under a Releases group): human-curated
  <Update> entry per stable release, seeded with v1.1.0 and v1.0.0 from the
  GitHub release notes; links tagged docs trees for older releases instead
  of maintaining versioned page sets.
- scripts/ci/cut_ironclaw_release.py: ensure_stable_changelog_entry — a
  stable (non-rc) cut refuses when the candidate commit's changelog lacks
  the release's vX.Y.Z entry, with an actionable message; rc cuts are
  exempt so the freeze/blocker flow is unimpeded. Five new cases in
  test_cut_ironclaw_release.py (missing entry, missing file, present entry,
  rc exemption, malformed-version deferral to the canonical validator).
- docs/internal/weekly-release-strategy.md: Monday checklist writes the
  changelog entry on the release branch; promotion notes the automatic
  docs-live repoint; new "Docs publication" section records the dashboard
  configuration, post-promotion verification, branch-protection
  recommendation, emergency manual repoint, and older-release access.

End-to-end proof of the workflow job rides the next stable release; until
the Mintlify dashboard is repointed the site keeps deploying from main, so
the rollout order is: merge, repoint the dashboard, then the next stable
tag takes over.

Part of #7317 (doc-truth pipeline, PR 4 of 5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* release(docs): harden the docs-live chain after review

Three gaps found reviewing the pipeline end to end:

- Changelog history loss: the runbook told the release owner to write
  the changelog entry on the frozen release branch, which is never
  merged back — next week's candidate, cut from main, would ship a
  changelog missing the release and docs-live would silently drop it.
  The entry now lands on main before the Monday cut; the gate's
  message and the runbook say so, with a cherry-pick fallback.
- Substring gate false-pass: the stable gate accepted any 'vX.Y.Z'
  substring, so an rc-labeled entry (description="vX.Y.Z-rc.1") or a
  prose mention satisfied it. It now requires the exact
  description="vX.Y.Z" attribute; both cases pinned in tests.
- Backwards repoint: re-running an older release's workflow would
  force-move docs-live to the older commit and silently revert the
  live site. publish-docs-live now moves the pointer only when its own
  tag is the newest stable ironclaw-v* tag, and the guard is pinned in
  ws12 REQUIRED_MARKERS so regeneration cannot drop it.

The runbook also gains the docs-hotfix recipe (publish tag+fix, never
main) and spells out that docs-live branch protection must allow force
pushes or it 422s the automation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* release(docs): match a real changelog Update tag and fail the repoint closed

Post-review hardening: the stable gate now requires the version on an
actual <Update> tag (lookalike attributes and other elements refuse, with
a regression test); the publish-docs-live step runs under set -euo
pipefail and rejects empty tag discovery instead of silently skipping;
ws12 pins the backward-repoint comparison itself; comments trimmed and
the public changelog no longer overclaims while the dashboard still
deploys from main.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* release(docs): close the review-round gaps in the docs-live chain

Seed the changelog with v1.2.0 (already-shipped stable whose branch never
merges back), put ironclaw-release.yml in code_style's has_code scope and
pin that semantically in ws12, bootstrap docs-live via POST only when the
branch truly does not exist so protection 422s surface as themselves,
drive the changelog gate through main() in tests, restore the emergency
paragraph to its own runbook section, and tell contributors docs reach
the live site with the next stable release.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 16:29:08 +00:00

410 lines
11 KiB
JSON

{
"$schema": "https://mintlify.com/docs.json",
"theme": "almond",
"name": "IronClaw",
"colors": {
"primary": "#1191f0",
"light": "#1191f0",
"dark": "#1191f0"
},
"favicon": "/images/logo/favicon.ico",
"logo": {
"light": "/images/logo/logo.svg",
"dark": "/images/logo/logo-dark.svg"
},
"navbar": {
"links": [
{
"label": "Get Support",
"href": "https://t.me/ironclawAI"
}
],
"primary": {
"type": "button",
"label": "Deploy Now",
"href": "https://agent.near.ai/"
}
},
"navigation": {
"languages": [
{
"language": "en",
"tabs": [
{
"tab": " ",
"groups": [
{
"group": " ",
"pages": [
"index",
"quickstart",
"onboard"
]
},
{
"group": "Using IronClaw",
"icon": "play",
"pages": [
"using/webui",
"using/cli",
"using/service"
]
},
{
"group": "Capabilities",
"icon": "cubes",
"pages": [
"capabilities/overview",
"capabilities/llm-providers",
{
"group": "Core Capabilities",
"pages": [
"security",
"capabilities/database",
"capabilities/configuration",
{
"group": "Memory",
"pages": [
"capabilities/memory/memory",
"capabilities/memory/identity"
]
},
{
"group": "Routines",
"pages": [
"capabilities/routines/cron",
"capabilities/routines/heartbeat",
"capabilities/routines/reactive"
]
},
{
"group": "Jobs",
"pages": [
"capabilities/jobs/jobs",
"capabilities/jobs/self-repair"
]
},
"capabilities/skills",
"capabilities/sandboxed-tools",
"capabilities/traces"
]
}
]
},
{
"group": "Channels",
"icon": "message",
"pages": [
"channels/overview",
"channels/slack",
"channels/telegram"
]
},
{
"group": "IronHub",
"icon": "archive",
"pages": [
"hub/overview",
"hub/installing",
"hub/contributing"
]
},
{
"group": "API",
"icon": "code",
"pages": [
"api/responses"
]
},
{
"group": "Extensions (Tools)",
"icon": "hammer",
"pages": [
"extensions/overview",
{
"group": "Built-in Extensions",
"pages": [
"extensions/file-tools",
"extensions/github",
{
"group": "Google",
"pages": [
"extensions/google/oauth-setup",
"extensions/google/gmail",
"extensions/google/calendar",
"extensions/google/docs",
"extensions/google/drive",
"extensions/google/sheets",
"extensions/google/slides"
]
},
"extensions/mcp",
"extensions/web-search",
"extensions/shell"
]
}
]
},
{
"group": "Tutorials",
"icon": "graduation-cap",
"pages": [
"extensions/building-a-tool",
"channels/building-a-channel",
{
"group": "How to host IronClaw on...",
"pages": [
"infrastructure/droplet",
"infrastructure/google",
"infrastructure/amazon"
]
}
]
},
{
"group": "Releases",
"icon": "clock-rotate-left",
"pages": [
"changelog"
]
}
]
}
]
},
{
"language": "zh",
"navbar": {
"links": [
{
"label": "支持",
"href": "https://t.me/ironclawAI"
}
],
"primary": {
"type": "button",
"label": "立即部署",
"href": "https://agent.near.ai/"
}
},
"tabs": [
{
"tab": " ",
"groups": [
{
"group": " ",
"pages": [
"zh/index",
"zh/quickstart",
"zh/onboard"
]
},
{
"group": "核心能力",
"icon": "cubes",
"pages": [
"zh/capabilities/overview",
{
"group": "核心能力",
"pages": [
"zh/security",
{
"group": "记忆",
"pages": [
"zh/capabilities/memory/memory",
"zh/capabilities/memory/identity"
]
},
{
"group": "例程",
"pages": [
"zh/capabilities/routines/cron",
"zh/capabilities/routines/heartbeat",
"zh/capabilities/routines/reactive"
]
},
{
"group": "任务",
"pages": [
"zh/capabilities/jobs/jobs",
"zh/capabilities/jobs/self-repair"
]
},
"zh/capabilities/skills",
"zh/capabilities/sandboxed-tools"
]
}
]
},
{
"group": "渠道",
"icon": "message",
"pages": [
"zh/channels/overview",
"zh/channels/telegram"
]
},
{
"group": "IronHub",
"icon": "archive",
"pages": [
"zh/hub/overview",
"zh/hub/installing",
"zh/hub/contributing"
]
},
{
"group": "扩展(工具)",
"icon": "hammer",
"pages": [
"zh/extensions/overview",
{
"group": "内置扩展",
"pages": [
"zh/extensions/file-tools",
"zh/extensions/github",
{
"group": "Google",
"pages": [
"zh/extensions/google/oauth-setup",
"zh/extensions/google/gmail",
"zh/extensions/google/calendar",
"zh/extensions/google/docs",
"zh/extensions/google/drive",
"zh/extensions/google/sheets",
"zh/extensions/google/slides"
]
},
"zh/extensions/mcp",
"zh/extensions/web-search",
"zh/extensions/shell"
]
}
]
},
{
"group": "教程",
"icon": "graduation-cap",
"pages": [
"zh/extensions/building-a-tool",
{
"group": "在以下平台托管 IronClaw",
"pages": [
"zh/infrastructure/droplet",
"zh/infrastructure/google",
"zh/infrastructure/amazon"
]
}
]
}
]
}
]
}
],
"global": {
"anchors": [
{
"anchor": "Agent Dashboard",
"href": "https://agent.near.ai/",
"icon": "sliders"
},
{
"anchor": "NEAR AI Cloud",
"href": "https://cloud.near.ai",
"icon": "cloud"
}
]
}
},
"contextual": {
"options": [
"copy",
"view",
"chatgpt",
"claude",
"perplexity",
"mcp",
"cursor",
"vscode"
]
},
"footer": {
"socials": {
"x": "https://x.com/near_ai",
"github": "https://github.com/nearai",
"linkedin": "https://linkedin.com/company/near-ai"
}
},
"redirects": [
{
"source": "/capabilities/mcp",
"destination": "/extensions/mcp"
},
{
"source": "/tunnel",
"destination": "/using/webui"
},
{
"source": "/channels/discord",
"destination": "/channels/overview"
},
{
"source": "/channels/signal",
"destination": "/channels/overview"
},
{
"source": "/channels/wechat",
"destination": "/channels/overview"
},
{
"source": "/channels/wecom",
"destination": "/channels/overview"
},
{
"source": "/channels/local",
"destination": "/channels/overview"
},
{
"source": "/channels/webhook",
"destination": "/channels/overview"
},
{
"source": "/zh/channels/discord",
"destination": "/zh/channels/overview"
},
{
"source": "/zh/channels/signal",
"destination": "/zh/channels/overview"
},
{
"source": "/zh/channels/wechat",
"destination": "/zh/channels/overview"
},
{
"source": "/zh/channels/wecom",
"destination": "/zh/channels/overview"
},
{
"source": "/zh/channels/local",
"destination": "/zh/channels/overview"
},
{
"source": "/zh/channels/webhook",
"destination": "/zh/channels/overview"
},
{
"source": "/zh/tunnel",
"destination": "/zh/index"
},
{
"source": "/zh/capabilities/jobs",
"destination": "/zh/capabilities/jobs/jobs"
},
{
"source": "/zh/extensions/google-calendar",
"destination": "/zh/extensions/google/calendar"
}
]
}