Add AgentAd ad schemas as a LogicSRC primitive (#10)

* Add AgentAd ad schemas as a LogicSRC primitive

AgentAd is a disclosed, agent-readable advertising contract for CLI tools
and AI agents. LogicSRC owns the canonical schemas; cl1s.tech is the
reference network built on them.

- packages/schemas: agentad-{ad,placement,ad-request,ad-response,
  impression,click,campaign} schemas (id under schemas.logicsrc.com) +
  ad/placement fixtures, exported from @logicsrc/schemas
- packages/validators: register the 7 agentad kinds, wire fixture
  validation, add tests (disclosure.sponsored must be true)
- docs/agentad.md: the AgentAd spec
- README: list AgentAd under v1 priorities

Validators build clean; all fixtures validate; vitest 4/4 green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Prepare @logicsrc/schemas for npm publish

Add license, repository, homepage, keywords, publishConfig (public),
and a package README covering both the logicsrc-* core schemas and the
agentad-* family.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Anthony Ettinger 2026-06-11 21:02:43 -07:00 committed by GitHub
parent ad9f3a2a29
commit 7cda686059
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 483 additions and 5 deletions

View file

@ -25,4 +25,27 @@ describe("LogicSRC validators", () => {
expect(result.ok).toBe(false);
});
it("validates the AgentAd ad fixture", () => {
const testDir = dirname(fileURLToPath(import.meta.url));
const file = resolve(testDir, "../../schemas/fixtures/agentad-ad.yaml");
const data = parseDocument(readFileSync(file, "utf8"), file);
expect(validate("agentad-ad", data).ok).toBe(true);
});
it("rejects an AgentAd ad that is not disclosed as sponsored", () => {
const result = validate("agentad-ad", {
type: "agentad.ad",
version: "0.1",
id: "undisclosed",
advertiser_did: "acme.coinpay",
format: "text",
title: "Buy now",
url: "https://example.com",
disclosure: { sponsored: false, label: "Sponsored" }
});
expect(result.ok).toBe(false);
});
});