g1t/apps/web/app/lib/roadmap.ts
| 1 | /** |
| 2 | * What a project will have and does not yet: the pages the project menu |
| 3 | * shows as Soon, each with a page of its own saying what it will be. One |
| 4 | * place, so the menu and those pages never disagree. |
| 5 | * |
| 6 | * Each entry says what it is for, what it will do, and what to use today, |
| 7 | * so a Soon is a promise someone can read, not a greyed-out word. |
| 8 | */ |
| 9 | |
| 10 | export type RoadmapItem = { |
| 11 | /** In the address: `/<owner>/<project>/soon/<key>`. */ |
| 12 | key: string; |
| 13 | title: string; |
| 14 | /** The menu section it sits in. */ |
| 15 | section: "Work" | "Code" | "Agents" | "Ship" | "Security" | "Observe" | "Insights"; |
| 16 | /** One line, for the menu's tooltip and the page's lead. */ |
| 17 | summary: string; |
| 18 | /** Why it matters, in two or three sentences. */ |
| 19 | why: string; |
| 20 | /** What it will do. */ |
| 21 | plans: string[]; |
| 22 | /** What to use until it exists: a project page, by its path under the project. */ |
| 23 | today?: { label: string; path: string }; |
| 24 | }; |
| 25 | |
| 26 | export const ROADMAP: RoadmapItem[] = [ |
| 27 | // --- Work --------------------------------------------------------------- |
| 28 | { |
| 29 | key: "board", |
| 30 | title: "Board", |
| 31 | section: "Work", |
| 32 | summary: "Issues and pull requests as a board, a table or a roadmap, with fields of your own.", |
| 33 | why: "Like GitHub Projects: one view of everything in flight, arranged the way your team thinks about it. Agents move the cards as they work, so the board is never out of date.", |
| 34 | plans: [ |
| 35 | "Board, table and roadmap views of the same items, saved and shared", |
| 36 | "Custom fields: status, priority, size, iteration, dates, anything", |
| 37 | "Group and filter by owner, outcome, label, agent or state", |
| 38 | "Cards move by themselves as agents open, revise and land changes", |
| 39 | "Boards across projects, for a workspace's whole portfolio", |
| 40 | ], |
| 41 | today: { label: "Issues", path: "issues" }, |
| 42 | }, |
| 43 | { |
| 44 | key: "roadmap", |
| 45 | title: "Roadmap", |
| 46 | section: "Work", |
| 47 | summary: "Outcomes on a timeline, with their dependencies across projects.", |
| 48 | why: "An outcome is what should be true when the work is done. On a roadmap you see when each is expected, what it waits on in other projects, and how much has landed.", |
| 49 | plans: [ |
| 50 | "Outcomes as bars on a timeline, from start to target", |
| 51 | "Progress from merged work, not from guesses", |
| 52 | "Dependencies across projects, drawn from the project graph", |
| 53 | "Slip warnings when the work left outgrows the time left", |
| 54 | ], |
| 55 | today: { label: "Outcomes", path: "plans" }, |
| 56 | }, |
| 57 | { |
| 58 | key: "milestones", |
| 59 | title: "Milestones", |
| 60 | section: "Work", |
| 61 | summary: "Dates to land outcomes by, with what is left and what is at risk.", |
| 62 | why: "A milestone groups the issues that must land together, by a date. g1t shows what remains and which agent or person holds each part.", |
| 63 | plans: [ |
| 64 | "Issues and outcomes grouped under a due date", |
| 65 | "Burn-down from merged pull requests", |
| 66 | "At-risk items flagged before the date, not after", |
| 67 | ], |
| 68 | today: { label: "Issues", path: "issues" }, |
| 69 | }, |
| 70 | |
| 71 | // --- Code --------------------------------------------------------------- |
| 72 | { |
| 73 | key: "branches", |
| 74 | title: "Branches", |
| 75 | section: "Code", |
| 76 | summary: "Every branch: who is on it, how far behind it is, and its preview.", |
| 77 | why: "With agents opening branches by the dozen, a list of names is not enough. Each branch shows its pull request, its checks, its live preview and how stale it is.", |
| 78 | plans: [ |
| 79 | "Branches with their pull request, checks and preview address", |
| 80 | "Ahead and behind the default branch, with one-click catch-up by an agent", |
| 81 | "Protection rules: required checks, reviews and the merge queue", |
| 82 | "Stale branches cleaned up on a schedule you set", |
| 83 | ], |
| 84 | today: { label: "Pull requests", path: "pulls" }, |
| 85 | }, |
| 86 | { |
| 87 | key: "tags", |
| 88 | title: "Tags", |
| 89 | section: "Code", |
| 90 | summary: "Tags, and the releases made from them.", |
| 91 | why: "A tag marks a version of the code. Each links to its release notes and to the deployment that shipped it.", |
| 92 | plans: ["Tags with their commit, release and deployment", "Signed tags verified", "Rules for who may create and move them"], |
| 93 | today: { label: "Commits", path: "commits" }, |
| 94 | }, |
| 95 | { |
| 96 | key: "compare", |
| 97 | title: "Compare", |
| 98 | section: "Code", |
| 99 | summary: "Any two branches, tags or commits, side by side.", |
| 100 | why: "See exactly what changed between two points, with the sessions and pull requests that changed it.", |
| 101 | plans: ["Diff any two refs", "The pull requests and agent sessions between them", "Open a pull request from the comparison"], |
| 102 | today: { label: "Commits", path: "commits" }, |
| 103 | }, |
| 104 | { |
| 105 | key: "docs", |
| 106 | title: "Docs", |
| 107 | section: "Code", |
| 108 | summary: "Pages about the project that agents keep current as the code changes.", |
| 109 | why: "A wiki goes stale the day it is written. g1t's docs live with the code, and when a change makes a page wrong, an agent proposes the fix in the same pull request.", |
| 110 | plans: [ |
| 111 | "Pages written in Markdown, kept in the repository", |
| 112 | "Agents update pages a change makes wrong, in the same pull request", |
| 113 | "Architecture pages drawn from the code itself", |
| 114 | "Search across every project's docs", |
| 115 | ], |
| 116 | today: { label: "Files", path: "code" }, |
| 117 | }, |
| 118 | |
| 119 | // --- Agents ------------------------------------------------------------- |
| 120 | { |
| 121 | key: "agents", |
| 122 | title: "At work", |
| 123 | section: "Agents", |
| 124 | summary: "Every agent at work on this project now, and a way to steer it.", |
| 125 | why: "Agents are the project's busiest contributors. See each one live: what issue it holds, what it is doing this minute, what it has spent, and send it a word mid-run.", |
| 126 | plans: [ |
| 127 | "Live view of each running agent, with its current step", |
| 128 | "Steer, pause or stop a run, and hand it to a person", |
| 129 | "What each run has cost so far", |
| 130 | "Your own agents and g1t's side by side", |
| 131 | ], |
| 132 | today: { label: "Pull requests", path: "pulls" }, |
| 133 | }, |
| 134 | { |
| 135 | key: "sessions", |
| 136 | title: "Sessions", |
| 137 | section: "Agents", |
| 138 | summary: "Every agent session that changed this project, searchable.", |
| 139 | why: "When an agent writes a line, its reasoning is worth keeping. Every session is kept, searchable, and linked from the lines it wrote, so why-blame answers why the code is the way it is.", |
| 140 | plans: [ |
| 141 | "Every session, with its prompt, steps, tools and result", |
| 142 | "Search by file, issue, agent or words", |
| 143 | "Why-blame: from any line to the session that wrote it", |
| 144 | "Sessions as context for the next agent on the same code", |
| 145 | ], |
| 146 | today: { label: "Commits", path: "commits" }, |
| 147 | }, |
| 148 | { |
| 149 | key: "playbooks", |
| 150 | title: "Playbooks", |
| 151 | section: "Agents", |
| 152 | summary: "How agents should work here: conventions, commands and checks.", |
| 153 | why: "Every project has its own way of doing things. A playbook tells every agent how this one builds, tests, names things and what it must never touch, kept with the code and versioned with it.", |
| 154 | plans: [ |
| 155 | "Instructions per kind of work: fixes, features, reviews, upgrades", |
| 156 | "Commands to build and test, run before every change", |
| 157 | "Paths agents may not touch without a person", |
| 158 | "Learned from reviews: what people corrected becomes a rule", |
| 159 | ], |
| 160 | today: { label: "Settings", path: "settings" }, |
| 161 | }, |
| 162 | { |
| 163 | key: "memory", |
| 164 | title: "Memory", |
| 165 | section: "Agents", |
| 166 | summary: "What agents have learned about this project, kept and curated.", |
| 167 | why: "Agents that forget repeat mistakes. g1t keeps what they learn about the code, its quirks and its people, and lets you see, edit and delete it.", |
| 168 | plans: ["Facts agents learned, with where they learned them", "Edit or remove anything", "Shared across every agent on the project"], |
| 169 | }, |
| 170 | |
| 171 | // --- Ship --------------------------------------------------------------- |
| 172 | { |
| 173 | key: "environments", |
| 174 | title: "Environments", |
| 175 | section: "Ship", |
| 176 | summary: "Staging, production and others, with approvers and branch rules.", |
| 177 | why: "Production and previews exist today. Environments add the rest: staging, QA, per-customer, each with its own variables, approvers and rules for what may deploy there.", |
| 178 | plans: [ |
| 179 | "Named environments with their own variables and secrets", |
| 180 | "Required approvers before a deploy", |
| 181 | "Branch rules: what may deploy where", |
| 182 | "Promote a deployment from one environment to the next", |
| 183 | ], |
| 184 | today: { label: "Deployments", path: "deployments" }, |
| 185 | }, |
| 186 | { |
| 187 | key: "releases", |
| 188 | title: "Releases", |
| 189 | section: "Ship", |
| 190 | summary: "Tagged releases with notes written from what landed.", |
| 191 | why: "Release notes from the pull requests and sessions that made the release: what changed, why, and who or what changed it.", |
| 192 | plans: ["Notes drafted from merged work", "Assets and checksums attached", "Published to the project's page and a feed"], |
| 193 | today: { label: "Commits", path: "commits" }, |
| 194 | }, |
| 195 | { |
| 196 | key: "packages", |
| 197 | title: "Packages", |
| 198 | section: "Ship", |
| 199 | summary: "npm, container and other packages published from the project.", |
| 200 | why: "Publish packages from workflows to g1t's registry, with the same access as the code.", |
| 201 | plans: ["npm, OCI containers, Cargo, PyPI and Go modules", "Published from workflows", "Private packages for the workspace"], |
| 202 | today: { label: "Workflows", path: "actions" }, |
| 203 | }, |
| 204 | { |
| 205 | key: "flags", |
| 206 | title: "Feature flags", |
| 207 | section: "Ship", |
| 208 | summary: "Turn features on per environment or per user, without a deploy.", |
| 209 | why: "Ship code dark and turn it on when ready, for some users first, at the edge, with no deploy.", |
| 210 | plans: ["Flags read at the edge by deployed apps", "Rollouts by percentage, user or environment", "Flags cleaned up by agents when fully on"], |
| 211 | today: { label: "Deployments", path: "deployments" }, |
| 212 | }, |
| 213 | |
| 214 | // --- Security ------------------------------------------------------------- |
| 215 | { |
| 216 | key: "security", |
| 217 | title: "Overview", |
| 218 | section: "Security", |
| 219 | summary: "Every security finding in one place, with the agent fixing each.", |
| 220 | why: "Findings are worth something only when they are fixed. Each one here becomes an issue an agent takes, tested and landed through the merge queue.", |
| 221 | plans: ["Findings by severity across scanners", "Each fixed by an agent through the queue", "A security policy and how to report to you"], |
| 222 | }, |
| 223 | { |
| 224 | key: "secret-scanning", |
| 225 | title: "Secret scanning", |
| 226 | section: "Security", |
| 227 | summary: "Keys and tokens found in the code or its history, revoked and removed.", |
| 228 | why: "A leaked key is an incident. g1t blocks pushes that carry one, finds old ones in history, and helps revoke them.", |
| 229 | plans: ["Push protection for known key formats", "History scanned for leaks", "Revocation with the provider, where it allows"], |
| 230 | }, |
| 231 | { |
| 232 | key: "dependency-updates", |
| 233 | title: "Dependency updates", |
| 234 | section: "Security", |
| 235 | summary: "Outdated and vulnerable packages, updated by agents.", |
| 236 | why: "Like Dependabot, but the agent also fixes what the upgrade breaks, so updates land instead of piling up.", |
| 237 | plans: ["Vulnerable packages first, then outdated ones", "Breaking changes fixed in the same pull request", "Grouped, scheduled and landed through the queue"], |
| 238 | }, |
| 239 | { |
| 240 | key: "code-scanning", |
| 241 | title: "Code scanning", |
| 242 | section: "Security", |
| 243 | summary: "Code scanned for vulnerabilities on every change.", |
| 244 | why: "Scanning on every pull request, with findings explained in the review and fixed by the author's agent.", |
| 245 | plans: ["Static analysis on every pull request", "Findings in the review, with a fix", "Baselines so only new findings block"], |
| 246 | }, |
| 247 | { |
| 248 | key: "firewall", |
| 249 | title: "Firewall", |
| 250 | section: "Security", |
| 251 | summary: "Rules for who may reach the project's deployed apps.", |
| 252 | why: "Deployed apps run on Cloudflare. Rate limits, bot protection and IP rules, per app and environment.", |
| 253 | plans: ["Rate limits and bot protection", "IP and country rules", "Password-protected previews"], |
| 254 | today: { label: "Deployments", path: "deployments" }, |
| 255 | }, |
| 256 | |
| 257 | // --- Observe ------------------------------------------------------------ |
| 258 | { |
| 259 | key: "logs", |
| 260 | title: "Logs and metrics", |
| 261 | section: "Observe", |
| 262 | summary: "Requests, errors and CPU time of each deployment, and its logs.", |
| 263 | why: "Every deployed app's logs and numbers, by deployment, so a regression points at the change that caused it.", |
| 264 | plans: ["Live and searchable logs", "Requests, errors, latency and CPU by deployment", "Compare a preview with production"], |
| 265 | today: { label: "Deployments", path: "deployments" }, |
| 266 | }, |
| 267 | { |
| 268 | key: "errors", |
| 269 | title: "Errors and incidents", |
| 270 | section: "Observe", |
| 271 | summary: "Errors from the running app, each becoming an issue an agent can take.", |
| 272 | why: "An error in production should become a fix, not a dashboard. Each new error is grouped, explained, and turned into an issue with the context an agent needs.", |
| 273 | plans: ["Errors grouped with stack and request", "One click to an issue for an agent", "Incidents with a timeline and who was told"], |
| 274 | today: { label: "Issues", path: "issues" }, |
| 275 | }, |
| 276 | { |
| 277 | key: "uptime", |
| 278 | title: "Uptime", |
| 279 | section: "Observe", |
| 280 | summary: "Checks that the app answers, from around the world.", |
| 281 | why: "Know the app is down before your users tell you, and who was told.", |
| 282 | plans: ["Checks from many places", "Alerts by email and webhook", "A public status page"], |
| 283 | }, |
| 284 | { |
| 285 | key: "analytics", |
| 286 | title: "Web analytics", |
| 287 | section: "Observe", |
| 288 | summary: "Who visits the deployed apps, without cookies.", |
| 289 | why: "Visits, pages and referrers for each app, private by design, from Cloudflare's own analytics.", |
| 290 | plans: ["Visits, pages, referrers and countries", "No cookies, no personal data", "Per deployment and per preview"], |
| 291 | }, |
| 292 | |
| 293 | // --- Insights ------------------------------------------------------------- |
| 294 | { |
| 295 | key: "delivery", |
| 296 | title: "Delivery", |
| 297 | section: "Insights", |
| 298 | summary: "Lead time, deploy frequency, change failure rate and time to restore.", |
| 299 | why: "The four numbers that say how well a team ships, measured from what actually happened in g1t.", |
| 300 | plans: ["DORA metrics from merges and deployments", "Review and queue time", "Trends by week and by project"], |
| 301 | }, |
| 302 | { |
| 303 | key: "costs", |
| 304 | title: "Costs", |
| 305 | section: "Insights", |
| 306 | summary: "What the project costs, by agent run, sandbox, build and app.", |
| 307 | why: "Usage is charged by the workspace; here it is broken down for one project, so you can see what each part of the work costs.", |
| 308 | plans: ["Cost by kind of work and by issue", "Cost per merged change", "Budgets per project"], |
| 309 | }, |
| 310 | { |
| 311 | key: "impact", |
| 312 | title: "Agent impact", |
| 313 | section: "Insights", |
| 314 | summary: "How much of the work agents do, and how well.", |
| 315 | why: "The share of changes agents author, how often their work lands first time, and where people still step in.", |
| 316 | plans: ["Agents' share of merged changes", "First-time pass rate of checks and reviews", "Where people correct agents most"], |
| 317 | }, |
| 318 | ]; |
| 319 | |
| 320 | export function roadmapItem(key: string): RoadmapItem | undefined { |
| 321 | return ROADMAP.find((item) => item.key === key); |
| 322 | } |
| 323 | |
| 324 | export function roadmapIn(section: RoadmapItem["section"]): RoadmapItem[] { |
| 325 | return ROADMAP.filter((item) => item.section === section); |
| 326 | } |