Skip to content
Draft
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
28 changes: 28 additions & 0 deletions .agents/references/terminology.md
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,34 @@ For the summary of the most critical terms (core features, Oz terms, terms to av

- **Warp CLI** — Ambiguous since the Warp Agent CLI launched; avoid the bare term. Use "Oz CLI" for the `oz` binary that runs and manages cloud agents (formerly called `warp-cli`), or "Warp Agent CLI" for the `warp` binary that runs the Warp Agent in any terminal.

- **Automation Platform** — Working name for Warp's cloud agent platform (the proposed successor branding for "Oz" as of the ~2026-08-18 launch), covering environments, integrations, orchestration, self-hosting, and the Agent API/SDK.
*Usage note:* PENDING final naming confirmation — not yet on ZL's locked product-naming list (Warp / Warp Factories / Warp Agent / Warp Terminal). Used in docs IA prototyping via `{VARS.WARP_AUTOMATION_PLATFORM}`; do not hardcode the literal string "Automation Platform" in prose so the name can still change cheaply.

## Warp Factories terminology

- **Warp Factories** — Warp's product for deploying and operating cloud software factories: automation loops around the SDLC where cloud agents triage, spec, implement, review, and verify work, with humans in the loop at key decision points. Launches in closed beta ~2026-08-18.
*Usage note:* Capitalize both words as the product name; plural "Factories." Distinct from "software factory" (see below), the generic industry term for the pattern.

- **software factory** — The generic, lowercase industry term for an automation loop around the SDLC (triage, spec, implement, review, verify). Warp Factories is Warp's product implementation of this pattern.
*Usage note:* Lowercase when used generically ("a software factory," "cloud software factories"). Capitalize only when part of the product name "Warp Factories."

- **factory** — An individual deployed instance of a software factory, built on Warp Factories infrastructure.
*Usage note:* Lowercase common noun ("your factory," "set up a factory").

- **factory definitions as code** — The practice of specifying a factory's repos, agent roles, skills, MCPs, and permissions as version-controlled code, similar to infrastructure-as-code. Enables rollback, canarying, and agentic self-improvement of the factory itself.

- **work item** — A unit of work moving through a factory (for example an issue, ticket, or triggered task) as it passes through triage, spec, implementation, review, and verification.

- **foreman agent** — The orchestrator agent that receives a work item's triggering context and dispatches subagents to move it through the factory, choosing model, harness, and context for each step.

- **Factory MCP** — The MCP server that lets any coding agent or MCP client interact with a factory: push work in, pull status, or guide sessions.
*Usage note:* Capitalize as a feature/proper-noun name.

- **control room** — The web app view showing all factory agent runs, work item status, automations, and configuration for a given factory.
*Usage note:* Lowercase common noun unless referring to a specific labeled UI element.

- **AI sovereignty** — Warp Factories' positioning around customer ownership and control of inference, hosting, and data exhaust (agent conversations, evals, memories) for their factory.

## Technical terms

- **AI** — not "A.I." Normalize all instances to "AI."
Expand Down
71 changes: 55 additions & 16 deletions .agents/skills/style_lint/style_lint.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"Codebase Context", "Code Review", "Command Palette", "Global Rules",
"Oz CLI", "Oz Platform", "Project Rules",
"Slash Commands", "Terminal Mode", "Universal Input", "Warp Drive",
"Warp Platform",
"Warp Platform", "Automation Platform", "Warp Factories", "Factory MCP",
}

# Terminology: wrong → right (case-sensitive checks)
Expand Down Expand Up @@ -83,6 +83,8 @@
("oz.warp.dev", "WEB_APP_URL", "{VARS.WEB_APP_URL} in prose or {{WEB_APP_URL}} in frontmatter"),
("Oz dashboard", "DASHBOARD", "{VARS.DASHBOARD} in prose or {{DASHBOARD}} in frontmatter"),
("Oz run", "PLATFORM_RUN", "{VARS.PLATFORM_RUN} in prose or {{PLATFORM_RUN}} in frontmatter"),
("Oz API & SDK", "API_SDK_NAME", "{VARS.API_SDK_NAME} in prose or {{API_SDK_NAME}} in frontmatter"),
("Oz Platform", "WARP_AUTOMATION_PLATFORM", "{VARS.WARP_AUTOMATION_PLATFORM} in prose or {{WARP_AUTOMATION_PLATFORM}} in frontmatter"),
]

