--- title: Goals --- ```js import {API} from "./components/config.js"; const POLL = 20_000; ``` ```js const goalsState = (async function*() { while (true) { let domains = [], domainGoals = [], repoGoals = [], repos = [], ok = false; try { const [rd, rdg, rrg, rr] = await Promise.all([ fetch(`${API}/domains/?status=active`), fetch(`${API}/domain-goals/`), fetch(`${API}/repo-goals/`), fetch(`${API}/repos/`), ]); ok = rd.ok && rdg.ok && rrg.ok && rr.ok; if (ok) { [domains, domainGoals, repoGoals, repos] = await Promise.all([ rd.json(), rdg.json(), rrg.json(), rr.json(), ]); } } catch {} yield {domains, domainGoals, repoGoals, repos, ok, ts: new Date()}; await new Promise(res => setTimeout(res, POLL)); } })(); ``` ```js const domains = goalsState.domains ?? []; const domainGoals = goalsState.domainGoals ?? []; const repoGoals = goalsState.repoGoals ?? []; const repos = goalsState.repos ?? []; const _ok = goalsState.ok ?? false; const _ts = goalsState.ts; ``` ```js // ── Indexes ──────────────────────────────────────────────────────────────────── const repoById = Object.fromEntries(repos.map(r => [r.id, r])); const domainById = Object.fromEntries(domains.map(d => [d.id, d])); // Domain goals keyed by domain_id; active first, then superseded, then archived const goalsByDomain = {}; for (const g of domainGoals) { if (!goalsByDomain[g.domain_id]) goalsByDomain[g.domain_id] = []; goalsByDomain[g.domain_id].push(g); } const STATUS_ORDER = {active: 0, superseded: 1, archived: 2}; for (const id of Object.keys(goalsByDomain)) { goalsByDomain[id].sort((a, b) => (STATUS_ORDER[a.status] ?? 9) - (STATUS_ORDER[b.status] ?? 9) ); } // Repo goals keyed by domain_goal_id (primary) and repo_id (for unlinked) const repoGoalsByDomainGoal = {}; const unlinkedRepoGoals = []; // active repo goals with no domain_goal_id for (const rg of repoGoals) { if (rg.domain_goal_id) { if (!repoGoalsByDomainGoal[rg.domain_goal_id]) repoGoalsByDomainGoal[rg.domain_goal_id] = []; repoGoalsByDomainGoal[rg.domain_goal_id].push(rg); } else if (rg.status === "active") { unlinkedRepoGoals.push(rg); } } // Sort repo goals within each domain goal by priority asc for (const id of Object.keys(repoGoalsByDomainGoal)) { repoGoalsByDomainGoal[id].sort((a, b) => a.priority - b.priority); } // KPI const domainsWithActiveGoal = domains.filter(d => (goalsByDomain[d.id] ?? []).some(g => g.status === "active")); const domainsWithoutGoal = domains.filter(d => !(goalsByDomain[d.id] ?? []).some(g => g.status === "active")); const totalActiveRepoGoals = repoGoals.filter(g => g.status === "active").length; ``` # Goals ```js import {injectTocTop} from "./components/toc-sidebar.js"; import {withDocHelp} from "./components/doc-overlay.js"; // ── Live indicator ───────────────────────────────────────────────────────────── const _liveEl = html`
${_ok ? `Live · updated ${_ts?.toLocaleTimeString()}` : html`Offline — run: make api`}
`; withDocHelp(_liveEl, "/docs/live-data"); // ── KPI sidebar card ──────────────────────────────────────────────────────────── const _kpiBox = html`
Goals
domains with active goal
${domainsWithActiveGoal.length} / ${domains.length}
active repo goals
${totalActiveRepoGoals}
${domainsWithoutGoal.length > 0 ? html`
no active goal
${domainsWithoutGoal.map(d => html`
${d.slug}
`)}
` : ""}
`; injectTocTop("goals-kpi-box", _kpiBox); injectTocTop("live-indicator", _liveEl); const _h1 = document.querySelector("#observablehq-main h1"); if (_h1) { _h1.style.position = "relative"; withDocHelp(_h1, "/docs/goals"); } ``` Strategic intent, organised by domain. Each domain has one **active** goal at a time; prior goals are retained as history. Repository goals inherit from a domain goal and refine it into actionable scope for a specific repo. --- ```js // ── Repo goal card renderer ──────────────────────────────────────────────────── function renderRepoGoalCard(rg) { const repo = repoById[rg.repo_id]; const STATUS_COLORS = { active: {border: "#3b82f6", badge_bg: "#dbeafe", badge_fg: "#1e40af"}, paused: {border: "#f59e0b", badge_bg: "#fef3c7", badge_fg: "#92400e"}, completed: {border: "#22c55e", badge_bg: "#dcfce7", badge_fg: "#166534"}, archived: {border: "#94a3b8", badge_bg: "#f1f5f9", badge_fg: "#475569"}, }; const c = STATUS_COLORS[rg.status] ?? STATUS_COLORS.archived; return html`
#${rg.priority} ${repo?.slug ?? rg.repo_id.slice(0,8)} ${rg.status}
${rg.title}
${rg.description}
goal id: ${rg.id.slice(0,8)}…
`; } // ── Domain section renderer ──────────────────────────────────────────────────── function renderDomainSection(domain) { const goals = goalsByDomain[domain.id] ?? []; const activeGoal = goals.find(g => g.status === "active"); const secondaryGoals = goals.filter(g => g.status !== "active"); return html`
${domain.slug} ${domain.name}
${activeGoal ? html`
Domain Goal active
${activeGoal.title}
${activeGoal.description}
goal id: ${activeGoal.id.slice(0,8)}… · set ${new Date(activeGoal.created_at).toLocaleDateString()}
${(repoGoalsByDomainGoal[activeGoal.id] ?? []).length > 0 ? html`
${(repoGoalsByDomainGoal[activeGoal.id] ?? []).map(renderRepoGoalCard)}
` : html`
No repository goals linked to this domain goal yet.
`}
` : html`
No active goal set for this domain.
`} ${secondaryGoals.length > 0 ? html`
${secondaryGoals.length} secondary goal${secondaryGoals.length === 1 ? "" : "s"} (${[...new Set(secondaryGoals.map(g => g.status))].join(", ")})
${secondaryGoals.map(g => html`
Domain Goal ${g.status}
${g.title}
${g.description}
goal id: ${g.id.slice(0,8)}… · set ${new Date(g.created_at).toLocaleDateString()}
${(repoGoalsByDomainGoal[g.id] ?? []).length > 0 ? html`
${(repoGoalsByDomainGoal[g.id] ?? []).map(renderRepoGoalCard)}
` : ""}
`)}
` : ""}
`; } // ── Main render ──────────────────────────────────────────────────────────────── if (!_ok) { display(html`

API offline — run make api from state-hub/.

`); } else if (domains.length === 0) { display(html`

No active domains found.

`); } else { // Domains with active goal first, then those without const sorted = [ ...domainsWithActiveGoal.sort((a, b) => a.slug.localeCompare(b.slug)), ...domainsWithoutGoal.sort((a, b) => a.slug.localeCompare(b.slug)), ]; display(html`
${sorted.map(renderDomainSection)}
`); } ``` ```js // ── Unlinked active repo goals ───────────────────────────────────────────────── if (unlinkedRepoGoals.length > 0) { display(html`

Unlinked Repository Goals

Active repo goals not yet associated with a domain goal.

${unlinkedRepoGoals.map(renderRepoGoalCard)}
`); } ```