Intent / The Why
The Neo Portal's News section currently surfaces four content types: Medium articles, Blog posts, Tickets, and Release Notes. However, two major content sources — Pull Requests and GitHub Discussions — are synced to local markdown (resources/content/pulls/, resources/content/discussions/) but never displayed in the portal. This means:
- PR conversations — which under the new PR-first workflow carry the richest architectural context (diff summaries, review scores, Fat Ticket metadata) — are invisible to human visitors and SEO crawlers.
- Discussions — which serve as the Ideation Sandbox for brainstorming — are similarly hidden despite being synced.
The old workflow committed directly to dev with context dumped into ticket comments. Under the new Swarm workflow, the PR body is where the signal lives. The portal must reflect this shift.
SEO Value
Each merged PR is a self-contained problem→solution document. Googlebot can index these as Q&A-style technical resources, extending the portal's organic reach. The same applies to discussions, which often capture architectural reasoning before it becomes a ticket.
LLM Value
PRs and discussions follow a natural Q&A reward signal pattern. PR body = problem statement + plan. PR comments = review signal + corrections. This structure is inherently useful for LLM RAG consumption.
Scope of Work
1. New JSON Index Generators (buildScripts/docs/index/)
Create two new scripts mirroring the existing tickets.mjs pattern:
pulls.mjs — Scans resources/content/pulls/*.md, parses frontmatter (number, title, author, state, mergedAt, base, head), generates apps/portal/resources/data/pulls.json as a flat-tree structure grouped by state (Merged / Open).
discussions.mjs — Scans resources/content/discussions/*.md, parses frontmatter, generates apps/portal/resources/data/discussions.json grouped by category.
Reference: buildScripts/docs/index/tickets.mjs is the canonical pattern to follow (frontmatter parsing, filtering, flat-tree output).
2. New Portal Tabs (apps/portal/view/news/)
Add two new tab items to TabContainer.mjs:
{
module: () => import('./pulls/MainContainer.mjs'),
header: {
iconCls: 'fa fa-code-pull-request',
route : '/news/pulls',
text : 'Pull Requests'
}
}, {
module: () => import('./discussions/MainContainer.mjs'),
header: {
iconCls: 'fa fa-comments',
route : '/news/discussions',
text : 'Discussions'
}
}Create pulls/MainContainer.mjs and discussions/MainContainer.mjs following the existing tickets/MainContainer.mjs pattern (TreeList + markdown article viewer).
3. SEO Routes (buildScripts/docs/seo/generate.mjs)
Add collectPRRoutes() and collectDiscussionRoutes() functions mirroring collectReleaseRoutes() and collectIssueRoutes(). Wire them into collectAllRoutes(). Add priority entries in getPriority():
/news/pulls/* → 0.6 priority
/news/discussions/* → 0.4 priority
Update getLlmsTxt() to include PR and Discussion sections.
Key Files
| File |
Action |
buildScripts/docs/index/pulls.mjs |
[NEW] JSON index generator |
buildScripts/docs/index/discussions.mjs |
[NEW] JSON index generator |
apps/portal/view/news/TabContainer.mjs |
[MODIFY] Add 2 new tab items |
apps/portal/view/news/pulls/MainContainer.mjs |
[NEW] PR viewer |
apps/portal/view/news/discussions/MainContainer.mjs |
[NEW] Discussion viewer |
buildScripts/docs/seo/generate.mjs |
[MODIFY] Add PR/Discussion route collectors |
Acceptance Criteria
Origin Session ID: 144326a4-c1e8-4eee-80e4-b984f3c79ddc
Intent / The Why
The Neo Portal's News section currently surfaces four content types: Medium articles, Blog posts, Tickets, and Release Notes. However, two major content sources — Pull Requests and GitHub Discussions — are synced to local markdown (
resources/content/pulls/,resources/content/discussions/) but never displayed in the portal. This means:The old workflow committed directly to
devwith context dumped into ticket comments. Under the new Swarm workflow, the PR body is where the signal lives. The portal must reflect this shift.SEO Value
Each merged PR is a self-contained problem→solution document. Googlebot can index these as Q&A-style technical resources, extending the portal's organic reach. The same applies to discussions, which often capture architectural reasoning before it becomes a ticket.
LLM Value
PRs and discussions follow a natural Q&A reward signal pattern. PR body = problem statement + plan. PR comments = review signal + corrections. This structure is inherently useful for LLM RAG consumption.
Scope of Work
1. New JSON Index Generators (
buildScripts/docs/index/)Create two new scripts mirroring the existing
tickets.mjspattern:pulls.mjs— Scansresources/content/pulls/*.md, parses frontmatter (number, title, author, state, mergedAt, base, head), generatesapps/portal/resources/data/pulls.jsonas a flat-tree structure grouped by state (Merged / Open).discussions.mjs— Scansresources/content/discussions/*.md, parses frontmatter, generatesapps/portal/resources/data/discussions.jsongrouped by category.Reference:
buildScripts/docs/index/tickets.mjsis the canonical pattern to follow (frontmatter parsing, filtering, flat-tree output).2. New Portal Tabs (
apps/portal/view/news/)Add two new tab items to
TabContainer.mjs:{ module: () => import('./pulls/MainContainer.mjs'), header: { iconCls: 'fa fa-code-pull-request', route : '/news/pulls', text : 'Pull Requests' } }, { module: () => import('./discussions/MainContainer.mjs'), header: { iconCls: 'fa fa-comments', route : '/news/discussions', text : 'Discussions' } }Create
pulls/MainContainer.mjsanddiscussions/MainContainer.mjsfollowing the existingtickets/MainContainer.mjspattern (TreeList + markdown article viewer).3. SEO Routes (
buildScripts/docs/seo/generate.mjs)Add
collectPRRoutes()andcollectDiscussionRoutes()functions mirroringcollectReleaseRoutes()andcollectIssueRoutes(). Wire them intocollectAllRoutes(). Add priority entries ingetPriority():/news/pulls/*→ 0.6 priority/news/discussions/*→ 0.4 priorityUpdate
getLlmsTxt()to include PR and Discussion sections.Key Files
buildScripts/docs/index/pulls.mjsbuildScripts/docs/index/discussions.mjsapps/portal/view/news/TabContainer.mjsapps/portal/view/news/pulls/MainContainer.mjsapps/portal/view/news/discussions/MainContainer.mjsbuildScripts/docs/seo/generate.mjsAcceptance Criteria
node buildScripts/docs/index/pulls.mjsgenerates validpulls.jsonnode buildScripts/docs/index/discussions.mjsgenerates validdiscussions.jsonOrigin Session ID: 144326a4-c1e8-4eee-80e4-b984f3c79ddc