Skip to content
Merged
Show file tree
Hide file tree
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
105 changes: 105 additions & 0 deletions .agents/plugins/evaluations/contentcloud-video-production-0.10.0.json

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,18 @@
"authentication": "ON_INSTALL"
},
"category": "Productivity"
},
{
"name": "contentcloud-wechat-article",
"source": {
"source": "local",
"path": "./plugins/contentcloud-wechat-article"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}
]
}
13 changes: 7 additions & 6 deletions .agents/plugins/registry.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@
{
"id": "contentcloud-video-production",
"kind": "scene_plugin",
"version": "0.9.0",
"version": "0.10.0",
"source": {
"repository": "https://github.com/limecloud/contentcloud",
"ref": "v0.9.0"
"ref": "v0.10.0"
},
"license": "Apache-2.0",
"digest": "sha256:30a5a5c5c3109d86aa272451a8df0a30c269df9a91fdad9c8e7cdce93f0e8bdc",
"digest": "sha256:1764592f24775b3d0f8c650c0956da18b6b088ed399fcbb57c2ec8f1867f0ab8",
"signature": {
"status": "verified",
"algorithm": "ed25519",
"key_id": "contentcloud-plugin-release-2026-07",
"value": "mTdUw7bh2wmkEdVIWdjGMxfBgvzGiIl3fl8uwRG9d05h1J+7WbEAAUQyAmgD5O4HnUbHAM82xFpmm5I/vvWfBw=="
"value": "6JZTOvfm6vOTOyUlWg2KCOBoaWGnaOtLBKaV5avWjKrh/Ht0sjuizDCgQ/mnOv+HAaibKn5zHKMrHsxvan1ZCQ=="
},
"compatible_profiles": [
"contentcloud.video-production"
Expand Down Expand Up @@ -54,8 +54,8 @@
],
"evaluation": {
"status": "passed",
"report": ".agents/plugins/evaluations/contentcloud-video-production-0.9.0.json",
"digest": "sha256:93dacddb4ea9a69a3a02ec0b914821694b2e022beed3e497590c7b58b3da348e",
"report": ".agents/plugins/evaluations/contentcloud-video-production-0.10.0.json",
"digest": "sha256:e3131d21bd61e8c08639295b9c2f58b663eba421c0448023037e9b4a46593e18",
"evidence": [
"codex-plugin-transaction",
"bootstrap-confirmation",
Expand All @@ -65,6 +65,7 @@
"knowledge-contract",
"content-contract",
"v5-local-production-boundary",
"wechat-article-governance",
"browser-navigation-safety",
"environment-control-plane",
"agent-client-governance"
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ jobs:
- run: test -z "$(gofmt -l ./cmd ./internal ./contracts ./migrations ./plugins)"
- run: go vet ./...
- run: go test -race ./...
- run: pnpm governance:v3
- run: pnpm governance:content
- run: pnpm evaluate:plugin
- run: pnpm test:plugin-signing
- run: pnpm check:plugin
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ web/vite.config.d.ts
*.log
.playwright-mcp/
register-create.png
.gstack/
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,26 @@

ContentCloud 的重要变更记录在此文件中。

## [0.10.0] - 2026-07-30

### Added

- 增加按租户开通的内容能力管理;视频剧本保持默认能力,平台管理员可在 Web 管理端显式启用微信公众号文章,并由签名 Environment Manifest 同步到本地 Workspace。
- 增加 ArticleBrief、ArticleItem 和 WeChatDeliveryPackage 契约,以及文章规划、长文写作、视觉规划和微信交付四个 Skills;CLI/MCP 支持批次冻结、确定性 lint、受控 revision diff 和本地交付包导出。
- 增加同源公开文档中心,Web `/docs`、JSON API 与 `Accept: text/markdown` 共享内嵌目录;覆盖 Agent 客户端、内容类型、工作流和故障排查,并明确内部架构文档不对外暴露。
- 增加 PostgreSQL `00003_tenant_content_capabilities.sql`,以增量表保存租户内容能力,不改写现有项目、Submission、Revision 或 ApprovedSnapshot 数据。

### Changed

- ContentBatch 从视频专用结构扩展为显式 `content_kind`、Schema 引用和交付 Profile 路由;服务端发布、内审和客户批准均复验租户能力、ArticleBrief、Knowledge ApprovedSnapshot 与商业主张血缘。
- Web 客户审批页可按 Schema 展示视频剧本或结构化公众号文章,并将评论稳定绑定到文章 block、assertion 和 Revision digest。
- CLI、Web、npm 安装器、视频 Plugin、MCP、Environment Profile 和 bootstrap 固定版本统一升级到 `0.10.0`;微信文章 Skill Pack 首版为 `0.1.0`,只提供受治理的本地人工交付,不登录或代替用户发布到微信。

### Fixed

- 发布和批准阶段会再次拒绝未开通内容类型、混合内容批次、缺少已批准 ArticleBrief/Knowledge 基线及 Claim 类型不匹配,避免本地状态或旧 Manifest 绕过服务端治理。
- 文档 API 对 Markdown 协商、未知页面与内部页面执行明确的内容类型、缓存和不可见边界,避免 SPA fallback 将不存在的 Skill 引用伪装为成功响应。

## [0.9.0] - 2026-07-29

### Added
Expand Down
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ check:
go fmt ./...
go vet ./...
go test ./...
pnpm governance:v3
pnpm governance:content
pnpm test:plugin-signing
pnpm check:plugin
pnpm --dir web typecheck
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ web/ React + TypeScript 工作台与客户审批页
docs/roadmap/v2/ V2 产品、架构、流程、安全、计划与实现状态
```

## 使用文档

多客户端、多内容形态的用户指南以 [`docs/content/README.md`](docs/content/README.md) 为单一事实源。运行服务后可通过公开 `/docs` 文档中心查看;Agent 可使用 `Accept: text/markdown` 读取同源页面。内部扩展架构稿位于 `docs/content/internal/`,不会进入公开文档 API。

## 本地开发

要求 Go 1.24+、Node.js 22+、pnpm 10+。
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.9.0
0.10.0
45 changes: 45 additions & 0 deletions contracts/article-1.0.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://contentcloud.goodvision.cn/schemas/article-1.0.schema.json",
"title": "ContentCloud ArticleItem 1.0",
"type": "object",
"additionalProperties": false,
"required": ["id", "type", "status", "schema_version", "deliverability", "project_id", "content_id", "content_batch_id", "brief_ref", "context_snapshot_id", "resolved_comment_ids", "language", "title_candidates", "selected_title_id", "summary", "author_display_name", "cover", "blocks", "attribution", "editorial_checks", "channel_hints", "blocked_reasons", "missing_inputs"],
"properties": {
"id": {"type": "string", "minLength": 1},
"type": {"const": "article_item"},
"status": {"enum": ["candidate", "blocked"]},
"schema_version": {"const": "contentcloud.article/1.0"},
"deliverability": {"enum": ["review_ready", "blocked"]},
"project_id": {"type": "string", "minLength": 1},
"content_id": {"type": "string", "minLength": 1},
"content_batch_id": {"type": "string", "minLength": 1},
"brief_ref": {"type": "string", "minLength": 1},
"context_snapshot_id": {"type": "string", "minLength": 1},
"based_on_version_id": {"type": "string"},
"resolved_comment_ids": {"type": "array", "uniqueItems": true, "items": {"type": "string"}},
"change_summary": {"type": "string"},
"language": {"const": "zh-CN"},
"title_candidates": {"type": "array", "minItems": 1, "maxItems": 5, "items": {"$ref": "#/$defs/title"}},
"selected_title_id": {"type": "string", "minLength": 1},
"summary": {"type": "string", "minLength": 1, "maxLength": 120},
"author_display_name": {"type": "string", "minLength": 1},
"cover": {"$ref": "#/$defs/image"},
"blocks": {"type": "array", "items": {"$ref": "#/$defs/block"}},
"attribution": {"$ref": "#/$defs/attribution"},
"editorial_checks": {"$ref": "#/$defs/checks"},
"channel_hints": {"$ref": "#/$defs/hints"},
"blocked_reasons": {"type": "array", "items": {"$ref": "#/$defs/blocked_reason"}},
"missing_inputs": {"type": "array", "items": {"type": "string"}}
},
"$defs": {
"title": {"type": "object", "additionalProperties": false, "required": ["id", "text", "strategy", "risk_refs"], "properties": {"id": {"type": "string"}, "text": {"type": "string", "minLength": 1, "maxLength": 64}, "strategy": {"type": "string", "minLength": 1}, "risk_refs": {"type": "array", "items": {"type": "string"}}}},
"image": {"type": "object", "additionalProperties": false, "required": ["asset_ref", "rights_ref", "alt_text", "caption", "purpose"], "properties": {"asset_ref": {"type": "string"}, "rights_ref": {"type": "string"}, "alt_text": {"type": "string"}, "caption": {"type": "string"}, "purpose": {"type": "string"}}},
"assertion": {"type": "object", "additionalProperties": false, "required": ["id", "type", "knowledge_refs", "evidence_refs", "attribution"], "properties": {"id": {"type": "string", "minLength": 1}, "type": {"enum": ["fact", "commercial_claim", "quotation", "editorial_opinion", "personal_experience", "hypothesis"]}, "knowledge_refs": {"type": "array", "uniqueItems": true, "items": {"type": "string"}}, "evidence_refs": {"type": "array", "uniqueItems": true, "items": {"type": "string"}}, "attribution": {"type": "string"}}},
"block": {"type": "object", "additionalProperties": false, "required": ["id", "type", "text", "level", "ordered", "items", "asset_ref", "rights_ref", "alt_text", "caption", "purpose", "callout_kind", "target", "assertions", "style_marks"], "properties": {"id": {"type": "string", "minLength": 1}, "type": {"enum": ["heading", "paragraph", "list", "quote", "image", "callout", "divider", "cta"]}, "text": {"type": "string"}, "level": {"type": "integer", "minimum": 0, "maximum": 3}, "ordered": {"type": "boolean"}, "items": {"type": "array", "items": {"type": "string"}}, "asset_ref": {"type": "string"}, "rights_ref": {"type": "string"}, "alt_text": {"type": "string"}, "caption": {"type": "string"}, "purpose": {"type": "string"}, "callout_kind": {"enum": ["", "note", "conclusion", "warning"]}, "target": {"type": "string"}, "assertions": {"type": "array", "items": {"$ref": "#/$defs/assertion"}}, "style_marks": {"type": "array", "uniqueItems": true, "items": {"enum": ["strong", "emphasis"]}}}},
"attribution": {"type": "object", "additionalProperties": false, "required": ["source_names", "disclosure"], "properties": {"source_names": {"type": "array", "items": {"type": "string"}}, "disclosure": {"type": "string"}}},
"checks": {"type": "object", "additionalProperties": false, "required": ["schema_checked", "knowledge_checked", "claims_checked", "quotations_checked", "rights_checked", "channel_checked"], "properties": {"schema_checked": {"type": "boolean"}, "knowledge_checked": {"type": "boolean"}, "claims_checked": {"type": "boolean"}, "quotations_checked": {"type": "boolean"}, "rights_checked": {"type": "boolean"}, "channel_checked": {"type": "boolean"}}},
"hints": {"type": "object", "additionalProperties": false, "required": ["highlight_block_ids", "preferred_line_break_block_ids"], "properties": {"highlight_block_ids": {"type": "array", "uniqueItems": true, "items": {"type": "string"}}, "preferred_line_break_block_ids": {"type": "array", "uniqueItems": true, "items": {"type": "string"}}}},
"blocked_reason": {"type": "object", "additionalProperties": false, "required": ["code", "message", "owner_role", "next_action"], "properties": {"code": {"type": "string"}, "message": {"type": "string"}, "owner_role": {"type": "string"}, "next_action": {"type": "string"}}}
}
}
43 changes: 43 additions & 0 deletions contracts/article-brief-1.0.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://contentcloud.goodvision.cn/schemas/article-brief-1.0.schema.json",
"title": "ContentCloud ArticleBrief 1.0",
"type": "object",
"additionalProperties": false,
"required": ["id", "kind", "status", "schema_version", "deliverability", "intent_id", "channel", "topic", "reader_promise", "content_pillar", "objective", "audience", "reading_context", "structure_type", "section_goals", "opening_strategy", "ending_strategy", "target_word_count", "min_word_count", "max_word_count", "voice", "tone", "narrative_person", "required_knowledge_ids", "approved_claim_ids", "asset_ids", "rights_ids", "cover_intent", "cta", "primary_variable", "controlled_variables", "blocked_reasons", "missing_inputs"],
"properties": {
"id": {"type": "string", "minLength": 1},
"kind": {"const": "article_brief"},
"status": {"enum": ["candidate", "blocked"]},
"schema_version": {"const": "contentcloud.article-brief/1.0"},
"deliverability": {"enum": ["review_ready", "blocked"]},
"intent_id": {"type": "string", "minLength": 1},
"channel": {"const": "wechat_official_account"},
"topic": {"type": "string", "minLength": 1},
"reader_promise": {"type": "string", "minLength": 1},
"content_pillar": {"type": "string", "minLength": 1},
"objective": {"type": "string", "minLength": 1},
"audience": {"type": "string", "minLength": 1},
"reading_context": {"type": "string", "minLength": 1},
"structure_type": {"enum": ["problem_solution", "how_to", "case_study", "brand_story", "opinion_analysis", "curated_guide"]},
"section_goals": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}},
"opening_strategy": {"type": "string", "minLength": 1},
"ending_strategy": {"type": "string", "minLength": 1},
"target_word_count": {"type": "integer", "minimum": 100, "maximum": 20000},
"min_word_count": {"type": "integer", "minimum": 100, "maximum": 20000},
"max_word_count": {"type": "integer", "minimum": 100, "maximum": 20000},
"voice": {"type": "string", "minLength": 1},
"tone": {"type": "string", "minLength": 1},
"narrative_person": {"enum": ["first", "second", "third"]},
"required_knowledge_ids": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string"}},
"approved_claim_ids": {"type": "array", "uniqueItems": true, "items": {"type": "string"}},
"asset_ids": {"type": "array", "uniqueItems": true, "items": {"type": "string"}},
"rights_ids": {"type": "array", "uniqueItems": true, "items": {"type": "string"}},
"cover_intent": {"type": "string", "minLength": 1},
"cta": {"type": "string", "minLength": 1},
"primary_variable": {"enum": ["title", "opening", "structure", "cta", "cover"]},
"controlled_variables": {"type": "array", "uniqueItems": true, "items": {"enum": ["title", "opening", "structure", "cta", "cover"]}},
"blocked_reasons": {"type": "array", "items": {"type": "string"}},
"missing_inputs": {"type": "array", "items": {"type": "string"}}
}
}
5 changes: 4 additions & 1 deletion contracts/content-batch-3.0.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@
"title": "ContentCloud ContentBatch 3.0",
"type": "object",
"additionalProperties": false,
"required": ["schema_version", "id", "intent_id", "brief_ref", "knowledge_snapshot_refs", "status", "publishable", "content_item_refs", "blocked_reasons", "checks"],
"required": ["schema_version", "id", "intent_id", "content_kind", "content_schema_ref", "delivery_profiles", "brief_ref", "knowledge_snapshot_refs", "status", "publishable", "content_item_refs", "blocked_reasons", "checks"],
"properties": {
"schema_version": {"const": "contentcloud.content-batch/3.0"},
"id": {"type": "string", "minLength": 1},
"intent_id": {"type": "string", "minLength": 1},
"content_kind": {"enum": ["video_script", "wechat_article"]},
"content_schema_ref": {"enum": ["contentcloud.content-item/3.0", "contentcloud.article/1.0"]},
"delivery_profiles": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"enum": ["json", "markdown", "xlsx", "wechat_html", "asset_manifest", "operator_readme"]}},
"brief_ref": {"type": "string", "minLength": 1},
"knowledge_snapshot_refs": {"type": "array", "minItems": 1, "items": {"type": "string"}},
"status": {"enum": ["candidate", "blocked", "review_ready", "approved", "delivered"]},
Expand Down
9 changes: 8 additions & 1 deletion contracts/creative-environment-manifest-1.0.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"title": "Creative Environment Manifest 1.0",
"type": "object",
"additionalProperties": false,
"required": ["schema_version", "project_id", "profile_id", "profile_version", "environment_version", "harness", "distribution", "workspace_template", "capabilities", "policies", "issued_at", "expires_at", "digest", "signature"],
"required": ["schema_version", "project_id", "profile_id", "profile_version", "environment_version", "harness", "distribution", "workspace_template", "capabilities", "content_types", "policies", "issued_at", "expires_at", "digest", "signature"],
"properties": {
"schema_version": {"const": "1.0"},
"project_id": {"type": "string", "minLength": 1},
Expand All @@ -23,6 +23,13 @@
},
"workspace_template": {"$ref": "#/$defs/workspace_template"},
"capabilities": {"$ref": "#/$defs/capabilities"},
"content_types": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"contains": {"const": "video_script"},
"items": {"enum": ["video_script", "wechat_article"]}
},
"policies": {"$ref": "#/$defs/policies"},
"issued_at": {"type": "string", "format": "date-time"},
"expires_at": {"type": "string", "format": "date-time"},
Expand Down
9 changes: 9 additions & 0 deletions contracts/embed.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,15 @@ var ContentBatchV3Schema []byte
//go:embed content-item-3.0.schema.json
var ContentItemV3Schema []byte

//go:embed article-brief-1.0.schema.json
var ArticleBriefV1Schema []byte

//go:embed article-1.0.schema.json
var ArticleV1Schema []byte

//go:embed wechat-delivery-1.0.schema.json
var WeChatDeliveryV1Schema []byte

//go:embed brief-3.0.schema.json
var BriefV3Schema []byte

Expand Down
3 changes: 3 additions & 0 deletions contracts/embed_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ func TestEmbeddedSchemasAreValidJSON(t *testing.T) {
"handoff-1.0": HandoffV1Schema,
"content-batch-3.0": ContentBatchV3Schema,
"content-item-3.0": ContentItemV3Schema,
"article-brief-1.0": ArticleBriefV1Schema,
"article-1.0": ArticleV1Schema,
"wechat-delivery-1.0": WeChatDeliveryV1Schema,
"brief-3.0": BriefV3Schema,
"creative-directions-3.0": CreativeDirectionsV3Schema,
"submission-bundle-3.0": SubmissionBundleV3Schema,
Expand Down
Loading
Loading