awcms-news-portal
Provides architectural specifications for porting the AWCMS news portal module, including R2 storage and media registry.
Install
mkdir -p .claude/skills/awcms-news-portal && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/19084" && unzip -o skill.zip -d .claude/skills/awcms-news-portal && rm skill.zipInstalls to .claude/skills/awcms-news-portal
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
BACAAN SAJA — modul news_portal BELUM di-port ke repo ini (ada di awcms-mini; `ls src/modules` tidak memuatnya, tidak ada migration-nya di `sql/`; bergantung pada blog_content/tenant_domain yang juga belum di-port). Rujukan modul/tabel/`sql/NNN` di dalamnya adalah artefak awcms-mini, penomoran mini. Pakai sebagai spesifikasi target saat MEM-PORT (via `awcms-port-from-mini`), bukan panduan implementasi kode yang bisa dipanggil — verifikasi `ls src/modules` dulu. Konteks port (Issue #631-#642, #649). Gunakan saat menambah/mengubah preset full-online R2-only, media object registry, presigned upload flow, R2 readiness checks, homepage composer, ad/video/quality-checklist berbasis media R2, tag linking, atau SEO/social preview `/news`. Merangkum keputusan arsitektur yang sudah dibuat (docs/awcms/news-portal/) supaya issue lanjutan tidak mengulang/kontradiksi.Key capabilities
- →Port news portal modules from awcms-mini
- →Configure full-online R2-only media presets
- →Implement presigned R2 upload flows
- →Validate R2 readiness and security checks
- →Compose editorial homepage sections
- →Link internal tags for news content
How it works
This skill acts as a specification reference for porting news portal features from the awcms-mini repository to the current architecture. It provides architectural constraints and status tracking for R2-only media integration.
Inputs & outputs
When to use awcms-news-portal
- →Porting news portal modules
- →Implementing R2 media features
- →Reviewing architectural decisions for media registry
About this skill
🇬🇧 English (source) · 🇮🇩 Bahasa Indonesia
AWCMS — News Portal (full-online R2-only media)
<!-- sql-refs: awcms-mini — the `sql/NNN` numbers in this skill body use awcms-mini numbering; the module HAS BEEN ported to awcms as `sql/041`–`sql/045` (see the module README + the real `sql/` for the actual numbers) -->STATUS — THIS MODULE NO LONGER EXISTS (ADR-0044, PR #300).
news_portalwas MERGED intoblog_content. What changed, and what must be read before a single line of code is written from this skill:<details> <summary>Old port status (pre-ADR-0044, kept for context)</summary>
src/modules/news-portal/deleted;src/modules/index.tsdoes not load it (registry = 21 modules). There is nobasePath /api/v1/news-portal.- Its features are not gone: the homepage-section composer and ad placement with a verified
media_object_idare now owned byblog_content, with widened targeting (#301), a legacy ad ingest job (#302), the free-URL ad write path closed off (#303), and a gated content-block vocabulary (#304).- The
awcms_news_portal_*table names are KEPT (ADR-0036 precedent: hard composite FK from ad placements). A table name is therefore NOT a hint about which module owns it here.- Its OpenAPI contract moved too (PR #308).
openapi/modules/news-portal.openapi.yamlwas deleted; the four/api/v1/news-portal/*paths and their schemas now live inopenapi/modules/blog-content.openapi.yaml. The path names and tag names (News Portal Homepage Sections/News Portal Ad Placements) were deliberately NOT changed — ADR-0044 §3/§6 moves ownership, not the public surface; the only thing corrected was the module attribution in the tag descriptions. The fragment ownership gate now rejects a fragment with no owning module, so this oversight cannot silently recur.- To change those features: the
awcms-blog-contentskill. For media:awcms-media-library. This skill no longer has any code to change.- The body below is kept as the pre-merge specification because §640 is still referenced by
src/modules/blog-content/README.mdfor the content-quality checklist rules. Every file path inside it is history.
news_portalused to be real here:src/modules/news-portal, migrationssql/041_awcms_news_media_object_registry_schema.sql–sql/045_awcms_news_portal_ad_placements_schema.sql, 4awcms_news_*tables (allFORCE ROW LEVEL SECURITY). This skill is now a guide to changing/adding real code. Readsrc/modules/news-portal/README.md
sql/for accurate numbers/tables.⚠ ADR-0036 INVERSION (MUST READ — it changes media ownership): media is NO LONGER owned by news_portal. Migrations
052/053/054extract the ENTIRE media registry (awcms_news_media_objects), presigned upload/finalize/cancel, MIME sniffer, R2 config/client/verification, categorization, and thenews-media:reconcilejob OUT ofnews-portal/into the new modulesrc/modules/media-library/(filesnews-media-*→media-*, internal symbolsfetchNewsMediaObjectById/NewsMediaObjectViewKEPT). The port_shared/ports/news-media-port.tswas DELETED →media-library-port.ts(MediaLibraryPort,isManagedMediaEnforcementActiveForTenant). Permissionnews_portal.media.*→media_library.media.*(destructive repointsql/052). For anything about media (upload, registry, reconcile, R2 config, enforcement) use theawcms-media-libraryskill, NOT this one. news_portal here is only homepage sections + ad placements; it CONSUMESmedia_library. Most of the skill body below still specifies the PRE-inversion (mini) shape — treat its media sections as history, not as where the code lives now.AWCMS PORT DELTA (MUST READ — most of the skill body below specifies the mini shape; this is what DIFFERS here):
- DROPPED: the host-resolved
/news/**family of public routes (index, detail, category, tag, search, feed, sitemap) along with their render helpers (homepage-section-composer,homepage-section-rendering,news-share-config). They needlib/tenant/public-host-tenant-resolver.ts+ envPUBLIC_TENANT_RESOLUTION_MODEfrom thetenant_domainmodule. UPDATE 2026-07-25:tenant_domainHAS BEEN ported (#219,sql/046–048), so the foundation blocker is gone — but the/news/**routes themselves are still not adopted. Do not build/reference/news/**as existing; adopting it now is work of its own, not an automatic consequence oftenant_domain. (The public route that DOES exist =/blog/{tenantCode}owned byblog_content, path-based ADR-0009.)- DROPPED: activation of the
news_portal_full_online_r2preset (apply-news-portal-preset.ts) — it needs themodule_managementpreset subsystem, which has not been ported. Theawcms_news_portal_tenant_statetable + readerisFullOnlineR2ModeAppliedForTenantstill exist (forward-compatible) but without a writer (inert). Post-ADR-0036, managed-media enforcement is driven bymedia_libraryviaisManagedMediaEnforcementActiveForTenant(readiness + per-tenant flagsql/053), switched on viaPOST /api/v1/media/ enforcement— NO LONGER the oldisFullOnlineR2ModeActiveForTenantport.- What was ACTUALLY ported & active IN news_portal: the homepage section composer + ad placements (
sql/044/045). The media registry + presigned upload/finalize + MIME sniff/SHA-256 + thenews-media:reconcilejob have MOVED tomedia_library(ADR-0036) — see theawcms-media-libraryskill. Thenews_mediacapability is retired; news_portal now CONSUMESmedia_library.NEWS_MEDIA_R2_*env pre-validation (validate-env + 3 security-readiness checks) was deferred during the port — the module is fail-safe without it at runtime.- The
sql/NNNnumbers in the skill body = awcms-mini numbering; the real ones in awcms aresql/041–sql/045.
The news_portal epic (#631-#642, #649) adds an editorial + media layer on top
of blog_content (base module, already active) and online public routing
(tenant_domain, ADR-0009/ADR-0010), specifically for full-online
deployments that turn on R2-only mode for news images. The follow-on epic
social-publishing (#643-#647) depends on this epic's architectural
foundation (particularly the #633 media registry for images shared to social
platforms) but is not part of the status table below — see the separate
skill/documentation once that epic starts.
</details>
When to use this skill vs the generic skills
This skill complements (does not replace) awcms-new-endpoint,
awcms-new-migration, awcms-integration (outbox/circuit-breaker
patterns for R2, ADR-0006), awcms-idempotency (the upload confirm
mutation), awcms-sensitive-data (photos are potentially PII),
awcms-abac-guard, and awcms-blog-content (the
post/page/gallery/ads content model that consumes the media registry).
This skill provides the epic-specific cross-cutting context — above
all the "R2-only, bucket separate from sync-storage" decision that must
be preserved in every issue.
Read first: docs/awcms/news-portal/full-online-r2-architecture.md
before working on any issue in this epic — that document (not this
skill) is the architectural source of truth; this skill summarises
status + pointers, it does not duplicate its contents.
Status per issue (do not rebuild what already exists)
| Issue | Scope | Status |
|---|---|---|
| #631 | Full-online R2-only architecture documentation + SOP + security + IR + backup + user guide | Done — see §Existing documents below |
| #632 | news_portal_full_online_r2 preset (module descriptor/config gate) | Done — see §632 below |
| #633 | Tenant-scoped R2-only media object registry (schema + migration) | Done — see §633 below |
| #634 | Direct-to-R2 presigned upload flow (upload/confirm endpoints) | Done — see §634 below |
| #635 | Config validation + readiness checks (config:validate/security:readiness/production:preflight) for R2 image delivery | Done — see §635 below |
| #636 | blog_content must reference an R2 media object for news images when the mode is active | Done — see §636 below |
| #637 | Editorial homepage section composer /news with R2-only rendering | Done — see §637 below |
| #638 | News portal ad placement preset with R2-only image validation | Done — see §638 below |
| #639 | video_news content block with a mandatory R2 thumbnail | Done — see §639 below |
| #640 | Publishing content quality checklist with an R2 image requirement | Done — see §640 below |
| #641 | Automatic internal tag linking for post/news content | Done — see §641 below |
| #642 | Public social sha |
Content truncated.
When not to use it
- →Offline or LAN-only deployments
- →Projects requiring local filesystem fallback
- →Deployment profiles without explicit R2 preset activation
Prerequisites
Limitations
- →Modul news_portal is not yet ported to the current repository
- →SQL migration numbering follows awcms-mini, not the current repo
- →SVG files are prohibited by default
How it compares
Unlike a standard implementation guide, this skill serves as a target specification for porting existing modules while enforcing strict architectural boundaries like R2-only storage.
Compared to similar skills
awcms-news-portal side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| awcms-news-portal (this skill) | 0 | 1mo | Caution | Advanced |
| architecture-patterns | 55 | 3mo | No flags | Advanced |
| kotlin-multiplatform | 32 | 4mo | Review | Advanced |
| nodejs-best-practices | 28 | 7mo | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
architecture-patterns
wshobson
Implement proven backend architecture patterns including Clean Architecture, Hexagonal Architecture, and Domain-Driven Design. Use when architecting complex backend systems or refactoring existing applications for better maintainability.
kotlin-multiplatform
vitorpamplona
Platform abstraction decision-making for Amethyst KMP project. Guides when to abstract vs keep platform-specific, source set placement (commonMain, jvmAndroid, platform-specific), expect/actual patterns. Covers primary targets (Android, JVM/Desktop, iOS) with web/wasm future considerations. Integrates with gradle-expert for dependency issues. Triggers on: abstraction decisions ("should I share this?"), source set placement questions, expect/actual creation, build.gradle.kts work, incorrect placement detection, KMP dependency suggestions.
nodejs-best-practices
davila7
Node.js development principles and decision-making. Framework selection, async patterns, security, and architecture. Teaches thinking, not copying.
workflow-orchestration-patterns
wshobson
Design durable workflows with Temporal for distributed systems. Covers workflow vs activity separation, saga patterns, state management, and determinism constraints. Use when building long-running processes, distributed transactions, or microservice orchestration.
java-pro
sickn33
Master Java 21+ with modern features like virtual threads, pattern matching, and Spring Boot 3.x. Expert in the latest Java ecosystem including GraalVM, Project Loom, and cloud-native patterns. Use PROACTIVELY for Java development, microservices architecture, or performance optimization.
arm-cortex-expert
sickn33
Senior embedded software engineer specializing in firmware and driver development for ARM Cortex-M microcontrollers (Teensy, STM32, nRF52, SAMD). Decades of experience writing reliable, optimized, and maintainable embedded code with deep expertise in memory barriers, DMA/cache coherency, interrupt-driven I/O, and peripheral drivers.