Skip to content

[Slice 4] new-blog-post end-to-end (multimode) #25

@wab

Description

@wab

Parent

#21

What to build

Add the blog post content type end-to-end. Uses the team cross-ref from #24 to validate author. This is the highest-volume content type at Ocobo, so adoption of the publishing flow hinges on this slice.

Concretely:

  • Create scripts/schemas/blog-post.schema.js — Zod schema with title, author (team slug), description, date, image, exerpt? (encode the typo as-is, with a code comment pointing to the future fix issue), read?, podcastId?, tags?[].
  • Extend scripts/cross-ref-resolver.js to validate author exists in the team registry.
  • Tests.
  • Extend scripts/validate-content.js to validate blog/fr/ (and blog/en/ if non-empty).
  • Create .claude/skills/new-blog-post/SKILL.md — multimode. Interview: slug-first conflict check, author picker (active team members only), autocomplete tags from existing values with warn-but-allow for new ones, optional fields batched, preview before write, cover image via drag&drop into assets/posts/<slug>/.
  • Create docs/notion-templates/blog-post.md — property mapping + NotionAI prompt for the Blog Posts DB.

Acceptance criteria

  • pnpm validate covers blog/fr/ and passes on current data (or reports specific violations).
  • Vitest tests for blog-post.schema.js and the extended cross-ref-resolver.js pass.
  • /new-blog-post <notion-url> imports a Notion page, validates the author against the team registry, and refuses on a broken reference with a clear message.
  • /new-blog-post (no arg) runs the interview; the author picker lists only active team members.
  • Autocomplete proposes existing tags by frequency; a brand-new tag is accepted after explicit confirmation.
  • The frontmatter is written with exerpt: (not excerpt:) and the schema comment references the typo cleanup issue.

Blocked by

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationenhancementNew feature or requestready-for-agentScoped, dependencies clear, acceptance criteria explicit — grabbable by an AFK agent

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions