Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
Your own dashboard, running only the sections you install. Nothing here reads
anyone else's data: your notes live in this folder, and the tokens are yours.

Wired up out of the box, grouped into **Today**, **Archives** and **Guide**:
Wired up out of the box, grouped into **Today**, **Delivery**, **Archives** and **Guide**:

| Tab | What it does | Reads / writes |
|---|---|---|
| ☀️ Today ▸ Day | The cockpit: backlog size, what you owe from meetings, and a panel listing every Claude Code session you have open | reads `content/` (counts); the sessions panel reads `~/.claude` |
| ✅ Today ▸ Tasks | Eisenhower-quadrant backlog + a Today block | `content/tasks/active.md` |
| 🔀 Today ▸ PRs | Per-squad PR checkpoints from GitHub, stacked-PR chains, Slack channel signals, and a ready-to-paste Slack draft | `.data/` |
| 🗺️ Delivery ▸ Roadmap | One roadmap per squad — initiatives by objective, build/rollout state, effort, impact, capacity | `content/team/roadmaps/*.json` |
| 📓 Archives ▸ Journal | Per-day journal | `content/tasks/journal.md` |
| 📅 Archives ▸ Meetings | Meeting notes by bucket, with live action-item checkboxes and archiving | `content/meetings/` |
| 📖 Guide | Setup, How to use, FAQs — describing *your* tabs | — (`src/GuideView.tsx`) |
Expand Down
95 changes: 95 additions & 0 deletions content/team/roadmaps/example-squad.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{
"meta": {
"title": "Example Squad — 2026",
"icon": "🚀",
"note": "Delete this file once you have a roadmap of your own. Every field here is editable in Squad Settings — nothing needs hand-editing."
},
"vision": "A one-line statement of where this squad is trying to get to. Shown under the title.",
"problemStatement": "What is actually in the way today. Kept separate from the vision so the plan can be argued against the problem rather than against the ambition.",
"targetRevenue": "",
"strategicObjectives": [
{ "key": "reliability", "name": "Reliability", "note": "Stability Block", "description": "Make the thing work every time, not just on the happy path." },
{ "key": "growth", "name": "Growth", "note": "Market Block", "description": "Unlock the segments the current product cannot serve." },
{ "key": "platform", "name": "Platform", "note": "Foundation Block", "description": "Pay down what makes every other initiative slower than it should be." }
],
"sequencing": [
{ "key": "now", "label": "Now", "text": "What is in flight this quarter, and why it is first." },
{ "key": "next", "label": "Next", "text": "What follows, and what has to land before it can start." },
{ "key": "later", "label": "Later", "text": "Named so it stops being re-litigated every planning session." }
],
"buildStatuses": [
{ "key": "planned", "label": "Planned" },
{ "key": "in_progress", "label": "In progress" },
{ "key": "shipped", "label": "Shipped" },
{ "key": "dropped", "label": "Dropped" }
],
"rolloutStatuses": [
{ "key": "not_started", "label": "Not started" },
{ "key": "rolling_out", "label": "Rolling out" },
{ "key": "fully_rolled_out", "label": "Fully rolled out" }
],
"healthStatuses": [
{ "key": "green", "label": "On track" },
{ "key": "yellow", "label": "At risk" },
{ "key": "red", "label": "Off track" }
],
"impactLevels": ["high", "medium", "low"],
"effortLegend": [
{ "key": "Days", "label": "Days" },
{ "key": "Weeks", "label": "Weeks" },
{ "key": "Months", "label": "Months" },
{ "key": "Quarters", "label": "Quarters" }
],
"effortWeeks": { "Days": 0.5, "Weeks": 2, "Months": 8, "Quarters": 24 },
"effortRanges": { "Days": "1–4 days", "Weeks": "1–3 weeks", "Months": "1–3 months", "Quarters": "a quarter or more" },
"complexityFactors": { "low": 1, "medium": 1.5, "high": 2.5 },
"quarterCapacityWeeks": 12,
"monthCapacityWeeks": 4,
"quarterOptions": ["Q1 2026", "Q2 2026", "Q3 2026", "Q4 2026"],
"monthOptions": ["Jan 2026", "Feb 2026", "Mar 2026", "Apr 2026", "May 2026", "Jun 2026"],
"initiatives": [
{
"id": "example-shipped",
"name": "An initiative that already shipped",
"strategicArea": "reliability",
"description": "Initiatives group by objective. Build and rollout are tracked separately because shipping code and turning it on for everyone are different days.",
"effort": "Weeks",
"impact": "high",
"build": "shipped",
"rollout": "fully_rolled_out",
"quarters": ["Q1 2026"],
"owners": []
},
{
"id": "example-in-flight",
"name": "An initiative in flight",
"strategicArea": "growth",
"description": "Set impact from the vocabulary rather than typing it, so it can be weighed against effort.",
"effort": "Months",
"impact": "medium",
"build": "in_progress",
"rollout": "not_started",
"quarters": ["Q2 2026"],
"owners": []
},
{
"id": "example-unset-impact",
"name": "An initiative nobody has sized yet",
"strategicArea": "platform",
"description": "Impact is deliberately unset here. It renders as nothing rather than as a low priority — an unsized initiative is not the same as an unimportant one.",
"effort": "Weeks",
"impact": "",
"impactNote": "Free-text rationale lives here, alongside the picked level.",
"build": "planned",
"rollout": "not_started",
"quarters": [],
"owners": []
}
],
"sprints": [],
"kpis": [],
"dashboards": [],
"capacityItems": [],
"team": [],
"projects": []
}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"@asucregonzalez/section-journal": "^0.1.2",
"@asucregonzalez/section-meetings": "^0.2.0",
"@asucregonzalez/section-pull-requests": "^0.4.0",
"@asucregonzalez/section-roadmap": "^0.1.1",
"@asucregonzalez/section-tasks": "^0.3.0",
"@asucregonzalez/theme": "^0.2.0",
"@asucregonzalez/ui": "^0.3.0",
Expand Down
2 changes: 2 additions & 0 deletions server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { registerTasksRoutes } from '@asucregonzalez/section-tasks/server';
import { registerJournalRoutes } from '@asucregonzalez/section-journal/server';
import { registerMeetingsRoutes } from '@asucregonzalez/section-meetings/server';
import { registerClaudeSessionsRoutes } from '@asucregonzalez/section-claude-sessions/server';
import { registerRoadmapRoutes } from '@asucregonzalez/section-roadmap/server';

/**
* The API server. Each installed section with a backend gets its own router and a
Expand Down Expand Up @@ -69,6 +70,7 @@ registerPullRequestsRoutes(prRouter, ctx, { defaultOrganizations: githubOrgs });
app.use(prRouter);

const routers = [
registerRoadmapRoutes,
registerTasksRoutes,
registerJournalRoutes,
registerMeetingsRoutes,
Expand Down
9 changes: 9 additions & 0 deletions src/GuideView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,15 @@ const USAGE: Card[] = [
{ kind: 'chat', text: 'Populate it with the meeting-processor skill (Granola) or sync-meetings (a Drive folder). Both write into content/meetings/ and tell you what they could not reach rather than inventing it.' },
],
},
{
section: 'roadmap', icon: '🗺️', title: 'Roadmap',
items: [
{ kind: 'in-app', text: 'One roadmap per squad: initiatives grouped by objective, with build and rollout state, effort, impact and owners. The left sidebar picks the squad — it is always there, even when you only have one.' },
{ kind: 'both', text: 'Squads are files. content/team/roadmaps/<squad>.json, one document each — add a file and it appears in the sidebar. A single content/team/roadmap.json works too, and is what you get before you have a second squad.' },
{ kind: 'in-app', text: 'Squad Settings edits what used to mean hand-editing JSON: vision, objectives, sequencing, the status vocabularies, effort and complexity, and capacity. Renaming a status moves every initiative using it; deleting one still in use is refused, with the count.' },
{ kind: 'both', text: 'Impact is a vocabulary, not free text, so it can be sorted against effort. An initiative with no impact set shows nothing rather than a default — an unset priority is not a low one.' },
],
},
{
section: ['setup', 'how-to', 'faq'], icon: '📖', title: 'Guide (this tab)',
items: [
Expand Down
11 changes: 11 additions & 0 deletions src/sections.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { DashboardSection } from '@asucregonzalez/core';
import { pullRequestsSection } from '@asucregonzalez/section-pull-requests';
import { roadmapSection } from '@asucregonzalez/section-roadmap';
import { createTasksSection } from '@asucregonzalez/section-tasks';
import { journalSection } from '@asucregonzalez/section-journal';
import { meetingsSection } from '@asucregonzalez/section-meetings';
Expand Down Expand Up @@ -39,6 +40,16 @@ export const sections: DashboardSection[] = [
{ ...pullRequestsSection, id: 'prs', label: 'PRs', path: '/today/prs' },
],
},
{
// One roadmap per squad, read from `content/team/roadmaps/*.json` (or a single
// `content/team/roadmap.json` if that is all you have). Squads are files, so
// this grows by adding one — there is nothing to register here.
id: 'delivery', label: 'Delivery', icon: '📦', path: '/delivery', visibility: 'shared',
blurb: 'What you are shipping, and when.',
children: [
{ ...roadmapSection, id: 'roadmap', label: 'Roadmap', path: '/delivery/roadmap' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delivery home link opens Today

Medium Severity

The Delivery group path is /delivery, but the shell only matches child paths. Home’s Elsewhere card links to that group path, so it renders Today while the address bar still shows /delivery. The header tab works because it navigates to /delivery/roadmap directly. Today avoids this because Day uses the same path as its group.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 5a8e4e5. Configure here.

],
},
{
id: 'archives', label: 'Archives', icon: '📚', path: '/archives', visibility: 'shared',
blurb: 'Everything already written down.',
Expand Down