Skip to content

Commit 4d82d93

Browse files
committed
Merge origin/staging into mship-fixes
Baseline reconciliation: route count to the merged union (1125), and the settings-page module-graph baseline re-recorded for the page-compile / artifact-stylesheet statics now reachable via file-utils.server.
2 parents 2e21dbf + 521348b commit 4d82d93

179 files changed

Lines changed: 31205 additions & 1022 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/babysit/SKILL.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,21 @@ round. Always check both conditions freshly after every push.
134134
When the loop ends, summarize: how many rounds it took, what was actually fixed (one line each),
135135
what was pushed back on as a false positive and why, and the final Greptile score / thread count.
136136

137+
## Public-repo hygiene
138+
139+
Every reply, comment and commit you post here is public and permanent, and review bots quote
140+
your replies back so a leak propagates. Before each post, strip anything that ties the change to
141+
a tenant: customer/company names, workspace/user/org/KB/connector IDs, emails, tenant hostnames,
142+
verbatim document/sheet/folder names, log lines, and per-tenant DB output. Cite the mechanism and
143+
aggregate numbers instead — see `/ship`'s "What to Omit" for the full list and the pre-publish
144+
grep. Triaging a finding often means pasting evidence you gathered from prod; that is exactly the
145+
moment this gets violated. Check before posting, not after: editing a comment does not unsend its
146+
notification email.
147+
137148
## Hard rules
138149

139150
- Never post the two re-review mentions as a single combined comment.
151+
- Never paste prod evidence into a reply without scrubbing it first (see above).
140152
- Never resolve a thread without replying to it first.
141153
- Never fix a finding with a hacky workaround — if the clean fix isn't obvious, find the sibling
142154
pattern elsewhere in the codebase solving the same class of problem and match it.

.agents/skills/emcn-design-review/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Use CSS variable pattern (`text-[var(--text-primary)]`), never Tailwind semantic
3939
**Surfaces**: `--bg`, `--surface-1` through `--surface-7`, `--surface-hover`, `--surface-active`
4040
**Borders**: `--border`, `--border-1`, `--border-muted`
4141
**Brand/accent**: `--brand-secondary`, `--brand-accent`
42-
**Z-Index**: `--z-dropdown` (100), `--z-modal` (200), `--z-popover` (300), `--z-tooltip` (400), `--z-toast` (500)
42+
**Z-Index**: `--z-dropdown` (100), `--z-toast` (150), `--z-modal` (200), `--z-popover` (300), `--z-tooltip` (400), `--z-takeover` (500), `--z-shell-gate` (600)
4343
**Shadows**: `shadow-subtle`, `shadow-medium`, `shadow-overlay`, `shadow-card`
4444
**Badges**: `--badge-*` semantic families (success/error/gray/blue/purple/orange/amber/teal/cyan/pink, each with `-bg`/`-text`)
4545

.agents/skills/ship/SKILL.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,20 @@ chore(scope): description for maintenance
102102

103103
## What to Omit
104104

105-
The repo is public. Keep the title and description to the code change and its reasoning — never:
105+
The repo is public. **Everything you publish — title, description, commit messages, and every later comment — must stand on its own without the incident that produced it.** Never include:
106106

107-
- Customer, company, or user names; workspace/user/org IDs; email addresses
107+
- Customer, company, or user names; workspace/user/org/KB/connector IDs; email addresses
108108
- Prod or staging operational data: log lines, DB rows, metrics, timestamps, incident details, canary/alert output
109-
- Infrastructure specifics: hostnames, ARNs, internal URLs, env var values, secret names
109+
- Infrastructure specifics: hostnames (incl. tenant subdomains), ARNs, internal URLs, env var values, secret names
110+
- Verbatim customer content: file names, document titles, sheet/column names, folder paths
110111

111-
Describe the bug by its mechanism, not by how you found it. "Expired OAuth credentials fail to refresh in the worker" — not "the Sheets canary failed at 16:31Z for workspace abc-123".
112+
Describe the bug by its mechanism, not by how you found it. "Expired OAuth credentials fail to refresh in the worker" — not "the Sheets canary failed at 16:31Z for workspace abc-123". Aggregate counts are fine once detached from the tenant ("1,379 PDFs failed"); the same number attributed to a named customer is not. Replace real examples with placeholders (`<real sheet name>`) rather than cutting them — the illustration is usually the useful part.
113+
114+
**Scrub before publishing, not after** — a leak is public the instant it posts, and editing later does not unsend the notification email. This applies to every PR you open, including ones created directly with `gh pr create` rather than through this skill. Grep the title, body, and `git log origin/staging..HEAD` before publishing:
115+
116+
```bash
117+
grep -niE 'customer-or-company-name|@[a-z0-9.-]+\.(com|io|ai)|[0-9a-f]{8}-[0-9a-f]{4}-|\.sharepoint\.com|arn:aws|https?://[a-z0-9.-]*\.internal'
118+
```
112119

