From de517ba9b7e729b452b0f40873e0f85bcb9de430 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Sat, 6 Jun 2026 17:35:22 +0000 Subject: [PATCH] Add LogicSRC hire us page --- .../contract/logicsrc-web.contract.test.ts | 3 +- apps/logicsrc-web/e2e/logicsrc.spec.ts | 12 ++ apps/logicsrc-web/public/sitemap.xml | 5 + apps/logicsrc-web/src/main.ts | 51 +++++++- apps/logicsrc-web/src/styles.css | 122 +++++++++++++++++- 5 files changed, 187 insertions(+), 6 deletions(-) diff --git a/apps/logicsrc-web/contract/logicsrc-web.contract.test.ts b/apps/logicsrc-web/contract/logicsrc-web.contract.test.ts index 77f6ca2..4d3638b 100644 --- a/apps/logicsrc-web/contract/logicsrc-web.contract.test.ts +++ b/apps/logicsrc-web/contract/logicsrc-web.contract.test.ts @@ -23,7 +23,7 @@ afterAll(() => { describe("LogicSRC web contracts", () => { it("serves SPA routes from the built app shell", async () => { - for (const route of ["/", "/openspec", "/docs", "/blog", "/about", "/terms", "/privacy"]) { + for (const route of ["/", "/openspec", "/docs", "/blog", "/hire-us", "/about", "/terms", "/privacy"]) { const response = await fetch(`${baseUrl}${route}`); const text = await response.text(); @@ -41,6 +41,7 @@ describe("LogicSRC web contracts", () => { expect(response.headers.get("content-type")).toContain("application/xml"); expect(response.headers.get("cache-control")).toBe("no-store"); expect(text).toContain("https://logicsrc.com/openspec"); + expect(text).toContain("https://logicsrc.com/hire-us"); expect(text).toContain("https://logicsrc.com/blog"); }); diff --git a/apps/logicsrc-web/e2e/logicsrc.spec.ts b/apps/logicsrc-web/e2e/logicsrc.spec.ts index 09d974a..cfef80c 100644 --- a/apps/logicsrc-web/e2e/logicsrc.spec.ts +++ b/apps/logicsrc-web/e2e/logicsrc.spec.ts @@ -22,6 +22,17 @@ test.describe("LogicSRC PWA", () => { await expect(page.getByText("/privacy ยท Privacy")).toBeVisible(); }); + test("renders Hire Us offer and CoinPay payment CTA", async ({ page }) => { + await page.goto("/hire-us"); + + await expect(page.getByRole("heading", { name: "Hire Us", exact: true })).toBeVisible(); + await expect(page.locator(".price-row strong", { hasText: "$500" })).toBeVisible(); + await expect(page.getByText("per week")).toBeVisible(); + await expect(page.getByText("open infrastructure and open specs for AI agent systems")).toBeVisible(); + await expect(page.getByRole("link", { name: "Request CoinPay invoice" })).toHaveAttribute("href", /CoinPay/); + await expect(page.getByText("COINPAY_PRODUCT=logicsrc-hire-us")).toBeVisible(); + }); + test("serves sitemap and RSS XML endpoints", async ({ request }) => { const sitemap = await request.get("/sitemap.xml"); const rss = await request.get("/blog/rss.xml"); @@ -29,6 +40,7 @@ test.describe("LogicSRC PWA", () => { expect(sitemap.status()).toBe(200); expect(sitemap.headers()["content-type"]).toMatch(/(?:application|text)\/xml/); await expect(sitemap.text()).resolves.toContain("https://logicsrc.com/openspec"); + await expect(sitemap.text()).resolves.toContain("https://logicsrc.com/hire-us"); expect(rss.status()).toBe(200); expect(rss.headers()["content-type"]).toMatch(/(?:application|text)\/xml/); diff --git a/apps/logicsrc-web/public/sitemap.xml b/apps/logicsrc-web/public/sitemap.xml index c77b5e6..194047f 100644 --- a/apps/logicsrc-web/public/sitemap.xml +++ b/apps/logicsrc-web/public/sitemap.xml @@ -25,6 +25,11 @@ weekly 0.8 + + https://logicsrc.com/hire-us + weekly + 0.8 + https://logicsrc.com/blog weekly diff --git a/apps/logicsrc-web/src/main.ts b/apps/logicsrc-web/src/main.ts index ddb46af..0969d3f 100644 --- a/apps/logicsrc-web/src/main.ts +++ b/apps/logicsrc-web/src/main.ts @@ -39,10 +39,18 @@ const agentByteSurfaces = [ { name: "PWA", detail: "Plan builder, candidate intake, live screening room, artifact review, and decision packet." } ]; +const hireUsWork = [ + { name: "AI agent workflow specs", detail: "Open schemas, repo-local plans, AgentSwarm flows, AgentByte screening contracts, and MCP resources." }, + { name: "Reference implementations", detail: "CLI, TUI, SDK, PWA, API, curl, and sh1pt-compatible surfaces that prove the spec can be used." }, + { name: "Integration hardening", detail: "GitHub, CoinPay, model providers, webhooks, audit logs, permissions, and deployment-ready contracts." }, + { name: "Open infrastructure", detail: "Portable code and specs first: no closed workflow lock-in, no one-off agent scripts that cannot be audited." } +]; + const pages = [ { id: "docs", title: "Docs", detail: "Specification guides, CLI conventions, schemas, plugin contracts, SDK conventions, and MCP resources." }, { id: "blog", title: "Blog", detail: "Project notes for LogicSRC, AgentSwarm, AgentByte, OpenSpec workflows, and reference implementations." }, { id: "openspec", title: "OpenSpec", detail: "Comparison and compatibility notes for OpenSpec.dev-style repo-local specs, proposals, tasks, and deltas." }, + { id: "hire-us", title: "Hire Us", detail: "$500/week LogicSRC work on open infrastructure, specs, AI agent workflows, and reference implementations paid through CoinPay." }, { id: "about", title: "About", detail: "LogicSRC is the Profullstack open specification project for human and AI agent coordination." }, { id: "terms", title: "Terms", detail: "Draft terms will cover acceptable use, reference implementation boundaries, and hosted-product responsibilities." }, { id: "privacy", title: "Privacy", detail: "Draft privacy notes will cover telemetry, audit events, identity data, and hosted-product data boundaries." } @@ -100,6 +108,7 @@ document.querySelector("#app")!.innerHTML = ` Docs Blog OpenSpec + Hire Us About Terms Privacy @@ -265,6 +274,46 @@ sh1pt logicsrc --openspec \\ +
+
+

Hire Us

+

$500/week for LogicSRC work using open infrastructure and open specs for AI agent systems.

+
+
+
+

Profullstack standards work

+

Open-spec AI agent implementation help

+

Hire us to turn agent ideas into portable LogicSRC specs, CLIs, SDKs, MCP resources, PWAs, APIs, and sh1pt-compatible workflows. We prioritize auditable contracts, repo-local artifacts, and integrations that can move between model providers and infrastructure.

+
+ $500 + per week +
+ +
+
+
+ ${hireUsWork.map((item) => ` +
+

${item.name}

+

${item.detail}

+
+ `).join("")} +
+
+

CoinPay checkout hook

+

Once the CoinPay org is configured, this page can point the primary CTA at a hosted checkout or escrow request for the weekly plan.

+
COINPAY_ORG=profullstack
+COINPAY_PRODUCT=logicsrc-hire-us
+COINPAY_AMOUNT_USD=500
+COINPAY_INTERVAL=week
+
+
+
+
+

Top-Level Pages

@@ -301,6 +350,6 @@ if (window.location.pathname === "/agentbyte") { } const pageRoute = window.location.pathname.slice(1); -if (["docs", "blog", "openspec", "about", "terms", "privacy"].includes(pageRoute)) { +if (["docs", "blog", "openspec", "hire-us", "about", "terms", "privacy"].includes(pageRoute)) { document.querySelector(`#${pageRoute}`)?.scrollIntoView(); } diff --git a/apps/logicsrc-web/src/styles.css b/apps/logicsrc-web/src/styles.css index fed4198..1e688bc 100644 --- a/apps/logicsrc-web/src/styles.css +++ b/apps/logicsrc-web/src/styles.css @@ -184,7 +184,10 @@ h1 { .cli-panel, .soon-lead, .soon-grid article, -.implementation-list article { +.implementation-list article, +.hire-panel, +.hire-grid article, +.coinpay-panel { border: 1px solid #d6ddd2; border-radius: 8px; background: #ffffff; @@ -374,15 +377,125 @@ pre { margin-top: 0.75rem; } +.hire-us { + padding-top: 1.2rem; +} + +.hire-layout { + display: grid; + grid-template-columns: minmax(20rem, 0.9fr) minmax(0, 1.1fr); + gap: 1rem; +} + +.hire-panel { + padding: 1rem; + background: #101418; + color: #f6f7f4; +} + +.hire-panel .eyebrow { + color: #5ac8a6; +} + +.hire-panel h3 { + margin-bottom: 0.55rem; + font-size: 1.35rem; +} + +.hire-panel p { + color: #ccd5ce; + line-height: 1.5; +} + +.price-row { + display: flex; + align-items: end; + gap: 0.5rem; + margin: 1rem 0; +} + +.price-row strong { + color: #ffffff; + font-size: 2.4rem; + line-height: 1; +} + +.price-row span { + color: #b5beb2; + font-weight: 800; +} + +.cta-row { + display: flex; + flex-wrap: wrap; + gap: 0.65rem; +} + +.button-primary, +.button-secondary { + display: inline-flex; + min-height: 2.5rem; + align-items: center; + justify-content: center; + padding: 0.6rem 0.85rem; + border-radius: 6px; + font-weight: 800; +} + +.button-primary { + background: #5ac8a6; + color: #101418; +} + +.button-secondary { + border: 1px solid #3f5049; + color: #f6f7f4; +} + +.hire-stack { + display: grid; + gap: 0.75rem; +} + +.hire-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.75rem; +} + +.hire-grid article, +.coinpay-panel { + padding: 0.85rem; +} + +.hire-grid h3, +.coinpay-panel h3 { + margin-bottom: 0.35rem; + font-size: 1rem; +} + +.hire-grid p, +.coinpay-panel p { + margin-bottom: 0; + color: #58615b; + line-height: 1.45; +} + +.coinpay-panel pre { + margin-bottom: 0; +} + @media (max-width: 980px) { .primitive-grid, - .implementation-list { + .implementation-list, + .hire-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .hero, .soon-layout, - .two-col { + .two-col, + .hire-layout { grid-template-columns: 1fr; } } @@ -417,7 +530,8 @@ pre { .status-grid, .primitive-grid, .soon-grid, - .implementation-list { + .implementation-list, + .hire-grid { grid-template-columns: 1fr; }