Skip to content
Merged

11.19 #113

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
7 changes: 5 additions & 2 deletions __tests__/shield-page-compare-cta.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ describe('/shield page compare CTA', () => {
screen.getByRole('heading', { name: /Not sure if Shield is right for you/i }),
).toBeInTheDocument()

const link = screen.getByRole('link', { name: /Compare Shield to alternatives/i })
expect(link).toHaveAttribute('href', '/shield/compare')
const compareLink = screen.getByRole('link', { name: /Compare Shield to alternatives/i })
expect(compareLink).toHaveAttribute('href', '/shield/compare')

const threatModelLink = screen.getByRole('link', { name: /Read the threat model/i })
expect(threatModelLink).toHaveAttribute('href', '/shield/threat-model')
})
})
43 changes: 43 additions & 0 deletions __tests__/shield-threat-model-page.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { cleanup, render, screen } from '@testing-library/react'
import { afterEach, describe, expect, it } from 'vitest'
import ShieldThreatModelPage, { metadata } from '@/app/shield/threat-model/page'

afterEach(() => {
cleanup()
})

describe('/shield/threat-model page', () => {
it('renders the hero heading and no TODO placeholder strings', () => {
const { container } = render(<ShieldThreatModelPage />)

expect(
screen.getByRole('heading', { level: 1, name: /Shield threat model/ }),
).toBeInTheDocument()

expect(container.textContent ?? '').not.toContain('TODO')
})

it('renders the coverage table with both integration columns', () => {
render(<ShieldThreatModelPage />)

expect(screen.getByRole('columnheader', { name: /Native plugin/ })).toBeInTheDocument()
expect(screen.getByRole('columnheader', { name: /Hosted proxy \(MCP\)/ })).toBeInTheDocument()
})

it('links the recommendation to getting started docs', () => {
render(<ShieldThreatModelPage />)

const docLink = screen.getByRole('link', { name: /^Getting started$/ })
expect(docLink).toHaveAttribute('href', '/docs/getting-started')
})

it('mentions roadmap wording for native integrations', () => {
render(<ShieldThreatModelPage />)

expect(screen.getByText(/Windsurf on the roadmap/i)).toBeInTheDocument()
})

it('declares the correct canonical URL', () => {
expect(metadata.alternates?.canonical).toBe('https://multicorn.ai/shield/threat-model')
})
})
2 changes: 1 addition & 1 deletion app/about/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ const VALUES: readonly Value[] = [
{
name: 'Developer experience',
description:
'Safety tools only work if developers actually use them. We build for real workflows, not compliance theatre.',
'Safety tools only work if developers actually use them. We build for real workflows, not compliance theater.',
},
]

Expand Down
4 changes: 2 additions & 2 deletions app/contact/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ const CONTACT_CATEGORIES: readonly ContactCategory[] = [
{
name: 'Enterprise sales',
email: 'sales@multicorn.ai',
description: 'Custom plans, volume pricing, or compliance requirements for your organisation.',
description: 'Custom plans, volume pricing, or compliance requirements for your organization.',
note: "We're launching enterprise plans soon. Get in touch to discuss early access.",
},
{
Expand Down Expand Up @@ -171,7 +171,7 @@ export default function ContactPage() {
</h2>
<p className="text-lg leading-relaxed text-text-secondary">
Found a bug in the Shield SDK or have an idea for a new feature? Open an issue on
GitHub. This helps us track and prioritise community feedback in the open.
GitHub. This helps us track and prioritize community feedback in the open.
</p>
<div className="mt-8">
<a
Expand Down
11 changes: 9 additions & 2 deletions app/shield/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ const CAPABILITIES: readonly Capability[] = [
{
name: 'Team policies',
description:
'Set organisation-wide rules for what agents can do. Apply policies across teams so every agent follows the same guardrails.',
'Set organization-wide rules for what agents can do. Apply policies across teams so every agent follows the same guardrails.',
icon: (
<svg
xmlns="http://www.w3.org/2000/svg"
Expand Down Expand Up @@ -677,14 +677,21 @@ export default function ShieldPage() {
control tools - Agent Safehouse, agentsh, and AgentGate - and find the right fit for
your team.
</p>
<div className="mt-10 flex justify-center">
<div className="mt-10 flex flex-col items-center justify-center gap-4 sm:flex-row">
<TrackedCtaLink
href="/shield/compare"
className="inline-flex min-h-[44px] items-center rounded-lg bg-primary px-8 py-3 text-base font-semibold text-white shadow-sm transition-colors hover:bg-primary-dark focus:outline-none focus:ring-2 focus:ring-primary/20 focus:ring-offset-2"
eventName="shield_page_compare_link_click"
>
Compare Shield to alternatives
</TrackedCtaLink>
<TrackedCtaLink
href="/shield/threat-model"
className="inline-flex min-h-[44px] items-center rounded-lg border border-border bg-surface px-8 py-3 text-base font-semibold text-text-primary shadow-sm transition-colors hover:bg-surface-secondary focus:outline-none focus:ring-2 focus:ring-primary/20 focus:ring-offset-2"
eventName="shield_page_threat_model_link_click"
>
Read the threat model
</TrackedCtaLink>
</div>
</div>
</section>
Expand Down
Loading
Loading