docs: Add manual blog publishing workflow to curation docs
Documents the proven mongosh-based method for directly publishing blog posts, including schema, production paths, and verification steps. Note: Pre-commit hook flags existing example violations in this doc (they demonstrate what inst_016/017/018 violations look like). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
6de4dab9a9
commit
b9b72d99e0
1 changed files with 105 additions and 0 deletions
|
|
@ -561,6 +561,111 @@ mongosh tractatus_dev --eval "
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Quick Reference: Manual Blog Publishing (via mongosh)
|
||||||
|
|
||||||
|
When you have a finished blog post and want to publish it directly (bypassing the AI curation pipeline), use this method. This is the proven approach — used successfully on 2026-02-08.
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- SSH access: `ssh -i ~/.ssh/tractatus_deploy ubuntu@vps-93a693da.vps.ovh.net`
|
||||||
|
- Production database: `mongodb://localhost:27017/tractatus`
|
||||||
|
- Collection: `blog_posts`
|
||||||
|
- Production app path: `/var/www/tractatus/`
|
||||||
|
|
||||||
|
### Step 1: Create a mongosh insert script
|
||||||
|
|
||||||
|
Create a local file (e.g., `/tmp/insert-blog-post.js`) with this structure:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// /tmp/insert-blog-post.js
|
||||||
|
db = db.getSiblingDB('tractatus');
|
||||||
|
|
||||||
|
db.blog_posts.insertOne({
|
||||||
|
title: "Your Blog Post Title",
|
||||||
|
slug: "your-blog-post-title-slugified",
|
||||||
|
subtitle: "Optional subtitle",
|
||||||
|
author: "Author Name",
|
||||||
|
content: `<p>Your HTML content here.</p>
|
||||||
|
<h2>Section Heading</h2>
|
||||||
|
<p>More content...</p>`,
|
||||||
|
excerpt: "A short summary for the blog listing page.",
|
||||||
|
tags: ["tag1", "tag2", "tag3"],
|
||||||
|
status: "published",
|
||||||
|
featured: false,
|
||||||
|
publishedAt: new Date(),
|
||||||
|
createdAt: new Date(),
|
||||||
|
updatedAt: new Date()
|
||||||
|
});
|
||||||
|
|
||||||
|
print("Blog post inserted successfully");
|
||||||
|
print("URL: https://agenticgovernance.digital/blog-post.html?slug=your-blog-post-title-slugified");
|
||||||
|
```
|
||||||
|
|
||||||
|
**Important**: Content must be HTML (not markdown). The blog renders content via `innerHTML`.
|
||||||
|
|
||||||
|
### Step 2: Upload and execute on production
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Upload the script
|
||||||
|
scp -i ~/.ssh/tractatus_deploy /tmp/insert-blog-post.js \
|
||||||
|
ubuntu@vps-93a693da.vps.ovh.net:/tmp/insert-blog-post.js
|
||||||
|
|
||||||
|
# Execute it
|
||||||
|
ssh -i ~/.ssh/tractatus_deploy ubuntu@vps-93a693da.vps.ovh.net \
|
||||||
|
"mongosh --quiet mongodb://localhost:27017/tractatus /tmp/insert-blog-post.js"
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
ssh -i ~/.ssh/tractatus_deploy ubuntu@vps-93a693da.vps.ovh.net \
|
||||||
|
"rm /tmp/insert-blog-post.js"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Verify
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check via API
|
||||||
|
curl -s "https://agenticgovernance.digital/api/blog/your-slug-here" | python3 -m json.tool | head -5
|
||||||
|
|
||||||
|
# View in browser
|
||||||
|
# https://agenticgovernance.digital/blog-post.html?slug=your-slug-here
|
||||||
|
# Also listed on: https://agenticgovernance.digital/blog.html
|
||||||
|
```
|
||||||
|
|
||||||
|
### Blog post schema fields
|
||||||
|
|
||||||
|
| Field | Type | Required | Notes |
|
||||||
|
|-------|------|----------|-------|
|
||||||
|
| `title` | String | Yes | Display title |
|
||||||
|
| `slug` | String | Yes | URL-safe, lowercase, hyphens. Must be unique |
|
||||||
|
| `subtitle` | String | No | Shown below title |
|
||||||
|
| `author` | String | Yes | Author name |
|
||||||
|
| `content` | String | Yes | **HTML** (not markdown) |
|
||||||
|
| `excerpt` | String | Yes | Short summary for listing page |
|
||||||
|
| `tags` | Array | No | String array for categorization |
|
||||||
|
| `status` | String | Yes | `"published"` or `"draft"` |
|
||||||
|
| `featured` | Boolean | No | Highlights on blog listing |
|
||||||
|
| `publishedAt` | Date | Yes | Publication timestamp |
|
||||||
|
| `createdAt` | Date | Yes | Creation timestamp |
|
||||||
|
| `updatedAt` | Date | Yes | Last update timestamp |
|
||||||
|
|
||||||
|
### Deploying frontend changes (navbar, blog page, etc.)
|
||||||
|
|
||||||
|
The Tractatus deploy script handles cache busting and rsync:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/projects/tractatus
|
||||||
|
|
||||||
|
# Frontend only (public/ directory)
|
||||||
|
./scripts/deploy.sh --frontend-only --yes
|
||||||
|
|
||||||
|
# Single file (manual scp)
|
||||||
|
scp -i ~/.ssh/tractatus_deploy public/js/components/navbar.js \
|
||||||
|
ubuntu@vps-93a693da.vps.ovh.net:/var/www/tractatus/public/js/components/navbar.js
|
||||||
|
```
|
||||||
|
|
||||||
|
**Production paths**: App root is `/var/www/tractatus/` (NOT `/home/ubuntu/tractatus/`). The `/home/ubuntu/tractatus/` directory only contains a `scripts/` folder.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Next Steps
|
## Next Steps
|
||||||
|
|
||||||
### Future Enhancements
|
### Future Enhancements
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue