feat(WP-0015/B1-B6): StaticPages controller and public intro/tutorial UI

B1 — Web/Controller/StaticPages.hs: LandingAction, CapabilitiesAction,
     TutorialAction, ExtensionGuideAction (no auth guard)
B2 — Web/View/StaticPages/Landing.hs: hero, traceability chain, capability
     grid, GAAF status bar, CTAs to capabilities and management UI
B3 — Web/View/StaticPages/Capabilities.hs: 12-phase capability map, GAAF
     scorecard, API v1/v2 surface table, learning loop, type registry system
B4 — Web/View/StaticPages/Tutorial.hs: 6-step developer tutorial (widgets,
     events, governance, deployment, learning, federation)
     Web/View/StaticPages/ExtensionGuide.hs: 6-step hub extension guide
     (HubCapabilityManifest, type registry, widgets, patterns, agents)
     with GAAF rules summary
B5 — Web/Routes.hs: StaticPagesController manual routes; "/" → Landing,
     "/capabilities", "/tutorial", "/extension-guide"
     Web/Types.hs: StaticPagesController data type
B6 — Web/FrontController.hs: import StaticPagesController; register route
     (last, catches root); nav adds About/Tutorial/Extend links and
     separator; logo now links to LandingAction

B7 (deployment verification) remains pending until devenv up is available.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-08 02:02:44 +00:00
parent 74bab5f6f2
commit 5510ae22da
8 changed files with 591 additions and 1 deletions

View File

@@ -70,6 +70,8 @@ import Web.Controller.LineageEnrichment ()
import Web.Controller.LearningDashboard ()
import Web.Controller.Api.V2.Learning ()
import Web.Controller.Sessions ()
-- WP-0015 — Public intro / tutorial pages
import Web.Controller.StaticPages ()
instance FrontController WebApplication where
controllers =
@@ -135,6 +137,8 @@ instance FrontController WebApplication where
, parseRoute @LineageEnrichmentController
, parseRoute @LearningDashboardController
, parseRoute @ApiV2LearningController
-- WP-0015 — Public intro / tutorial pages (must be last; catches "/" root)
, parseRoute @StaticPagesController
]
instance InitControllerContext WebApplication where
@@ -165,7 +169,11 @@ defaultLayout inner = [hsx|
</head>
<body class="bg-gray-50 text-gray-900">
<nav class="bg-white border-b border-gray-200 px-6 py-3 flex items-center gap-6">
<a href={HubsAction} class="font-semibold text-indigo-600">inter-hub</a>
<a href={LandingAction} class="font-semibold text-indigo-600">inter-hub</a>
<a href={CapabilitiesAction} class="text-sm text-gray-600 hover:text-gray-900">About</a>
<a href={TutorialAction} class="text-sm text-gray-600 hover:text-gray-900">Tutorial</a>
<a href={ExtensionGuideAction} class="text-sm text-gray-600 hover:text-gray-900">Extend</a>
<span class="text-gray-200">|</span>
<a href={HubsAction} class="text-sm text-gray-600 hover:text-gray-900">Hubs</a>
<a href={WidgetsAction} class="text-sm text-gray-600 hover:text-gray-900">Widgets</a>
<a href={RequirementCandidatesAction} class="text-sm text-gray-600 hover:text-gray-900">Candidates</a>