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

@ -11,7 +11,7 @@
"scripts": {
"build": "tsc -p tsconfig.json",
"test": "vitest run src",
"validate:fixtures": "node dist/cli.js task ../schemas/fixtures/task.yaml && node dist/cli.js agent ../schemas/fixtures/agent.yaml"
"validate:fixtures": "node dist/cli.js task ../schemas/fixtures/task.yaml && node dist/cli.js agent ../schemas/fixtures/agent.yaml && node dist/cli.js agentad-ad ../schemas/fixtures/agentad-ad.yaml && node dist/cli.js agentad-placement ../schemas/fixtures/agentad-placement.yaml"
},
"dependencies": {
"ajv": "^8.17.1",

View file

@ -7,7 +7,7 @@ function main(argv: string[]) {
const [, , kindArg, fileArg] = argv;
if (!kindArg || !fileArg) {
console.error("Usage: logicsrc-validate <task|agent|run|event|plugin> <file.yaml|file.json>");
console.error("Usage: logicsrc-validate <task|agent|run|event|plugin|agentad-ad|agentad-placement|...> <file.yaml|file.json>");
process.exitCode = 2;
return;
}

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);
});
});

View file

@ -9,6 +9,13 @@ import pluginSchema from "../../schemas/schemas/logicsrc-plugin.schema.json" wit
import runSchema from "../../schemas/schemas/logicsrc-run.schema.json" with { type: "json" };
import socialPostSchema from "../../schemas/schemas/logicsrc-social-post.schema.json" with { type: "json" };
import taskSchema from "../../schemas/schemas/logicsrc-task.schema.json" with { type: "json" };
import agentadAdSchema from "../../schemas/schemas/agentad-ad.schema.json" with { type: "json" };
import agentadPlacementSchema from "../../schemas/schemas/agentad-placement.schema.json" with { type: "json" };
import agentadAdRequestSchema from "../../schemas/schemas/agentad-ad-request.schema.json" with { type: "json" };
import agentadAdResponseSchema from "../../schemas/schemas/agentad-ad-response.schema.json" with { type: "json" };
import agentadImpressionSchema from "../../schemas/schemas/agentad-impression.schema.json" with { type: "json" };
import agentadClickSchema from "../../schemas/schemas/agentad-click.schema.json" with { type: "json" };
import agentadCampaignSchema from "../../schemas/schemas/agentad-campaign.schema.json" with { type: "json" };
export const schemas = {
agent: agentSchema,
@ -21,7 +28,14 @@ export const schemas = {
plugin: pluginSchema,
run: runSchema,
"social-post": socialPostSchema,
task: taskSchema
task: taskSchema,
"agentad-ad": agentadAdSchema,
"agentad-placement": agentadPlacementSchema,
"agentad-ad-request": agentadAdRequestSchema,
"agentad-ad-response": agentadAdResponseSchema,
"agentad-impression": agentadImpressionSchema,
"agentad-click": agentadClickSchema,
"agentad-campaign": agentadCampaignSchema
} as const;
export type SchemaKind = keyof typeof schemas;