Halo CLI Content
Use this skill for halo post and halo single-page.
If auth may not be ready, check halo auth current first or load halo-cli-auth.
Commands
halo post --help
halo single-page --help
Post workflows:
listget <name>open <name>createupdate <name>delete <name>export-json <name>import-jsoncategory(subcommand)tag(subcommand)
Single-page workflows:
listget <name>open <name>createupdate <name>delete <name>export-json <name>import-json
Posts
List and inspect:
halo post list
halo post list --keyword halo --publish-phase PUBLISHED
halo post list --category Technology --page 1 --size 20
halo post get my-post --json
Create:
halo post create --title "Hello Halo" --content "# Hello Halo" --publish true
halo post create --title "Hello Halo" --content "<h1>Hello Halo</h1>" --raw-type html
halo post create \
--title "Release Notes" \
--content "Release notes content" \
--slug "release-notes" \
--excerpt "A brief summary" \
--categories News,CLI \
--tags Halo,Release \
--cover "https://example.com/cover.png" \
--visible PUBLIC \
--allow-comment true \
--pinned false \
--priority 100 \
--publish true
Update:
halo post update my-post --title "Updated title"
halo post update my-post --content "Updated content" --publish true
halo post update my-post --new-name my-post-renamed
halo post update my-post --slug "new-slug" --excerpt "Updated excerpt" --cover ""
halo post update my-post --allow-comment false --priority 0
Taxonomy-aware create/update:
halo post create \
--title "Release Notes" \
--content "Release notes content" \
--categories News,CLI \
--tags Halo,Release
JSON round-trip:
halo post export-json my-post --output ./post.json
halo post import-json --file ./post.json --force
import-json payload example (for creating a new post):
{
"post": {
"apiVersion": "content.halo.run/v1alpha1",
"kind": "Post",
"metadata": {
"name": "56c6d867-9683-4927-ba94-388fedf87443"
},
"spec": {
"title": "Sample Post",
"slug": "sample-post",
"template": "",
"cover": "",
"deleted": false,
"publish": false,
"pinned": false,
"allowComment": true,
"visible": "PUBLIC",
"priority": 0,
"excerpt": { "autoGenerate": true, "raw": "" },
"categories": ["category-xxx"],
"tags": ["tag-xxx"],
"htmlMetas": []
}
},
"content": {
"raw": "# Hello World\n\nThis is a sample post content in **Markdown**.\n",
"content": "<h1 id=\"hello-world\">Hello World</h1>\n<p>This is a sample post content in <strong>Markdown</strong>.</p>\n",
"rawType": "markdown"
}
}
Content fields:
rawType: source format, supportsmarkdownorhtml.raw: the source content. Use Markdown text whenrawTypeismarkdown; use HTML text whenrawTypeishtml.content: the rendered result. Use HTML text whenrawTypeismarkdown(converted from Markdown); use HTML text whenrawTypeishtml.baseSnapshot,headSnapshot,releaseSnapshotandownermust be left empty (do not construct manually).categoriesandtagsvalues are themetadata.nameof existing categories/tags in the system. Query them first withhalo post category listandhalo post tag list; create any missing ones before importing.
Markdown round-trip:
halo post export-markdown my-post
halo post export-markdown my-post --output ./post.md
halo post import-markdown --file ./post.md --force
Rules:
--raw-typedefaults tomarkdown, so--contentis rendered as Markdown unless you set--raw-type html.- Prefer
--contentfor direct inline updates, or useimport-markdownfor Markdown files. openonly works for published content; with--jsonit returns the URL.- Import payload must contain
post.metadata.name. - Import payload must contain
content.raworcontent.content.
Post Categories
Manage post categories:
halo post category list
halo post category list --keyword Technology
halo post category get category-abc123
halo post category create --display-name "Technology" --slug "tech"
halo post category create --display-name "News" --description "Latest news" --priority 100
halo post category create --display-name "Featured" --slug "featured" --cover "https://example.com/cover.png"
halo post category update category-abc123 --display-name "Tech News"
halo post category delete category-abc123 --force
Post Tags
Manage post tags:
halo post tag list
halo post tag list --keyword Halo
halo post tag get tag-abc123
halo post tag create --display-name "Halo" --slug "halo" --color "#1890ff"
halo post tag create --display-name "Technology" --slug "tech" --color "#52c41a" --cover "https://example.com/tag-cover.png"
halo post tag update tag-abc123 --display-name "Halo CMS"
halo post tag delete tag-abc123 --force
Single Pages
List and inspect:
halo single-page list
halo single-page get about --json
Create:
halo single-page create --title "About" --content "# About" --publish true
halo single-page create --title "About" --content "<h1>Hello Halo</h1>" --raw-type html
halo single-page create \
--title "Contact Us" \
--content "# Contact" \
--slug "contact" \
--excerpt "Get in touch" \
--template "page" \
--visible PUBLIC \
--allow-comment true \
--priority 0 \
--publish true
Update:
halo single-page update about --title "About Halo"
halo single-page update about --new-name about-page
halo single-page update about --slug "about-halo" --excerpt "Updated description"
halo single-page update about --allow-comment false --template ""
JSON round-trip:
halo single-page export-json about --output ./about.json
halo single-page import-json --file ./about.json --force
import-json payload example (for creating a new single page):
{
"page": {
"apiVersion": "content.halo.run/v1alpha1",
"kind": "SinglePage",
"metadata": {
"name": "373a5f79-f44f-441a-9df1-85a4f553ece8"
},
"spec": {
"title": "About Us",
"slug": "about",
"template": "",
"cover": "",
"deleted": false,
"publish": false,
"publishTime": undefined,
"pinned": false,
"allowComment": true,
"visible": "PUBLIC",
"priority": 0,
"excerpt": { "autoGenerate": true, "raw": "" },
"htmlMetas": []
}
},
"content": {
"raw": "<h1>About Us</h1><p>This is a <strong>custom page</strong> content.</p>",
"content": "<h1>About Us</h1><p>This is a <strong>custom page</strong> content.</p>",
"rawType": "HTML"
}
}
Content fields:
rawType: source format, supportsmarkdownorhtml.raw: the source content. Use Markdown text whenrawTypeismarkdown; use HTML text whenrawTypeishtml.content: the rendered result. Use HTML text whenrawTypeismarkdown(converted from Markdown); use HTML text whenrawTypeishtml.baseSnapshot,headSnapshot,releaseSnapshotandownermust be left empty (do not construct manually).
Rules:
- The command name is
single-page, notsinglePage. - Single pages do not use post category/tag flows.
- There is no
--pinnedoption forsingle-page. - Import payload must contain
page.metadata.name.
Safety And Automation
- Use
--profile <name>when more than one Halo profile exists. - Use
--jsonfor scripts. - Use
--forcefor destructive non-interactive commands likedeleteor overwrite-style imports. - Read current state before mutating when the target resource is uncertain.