Install
$ agentstack add skill-chemny-cmm-content-factory-cmm-content-writing ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
CMM Content Writing
cmm-content-writing is the writing layer in the CMM content factory.
It consumes a content_plan from cmm-content-planning and produces a content_package for downstream visual, video, and publishing workflows.
Boundary
Use this skill for:
- Turning a
content_planinto a draft article, post, thread, note, or script. - Choosing the right writing pattern for the target platform.
- Producing structured
content_packageoutput. - Repurposing one plan into multiple platform drafts when requested.
- Preserving source discipline, claim caution, and platform-specific structure.
Do not use this skill for:
- Selecting topics. Use
cmm-content-planningonly after topic selection. - Generating images or video.
- Publishing, scheduling, posting, or writing to Notion.
Legacy Boundary
Do not invoke or modify legacy writing skills by default. Their useful patterns are internalized here as CMM writing methods. If a legacy skill exposes a useful edge case, record it as legacy_gap and update this CMM skill, its references, or its contract.
Input
Preferred input is a content_plan:
content_plan:
topic: ""
audience: ""
platform: ""
format: ""
core_angle: ""
core_claim: ""
evidence: []
risks: []
expression_strategy: ""
title_cover_direction: ""
outline_direction: []
first_action: ""
writing_decision:
user_real_need: ""
reader_takeaway: ""
article_type: ""
target_length: ""
length_reason: ""
one_sentence_spine: ""
must_include: []
must_exclude: []
scope_boundary: ""
drafting_instruction:
title_promise: ""
body_must_center_on: ""
article_shape: ""
personal_style_role:
source_profile: ""
voice: ""
rhythm: ""
stance: ""
lexicon: []
avoid: []
must_include: []
forbidden_drift: []
length_strategy: ""
source_boundaries: ""
style_selection:
user_profile: ""
writing: ""
visual: ""
layout: ""
downstream_needs:
writing: true
visual: true
video: false
publishing: false
status: draft
If the user only provides a topic, ask to run planning first or build a minimal content plan before drafting.
Read references/content-package-contract.md for exact output fields. Read references/writing-method.md for platform structure, evidence handling, and repurposing rules. Read references/wechat-writing-style.md for the full WeChat long-form quality standard when platform: wechat. Read references/xhs-copy-spec.md for Xiaohongshu/Rednote note structure, card copy, caption, hashtags, and preflight rules when platform: xiaohongshu. For Xiaohongshu titles and cover hooks, also read references/xhs-title-templates.md.
Before drafting, resolve content_plan.style_selection:
- Writing template:
cmm-content-factory/references/styles/writing/.yaml. - User profile:
~/.cmm/profile/.yamlwhen set; if absent, use the
shipped persona-neutral references/styles/default-profile.yaml (then bare neutral only if that is missing) per cmm-content-factory/references/styles/style-system.md.
- The generic anti-AI gate in
style-system.mdalways applies; the user
profile may add personal bans on top.
Template rules and user-profile persona/audience/lexicon are mandatory writing constraints, not suggestions. A user instruction in the current turn overrides them for this task only.
No styleless drafting gate: content_plan.style_selection.user_profile, writing, visual, and layout must be resolved before drafting any article. Profiles are runtime configuration. For this local CMM workflow, ~/.cmm/profile/neo.yaml is the local default only when it exists and the user did not request another style. Do not hardcode Neo-specific writing traits into the shared skill; derive drafting_instruction.personal_style_role from the active user profile for each run. If user_profile or writing is empty, stop and return a planning/style-selection block instead of producing正文. Do not write in the model's generic voice and then retrofit style afterward.
Profile-to-constraints gate: Loading a profile is not enough. Before any article正文 is drafted, convert the active user profile, account template, writing template, and this task's personal_style_brief into drafting_instruction.pre_draft_style_constraints. This object is the writing constraint package, not a review note. It must name the opening move, first-300- character judgment, article backbone, section intent, paragraph rhythm, allowed first-person stance, required judgment signals, banned generic shapes, and rewrite triggers for this exact article. If it is missing, generic, or not connected to the selected title promise, block drafting. A later voice_match_evidence.passed: true is invalid unless it proves the draft followed these pre-draft constraints with excerpts or concrete reasons.
Routing
Choose the writing pattern by platform, format, and evidence needs.
| Need | Pattern | |---|---| | WeChat long-form analysis, cited article, tutorial, case study | Research article pattern | | Personal blog or opinion essay | Blog draft pattern | | X thread, Weibo post, Xiaohongshu copy, LinkedIn-style post | Social draft pattern | | 口播稿 / 短视频口播脚本(真人出镜要念的稿,format=talking_script) | 口播稿 pattern → references/talking-script-method.md(钩子先行批量选 + 时长卡字数 + 口播/分镜双轨 + 人设口吻) | | 其它短视频脚本(纯文本/旁白) | Script draft pattern | | Multi-platform adaptation | Repurpose pattern |
Writing scope:
- All writing methods are internalized here: evidence-first structure,
voice-aware longform, platform adaptation, thread compression, and social copy formatting. No external writing skill is required.
- Any external save, Notion write, schedule, or publish action belongs outside
this skill.
Workflow
- Validate the
content_plan. - Resolve
content_plan.style_selection: load the writing template and the
user profile (or neutral mode).
- Confirm the style gate passed:
user_profile_loaded: truewriting_template_loaded: truestyle_selection.user_profileis non-emptystyle_selection.writingis non-empty
If any item fails, block drafting and ask/route back for style selection.
- For WeChat long-form drafts, run the account-template context gate before
generating title or正文. Read references/wechat-writing-style.md, references/platform-copy-specs.md, references/title-spec.md, and, for AI tool / product update / workflow topics, references/wechat-title-templates.md; then read the selected user profile and the resolved WeChat account template. If the active profile declares account_templates.wechat, expand and read that template file; otherwise read the bundled persona-neutral fallback cmm-content-factory/references/templates/wechat-default-template.md. Write wechat_context_gate before drafting:
``yaml wechat_context_gate: platform_rules_loaded: true user_profile_loaded: true account_template_path: "" account_template_loaded: true article_type_template_loaded: true calibration_style_checked: true passed: true source_files: [] ``
If the resolved account template was not read, block drafting. The account template must be converted into concrete constraints in voice_contract: opening pattern, article structure, paragraph style, practicality pattern, personal judgment pattern, and closing pattern. Do not satisfy this gate by merely naming the profile. Treat the account template as the primary visible article shape. Platform, length, density, and quality gates are backend constraints; they must not cause the draft to grow extra tables, prompt packs, check-standard blocks, or process artifacts that the account template did not call for.
- Check the writing decision gate for article drafts.
content_planshould
contain writing_decision.user_real_need, reader_takeaway, article_type, density_level, target_length, one_sentence_spine, must_include, must_exclude, and scope_boundary. If it is missing but the request is clear, build the decision before drafting and record it in the output. If the one-sentence spine is vague, reader takeaway is unclear, or target length is unsupported by the topic payload, stop and route back to planning instead of padding the draft. For WeChat, choose one canonical article type and target length from references/wechat-writing-style.md before drafting: quick_opinion 800-1200, opinion_essay 1200-1800, practical_method 1200-1800, tutorial 1800-2600, workflow_template 1800-2600, trend_explainer 1800-2600, case_study 2200-3200, tool_list_comparison 2200-3200. For product updates, tool introductions, feature explainers, AI workflow updates, and ordinary opinion/news-analysis pieces, prefer 1800-2400 chars unless the article has a concrete long-form deliverable. Any draft above 3200 chars must record a long-form qualification in length_reason; any draft over 3800 chars is a long_special_report exception and requires explicit user confirmation. Also choose one density_level from references/wechat-writing-style.md: compact, standard, or expanded. Default from tight: product updates, feature explainers, short tool introductions, and one-point opinions use compact; tutorials and workflow explanations use standard; real testing, case studies, multi-option comparisons, reusable templates/checklists, and source-heavy analysis may use expanded.
- Build or validate
personal_style_briefbefore drafting. It must come from
the selected user profile plus any loaded account template, and it must shape this exact article rather than restating the profile generically:
``yaml personal_style_brief: source_profile: "" account_template: "" opening_strategy: "" core_judgment: "" practitioner_perspective: stance_type: "" # observer_judgment | hands_on_experience | workflow_practitioner | user_advisor usable_scene: "" author_would_do: "" likely_misuse: "" evidence_boundary: "" structure_strategy: "" selection_logic: "" paragraph_rhythm: "" must_sound_like: [] forbidden_shape: [] generic_template_risk: "" article_type_override: "" ``
Treat this brief as the writing engine below the selected title's promise. It must be derived from the active user profile for this task, not from any hardcoded creator voice inside the shared skill. For AI tools, product updates, workflow articles, tutorials, and practical tech explainers, practitioner_perspective is required: state whether the author is writing from observation, hands-on use, workflow practice, or user-advisor judgment; name one realistic use scene; say how the author would or would not use it; name one likely misuse; and state the evidence boundary. Do not fake hands-on experience. If there is no real test material, use observer_judgment or workflow_practitioner, not hands_on_experience. If the generic article type would produce a manual, average listicle, or equal-weight tool explanation that conflicts with the user's profile, use article_type_override to preserve the personal article backbone, but do not replace or hide the title's promised subject. Example: a title with "10 tools" may still be practical_method + curated_tool_path, but the 10 tools must remain visible article subjects; the method only explains the selection and order. If personal_style_brief is missing and a user profile is available, stop and build it before writing.
- Convert the loaded profile and
personal_style_briefinto
drafting_instruction.pre_draft_style_constraints before drafting. This object must be concrete enough to generate from, not merely to evaluate after the fact:
```yaml predraftstyleconstraints: sourceprofile: "" sourceaccounttemplate: "" openingmove: "" first300charsmustdo: [] corejudgmenttostate: "" practitionerperspective: stancetype: "" usablescene: "" authorwoulddo: "" authorwouldnotdo: "" likelymisuse: "" evidenceboundary: "" articlebackbone: "" sectionintent:
- section: ""
job: "" stylerequirement: "" paragraphrhythm: "" firstpersonstance: "" requiredjudgmentsignals: [] requiredreaderguidance: [] allowedlexicon: [] bannedshapes: [] rewrite_triggers: [] ```
Block drafting if:
core_judgment_to_stateis vague or only repeats the topic;- AI tool/product/workflow articles lack
practitioner_perspective; practitioner_perspective.stance_typeclaims hands-on use without real
user-provided or source-backed experience;
opening_movewould produce a product-doc or dictionary opening;article_backboneis a generic feature list when the profile calls for a
judgment-led article;
section_intentdoes not show how each section advances the profile-shaped
judgment;
banned_shapesandrewrite_triggersare missing.
- Choose one primary
platformandformat. - Lock the platform copy budget before drafting. Read
references/platform-copy-specs.md and references/title-spec.md, then record the budget in content_package.platform_copy_budget. For WeChat, title_cmm_hard_max: 25 is a hard production standard; the official draft API's 32-character limit is recorded only as title_official_api_max and must not be used to loosen title generation. The upstream content_plan should already contain a title_direction_gate; inherit its selected direction as the title promise, but do not treat it as the final publish title. For WeChat AI tool / product update / workflow topics, use references/wechat-title-templates.md to avoid flat feature-log titles while preserving subject and evidence boundaries. After正文 is drafted, run the final_title_gate: generate 3-5 final title candidates under the CMM hard max, compute the length with a tool, discard over-budget candidates before recommending, and write the result to title_quality_gate. Candidate pattern values must be one of the six canonical patterns in references/title-spec.md; do not invent ad-hoc labels such as "tool + action", "object + result", or "suggestion". Put those explanations in reason instead. Do not rely on model self-counting.
- Check evidence:
- If the plan has sources, use them and preserve source references.
- If evidence is weak or uninspected, keep claims cautious and add
fact_check_status: needs_review.
- Deep backfill: if the outline exposes a claim that needs a number, date,
case, or quote not present in the plan, call cmm-web-search in fact_check intent for that specific claim before drafting it. Planning owns breadth research; writing owns claim-level backfill.
- Before drafting, load or build
drafting_instructionfrom the selected
title, outline, writing decision, personal_style_brief, and pre_draft_style_constraints. This package is the generation instruction, not a post-draft rubric. Do not draft until it clearly states the title promise, what the正文 must center on, article shape, runtime-derived personal-style role, must-include items, forbidden drift, length strategy, and source boundaries. It must block drafting when:
- the title promises a counted list but the article shape hides the counted
objects;
personal_style_briefchanges the article from the title's subject to a
different framework;
pre_draft_style_constraintsare missing or generic;- the one-sentence spine no longer ans
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: chemny
- Source: chemny/cmm-content-factory
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.