Skip to content
Merged
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
20 changes: 10 additions & 10 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Ocobo Content Repository — agent instructions
# Ocobo Content Repository - agent instructions

This repo holds the markdown content consumed by the Ocobo website. Read `CONTEXT.md` for the domain glossary and `docs/adr/` for past architectural decisions before doing non-trivial work.

Expand All @@ -20,17 +20,17 @@ Single-context. `CONTEXT.md` + `docs/adr/` at the repo root. See `docs/agents/do

Four skills cover the full authoring lifecycle:

- `setup` (`.claude/skills/setup/`) — one-command macOS onboarding for new contributors: installs/checks Homebrew, Node 24, pnpm 8, GitHub CLI auth, clones + installs, leaves the machine ready to run `/new-content`.
- `new-content` (`.claude/skills/new-content/`) — create any of the 5 types (`blog-post | story | team-member | tool | job`). Source-agnostic: interview, local file, or Notion URL.
- `publish-content` — validate and open a PR against `main`.
- `translate-content` — translate an existing file to the other language.
- `setup` (`.claude/skills/setup/`) - one-command macOS onboarding for new contributors: installs/checks Homebrew, Node 24, pnpm 8, GitHub CLI auth, clones + installs, leaves the machine ready to run `/new-content`.
- `new-content` (`.claude/skills/new-content/`) - create any of the 5 types (`blog-post | story | team-member | tool | job`). Source-agnostic: interview, local file, or Notion URL.
- `publish-content` - validate and open a PR against `main`.
- `translate-content` - translate an existing file to the other language.

Canonical workflow: `/new-content [--type X] [source]` → review preview → `/publish-content`. Source modes: **interview** (no setup), **local file** (`/new-content draft.md`), **Notion URL** (optional MCP, see `docs/mcp-notion-setup.md`).

Traps to respect when editing content directly:

- **`exerpt`** — the blog frontmatter key is intentionally misspelled; perpetuate it, do not "fix" it.
- **Slugs are identity** — kebab-case, and the cross-reference key for authors, tools, hiringContacts. Renaming a slug breaks references.
- **Blob URLs** — image fields (`avatar`, `image`, `iconUrl`) must resolve to Vercel Blob URLs; CI rewrites local paths on PR. `pnpm validate` fails on local paths until then — expected pre-sync.
- **Multi-language paradigm** — blog/story/job live under `<type>/<lang>/<slug>.md` (`fr` default). Team members carry both languages inline (`role.fr/en`, `bio.fr/en`); tools are language-agnostic (`name`, `category`, no translatable copy). Neither has a per-lang directory.
- **Cross-refs are strict** — `author`, `tools`, `featuredTool`, `hiringContact` must point to existing slugs; validation rejects dangling references.
- **`exerpt`** - the blog frontmatter key is intentionally misspelled; perpetuate it, do not "fix" it.
- **Slugs are identity** - kebab-case, and the cross-reference key for authors, tools, hiringContacts. Renaming a slug breaks references.
- **Blob URLs** - image fields (`avatar`, `image`, `iconUrl`) must resolve to Vercel Blob URLs; CI rewrites local paths on PR. `pnpm validate` fails on local paths until then - expected pre-sync.
- **Multi-language paradigm** - blog/story/job/challenge live under `<type>/<lang>/<slug>.md` (`fr` default). Challenge files sit in `challenges/<lang>/` with the same slug in both languages, and carry frontmatter only: a body fails validation. Team members carry both languages inline (`role.fr/en`, `bio.fr/en`); tools are language-agnostic (`name`, `category`, no translatable copy). Neither has a per-lang directory.
- **Cross-refs are strict** - `author`, `tools`, `featuredTool`, `hiringContact` must point to existing slugs; validation rejects dangling references.
Loading