mirror of
https://github.com/profullstack/logicsrc.git
synced 2026-08-13 14:37:26 +00:00
Add LogicSRC hire us page
This commit is contained in:
parent
8e6124d23a
commit
de517ba9b7
5 changed files with 187 additions and 6 deletions
|
|
@ -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("<loc>https://logicsrc.com/openspec</loc>");
|
||||
expect(text).toContain("<loc>https://logicsrc.com/hire-us</loc>");
|
||||
expect(text).toContain("<loc>https://logicsrc.com/blog</loc>");
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -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/);
|
||||
|
|
|
|||
|
|
@ -25,6 +25,11 @@
|
|||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://logicsrc.com/hire-us</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://logicsrc.com/blog</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
|
|
|
|||
|
|
@ -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<HTMLDivElement>("#app")!.innerHTML = `
|
|||
<a href="/docs">Docs</a>
|
||||
<a href="/blog">Blog</a>
|
||||
<a href="/openspec">OpenSpec</a>
|
||||
<a href="/hire-us">Hire Us</a>
|
||||
<a href="/about">About</a>
|
||||
<a href="/terms">Terms</a>
|
||||
<a href="/privacy">Privacy</a>
|
||||
|
|
@ -265,6 +274,46 @@ sh1pt logicsrc --openspec \\
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section id="hire-us" class="band hire-us">
|
||||
<div class="section-head">
|
||||
<h2>Hire Us</h2>
|
||||
<p>$500/week for LogicSRC work using open infrastructure and open specs for AI agent systems.</p>
|
||||
</div>
|
||||
<div class="hire-layout">
|
||||
<article class="hire-panel">
|
||||
<p class="eyebrow">Profullstack standards work</p>
|
||||
<h3>Open-spec AI agent implementation help</h3>
|
||||
<p>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.</p>
|
||||
<div class="price-row">
|
||||
<strong>$500</strong>
|
||||
<span>per week</span>
|
||||
</div>
|
||||
<div class="cta-row">
|
||||
<a class="button-primary" href="mailto:hire-us@profullstack.com?subject=LogicSRC%20Hire%20Us%20-%20CoinPay%20%24500%2Fweek">Request CoinPay invoice</a>
|
||||
<a class="button-secondary" href="/docs">Read specs</a>
|
||||
</div>
|
||||
</article>
|
||||
<div class="hire-stack">
|
||||
<div class="hire-grid">
|
||||
${hireUsWork.map((item) => `
|
||||
<article>
|
||||
<h3>${item.name}</h3>
|
||||
<p>${item.detail}</p>
|
||||
</article>
|
||||
`).join("")}
|
||||
</div>
|
||||
<article id="coinpay-setup" class="coinpay-panel">
|
||||
<h3>CoinPay checkout hook</h3>
|
||||
<p>Once the CoinPay org is configured, this page can point the primary CTA at a hosted checkout or escrow request for the weekly plan.</p>
|
||||
<pre><code>COINPAY_ORG=profullstack
|
||||
COINPAY_PRODUCT=logicsrc-hire-us
|
||||
COINPAY_AMOUNT_USD=500
|
||||
COINPAY_INTERVAL=week</code></pre>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="pages" class="band">
|
||||
<div class="section-head">
|
||||
<h2>Top-Level Pages</h2>
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue