Default domain was retired slug "custodian", so POST /technical-debt/ returned 422 and the modal failed after open. Use infotech, resolve apiBase like config.js, and surface API error detail in the toast.
144 lines
7.2 KiB
JavaScript
144 lines
7.2 KiB
JavaScript
import {readFileSync} from "node:fs";
|
|
import {fileURLToPath} from "node:url";
|
|
import {dirname, join} from "node:path";
|
|
|
|
// Read improvement-modal.js at config load time and inject as a plain <script>.
|
|
// Observable Framework proxies all src/*.js files through its own module
|
|
// bundler — they cannot be imported via a raw <script type="module"> in <head>.
|
|
// Reading the file here and stripping the ES module export is the reliable path.
|
|
const _configDir = dirname(fileURLToPath(import.meta.url));
|
|
const _modalScript = readFileSync(
|
|
join(_configDir, "src/components/improvement-modal.js"), "utf-8"
|
|
)
|
|
// Strip ES module exports so the file can run as a plain <script>.
|
|
.replace(/^export function /gm, "function ")
|
|
.replace(/^export const /gm, "const ")
|
|
+ "\ninitImprovementModal();\n"; // auto-initialise
|
|
|
|
export default {
|
|
root: "src",
|
|
title: "Custodian State Hub",
|
|
pages: [
|
|
// ── Pages (Overview first, then alphabetical) ────────────────────────────
|
|
{ name: "Overview", path: "/" },
|
|
{ name: "Capabilities", path: "/capability-requests" },
|
|
{ name: "Contributions", path: "/contributions" },
|
|
{
|
|
name: "Domains",
|
|
path: "/domains",
|
|
collapsible: true,
|
|
open: false,
|
|
pages: [
|
|
{ name: "RecentlyOnScope", path: "/domains/recently-on-scope" },
|
|
],
|
|
},
|
|
{ name: "Goals", path: "/goals" },
|
|
{ name: "Inbox", path: "/inbox" },
|
|
{ name: "Progress", path: "/progress" },
|
|
{ name: "Token Cost", path: "/token-cost" },
|
|
{
|
|
name: "Services",
|
|
collapsible: true,
|
|
open: false,
|
|
pages: [
|
|
{ name: "Third Party", path: "/tpsc" },
|
|
{ name: "First Party", path: "/services/first-party" },
|
|
{ name: "Self Hosted", path: "/services/self-hosted" },
|
|
],
|
|
},
|
|
{ name: "Todo", path: "/todo" },
|
|
{ name: "Tools & Apps", path: "/tools" },
|
|
// ── Sections (alphabetical) ───────────────────────────────────────────────
|
|
{
|
|
name: "Policies",
|
|
collapsible: true,
|
|
open: false,
|
|
pages: [
|
|
{ name: "Repository DoI", path: "/policy/repo-doi" },
|
|
{ name: "Service DoM", path: "/policy/service-dom" },
|
|
{ name: "Workplan DoD", path: "/policy/workstream-dod" },
|
|
],
|
|
},
|
|
{
|
|
name: "Repositories",
|
|
path: "/repos",
|
|
collapsible: true,
|
|
open: false,
|
|
pages: [
|
|
{ name: "Debt", path: "/techdept" },
|
|
{ name: "Repo Sync", path: "/repo-sync" },
|
|
{ name: "SBOM", path: "/sbom" },
|
|
],
|
|
},
|
|
{
|
|
name: "Workplans",
|
|
path: "/workstreams",
|
|
collapsible: true,
|
|
open: false,
|
|
pages: [
|
|
{ name: "Decisions", path: "/decisions" },
|
|
{ name: "Dependencies", path: "/dependencies" },
|
|
{ name: "Extends", path: "/extensions" },
|
|
{ name: "Interface Changes", path: "/interface-changes" },
|
|
{ name: "Interventions", path: "/interventions" },
|
|
{ name: "Tasks", path: "/tasks" },
|
|
{ name: "UI Feedback", path: "/ui-feedback" },
|
|
{ name: "Suggestions", path: "/suggestions" },
|
|
{ name: "WSJF Triage", path: "/wsjf-triage" },
|
|
],
|
|
},
|
|
// ── Reference (always last) ───────────────────────────────────────────────
|
|
{
|
|
name: "Reference",
|
|
path: "/reference",
|
|
collapsible: true,
|
|
open: false,
|
|
pages: [
|
|
{ name: "Capabilities", path: "/docs/capabilities" },
|
|
{ name: "Connecting to the Hub", path: "/docs/connecting" },
|
|
{ name: "Dashboard", path: "/docs/dashboard" },
|
|
{ name: "Contributions", path: "/docs/contributions" },
|
|
{ name: "Decision Health", path: "/docs/decisions-kpi" },
|
|
{ name: "Decisions", path: "/docs/decisions" },
|
|
{ name: "Dependencies", path: "/docs/dependencies" },
|
|
{ name: "Domains", path: "/docs/domains" },
|
|
{ name: "Goals", path: "/docs/goals" },
|
|
{ name: "Extension Points", path: "/docs/extensions" },
|
|
{ name: "Inter-Repo Communication", path: "/docs/inter-repo-communication" },
|
|
{ name: "Interventions", path: "/docs/interventions" },
|
|
{ name: "Live Data", path: "/docs/live-data" },
|
|
{ name: "Overview", path: "/docs/overview" },
|
|
{ name: "Progress Log", path: "/docs/progress-log" },
|
|
{ name: "Ralph Workplan", path: "/docs/ralph-workplan" },
|
|
{ name: "Reference & Context Help", path: "/docs/reference" },
|
|
{ name: "Repo Integration", path: "/docs/repo-integration" },
|
|
{ name: "State Hub", path: "/docs/state-hub" },
|
|
{ name: "Repos", path: "/docs/repos" },
|
|
{ name: "SBOM", path: "/docs/sbom" },
|
|
{ name: "SCOPE.md", path: "/docs/scope" },
|
|
{ name: "Service Catalog", path: "/docs/services" },
|
|
{ name: "Tasks", path: "/docs/tasks" },
|
|
{ name: "TPSC", path: "/docs/tpsc" },
|
|
{ name: "TPSC — GDPR Maturity", path: "/docs/gdpr-maturity" },
|
|
{ name: "Technical Debt", path: "/docs/debt" },
|
|
{ name: "Todo", path: "/docs/todo" },
|
|
{ name: "Workplan Health", path: "/docs/workstream-health-index" },
|
|
{ name: "Workplan Lifecycle", path: "/docs/workstream-lifecycle" },
|
|
{ name: "Workplans", path: "/docs/workstreams" },
|
|
{ name: "Suggestions", path: "/docs/suggestions" },
|
|
{ name: "WSJF Triage", path: "/docs/wsjf-triage" },
|
|
],
|
|
},
|
|
],
|
|
theme: ["air", "near-midnight"],
|
|
head: `<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🗄️</text></svg>">
|
|
<script>${_modalScript}</script>
|
|
<style>
|
|
.kpi-infobox { background: var(--theme-background-alt, #f9f9f9); border: 1px solid var(--theme-foreground-faint, #e0e0e0); border-radius: 10px; padding: 0.75rem 1rem; position: relative; box-shadow: 0 1px 6px rgba(0,0,0,0.07); margin-bottom: 1.25rem; }
|
|
.kpi-infobox-title { font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--theme-foreground-muted, #888); margin-bottom: 0.55rem; padding-right: 1.6rem; }
|
|
.filter-bar { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; margin-bottom: 1rem; }
|
|
.filter-text-input { display: flex; align-items: center; }
|
|
.filter-text-input input { height: 30px; font-size: 0.85rem; padding: 0.25rem 0.5rem; border-radius: 6px; border: 1px solid var(--theme-foreground-faint, #ccc); background: var(--theme-background, #fff); font-family: inherit; color: inherit; }
|
|
</style>`,
|
|
footer: "Custodian State Hub — local-first, append-only, sovereignty-preserving.",
|
|
};
|