From 797e138823420e64ad3d51b76f28bb010b7a35c4 Mon Sep 17 00:00:00 2001 From: Greg Soucy Date: Thu, 19 Mar 2026 02:42:06 -0400 Subject: [PATCH] Clarify discovery and integrity authority --- .gitignore | 2 - .well-known/agent-cards-v1.1.0.json | 6 +- .well-known/agent.json | 6 +- README.md | 34 +++-- checksums-v1.0.0.txt | 17 +++ checksums-v1.1.0.txt | 22 +++ checksums.txt | 65 --------- dist-pin/agent-cards/v1.0.0/checksums.txt | 17 --- .../.well-known/agent-cards-v1.1.0.json | 6 +- .../agent-cards/v1.1.0/.well-known/agent.json | 6 +- dist-pin/agent-cards/v1.1.0/checksums.txt | 51 +------ .../agent-cards/v1.1.0/meta/manifest.json | 12 +- .../v1.1.0/agent.descriptor.schema.json | 15 ++ meta/manifest.json | 12 +- package.json | 3 +- schemas/v1.1.0/agent.descriptor.schema.json | 15 ++ scripts/generate-checksums.mjs | 136 ++++++++++++------ scripts/validate-cards.mjs | 64 ++++++++- 18 files changed, 278 insertions(+), 211 deletions(-) create mode 100644 checksums-v1.0.0.txt create mode 100644 checksums-v1.1.0.txt delete mode 100644 checksums.txt diff --git a/.gitignore b/.gitignore index f9c9c57..7823ef6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,3 @@ npm-debug.log* dist .DS_Store -# local build/pin staging -/dist-pin/ diff --git a/.well-known/agent-cards-v1.1.0.json b/.well-known/agent-cards-v1.1.0.json index 60fb1ba..69c089b 100644 --- a/.well-known/agent-cards-v1.1.0.json +++ b/.well-known/agent-cards-v1.1.0.json @@ -1,7 +1,7 @@ { "id": "x402://commandlayer.eth/agent-cards/v1.1.0", "name": "CommandLayer Agent Cards Registry Descriptor (v1.1.0)", - "description": "Versioned discovery descriptor for CommandLayer Agent Cards v1.1.0.", + "description": "Frozen well-known discovery descriptor for the CommandLayer Agent Cards v1.1.0 release line.", "owner": "commandlayer.eth", "ens": "commandlayer.eth", "version": "1.1.0", @@ -25,6 +25,8 @@ "current_release": "v1.1.0", "legacy_release": "v1.0.0", "publish_state": "ready-to-pin", - "license": "Apache-2.0" + "license": "Apache-2.0", + "descriptor_role": "release-snapshot", + "frozen_release": "v1.1.0" } } diff --git a/.well-known/agent.json b/.well-known/agent.json index 643b1c3..d344e4e 100644 --- a/.well-known/agent.json +++ b/.well-known/agent.json @@ -1,7 +1,7 @@ { "id": "x402://commandlayer.eth/agent-cards/v1.1.0", "name": "CommandLayer Agent Cards Registry", - "description": "Well-known descriptor for the current CommandLayer Agent Cards v1.1.0 release line.", + "description": "Current well-known discovery descriptor for the recommended CommandLayer Agent Cards release line.", "owner": "commandlayer.eth", "ens": "commandlayer.eth", "version": "1.1.0", @@ -25,6 +25,8 @@ "current_release": "v1.1.0", "legacy_release": "v1.0.0", "publish_state": "ready-to-pin", - "license": "Apache-2.0" + "license": "Apache-2.0", + "descriptor_role": "current-pointer", + "current_pointer_target": "agent-cards-v1.1.0.json" } } diff --git a/README.md b/README.md index 4423456..c9c5374 100644 --- a/README.md +++ b/README.md @@ -61,8 +61,9 @@ agent-cards/ │ └── agent.descriptor.schema.json ├── meta/ ├── .well-known/ -├── dist-pin/agent-cards/v1.1.0/ -└── checksums.txt +├── dist-pin/ +├── checksums-v1.1.0.txt +└── checksums-v1.0.0.txt ``` ## Example Commons v1.1.0 card @@ -124,12 +125,29 @@ Validation checks: - direct Commons and Commercial source URL patterns - direct `commandlayer.org` mirror URL patterns - entry URI correctness -- checksum determinism across cards, schemas, meta, discovery, and dist-pin +- current release checksum determinism across the canonical v1.1.0 line +- archival checksum determinism for retained v1.0.0 compatibility assets +- committed dist-pin bundle mirroring and bundle-local checksum determinism -## Release artifacts +## Discovery surfaces + +- `.well-known/agent.json` — current discovery pointer for the recommended release line +- `.well-known/agent-cards-v1.1.0.json` — frozen v1.1.0 discovery snapshot +- The two discovery descriptors are intentionally both present under **Model A: current pointer + versioned snapshot**. +- Validation enforces that the files are identical except for the current-pointer fields in `agent.json`: `name`, `description`, `meta.descriptor_role`, and `meta.current_pointer_target`. +- The versioned snapshot keeps the v1.1.0 release facts frozen and carries `meta.descriptor_role=release-snapshot` plus `meta.frozen_release=v1.1.0`. + +## Release artifacts and integrity surfaces - `meta/manifest.json` — authoritative release index -- `.well-known/agent.json` — current discovery descriptor -- `.well-known/agent-cards-v1.1.0.json` — versioned descriptor -- `dist-pin/agent-cards/v1.1.0/` — publish bundle for repinning -- `checksums.txt` — deterministic artifact digests +- `checksums-v1.1.0.txt` — canonical checksum surface for the current v1.1.0 release line +- `checksums-v1.0.0.txt` — archival checksum surface for retained v1.0.0 compatibility assets +- `dist-pin/agent-cards/v1.1.0/` — committed authoritative publish bundle; it must exactly mirror the canonical v1.1.0 files in this repo +- `dist-pin/agent-cards/v1.1.0/checksums.txt` — bundle-local checksums for the committed publish bundle +- `dist-pin/agent-cards/v1.0.0/checksums.txt` — archival bundle-local checksums for the v1.0.0 publish bundle + +The clean-clone verification story is now split on purpose: + +- verify the current canonical release line with `npm run validate:checksums` or by inspecting `checksums-v1.1.0.txt` +- verify the committed publish bundle independently with `dist-pin/agent-cards/v1.1.0/checksums.txt` +- verify archival compatibility assets separately with `checksums-v1.0.0.txt` diff --git a/checksums-v1.0.0.txt b/checksums-v1.0.0.txt new file mode 100644 index 0000000..4c8325b --- /dev/null +++ b/checksums-v1.0.0.txt @@ -0,0 +1,17 @@ +8cbbb8edf6b3ec2e65dc54ce5bdd467a63aaaad1d90bbd251a729b238ef56507 agents/v1.0.0/commercial/authorizeagent.eth.json +bfad808d0e3b107df59887c9684303b87b4867d9887c9b1a035ca8b33b115cca agents/v1.0.0/commercial/checkoutagent.eth.json +0bbd1601794b3d18f63fc331b55888cb083e0f1a37d14c3c79679c237ec0414b agents/v1.0.0/commercial/purchaseagent.eth.json +15062e72b528e2f66e58a3d83ea617a4d9e699cb1eb25a0576cbf09f3808425d agents/v1.0.0/commercial/shipagent.eth.json +4079b22e3821dbfc141b1c9baaaf1cefb20b4c68af58725aacf8428e05d2e91a agents/v1.0.0/commercial/verifyagent.eth.json +2b14d78ad82435da6846e119bc9bf82f5b7661ccef53f4b7c25aaa50411d8812 agents/v1.0.0/commons/analyzeagent.eth.json +acb40f650362582daedda35fd1dbd78b7d1b6866e26cb3ee8ca090e0d18331e1 agents/v1.0.0/commons/classifyagent.eth.json +88943a385de72550bbd7454ddc8aabc6b4bc101449b571a1966e9e8c8266040e agents/v1.0.0/commons/cleanagent.eth.json +eb866bf8f0561590b823b1b04f4fed405fcae2f95b46f1a779cceb405efae05f agents/v1.0.0/commons/convertagent.eth.json +7f45a2abd1f542f37b0aaab639a5e02a15687235ec8704298fe9dfe39f5a5dbf agents/v1.0.0/commons/describeagent.eth.json +d8ae6333a4cc804361c0e427f0d82ee2d66b9129686fe85bcd97a3a9f1bf63f4 agents/v1.0.0/commons/explainagent.eth.json +3035cae9244887cc1451f329d9e20a15232197b39fe003a16a27c04bc10d8ff2 agents/v1.0.0/commons/fetchagent.eth.json +811465b0a47ee1b954802d97bfff3612e43914ed46c918936d3728a446175ce6 agents/v1.0.0/commons/formatagent.eth.json +4e66f7a76a302ac2fdcd7a8581c7c4fe6059028f801e2c8d155f513225aec805 agents/v1.0.0/commons/parseagent.eth.json +dc96aeffb629bec3c102771b8e5d99cd69d6b2bad7065d14b7c7ee2e8fc1eee2 agents/v1.0.0/commons/summarizeagent.eth.json +ec6b2669daca50f99c9b8e04db7b8010169786788431cd74b68e547441216b8a schemas/v1.0.0/_shared/agent.card.base.schema.json +c22100701ae9ebad97cfc1cb468a0369e424a0cdcec2d62968b848ef5d14369c schemas/v1.0.0/_shared/agent.descriptor.schema.json diff --git a/checksums-v1.1.0.txt b/checksums-v1.1.0.txt new file mode 100644 index 0000000..9a794eb --- /dev/null +++ b/checksums-v1.1.0.txt @@ -0,0 +1,22 @@ +c849b110de7ae1f2519263fa6e366ac9ab5dd6461bb2eb2f48d044e5805340c3 .well-known/agent-cards-v1.1.0.json +7565a19515cbb98ac272b9077be43378071102e98bdf23d43b6ce28cb5743399 .well-known/agent.json +9f37939c58430df6efc118ec62e56d758a2c63ff6becc33b72056dff0abd01e4 agents/v1.1.0/commercial/authorizeagent.eth.json +0c2fb22fe4d5028b3218edfbc6783fa928df09c33cac3e4ae19dd6b4fb3b1d25 agents/v1.1.0/commercial/checkoutagent.eth.json +b92447ac389a28dd6d7bb9e48b62b4dcfe2d573db9e8e46769ff7f05b70c174c agents/v1.1.0/commercial/purchaseagent.eth.json +8845af9bfb06aae06fff06d7926417e532e417faf8b11e8d906b54769f180684 agents/v1.1.0/commercial/shipagent.eth.json +0d6ee78a0a977601d2544feed5f483d193b2d5e0790417725d1665a0e6859538 agents/v1.1.0/commercial/verifyagent.eth.json +e1b3893660ea726ff444392df7abb2eada8b7a0e89e3d18fa1da3247e2546ba9 agents/v1.1.0/commons/analyzeagent.eth.json +66ae37ace0e04714b1965c7661237843dc699e3e2d1f68620cff45f1132fe81f agents/v1.1.0/commons/classifyagent.eth.json +1b56892f20d39d4780a49b8f96dd769fa7d2178f9cb04fe3c60f78d726c1889e agents/v1.1.0/commons/cleanagent.eth.json +eb575e806ce80fb473d771e667caa96e4e01806345292408882c92de54f2e059 agents/v1.1.0/commons/convertagent.eth.json +0d25e3b86ca25c333a17a0cc4b9a1e0b5265dbe2bc13d88ab9da220eb5f1b613 agents/v1.1.0/commons/describeagent.eth.json +6459519e39a9107e4294a8ad5bb46ba091933823145853aba50f38a283fbd167 agents/v1.1.0/commons/explainagent.eth.json +60288c4c63ceb7936df2dc686b063c0b97f714afac3662f05a9f10da0b6043c4 agents/v1.1.0/commons/fetchagent.eth.json +2c6a69e8e91d712c09994547a42bfb4043cd5abd14df2ac3f43f4d8837d2e433 agents/v1.1.0/commons/formatagent.eth.json +7ff9756b5bcc1f989c0f36b76de8d0a8fa2d5287532dfe9717c9622eac5f6c64 agents/v1.1.0/commons/parseagent.eth.json +1ee1a0b04cbc2488fea75458f34b0b271b7801d8e01533e4ba5dd91f2aa9ae15 agents/v1.1.0/commons/summarizeagent.eth.json +d4aa942ad535e5e5fd9103bc21dc94f45a69e87df820bf78af2c3b6db583dcca meta/commercial-agent.json +56c4da1b3716d804495aa54244f71f995ee4b22438f125c85e6148f1e5c5cf4e meta/commons-agent.json +c6ae761d917aac0f7161648002cab2caf84bf7e7084f4b8d3bf35c943409b8f9 meta/manifest.json +b7b573a464b3ba9f643958b716e72ce9eeb095a7c5b87bf2620eb53e7dc6afb3 schemas/v1.1.0/agent.card.schema.json +410c3abb4140657426ae8338ee79fbd05632bf82490061773e303782a0370d70 schemas/v1.1.0/agent.descriptor.schema.json diff --git a/checksums.txt b/checksums.txt deleted file mode 100644 index 28c0fe2..0000000 --- a/checksums.txt +++ /dev/null @@ -1,65 +0,0 @@ -cfb2adbfe8de109f249e9019596b38cb38816375e50752c2188e480d140479d7 .well-known/agent-cards-v1.1.0.json -9ed62edd51168143b431317454e4133ce3924fbb437fdbb1868be5a8d47b2670 .well-known/agent.json -8cbbb8edf6b3ec2e65dc54ce5bdd467a63aaaad1d90bbd251a729b238ef56507 agents/v1.0.0/commercial/authorizeagent.eth.json -bfad808d0e3b107df59887c9684303b87b4867d9887c9b1a035ca8b33b115cca agents/v1.0.0/commercial/checkoutagent.eth.json -0bbd1601794b3d18f63fc331b55888cb083e0f1a37d14c3c79679c237ec0414b agents/v1.0.0/commercial/purchaseagent.eth.json -15062e72b528e2f66e58a3d83ea617a4d9e699cb1eb25a0576cbf09f3808425d agents/v1.0.0/commercial/shipagent.eth.json -4079b22e3821dbfc141b1c9baaaf1cefb20b4c68af58725aacf8428e05d2e91a agents/v1.0.0/commercial/verifyagent.eth.json -2b14d78ad82435da6846e119bc9bf82f5b7661ccef53f4b7c25aaa50411d8812 agents/v1.0.0/commons/analyzeagent.eth.json -acb40f650362582daedda35fd1dbd78b7d1b6866e26cb3ee8ca090e0d18331e1 agents/v1.0.0/commons/classifyagent.eth.json -88943a385de72550bbd7454ddc8aabc6b4bc101449b571a1966e9e8c8266040e agents/v1.0.0/commons/cleanagent.eth.json -eb866bf8f0561590b823b1b04f4fed405fcae2f95b46f1a779cceb405efae05f agents/v1.0.0/commons/convertagent.eth.json -7f45a2abd1f542f37b0aaab639a5e02a15687235ec8704298fe9dfe39f5a5dbf agents/v1.0.0/commons/describeagent.eth.json -d8ae6333a4cc804361c0e427f0d82ee2d66b9129686fe85bcd97a3a9f1bf63f4 agents/v1.0.0/commons/explainagent.eth.json -3035cae9244887cc1451f329d9e20a15232197b39fe003a16a27c04bc10d8ff2 agents/v1.0.0/commons/fetchagent.eth.json -811465b0a47ee1b954802d97bfff3612e43914ed46c918936d3728a446175ce6 agents/v1.0.0/commons/formatagent.eth.json -4e66f7a76a302ac2fdcd7a8581c7c4fe6059028f801e2c8d155f513225aec805 agents/v1.0.0/commons/parseagent.eth.json -dc96aeffb629bec3c102771b8e5d99cd69d6b2bad7065d14b7c7ee2e8fc1eee2 agents/v1.0.0/commons/summarizeagent.eth.json -9f37939c58430df6efc118ec62e56d758a2c63ff6becc33b72056dff0abd01e4 agents/v1.1.0/commercial/authorizeagent.eth.json -0c2fb22fe4d5028b3218edfbc6783fa928df09c33cac3e4ae19dd6b4fb3b1d25 agents/v1.1.0/commercial/checkoutagent.eth.json -b92447ac389a28dd6d7bb9e48b62b4dcfe2d573db9e8e46769ff7f05b70c174c agents/v1.1.0/commercial/purchaseagent.eth.json -8845af9bfb06aae06fff06d7926417e532e417faf8b11e8d906b54769f180684 agents/v1.1.0/commercial/shipagent.eth.json -0d6ee78a0a977601d2544feed5f483d193b2d5e0790417725d1665a0e6859538 agents/v1.1.0/commercial/verifyagent.eth.json -e1b3893660ea726ff444392df7abb2eada8b7a0e89e3d18fa1da3247e2546ba9 agents/v1.1.0/commons/analyzeagent.eth.json -66ae37ace0e04714b1965c7661237843dc699e3e2d1f68620cff45f1132fe81f agents/v1.1.0/commons/classifyagent.eth.json -1b56892f20d39d4780a49b8f96dd769fa7d2178f9cb04fe3c60f78d726c1889e agents/v1.1.0/commons/cleanagent.eth.json -eb575e806ce80fb473d771e667caa96e4e01806345292408882c92de54f2e059 agents/v1.1.0/commons/convertagent.eth.json -0d25e3b86ca25c333a17a0cc4b9a1e0b5265dbe2bc13d88ab9da220eb5f1b613 agents/v1.1.0/commons/describeagent.eth.json -6459519e39a9107e4294a8ad5bb46ba091933823145853aba50f38a283fbd167 agents/v1.1.0/commons/explainagent.eth.json -60288c4c63ceb7936df2dc686b063c0b97f714afac3662f05a9f10da0b6043c4 agents/v1.1.0/commons/fetchagent.eth.json -2c6a69e8e91d712c09994547a42bfb4043cd5abd14df2ac3f43f4d8837d2e433 agents/v1.1.0/commons/formatagent.eth.json -7ff9756b5bcc1f989c0f36b76de8d0a8fa2d5287532dfe9717c9622eac5f6c64 agents/v1.1.0/commons/parseagent.eth.json -1ee1a0b04cbc2488fea75458f34b0b271b7801d8e01533e4ba5dd91f2aa9ae15 agents/v1.1.0/commons/summarizeagent.eth.json -3204719c980ffc68f7a317a01b9df67ca8655d5314168c6026415e06dcd8b0f8 dist-pin/agent-cards/v1.0.0/.well-known/agent.json -d3cde6eef58761fe5b88e3df5cb448002a289735df8f1c164fdc3b74193c61b9 dist-pin/agent-cards/v1.0.0/meta/commercial-agent.json -783178e57e9b754d939d90b9564740b45175fe0d360cfa4191716eb60e466c2e dist-pin/agent-cards/v1.0.0/meta/commons-agent.json -10c6ca12542dbdb21ccb1816ba7c98704789729e016b8dafe5ee2361f8b0e75c dist-pin/agent-cards/v1.0.0/meta/manifest.json -cfb2adbfe8de109f249e9019596b38cb38816375e50752c2188e480d140479d7 dist-pin/agent-cards/v1.1.0/.well-known/agent-cards-v1.1.0.json -9ed62edd51168143b431317454e4133ce3924fbb437fdbb1868be5a8d47b2670 dist-pin/agent-cards/v1.1.0/.well-known/agent.json -9f37939c58430df6efc118ec62e56d758a2c63ff6becc33b72056dff0abd01e4 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/authorizeagent.eth.json -0c2fb22fe4d5028b3218edfbc6783fa928df09c33cac3e4ae19dd6b4fb3b1d25 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/checkoutagent.eth.json -b92447ac389a28dd6d7bb9e48b62b4dcfe2d573db9e8e46769ff7f05b70c174c dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/purchaseagent.eth.json -8845af9bfb06aae06fff06d7926417e532e417faf8b11e8d906b54769f180684 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/shipagent.eth.json -0d6ee78a0a977601d2544feed5f483d193b2d5e0790417725d1665a0e6859538 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/verifyagent.eth.json -e1b3893660ea726ff444392df7abb2eada8b7a0e89e3d18fa1da3247e2546ba9 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/analyzeagent.eth.json -66ae37ace0e04714b1965c7661237843dc699e3e2d1f68620cff45f1132fe81f dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/classifyagent.eth.json -1b56892f20d39d4780a49b8f96dd769fa7d2178f9cb04fe3c60f78d726c1889e dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/cleanagent.eth.json -eb575e806ce80fb473d771e667caa96e4e01806345292408882c92de54f2e059 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/convertagent.eth.json -0d25e3b86ca25c333a17a0cc4b9a1e0b5265dbe2bc13d88ab9da220eb5f1b613 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/describeagent.eth.json -6459519e39a9107e4294a8ad5bb46ba091933823145853aba50f38a283fbd167 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/explainagent.eth.json -60288c4c63ceb7936df2dc686b063c0b97f714afac3662f05a9f10da0b6043c4 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/fetchagent.eth.json -2c6a69e8e91d712c09994547a42bfb4043cd5abd14df2ac3f43f4d8837d2e433 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/formatagent.eth.json -7ff9756b5bcc1f989c0f36b76de8d0a8fa2d5287532dfe9717c9622eac5f6c64 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/parseagent.eth.json -1ee1a0b04cbc2488fea75458f34b0b271b7801d8e01533e4ba5dd91f2aa9ae15 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/summarizeagent.eth.json -d4aa942ad535e5e5fd9103bc21dc94f45a69e87df820bf78af2c3b6db583dcca dist-pin/agent-cards/v1.1.0/meta/commercial-agent.json -56c4da1b3716d804495aa54244f71f995ee4b22438f125c85e6148f1e5c5cf4e dist-pin/agent-cards/v1.1.0/meta/commons-agent.json -7bbc331142bff2e8ac6882617345d732cc4744e266a16e87decf6fe5dedf2be1 dist-pin/agent-cards/v1.1.0/meta/manifest.json -b7b573a464b3ba9f643958b716e72ce9eeb095a7c5b87bf2620eb53e7dc6afb3 dist-pin/agent-cards/v1.1.0/schemas/v1.1.0/agent.card.schema.json -0735b66ce8352a56cb18b22f60393dc669f323bcaf8e44aa1ce797e2274d524c dist-pin/agent-cards/v1.1.0/schemas/v1.1.0/agent.descriptor.schema.json -d4aa942ad535e5e5fd9103bc21dc94f45a69e87df820bf78af2c3b6db583dcca meta/commercial-agent.json -56c4da1b3716d804495aa54244f71f995ee4b22438f125c85e6148f1e5c5cf4e meta/commons-agent.json -7bbc331142bff2e8ac6882617345d732cc4744e266a16e87decf6fe5dedf2be1 meta/manifest.json -ec6b2669daca50f99c9b8e04db7b8010169786788431cd74b68e547441216b8a schemas/v1.0.0/_shared/agent.card.base.schema.json -c22100701ae9ebad97cfc1cb468a0369e424a0cdcec2d62968b848ef5d14369c schemas/v1.0.0/_shared/agent.descriptor.schema.json -b7b573a464b3ba9f643958b716e72ce9eeb095a7c5b87bf2620eb53e7dc6afb3 schemas/v1.1.0/agent.card.schema.json -0735b66ce8352a56cb18b22f60393dc669f323bcaf8e44aa1ce797e2274d524c schemas/v1.1.0/agent.descriptor.schema.json diff --git a/dist-pin/agent-cards/v1.0.0/checksums.txt b/dist-pin/agent-cards/v1.0.0/checksums.txt index 366e17f..f249b47 100644 --- a/dist-pin/agent-cards/v1.0.0/checksums.txt +++ b/dist-pin/agent-cards/v1.0.0/checksums.txt @@ -1,21 +1,4 @@ 3204719c980ffc68f7a317a01b9df67ca8655d5314168c6026415e06dcd8b0f8 .well-known/agent.json -8cbbb8edf6b3ec2e65dc54ce5bdd467a63aaaad1d90bbd251a729b238ef56507 agents/v1.0.0/commercial/authorizeagent.eth.json -bfad808d0e3b107df59887c9684303b87b4867d9887c9b1a035ca8b33b115cca agents/v1.0.0/commercial/checkoutagent.eth.json -0bbd1601794b3d18f63fc331b55888cb083e0f1a37d14c3c79679c237ec0414b agents/v1.0.0/commercial/purchaseagent.eth.json -15062e72b528e2f66e58a3d83ea617a4d9e699cb1eb25a0576cbf09f3808425d agents/v1.0.0/commercial/shipagent.eth.json -4079b22e3821dbfc141b1c9baaaf1cefb20b4c68af58725aacf8428e05d2e91a agents/v1.0.0/commercial/verifyagent.eth.json -2b14d78ad82435da6846e119bc9bf82f5b7661ccef53f4b7c25aaa50411d8812 agents/v1.0.0/commons/analyzeagent.eth.json -acb40f650362582daedda35fd1dbd78b7d1b6866e26cb3ee8ca090e0d18331e1 agents/v1.0.0/commons/classifyagent.eth.json -88943a385de72550bbd7454ddc8aabc6b4bc101449b571a1966e9e8c8266040e agents/v1.0.0/commons/cleanagent.eth.json -eb866bf8f0561590b823b1b04f4fed405fcae2f95b46f1a779cceb405efae05f agents/v1.0.0/commons/convertagent.eth.json -7f45a2abd1f542f37b0aaab639a5e02a15687235ec8704298fe9dfe39f5a5dbf agents/v1.0.0/commons/describeagent.eth.json -d8ae6333a4cc804361c0e427f0d82ee2d66b9129686fe85bcd97a3a9f1bf63f4 agents/v1.0.0/commons/explainagent.eth.json -3035cae9244887cc1451f329d9e20a15232197b39fe003a16a27c04bc10d8ff2 agents/v1.0.0/commons/fetchagent.eth.json -811465b0a47ee1b954802d97bfff3612e43914ed46c918936d3728a446175ce6 agents/v1.0.0/commons/formatagent.eth.json -4e66f7a76a302ac2fdcd7a8581c7c4fe6059028f801e2c8d155f513225aec805 agents/v1.0.0/commons/parseagent.eth.json -dc96aeffb629bec3c102771b8e5d99cd69d6b2bad7065d14b7c7ee2e8fc1eee2 agents/v1.0.0/commons/summarizeagent.eth.json d3cde6eef58761fe5b88e3df5cb448002a289735df8f1c164fdc3b74193c61b9 meta/commercial-agent.json 783178e57e9b754d939d90b9564740b45175fe0d360cfa4191716eb60e466c2e meta/commons-agent.json 10c6ca12542dbdb21ccb1816ba7c98704789729e016b8dafe5ee2361f8b0e75c meta/manifest.json -ec6b2669daca50f99c9b8e04db7b8010169786788431cd74b68e547441216b8a schemas/v1.0.0/_shared/agent.card.base.schema.json -c22100701ae9ebad97cfc1cb468a0369e424a0cdcec2d62968b848ef5d14369c schemas/v1.0.0/_shared/agent.descriptor.schema.json diff --git a/dist-pin/agent-cards/v1.1.0/.well-known/agent-cards-v1.1.0.json b/dist-pin/agent-cards/v1.1.0/.well-known/agent-cards-v1.1.0.json index 60fb1ba..69c089b 100644 --- a/dist-pin/agent-cards/v1.1.0/.well-known/agent-cards-v1.1.0.json +++ b/dist-pin/agent-cards/v1.1.0/.well-known/agent-cards-v1.1.0.json @@ -1,7 +1,7 @@ { "id": "x402://commandlayer.eth/agent-cards/v1.1.0", "name": "CommandLayer Agent Cards Registry Descriptor (v1.1.0)", - "description": "Versioned discovery descriptor for CommandLayer Agent Cards v1.1.0.", + "description": "Frozen well-known discovery descriptor for the CommandLayer Agent Cards v1.1.0 release line.", "owner": "commandlayer.eth", "ens": "commandlayer.eth", "version": "1.1.0", @@ -25,6 +25,8 @@ "current_release": "v1.1.0", "legacy_release": "v1.0.0", "publish_state": "ready-to-pin", - "license": "Apache-2.0" + "license": "Apache-2.0", + "descriptor_role": "release-snapshot", + "frozen_release": "v1.1.0" } } diff --git a/dist-pin/agent-cards/v1.1.0/.well-known/agent.json b/dist-pin/agent-cards/v1.1.0/.well-known/agent.json index 643b1c3..d344e4e 100644 --- a/dist-pin/agent-cards/v1.1.0/.well-known/agent.json +++ b/dist-pin/agent-cards/v1.1.0/.well-known/agent.json @@ -1,7 +1,7 @@ { "id": "x402://commandlayer.eth/agent-cards/v1.1.0", "name": "CommandLayer Agent Cards Registry", - "description": "Well-known descriptor for the current CommandLayer Agent Cards v1.1.0 release line.", + "description": "Current well-known discovery descriptor for the recommended CommandLayer Agent Cards release line.", "owner": "commandlayer.eth", "ens": "commandlayer.eth", "version": "1.1.0", @@ -25,6 +25,8 @@ "current_release": "v1.1.0", "legacy_release": "v1.0.0", "publish_state": "ready-to-pin", - "license": "Apache-2.0" + "license": "Apache-2.0", + "descriptor_role": "current-pointer", + "current_pointer_target": "agent-cards-v1.1.0.json" } } diff --git a/dist-pin/agent-cards/v1.1.0/checksums.txt b/dist-pin/agent-cards/v1.1.0/checksums.txt index 28c0fe2..9a794eb 100644 --- a/dist-pin/agent-cards/v1.1.0/checksums.txt +++ b/dist-pin/agent-cards/v1.1.0/checksums.txt @@ -1,20 +1,5 @@ -cfb2adbfe8de109f249e9019596b38cb38816375e50752c2188e480d140479d7 .well-known/agent-cards-v1.1.0.json -9ed62edd51168143b431317454e4133ce3924fbb437fdbb1868be5a8d47b2670 .well-known/agent.json -8cbbb8edf6b3ec2e65dc54ce5bdd467a63aaaad1d90bbd251a729b238ef56507 agents/v1.0.0/commercial/authorizeagent.eth.json -bfad808d0e3b107df59887c9684303b87b4867d9887c9b1a035ca8b33b115cca agents/v1.0.0/commercial/checkoutagent.eth.json -0bbd1601794b3d18f63fc331b55888cb083e0f1a37d14c3c79679c237ec0414b agents/v1.0.0/commercial/purchaseagent.eth.json -15062e72b528e2f66e58a3d83ea617a4d9e699cb1eb25a0576cbf09f3808425d agents/v1.0.0/commercial/shipagent.eth.json -4079b22e3821dbfc141b1c9baaaf1cefb20b4c68af58725aacf8428e05d2e91a agents/v1.0.0/commercial/verifyagent.eth.json -2b14d78ad82435da6846e119bc9bf82f5b7661ccef53f4b7c25aaa50411d8812 agents/v1.0.0/commons/analyzeagent.eth.json -acb40f650362582daedda35fd1dbd78b7d1b6866e26cb3ee8ca090e0d18331e1 agents/v1.0.0/commons/classifyagent.eth.json -88943a385de72550bbd7454ddc8aabc6b4bc101449b571a1966e9e8c8266040e agents/v1.0.0/commons/cleanagent.eth.json -eb866bf8f0561590b823b1b04f4fed405fcae2f95b46f1a779cceb405efae05f agents/v1.0.0/commons/convertagent.eth.json -7f45a2abd1f542f37b0aaab639a5e02a15687235ec8704298fe9dfe39f5a5dbf agents/v1.0.0/commons/describeagent.eth.json -d8ae6333a4cc804361c0e427f0d82ee2d66b9129686fe85bcd97a3a9f1bf63f4 agents/v1.0.0/commons/explainagent.eth.json -3035cae9244887cc1451f329d9e20a15232197b39fe003a16a27c04bc10d8ff2 agents/v1.0.0/commons/fetchagent.eth.json -811465b0a47ee1b954802d97bfff3612e43914ed46c918936d3728a446175ce6 agents/v1.0.0/commons/formatagent.eth.json -4e66f7a76a302ac2fdcd7a8581c7c4fe6059028f801e2c8d155f513225aec805 agents/v1.0.0/commons/parseagent.eth.json -dc96aeffb629bec3c102771b8e5d99cd69d6b2bad7065d14b7c7ee2e8fc1eee2 agents/v1.0.0/commons/summarizeagent.eth.json +c849b110de7ae1f2519263fa6e366ac9ab5dd6461bb2eb2f48d044e5805340c3 .well-known/agent-cards-v1.1.0.json +7565a19515cbb98ac272b9077be43378071102e98bdf23d43b6ce28cb5743399 .well-known/agent.json 9f37939c58430df6efc118ec62e56d758a2c63ff6becc33b72056dff0abd01e4 agents/v1.1.0/commercial/authorizeagent.eth.json 0c2fb22fe4d5028b3218edfbc6783fa928df09c33cac3e4ae19dd6b4fb3b1d25 agents/v1.1.0/commercial/checkoutagent.eth.json b92447ac389a28dd6d7bb9e48b62b4dcfe2d573db9e8e46769ff7f05b70c174c agents/v1.1.0/commercial/purchaseagent.eth.json @@ -30,36 +15,8 @@ eb575e806ce80fb473d771e667caa96e4e01806345292408882c92de54f2e059 agents/v1.1.0/ 2c6a69e8e91d712c09994547a42bfb4043cd5abd14df2ac3f43f4d8837d2e433 agents/v1.1.0/commons/formatagent.eth.json 7ff9756b5bcc1f989c0f36b76de8d0a8fa2d5287532dfe9717c9622eac5f6c64 agents/v1.1.0/commons/parseagent.eth.json 1ee1a0b04cbc2488fea75458f34b0b271b7801d8e01533e4ba5dd91f2aa9ae15 agents/v1.1.0/commons/summarizeagent.eth.json -3204719c980ffc68f7a317a01b9df67ca8655d5314168c6026415e06dcd8b0f8 dist-pin/agent-cards/v1.0.0/.well-known/agent.json -d3cde6eef58761fe5b88e3df5cb448002a289735df8f1c164fdc3b74193c61b9 dist-pin/agent-cards/v1.0.0/meta/commercial-agent.json -783178e57e9b754d939d90b9564740b45175fe0d360cfa4191716eb60e466c2e dist-pin/agent-cards/v1.0.0/meta/commons-agent.json -10c6ca12542dbdb21ccb1816ba7c98704789729e016b8dafe5ee2361f8b0e75c dist-pin/agent-cards/v1.0.0/meta/manifest.json -cfb2adbfe8de109f249e9019596b38cb38816375e50752c2188e480d140479d7 dist-pin/agent-cards/v1.1.0/.well-known/agent-cards-v1.1.0.json -9ed62edd51168143b431317454e4133ce3924fbb437fdbb1868be5a8d47b2670 dist-pin/agent-cards/v1.1.0/.well-known/agent.json -9f37939c58430df6efc118ec62e56d758a2c63ff6becc33b72056dff0abd01e4 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/authorizeagent.eth.json -0c2fb22fe4d5028b3218edfbc6783fa928df09c33cac3e4ae19dd6b4fb3b1d25 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/checkoutagent.eth.json -b92447ac389a28dd6d7bb9e48b62b4dcfe2d573db9e8e46769ff7f05b70c174c dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/purchaseagent.eth.json -8845af9bfb06aae06fff06d7926417e532e417faf8b11e8d906b54769f180684 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/shipagent.eth.json -0d6ee78a0a977601d2544feed5f483d193b2d5e0790417725d1665a0e6859538 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commercial/verifyagent.eth.json -e1b3893660ea726ff444392df7abb2eada8b7a0e89e3d18fa1da3247e2546ba9 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/analyzeagent.eth.json -66ae37ace0e04714b1965c7661237843dc699e3e2d1f68620cff45f1132fe81f dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/classifyagent.eth.json -1b56892f20d39d4780a49b8f96dd769fa7d2178f9cb04fe3c60f78d726c1889e dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/cleanagent.eth.json -eb575e806ce80fb473d771e667caa96e4e01806345292408882c92de54f2e059 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/convertagent.eth.json -0d25e3b86ca25c333a17a0cc4b9a1e0b5265dbe2bc13d88ab9da220eb5f1b613 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/describeagent.eth.json -6459519e39a9107e4294a8ad5bb46ba091933823145853aba50f38a283fbd167 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/explainagent.eth.json -60288c4c63ceb7936df2dc686b063c0b97f714afac3662f05a9f10da0b6043c4 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/fetchagent.eth.json -2c6a69e8e91d712c09994547a42bfb4043cd5abd14df2ac3f43f4d8837d2e433 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/formatagent.eth.json -7ff9756b5bcc1f989c0f36b76de8d0a8fa2d5287532dfe9717c9622eac5f6c64 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/parseagent.eth.json -1ee1a0b04cbc2488fea75458f34b0b271b7801d8e01533e4ba5dd91f2aa9ae15 dist-pin/agent-cards/v1.1.0/agents/v1.1.0/commons/summarizeagent.eth.json -d4aa942ad535e5e5fd9103bc21dc94f45a69e87df820bf78af2c3b6db583dcca dist-pin/agent-cards/v1.1.0/meta/commercial-agent.json -56c4da1b3716d804495aa54244f71f995ee4b22438f125c85e6148f1e5c5cf4e dist-pin/agent-cards/v1.1.0/meta/commons-agent.json -7bbc331142bff2e8ac6882617345d732cc4744e266a16e87decf6fe5dedf2be1 dist-pin/agent-cards/v1.1.0/meta/manifest.json -b7b573a464b3ba9f643958b716e72ce9eeb095a7c5b87bf2620eb53e7dc6afb3 dist-pin/agent-cards/v1.1.0/schemas/v1.1.0/agent.card.schema.json -0735b66ce8352a56cb18b22f60393dc669f323bcaf8e44aa1ce797e2274d524c dist-pin/agent-cards/v1.1.0/schemas/v1.1.0/agent.descriptor.schema.json d4aa942ad535e5e5fd9103bc21dc94f45a69e87df820bf78af2c3b6db583dcca meta/commercial-agent.json 56c4da1b3716d804495aa54244f71f995ee4b22438f125c85e6148f1e5c5cf4e meta/commons-agent.json -7bbc331142bff2e8ac6882617345d732cc4744e266a16e87decf6fe5dedf2be1 meta/manifest.json -ec6b2669daca50f99c9b8e04db7b8010169786788431cd74b68e547441216b8a schemas/v1.0.0/_shared/agent.card.base.schema.json -c22100701ae9ebad97cfc1cb468a0369e424a0cdcec2d62968b848ef5d14369c schemas/v1.0.0/_shared/agent.descriptor.schema.json +c6ae761d917aac0f7161648002cab2caf84bf7e7084f4b8d3bf35c943409b8f9 meta/manifest.json b7b573a464b3ba9f643958b716e72ce9eeb095a7c5b87bf2620eb53e7dc6afb3 schemas/v1.1.0/agent.card.schema.json -0735b66ce8352a56cb18b22f60393dc669f323bcaf8e44aa1ce797e2274d524c schemas/v1.1.0/agent.descriptor.schema.json +410c3abb4140657426ae8338ee79fbd05632bf82490061773e303782a0370d70 schemas/v1.1.0/agent.descriptor.schema.json diff --git a/dist-pin/agent-cards/v1.1.0/meta/manifest.json b/dist-pin/agent-cards/v1.1.0/meta/manifest.json index 7eca699..24149df 100644 --- a/dist-pin/agent-cards/v1.1.0/meta/manifest.json +++ b/dist-pin/agent-cards/v1.1.0/meta/manifest.json @@ -43,14 +43,10 @@ } }, "checksums": { - "file": "https://commandlayer.org/agent-cards/checksums.txt", - "covers": [ - "agents", - "schemas", - "meta", - ".well-known", - "dist-pin/agent-cards/v1.1.0" - ] + "current_release": "https://commandlayer.org/agent-cards/checksums-v1.1.0.txt", + "archival_v1_0_0": "https://commandlayer.org/agent-cards/checksums-v1.0.0.txt", + "dist_pin_v1_1_0": "https://commandlayer.org/agent-cards/dist-pin/agent-cards/v1.1.0/checksums.txt", + "dist_pin_v1_0_0": "https://commandlayer.org/agent-cards/dist-pin/agent-cards/v1.0.0/checksums.txt" }, "entries": [ { diff --git a/dist-pin/agent-cards/v1.1.0/schemas/v1.1.0/agent.descriptor.schema.json b/dist-pin/agent-cards/v1.1.0/schemas/v1.1.0/agent.descriptor.schema.json index b01e6fa..e939a3b 100644 --- a/dist-pin/agent-cards/v1.1.0/schemas/v1.1.0/agent.descriptor.schema.json +++ b/dist-pin/agent-cards/v1.1.0/schemas/v1.1.0/agent.descriptor.schema.json @@ -95,6 +95,21 @@ }, "license": { "type": "string" + }, + "descriptor_role": { + "type": "string", + "enum": [ + "current-pointer", + "release-snapshot" + ] + }, + "current_pointer_target": { + "type": "string", + "const": "agent-cards-v1.1.0.json" + }, + "frozen_release": { + "type": "string", + "const": "v1.1.0" } } } diff --git a/meta/manifest.json b/meta/manifest.json index 7eca699..24149df 100644 --- a/meta/manifest.json +++ b/meta/manifest.json @@ -43,14 +43,10 @@ } }, "checksums": { - "file": "https://commandlayer.org/agent-cards/checksums.txt", - "covers": [ - "agents", - "schemas", - "meta", - ".well-known", - "dist-pin/agent-cards/v1.1.0" - ] + "current_release": "https://commandlayer.org/agent-cards/checksums-v1.1.0.txt", + "archival_v1_0_0": "https://commandlayer.org/agent-cards/checksums-v1.0.0.txt", + "dist_pin_v1_1_0": "https://commandlayer.org/agent-cards/dist-pin/agent-cards/v1.1.0/checksums.txt", + "dist_pin_v1_0_0": "https://commandlayer.org/agent-cards/dist-pin/agent-cards/v1.0.0/checksums.txt" }, "entries": [ { diff --git a/package.json b/package.json index c719cad..b308e7f 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "meta/", "schemas/", "dist-pin/", - "checksums.txt", + "checksums-v1.1.0.txt", + "checksums-v1.0.0.txt", "LICENSE", "README.md" ], diff --git a/schemas/v1.1.0/agent.descriptor.schema.json b/schemas/v1.1.0/agent.descriptor.schema.json index b01e6fa..e939a3b 100644 --- a/schemas/v1.1.0/agent.descriptor.schema.json +++ b/schemas/v1.1.0/agent.descriptor.schema.json @@ -95,6 +95,21 @@ }, "license": { "type": "string" + }, + "descriptor_role": { + "type": "string", + "enum": [ + "current-pointer", + "release-snapshot" + ] + }, + "current_pointer_target": { + "type": "string", + "const": "agent-cards-v1.1.0.json" + }, + "frozen_release": { + "type": "string", + "const": "v1.1.0" } } } diff --git a/scripts/generate-checksums.mjs b/scripts/generate-checksums.mjs index d193ec7..b20febc 100644 --- a/scripts/generate-checksums.mjs +++ b/scripts/generate-checksums.mjs @@ -6,87 +6,133 @@ import crypto from "node:crypto"; const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); const ROOT_DIR = path.join(__dirname, ".."); -const ROOTS = ["agents", "meta", ".well-known", "schemas", "dist-pin"]; - -// Ignore platform / tooling junk + the checksum itself const EXCLUDE_PREFIXES = ["node_modules/", ".git/"]; -const EXCLUDE_BASENAMES = new Set([ - "checksums.txt", - ".DS_Store", - "Thumbs.db", -]); +const EXCLUDE_BASENAMES = new Set([".DS_Store", "Thumbs.db"]); + +const SPECIFICATIONS = [ + { + name: "current release checksums", + output: "checksums-v1.1.0.txt", + roots: [ + ".well-known/agent.json", + ".well-known/agent-cards-v1.1.0.json", + "agents/v1.1.0", + "meta", + "schemas/v1.1.0" + ], + excludeBasenames: new Set(["checksums-v1.1.0.txt", "checksums-v1.0.0.txt", "checksums.txt"]) + }, + { + name: "archival compatibility checksums", + output: "checksums-v1.0.0.txt", + roots: ["agents/v1.0.0", "schemas/v1.0.0"], + excludeBasenames: new Set(["checksums-v1.1.0.txt", "checksums-v1.0.0.txt", "checksums.txt"]) + }, + { + name: "dist-pin v1.1.0 publish bundle checksums", + output: "dist-pin/agent-cards/v1.1.0/checksums.txt", + roots: ["dist-pin/agent-cards/v1.1.0/.well-known", "dist-pin/agent-cards/v1.1.0/agents", "dist-pin/agent-cards/v1.1.0/meta", "dist-pin/agent-cards/v1.1.0/schemas"], + stripPrefix: "dist-pin/agent-cards/v1.1.0/", + excludeBasenames: new Set(["checksums.txt"]) + }, + { + name: "dist-pin v1.0.0 archival publish bundle checksums", + output: "dist-pin/agent-cards/v1.0.0/checksums.txt", + roots: ["dist-pin/agent-cards/v1.0.0/.well-known", "dist-pin/agent-cards/v1.0.0/meta", "dist-pin/agent-cards/v1.0.0/agents", "dist-pin/agent-cards/v1.0.0/schemas"], + stripPrefix: "dist-pin/agent-cards/v1.0.0/", + excludeBasenames: new Set(["checksums.txt"]) + } +]; function isDir(p) { try { return fs.statSync(p).isDirectory(); } catch { return false; } } +function isFile(p) { + try { return fs.statSync(p).isFile(); } catch { return false; } +} + function sha256File(relPath) { const fullPath = path.join(ROOT_DIR, relPath); const buf = fs.readFileSync(fullPath); return crypto.createHash("sha256").update(buf).digest("hex"); } -function listFilesUnder(relativeRoot) { - const out = []; - const rootPath = path.join(ROOT_DIR, relativeRoot); - if (!isDir(rootPath)) return out; +function shouldInclude(relPath, excludeBasenames) { + if (EXCLUDE_PREFIXES.some((prefix) => relPath.startsWith(prefix))) return false; + if (EXCLUDE_BASENAMES.has(path.basename(relPath))) return false; + if (excludeBasenames.has(path.basename(relPath))) return false; + return true; +} - function walk(currentPath) { - const entries = fs.readdirSync(currentPath, { withFileTypes: true }); +function collectFiles(relPath, excludeBasenames) { + const fullPath = path.join(ROOT_DIR, relPath); + if (isFile(fullPath)) { + return shouldInclude(relPath, excludeBasenames) ? [relPath] : []; + } + if (!isDir(fullPath)) return []; - for (const entry of entries) { + const out = []; + function walk(currentPath) { + for (const entry of fs.readdirSync(currentPath, { withFileTypes: true })) { const full = path.join(currentPath, entry.name); const rel = path.relative(ROOT_DIR, full).replace(/\\/g, "/"); - - // directory traversal if (entry.isDirectory()) { - // skip excluded directories early - if (EXCLUDE_PREFIXES.some((p) => rel.startsWith(p))) continue; + if (EXCLUDE_PREFIXES.some((prefix) => rel.startsWith(prefix))) continue; walk(full); continue; } - - // file filters - if (EXCLUDE_PREFIXES.some((p) => rel.startsWith(p))) continue; - if (EXCLUDE_BASENAMES.has(path.basename(rel))) continue; - - out.push(rel); + if (shouldInclude(rel, excludeBasenames)) out.push(rel); } } - walk(rootPath); + walk(fullPath); return out; } -function buildChecksumsText() { - let files = []; - for (const root of ROOTS) files = files.concat(listFilesUnder(root)); +function buildSpecificationText(spec) { + const files = spec.roots + .flatMap((root) => collectFiles(root, spec.excludeBasenames)) + .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)); - // stable sort, independent of locale - files.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)); + const lines = files.map((relPath) => { + const renderedPath = spec.stripPrefix ? relPath.slice(spec.stripPrefix.length) : relPath; + return `${sha256File(relPath)} ${renderedPath}`; + }); - const lines = files.map((relPath) => `${sha256File(relPath)} ${relPath}`); return { text: lines.join("\n") + "\n", count: files.length }; } -function main() { - const verify = process.argv.includes("--verify"); - const outputPath = path.join(ROOT_DIR, "checksums.txt"); - - const { text, count } = buildChecksumsText(); +function verifySpecification(spec) { + const outputPath = path.join(ROOT_DIR, spec.output); + const { text } = buildSpecificationText(spec); + const existing = fs.existsSync(outputPath) ? fs.readFileSync(outputPath, "utf8") : ""; - if (verify) { - const existing = fs.existsSync(outputPath) ? fs.readFileSync(outputPath, "utf8") : ""; - if (existing !== text) { - console.error("❌ checksums.txt does NOT match current repo contents."); - process.exit(1); - } - console.log("✅ checksums.txt matches the current repo contents."); + if (existing !== text) { + console.error(`❌ ${spec.output} does NOT match ${spec.name}.`); + process.exitCode = 1; return; } + console.log(`✅ ${spec.output} matches ${spec.name}.`); +} + +function writeSpecification(spec) { + const outputPath = path.join(ROOT_DIR, spec.output); + const { text, count } = buildSpecificationText(spec); + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); fs.writeFileSync(outputPath, text, "utf8"); - console.log(`✅ checksums.txt written with ${count} entries.`); + console.log(`✅ ${spec.output} written with ${count} entries for ${spec.name}.`); +} + +function main() { + const verify = process.argv.includes("--verify"); + for (const spec of SPECIFICATIONS) { + if (verify) verifySpecification(spec); + else writeSpecification(spec); + } + + if (verify && process.exitCode) process.exit(process.exitCode); } main(); diff --git a/scripts/validate-cards.mjs b/scripts/validate-cards.mjs index 8b20899..11320b7 100644 --- a/scripts/validate-cards.mjs +++ b/scripts/validate-cards.mjs @@ -54,6 +54,42 @@ function validateDescriptor(relativePath) { const data = loadJson(relativePath); if (!descriptorValidate(data)) fail(`${relativePath} failed descriptor validation.`, descriptorValidate.errors); else console.log(`✅ Descriptor valid: ${relativePath}`); + return data; +} + +function validateDiscoveryRelationship() { + const current = validateDescriptor(".well-known/agent.json"); + const snapshot = validateDescriptor(".well-known/agent-cards-v1.1.0.json"); + + if (snapshot.name !== "CommandLayer Agent Cards Registry Descriptor (v1.1.0)" || + snapshot.description !== "Frozen well-known discovery descriptor for the CommandLayer Agent Cards v1.1.0 release line." || + snapshot.meta.descriptor_role !== "release-snapshot" || + snapshot.meta.frozen_release !== "v1.1.0") { + fail(".well-known/agent-cards-v1.1.0.json must remain the frozen v1.1.0 release snapshot."); + } else { + console.log("✅ Frozen discovery snapshot is structurally pinned for v1.1.0"); + } + + if (current.name !== "CommandLayer Agent Cards Registry" || + current.description !== "Current well-known discovery descriptor for the recommended CommandLayer Agent Cards release line." || + current.meta.descriptor_role !== "current-pointer" || + current.meta.current_pointer_target !== "agent-cards-v1.1.0.json") { + fail(".well-known/agent.json must expose the current-pointer semantics explicitly."); + } + + const normalizedCurrent = structuredClone(current); + const normalizedSnapshot = structuredClone(snapshot); + normalizedCurrent.name = snapshot.name; + normalizedCurrent.description = snapshot.description; + normalizedCurrent.meta.descriptor_role = snapshot.meta.descriptor_role; + delete normalizedCurrent.meta.current_pointer_target; + delete normalizedSnapshot.meta.frozen_release; + + if (JSON.stringify(normalizedCurrent) !== JSON.stringify(normalizedSnapshot)) { + fail(".well-known/agent.json may differ from the v1.1.0 snapshot only by current-pointer fields (name, description, meta.descriptor_role, meta.current_pointer_target)." ); + } else { + console.log("✅ Current discovery pointer differs only in the allowed pointer fields"); + } } function validateExpectedV11Set() { @@ -116,11 +152,35 @@ function validateCard(fullPath) { console.log(`✅ Agent Card valid: ${relativePath}`); } +function validateDistPinBundle(version) { + const bundleRoot = path.join(ROOT, "dist-pin", "agent-cards", version); + if (!fs.existsSync(bundleRoot)) { + fail(`dist-pin/agent-cards/${version} is missing; committed dist-pin bundles are authoritative publish bundles.`); + return; + } + + const files = collectJsonFiles(path.join("dist-pin", "agent-cards", version)); + for (const fullPath of files) { + const relativePath = path.relative(bundleRoot, fullPath).replace(/\\/g, "/"); + const sourcePath = path.join(ROOT, relativePath); + if (!fs.existsSync(sourcePath)) { + fail(`dist-pin/agent-cards/${version}/${relativePath} has no canonical source counterpart.`); + continue; + } + const bundleText = fs.readFileSync(fullPath, "utf8"); + const sourceText = fs.readFileSync(sourcePath, "utf8"); + if (bundleText !== sourceText) { + fail(`dist-pin/agent-cards/${version}/${relativePath} must exactly mirror ${relativePath}.`); + } + } + console.log(`✅ dist-pin/agent-cards/${version} is an exact committed publish bundle mirror`); +} + function main() { - validateDescriptor(".well-known/agent.json"); - validateDescriptor(".well-known/agent-cards-v1.1.0.json"); + validateDiscoveryRelationship(); validateExpectedV11Set(); for (const file of collectJsonFiles("agents")) validateCard(file); + validateDistPinBundle("v1.1.0"); if (process.exitCode) process.exit(process.exitCode); console.log("✅ All Agent Card validations completed successfully."); }