113120
## PR Description Format
114121

apps/docs/app/[lang]/[[...slug]]/page.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type React from 'react'
2+
import { highlight } from 'fumadocs-core/highlight'
23
import type { Root } from 'fumadocs-core/page-tree'
34
import { findNeighbour } from 'fumadocs-core/page-tree'
45
import type { ApiPageProps } from 'fumadocs-openapi/ui'
@@ -17,6 +18,7 @@ import { Heading } from '@/components/ui/heading'
1718
import { ResponseSection } from '@/components/ui/response-section'
1819
import { i18n } from '@/lib/i18n'
1920
import { getApiSpecContent, getAuthenticatedCodeSamples, openapi } from '@/lib/openapi'
21+
import { simShikiOptions } from '@/lib/shiki-theme'
2022
import { type PageData, source } from '@/lib/source'
2123
import { DOCS_BASE_URL } from '@/lib/urls'
2224

@@ -69,9 +71,31 @@ function stripLocalePrefix(url: string, lang: string): string {
6971
return url
7072
}
7173

74+
/**
75+
* Renders the API reference's request and response samples through the docs' own `CodeBlock`
76+
* rather than fumadocs-openapi's built-in one, so those blocks get the emcn copy control
77+
* instead of fumadocs' lucide clipboard. Mirrors the default renderer — same `highlight` call,
78+
* same `Pre` component, same `my-0` — differing only in which shell wraps the result.
79+
*/
80+
async function ApiCodeBlock({ lang, code }: { lang: string; code: string }) {
81+
return (
82+
<CodeBlock className='my-0'>
83+
{await highlight(code, { lang, ...simShikiOptions, components: { pre: Pre } })}
84+
</CodeBlock>
85+
)
86+
}
87+
7288
const APIPage = createAPIPage(openapi, {
89+
renderCodeBlock: (props) => <ApiCodeBlock {...props} />,
7390
playground: { enabled: false },
7491
generateCodeSamples: getAuthenticatedCodeSamples,
92+
/**
93+
* fumadocs-openapi highlights its request and response samples through its own Shiki
94+
* instance, not the MDX pipeline, so it does not inherit `source.config.ts`. Left alone,
95+
* every API reference page renders `github-light` / `github-dark` while the rest of the docs
96+
* render the platform palette.
97+
*/
98+
shikiOptions: simShikiOptions,
7599
client: {
76100
operation: { APIExampleSelector },
77101
},

apps/docs/app/[lang]/layout.tsx

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { ReactNode } from 'react'
22
import { defineI18nUI } from 'fumadocs-ui/i18n'
33
import { DocsLayout } from 'fumadocs-ui/layouts/docs'
44
import { RootProvider } from 'fumadocs-ui/provider/next'
5-
import { Geist_Mono, Inter } from 'next/font/google'
5+
import { Inter } from 'next/font/google'
66
import { ThemeProvider } from 'next-themes'
77
import {
88
SidebarFolder,
@@ -25,12 +25,6 @@ const inter = Inter({
2525
display: 'swap',
2626
})
2727

28-
const geistMono = Geist_Mono({
29-
subsets: ['latin'],
30-
variable: '--font-geist-mono',
31-
display: 'swap',
32-
})
33-
3428
const { provider } = defineI18nUI(i18n, {
3529
translations: {
3630
en: {
@@ -85,11 +79,7 @@ export default async function Layout({ children, params }: LayoutProps) {
8579
}
8680

8781
return (
88-
<html
89-
lang={lang}
90-
className={`${inter.variable} ${geistMono.variable} ${season.variable}`}
91-
suppressHydrationWarning
92-
>
82+
<html lang={lang} className={`${inter.variable} ${season.variable}`} suppressHydrationWarning>
9383
<head>
9484
<script
9585
id='website-json-ld'

0 commit comments

Comments
 (0)