# Oz terms to avoid (case-insensitive patterns)
Expand Down Expand Up @@ -181,6 +183,11 @@
)
MARKDOWN_LINK = re.compile(r"\[([^\]]*)\]\(([^)]+)\)")
VIDEO_EMBED_TITLE = re.compile(r"\btitle\s*=\s*([\"'])(.*?)\1", re.DOTALL)
# JSX expression titles, e.g. title={`${VARS.WEB_APP} walkthrough`} — used when
# the title includes a rename-sensitive {VARS.KEY} reference. Content can't be
# statically evaluated, so these are treated as present but skipped by the
# generic-title check below.
VIDEO_EMBED_TITLE_EXPR = re.compile(r"\btitle\s*=\s*\{(.*?)\}", re.DOTALL)

# Common bolded words that are NOT product terms (false positive suppression)
COMMON_BOLD_WORDS = {
Expand Down Expand Up @@ -656,21 +663,29 @@ def check_video_embed_titles(lines: List[str], filepath: str) -> List[Issue]:
issues = []
for line_number, tag in _iter_video_embed_tags(lines):
title_match = VIDEO_EMBED_TITLE.search(tag)
if not title_match or not title_match.group(2).strip():
issues.append(Issue(
filepath, line_number, "video-title",
"VideoEmbed missing title prop. Add a specific title that describes the integration, workflow, feature, or task shown.",
"error",
))
if title_match and title_match.group(2).strip():
title = title_match.group(2).strip()
if _is_generic_video_title(title):
issues.append(Issue(
filepath, line_number, "video-title",
f"Generic VideoEmbed title: \"{title}\". Use a specific title that describes what the video shows.",
"warning",
))
continue

title = title_match.group(2).strip()
if _is_generic_video_title(title):
issues.append(Issue(
filepath, line_number, "video-title",
f"Generic VideoEmbed title: \"{title}\". Use a specific title that describes what the video shows.",
"warning",
))
# Not a quoted string literal — check for a JSX expression title, e.g.
# title={`${VARS.WEB_APP} walkthrough`}. Content isn't statically
# evaluable, so skip the generic-title check but still confirm a
# non-empty title prop is present.
expr_match = VIDEO_EMBED_TITLE_EXPR.search(tag)
if expr_match and expr_match.group(1).strip():
continue

issues.append(Issue(
filepath, line_number, "video-title",
"VideoEmbed missing title prop. Add a specific title that describes the integration, workflow, feature, or task shown.",
"error",
))
return issues


Expand Down Expand Up @@ -890,9 +905,25 @@ def check_hardcoded_vars(lines: List[str], filepath: str) -> List[Issue]:

Skips fenced code blocks and inline code spans so that CLI examples like
`oz.warp.dev` in a code fence are not flagged.

Literals are checked longest-first and matches are deduplicated by span so
overlapping rename-sensitive names are not double-flagged.

Matches use word boundaries (`\b`) rather than plain substring search, so
literals don't false-positive inside unrelated tokens such as URL query
params, hashes, or other identifiers.

An "@"-prefixed occurrence is skipped because mention handles are literal
strings that do not necessarily change with product names. Variabilizing
a handle could silently rewrite it into an invalid value at rename time.
"""
issues = []
in_code_block = False
sorted_strings = sorted(RENAME_SENSITIVE_VAR_STRINGS, key=lambda entry: -len(entry[0]))
compiled = [
(literal, var_key, suggestion, re.compile(r"\b" + re.escape(literal) + r"\b"))
for literal, var_key, suggestion in sorted_strings
]
for i, line in enumerate(lines, 1):
if line.strip().startswith("```"):
in_code_block = not in_code_block
Expand All @@ -901,8 +932,16 @@ def check_hardcoded_vars(lines: List[str], filepath: str) -> List[Issue]:
continue
# Strip inline code spans so backtick-wrapped references are not flagged
prose_line = re.sub(r"`[^`]+`", "", line)
for literal, var_key, suggestion in RENAME_SENSITIVE_VAR_STRINGS:
if literal in prose_line:
matched_spans: List[Tuple[int, int]] = []
for literal, var_key, suggestion, pattern in compiled:
for m in pattern.finditer(prose_line):
span = m.span()
if any(span[0] >= s and span[1] <= e for s, e in matched_spans):
continue
# Mention handles are literal strings, not prose. See docstring.
if span[0] > 0 and prose_line[span[0] - 1] == "@":
continue
matched_spans.append(span)
issues.append(Issue(
filepath, i, "hardcoded-var",
f'Hardcoded "{literal}" should use {suggestion} (see src/data/vars.ts)',
Expand Down
5 changes: 3 additions & 2 deletions astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -167,13 +167,14 @@ export default defineConfig({
customSets: [
{ label: 'Terminal', description: 'Warp Terminal features and configuration.', paths: ['terminal/**'] },
{ label: 'Agents', description: 'Warp\'s agents: capabilities, local agents, and CLI agents.', paths: ['agents/**'] },
{ label: 'Factories', description: 'Warp Factories documentation for setup, agent roles, definitions as code, integrations, measurement, and infrastructure.', paths: ['factories/**'] },
{ label: 'Warp Agent CLI', description: 'The Warp Agent CLI: agent conversations, shell commands, permissions, and configuration in any terminal.', paths: ['agents/cli/**'] },
{ label: 'Oz Platform', description: 'Warp\'s Oz platform: cloud agents, orchestration, triggers, integrations, environments, harnesses, and self-hosting.', paths: ['platform/**'] },
{ label: 'Automation Platform', description: 'Warp\'s Automation Platform: cloud agents, orchestration, triggers, integrations, environments, harnesses, and self-hosting.', paths: ['platform/**'] },
{ label: 'Code', description: 'Code editor, code review, and Git worktrees.', paths: ['code/**'] },
{ label: 'Enterprise', description: 'Enterprise features, SSO, team management, and security.', paths: ['enterprise/**'] },
{ label: 'Getting Started', description: 'Installation, quickstart, and migration guides.', paths: ['index', 'quickstart', 'getting-started/**'] },
{ label: 'Knowledge and Collaboration', description: 'Warp Drive, teams, and the Admin Panel.', paths: ['knowledge-and-collaboration/**'] },
{ label: 'Reference', description: 'CLI and API reference.', paths: ['reference/**'] },
{ label: 'API & Reference', description: 'CLI and API reference.', paths: ['reference/**'] },
// All support-and-community/ pages. open-source-licenses.mdx is excluded
// globally above (stack overflow in hast-util-to-text); the patch ensures
// it's excluded from this custom set as well.
Expand Down
2 changes: 1 addition & 1 deletion src/components/CustomSidebar.astro
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ import KapaLauncher from './KapaLauncher.astro';
'getting-started': 'Getting started',
'knowledge-and-collaboration': 'Knowledge & collaboration',
'agents': 'Agents',
'reference': 'Reference',
'reference': 'API & Reference',
'changelog': 'Changelog',
'support-and-community': 'Support',
'enterprise': 'Enterprise',
Expand Down
15 changes: 14 additions & 1 deletion src/components/FeedbackFooter.astro
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,20 @@ const pageUrl = Astro.url.href;
footer {
flex-direction: column;
gap: 1.25rem;
margin-top: 2rem;
/* Hairline marking the end of page content, so the CTA below reads as
footer chrome rather than a trailing sentence of the article.
Matches the divider treatment on the "On this page" panel footer
(`CustomPageSidebar.astro`).

Spacing above the rule is NOT set here: this footer is a sibling of
`.sl-markdown-content` inside Starlight's ContentPanel, whose
`.sl-container > * + *` rule (specificity 0,1,1) already applies
`margin-top: 1.5rem` and outranks a bare `footer` selector (0,0,1).
A `margin-top: 2rem` previously declared here never took effect;
padding is used instead so the space below the rule is ours to set
and matches the 1.5rem gap above it. */
padding-top: 1.5rem;
border-top: 1px solid var(--sl-color-hairline-light);
}
.kudos {
align-items: center;
Expand Down
44 changes: 18 additions & 26 deletions src/components/WarpTopicNav.astro
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@
// Reference, etc.) as an inline-flex row with a small icon + label. The list
// is sourced from `starlight-sidebar-topics`'s middleware, which exposes
// `Astro.locals.starlightSidebarTopics.topics` on every Starlight route.
// Each topic carries `{ link, label, icon, badge, isCurrent }`; we consume
// `link`/`label`/`icon`/`isCurrent` and ignore `badge` for now (none of our
// topics ship one). The plugin's per-topic sidebar filtering lives in its
// Each topic carries `{ link, label, icon, badge, isCurrent }`. The plugin's
// per-topic sidebar filtering lives in its
// middleware (it rewrites `starlightRoute.sidebar`), so removing the topic
// list from the sidebar markup does NOT break that filtering — the same
// filtered nav still renders below this row in the page sidebar.
Expand All @@ -26,21 +25,19 @@
// underline share `--sl-color-text-accent`, which auto-adapts to dark
// and light themes.
// - No surrounding chip / box / bg — just type + icon
import { Icon } from '@astrojs/starlight/components';
import { Badge, Icon } from '@astrojs/starlight/components';

const { topics } = Astro.locals.starlightSidebarTopics;

// Per-topic icon overrides for topics where Starlight's icon registry doesn't
// ship the right glyph (only 22 generic UI icons available; no robot/AI). The
// `sidebar.ts` config keeps the closest Starlight name (e.g. `puzzle` for
// Agents, `seti:json` for API) so the mobile drawer falls back gracefully;
// this map points to a custom inline SVG that we render here in the header
// instead.
// Agents) so the mobile drawer falls back gracefully; this map points to a
// custom inline SVG that we render here in the header instead.
const CUSTOM_TOPIC_ICONS: Record<string, true> = {
Agents: true,
API: true,
Enterprise: true,
Oz: true,
'Automation Platform': true,
};
---

Expand All @@ -60,22 +57,7 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = {
this and the Starlight-rendered icons to a single
uniform size. `currentColor` so each icon inherits the
link's text color and picks up the active-state accent. */}
{topic.label === 'API' ? (
/* `</>` brackets — the conventional dev-API glyph.
Two chevrons mirrored across center, stroke weight
matched to the other topic icons. */
<svg
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M16 18l6-6-6-6" />
<path d="M8 6l-6 6 6 6" />
</svg>
) : topic.label === 'Enterprise' ? (
{topic.label === 'Enterprise' ? (
/* Office building — simple outline: tall rectangle
with window grid and entrance, stroke weight matched
to the other topic icons. */
Expand All @@ -96,7 +78,7 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = {
<line x1="15" y1="14" x2="15" y2="14.01" />
<path d="M10 22v-4h4v4" />
</svg>
) : topic.label === 'Oz' ? (
) : topic.label === 'Automation Platform' ? (
/* Cloud icon — Feather-style cloud outline, stroke weight
matched to the other topic icons. */
<svg
Expand Down Expand Up @@ -139,6 +121,11 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = {
</span>
) : null}
<span class="warp-topic-nav__label">{topic.label}</span>
{topic.badge && (
<span class="warp-topic-nav__badge">
<Badge text={topic.badge.text} variant={topic.badge.variant} />
</span>
)}
</a>
</li>
))}
Expand Down Expand Up @@ -227,6 +214,11 @@ const CUSTOM_TOPIC_ICONS: Record<string, true> = {
color: var(--sl-color-text-accent);
font-weight: 600;
}
.warp-topic-nav__badge {
display: inline-flex;
align-items: center;
margin-inline-start: 0.125rem;
}

/* 2px accent underline under the active tab, anchored to the link's own
bottom edge so it hugs the tab. It previously dropped down to the
Expand Down
Loading