@passioncode-ai/fabric-agent-adapter 0.56.0 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/CHANGELOG.md +108 -0
  2. package/COMMERCIAL-LICENSE.md +1 -1
  3. package/README.md +18 -7
  4. package/SECURITY.md +6 -1
  5. package/package.json +1 -1
  6. package/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
  7. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +18 -4
  8. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/provider-entry.md +18 -7
  9. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/source-and-instance.md +154 -0
  10. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +2 -2
  11. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/fabric_provider.py +25 -5
  12. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/fabric_source_check.py +995 -0
  13. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/fabric_source_homes.py +72 -0
  14. package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/fabric_source_ignore.py +185 -0
  15. package/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +4 -3
  16. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/delegation.md +3 -1
  17. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +5 -1
  18. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/package.md +22 -0
  19. package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +5 -3
  20. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-actions.mjs +2 -1
  21. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-protocols.mjs +5 -3
  22. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_actions.py +2 -1
  23. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_protocols.py +4 -2
  24. package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +185 -5
  25. package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +16 -7
  26. package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/agents-that-answer-people.md +11 -5
  27. package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/source-and-instance.md +154 -0
  28. package/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +9 -9
  29. package/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fabric-service-kit",
3
- "version": "0.56.0",
3
+ "version": "0.58.0",
4
4
  "about": "The service kit's modules in dependency order: a module imports only modules listed before it. Written by fabric_kit.py build; edit the order and layers by hand, never the digests.",
5
5
  "python": [
6
6
  {
@@ -174,7 +174,7 @@
174
174
  "imports": [
175
175
  "fabric_secrets"
176
176
  ],
177
- "sha256": "f9f508eb8785ec13d1ad80c023b98a96f49a40b0e124fbecba19a8057af80551"
177
+ "sha256": "42529a7df4d753544d2e37a18ec81266d6e1e80477cb8558a3ab521416d45791"
178
178
  },
179
179
  {
180
180
  "module": "fabric_actions",
@@ -186,7 +186,7 @@
186
186
  "fabric_mandate",
187
187
  "fabric_time"
188
188
  ],
189
- "sha256": "0efe81c7b73c63963348fb4936a3816a961d3424416abd5823fbeb1aa2cb0bbf"
189
+ "sha256": "ae21d1199614c4f74d1dcd1e0a87107a9d52434cd9e2d64aa24a7b1e196fb723"
190
190
  },
191
191
  {
192
192
  "module": "fabric_connections",
@@ -661,7 +661,7 @@
661
661
  "imports": [
662
662
  "fabric-secrets"
663
663
  ],
664
- "sha256": "f0d9f6bd25320788e41a993aa730dafaafaa1713df806f6616c52a59ed578f67"
664
+ "sha256": "5fd8765fdd3e507cc85c108492682bf5cbb4ae08873245c50374fb01d33c75e4"
665
665
  },
666
666
  {
667
667
  "module": "fabric-actions",
@@ -673,7 +673,7 @@
673
673
  "fabric-mandate",
674
674
  "fabric-time"
675
675
  ],
676
- "sha256": "35f34dccb6c4feb482b0b169f53682f9690b32012481bef3869e487e9637af09"
676
+ "sha256": "06e42f5e24c96311d5417d0d1effa93479ef7128a7ab139903b2bcf59253f6be"
677
677
  },
678
678
  {
679
679
  "module": "fabric-connections",
@@ -4228,6 +4228,186 @@
4228
4228
  "fabric-openrouter.mjs": "6041f3ab30f516658e1dbab4897a651cc8509b2136cfa8e769802c6b40ec2f35",
4229
4229
  "fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
4230
4230
  "share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
4231
+ },
4232
+ "0.57.0": {
4233
+ "fabric_jsvalue.py": "12888a2c934a885d35999ac9782eaedc8d04946d9775213344a235a8814d3d28",
4234
+ "fabric_time.py": "588f383da4ac6a243ea95b6ffc3a0aa99ca94245732dc4937734f190b7af4ae9",
4235
+ "fabric_identifiers.py": "0fd814d521ac3aa39907458265870753046a73f48af3d8581ab864b93b211607",
4236
+ "fabric_secrets.py": "1d0191f0ec108fdc68345056b8c574b1f691509d1c353e41d98bfd58a59e8d3c",
4237
+ "fabric_crypto.py": "9c34aee20dbe4d6742e4fdbaab68ceb934bbe7dbd3a904c0010824ace16cdeaa",
4238
+ "fabric_base.py": "f62bcc2ed9912660fa875d27a09f60867260cc4925f79873501fd9620be59611",
4239
+ "fabric_platform.py": "a9350dff55ef0fb3a23cdb4d0320a15868b15a8deb10d2eb74d72c58740c284b",
4240
+ "fabric_paths.py": "8a1ee742f80f436e9f28c61b4f049a9545de2a9e0d66bfc61faa6ee5d1ba3734",
4241
+ "fabric_estate_rules.py": "8b36a7f4108d9c2b1fb38c8bff344778c807bed631a99b4a563ecb0a49c10b1c",
4242
+ "fabric_estate.py": "b3cd56dcb86e04d252980322ac8054da1aaef24ac64690f7aa80e7c765ee6f60",
4243
+ "fabric_mandate.py": "050c43d0166a7dfba82e29c4e978f05c364cf6da06d0a781bd023a566777c17b",
4244
+ "fabric_delegation.py": "716f0ff7ac01095f54b24970beac1962128e8ff33026b243fc0467876142ab03",
4245
+ "fabric_share.py": "da36a466426fc29dd7dd40013167f3959a18375f8fedd228bf64f298cec1040c",
4246
+ "fabric_ceremonies.py": "a59e83cf4adb2669a9b98008e3d3a0cba991a35cbff97bc604fc82fe81cfd49f",
4247
+ "fabric_package_schema.py": "e623f0408d38e3343ed66222fb812907c6c52e1a286eb1c1176ab2e64640c9ad",
4248
+ "fabric_package.py": "ff533f1b3f92b4ea0f532fcec50b68c610d47549930eef8ad5247692a64dfb3c",
4249
+ "fabric_protocols.py": "42529a7df4d753544d2e37a18ec81266d6e1e80477cb8558a3ab521416d45791",
4250
+ "fabric_actions.py": "ae21d1199614c4f74d1dcd1e0a87107a9d52434cd9e2d64aa24a7b1e196fb723",
4251
+ "fabric_connections.py": "7de55cb7d808f756d650effabfaa12027d40a5bd5d2f6d448c32969d47529ecb",
4252
+ "fabric_a2a.py": "8b01502131215bb4de1c01866187c56e99b791543923ed8577535573db33b919",
4253
+ "fabric_page_links.py": "1b57ea573c550e2f90d1ec3edcc655917ceaa0db9dd1635fccf422ec3024d25e",
4254
+ "fabric_lock.py": "ba2399d2137c7a7791b7133b9db9cca36693f4eb7e30955b25a75ade814e95ba",
4255
+ "fabric_usage.py": "5cc2e03ccc5b06e81987ed7bc3eead7a7e6cbf1a7cb8e05c6c64315eed9d91b6",
4256
+ "fabric_backups.py": "1f3f0d7ecf361b29e9101e07f1c53e5dc304d598bf26fd59ec89f16b9fed2420",
4257
+ "fabric_descriptor.py": "a6d7a4a38186f7ef527d16218bbf96e39e255f9547be668adcfbec063dabb7ed",
4258
+ "fabric_context.py": "6ae311ddc7217a4aff915e7ce2646486931acd128462b7bebe4a52bbb5fbb6c7",
4259
+ "fabric_auth.py": "71115d18c67b7b806cb57b64b77e01ad97fc0e63e6f49ee850f778123617d905",
4260
+ "fabric_events.py": "cd94b186e2a8f8cb4ad2b6bd44d83ec5021933075e28c5d655f387f16dff42b8",
4261
+ "fabric_logs.py": "86dc55bfafa2a57264722e2403510a249b95de0e4a722b2e4bc3948e3bd93da9",
4262
+ "fabric_supervisors.py": "3c5b2e8c310738720b1c1b779be4710e90251013d9be4c68f9952edc0bf55d5f",
4263
+ "fabric_service.py": "a2e813469a47d4d3eea996628635c8903007498bdb6a1ae032a7a5ce6f49fe2f",
4264
+ "fabric_profiles.py": "26e21ec29c016000f8ca8053b7b489184854a73be1b7fdc0a18d12990203db9b",
4265
+ "fabric_interop_rules.py": "82c079a4d9421ea2cd10c1dfa8e1c447b80d5e0dcc8d52d52415bf028e34c91e",
4266
+ "fabric_interop.py": "8f7e43bf01fa5e969d7d819f4b0188b9acfd846f6f85a37ea139e550d61e4e6c",
4267
+ "fabric_hub.py": "b9ac852e601b1d54cf61351677a628afc69faeed7d1fc74ebe541c1cf38e0c2a",
4268
+ "fabric_board_shapes.py": "0a0e8d3d40e33dfd8c457aedb85330b2ff25f8c49a33eb6cbd5a5cc8a5007f7e",
4269
+ "fabric_board_link.py": "e8d2310e5f53c75e4bf642c3d980b2faba692731eaf56ec245cea05446e38bef",
4270
+ "fabric_board_slots.py": "a3c705cded822103703a6c2d734bcd505fcd1d6c0293150c77dfa266fd416d53",
4271
+ "fabric_board_session.py": "9032c04fbafb63fd93809b494518aaa039215abef973ad181d960350beb56a9f",
4272
+ "fabric_board_fixture.py": "69761ce205ec640762ec9b591c6903e5a87f844e8d423b041681924027e39d1e",
4273
+ "fabric_board.py": "34c1200860040aa61cdd35f911f70d34d64b4a5cd91f892328d1169e4a89d8cd",
4274
+ "fabric_http.py": "80e22ae0bba91de13a94d64b595108b39c58f16f7b4137f3a48bdd9503f424fe",
4275
+ "fabric_openrouter.py": "d06a40f83f2fb8bd441ab3485ae882f1fbdd9cd7a9c1ec175eb47cb8ae2cce81",
4276
+ "fabric-jsvalue.mjs": "dfbdb8c41584972c9389750a41719374a1cfc5652ed438dd1623025190b0106e",
4277
+ "fabric-time.mjs": "3ff932069038a720df1c68c6492976906737b2e67e5c12d9c81c418597f661de",
4278
+ "fabric-identifiers.mjs": "a18c2a501a4aa170bfd3d99e571ad6b7662649b4d3b9d2a540c002ea42811bbf",
4279
+ "fabric-secrets.mjs": "6ad8ab18ac899ecc2384e8ec6a3fb689b92be3b9a5ce3a59b92a37d52da5d766",
4280
+ "fabric-crypto.mjs": "038e03689701e3c9721a1e7f8e0a4d02a52d6a5d1661b0dc84035edc3ebbfcf6",
4281
+ "fabric-base.mjs": "7804b2df7715dbbf9702a9b61b6b8cef2110f9a52b04cabd8fb0a66458d87512",
4282
+ "fabric-platform.mjs": "a8119d95ebba4d589a9e401f5d6fc8dda62d59d44e4c1ff811d97fac3771ac0c",
4283
+ "fabric-paths.mjs": "aa630d611e748a899e7043480f4a4e46b444f2e15ff945f30c2fbef21c1ceea5",
4284
+ "fabric-estate-rules.mjs": "7476be71174aa5b1026134f2b335abf647feaa55584e2f9de8618e3054aa8e1e",
4285
+ "fabric-estate.mjs": "e8a2e62d2313121e6cb502f6e6abad94d1d546a44b4d9b3ce2be29e7808e8cf3",
4286
+ "fabric-mandate.mjs": "deaab2bfb929d1bd35ae1bad71e7b9ad9902cc23b8eb51819ed592fd80eddf95",
4287
+ "fabric-delegation.mjs": "04eaf6cd1786d4309a253a27dbdb05e27b408cb511aa41b1633a96634b775e65",
4288
+ "fabric-share.mjs": "bfb26581c21ad984c2a337da02429f9f3a165cc582f8ba48de4d3dfb7d163a59",
4289
+ "fabric-ceremonies.mjs": "117d4374c9e95c930a38de7adbd4323774798f4fe6ec6f24afcd6f2c7298ca44",
4290
+ "fabric-package-schema.mjs": "cd28092375db0fc21ffab1f0bb7794f7f8979ee08c64d3b9faf4b3845357caa6",
4291
+ "fabric-package.mjs": "13913ea6d12056c3a31b8222b6c4aab8395941fe519913692e1a06d8672e1c88",
4292
+ "fabric-protocols.mjs": "5fd8765fdd3e507cc85c108492682bf5cbb4ae08873245c50374fb01d33c75e4",
4293
+ "fabric-actions.mjs": "06e42f5e24c96311d5417d0d1effa93479ef7128a7ab139903b2bcf59253f6be",
4294
+ "fabric-connections.mjs": "303432e547ce563e90ca9ffcd827f5612f51d3582929834e1add0fdaf6485dcc",
4295
+ "fabric-a2a.mjs": "51b72fe1d80649d659fcad3a8f96370db3476c4a7b30cbabd8522c138be69346",
4296
+ "fabric-page-links.mjs": "a8834926e9d4bbf7c4857f551451d2ebf6ac8873bbccaaf89c5e30cf45b17ee6",
4297
+ "fabric-lock.mjs": "ac219ab0a326d5c43c7c4c255e0c3843d4794de795a60e3af661e7d5350ea052",
4298
+ "fabric-usage.mjs": "1c4d18004639409624ac3516a02f2b60bbf55abdb612e9a96c37e83666eb87a7",
4299
+ "fabric-backups.mjs": "cfd8c9085e3d597a783099c2bd2ffe2f3faa0daaadab46dedd30523894cfeb06",
4300
+ "fabric-descriptor.mjs": "243bbce42989f67c4c5ec6b7659e201b3f9a1c08c71d429d88ec934d870f5104",
4301
+ "fabric-context.mjs": "1112d695e872f9825cbc94f08484974bff3880087bc29b8be59f885f03e8f7be",
4302
+ "fabric-auth.mjs": "782c2aa732f8320f604194660117640a7ea145e12b8155c04e88cef7c516a5b3",
4303
+ "fabric-events.mjs": "c463d6ffcae24229a5c608d8fcea4268d2ccc5024b19fa10e5a452284068fa71",
4304
+ "fabric-logs.mjs": "58467e5719c16e099d05bbedec47a95712506ab03c33f3cd4be1252e8498a946",
4305
+ "fabric-supervisors.mjs": "d45c38de0cb3ed85e083496c2d3c51dab004454accdd87f4762a512a6d442573",
4306
+ "fabric-service.mjs": "6aa673657427211b491a9b63f94b9847a7e6aa3ee1b7353e1af11f46469803a3",
4307
+ "fabric-profiles.mjs": "314376cf2deb87f235fb18b11d3b532e211f585b9af0a9302b5f4cc39971b532",
4308
+ "fabric-interop-rules.mjs": "e4f8b133138e27353a7976c0360bd1653c90daed43b3f843f85a19f14f5e9221",
4309
+ "fabric-interop.mjs": "ee7e6d32be1f42e6d21a943b8886652352408c49c6404d9749b8a02dc3901e92",
4310
+ "fabric-hub.mjs": "c005115a864cfd67daa4862097bb14acfe5a60bf653897e5bf8a570dd80f1070",
4311
+ "fabric-board-shapes.mjs": "c1db7b7bd0d58d82bb6d8dfbc3cd1547a256a333052d367e82ff1b3edf2804d7",
4312
+ "fabric-board-link.mjs": "b1ac329b65b679193b94b81fe735922e14427ed540ba910b1a815ce3447e3220",
4313
+ "fabric-board-slots.mjs": "43eb7ceb6c62989a4eb4b2089d1808e2c3cf8f873fcf9216fcb4c285e5b39eb4",
4314
+ "fabric-board-session.mjs": "04aa920b24a379157c55ebe3de516eb8b46bd0b0db50e4b883528d4ede7ed978",
4315
+ "fabric-board-fixture.mjs": "83c4b7e33ee47b68385faf2569d38d5c8a0c5cb0f8656090f41e1b0eed2f436e",
4316
+ "fabric-board.mjs": "0d75c3e27a0b791bdbc35b2e93b3299e5831d3ab3003ce441e6268397e32b448",
4317
+ "fabric-http.mjs": "9f899829073470b9c2b449605a9371b773848eec4e3a0122ed4ccde5eddcdb4b",
4318
+ "fabric-openrouter.mjs": "6041f3ab30f516658e1dbab4897a651cc8509b2136cfa8e769802c6b40ec2f35",
4319
+ "fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
4320
+ "share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
4321
+ },
4322
+ "0.58.0": {
4323
+ "fabric_jsvalue.py": "12888a2c934a885d35999ac9782eaedc8d04946d9775213344a235a8814d3d28",
4324
+ "fabric_time.py": "588f383da4ac6a243ea95b6ffc3a0aa99ca94245732dc4937734f190b7af4ae9",
4325
+ "fabric_identifiers.py": "0fd814d521ac3aa39907458265870753046a73f48af3d8581ab864b93b211607",
4326
+ "fabric_secrets.py": "1d0191f0ec108fdc68345056b8c574b1f691509d1c353e41d98bfd58a59e8d3c",
4327
+ "fabric_crypto.py": "9c34aee20dbe4d6742e4fdbaab68ceb934bbe7dbd3a904c0010824ace16cdeaa",
4328
+ "fabric_base.py": "f62bcc2ed9912660fa875d27a09f60867260cc4925f79873501fd9620be59611",
4329
+ "fabric_platform.py": "a9350dff55ef0fb3a23cdb4d0320a15868b15a8deb10d2eb74d72c58740c284b",
4330
+ "fabric_paths.py": "8a1ee742f80f436e9f28c61b4f049a9545de2a9e0d66bfc61faa6ee5d1ba3734",
4331
+ "fabric_estate_rules.py": "8b36a7f4108d9c2b1fb38c8bff344778c807bed631a99b4a563ecb0a49c10b1c",
4332
+ "fabric_estate.py": "b3cd56dcb86e04d252980322ac8054da1aaef24ac64690f7aa80e7c765ee6f60",
4333
+ "fabric_mandate.py": "050c43d0166a7dfba82e29c4e978f05c364cf6da06d0a781bd023a566777c17b",
4334
+ "fabric_delegation.py": "716f0ff7ac01095f54b24970beac1962128e8ff33026b243fc0467876142ab03",
4335
+ "fabric_share.py": "da36a466426fc29dd7dd40013167f3959a18375f8fedd228bf64f298cec1040c",
4336
+ "fabric_ceremonies.py": "a59e83cf4adb2669a9b98008e3d3a0cba991a35cbff97bc604fc82fe81cfd49f",
4337
+ "fabric_package_schema.py": "e623f0408d38e3343ed66222fb812907c6c52e1a286eb1c1176ab2e64640c9ad",
4338
+ "fabric_package.py": "ff533f1b3f92b4ea0f532fcec50b68c610d47549930eef8ad5247692a64dfb3c",
4339
+ "fabric_protocols.py": "42529a7df4d753544d2e37a18ec81266d6e1e80477cb8558a3ab521416d45791",
4340
+ "fabric_actions.py": "ae21d1199614c4f74d1dcd1e0a87107a9d52434cd9e2d64aa24a7b1e196fb723",
4341
+ "fabric_connections.py": "7de55cb7d808f756d650effabfaa12027d40a5bd5d2f6d448c32969d47529ecb",
4342
+ "fabric_a2a.py": "8b01502131215bb4de1c01866187c56e99b791543923ed8577535573db33b919",
4343
+ "fabric_page_links.py": "1b57ea573c550e2f90d1ec3edcc655917ceaa0db9dd1635fccf422ec3024d25e",
4344
+ "fabric_lock.py": "ba2399d2137c7a7791b7133b9db9cca36693f4eb7e30955b25a75ade814e95ba",
4345
+ "fabric_usage.py": "5cc2e03ccc5b06e81987ed7bc3eead7a7e6cbf1a7cb8e05c6c64315eed9d91b6",
4346
+ "fabric_backups.py": "1f3f0d7ecf361b29e9101e07f1c53e5dc304d598bf26fd59ec89f16b9fed2420",
4347
+ "fabric_descriptor.py": "a6d7a4a38186f7ef527d16218bbf96e39e255f9547be668adcfbec063dabb7ed",
4348
+ "fabric_context.py": "6ae311ddc7217a4aff915e7ce2646486931acd128462b7bebe4a52bbb5fbb6c7",
4349
+ "fabric_auth.py": "71115d18c67b7b806cb57b64b77e01ad97fc0e63e6f49ee850f778123617d905",
4350
+ "fabric_events.py": "cd94b186e2a8f8cb4ad2b6bd44d83ec5021933075e28c5d655f387f16dff42b8",
4351
+ "fabric_logs.py": "86dc55bfafa2a57264722e2403510a249b95de0e4a722b2e4bc3948e3bd93da9",
4352
+ "fabric_supervisors.py": "3c5b2e8c310738720b1c1b779be4710e90251013d9be4c68f9952edc0bf55d5f",
4353
+ "fabric_service.py": "a2e813469a47d4d3eea996628635c8903007498bdb6a1ae032a7a5ce6f49fe2f",
4354
+ "fabric_profiles.py": "26e21ec29c016000f8ca8053b7b489184854a73be1b7fdc0a18d12990203db9b",
4355
+ "fabric_interop_rules.py": "82c079a4d9421ea2cd10c1dfa8e1c447b80d5e0dcc8d52d52415bf028e34c91e",
4356
+ "fabric_interop.py": "8f7e43bf01fa5e969d7d819f4b0188b9acfd846f6f85a37ea139e550d61e4e6c",
4357
+ "fabric_hub.py": "b9ac852e601b1d54cf61351677a628afc69faeed7d1fc74ebe541c1cf38e0c2a",
4358
+ "fabric_board_shapes.py": "0a0e8d3d40e33dfd8c457aedb85330b2ff25f8c49a33eb6cbd5a5cc8a5007f7e",
4359
+ "fabric_board_link.py": "e8d2310e5f53c75e4bf642c3d980b2faba692731eaf56ec245cea05446e38bef",
4360
+ "fabric_board_slots.py": "a3c705cded822103703a6c2d734bcd505fcd1d6c0293150c77dfa266fd416d53",
4361
+ "fabric_board_session.py": "9032c04fbafb63fd93809b494518aaa039215abef973ad181d960350beb56a9f",
4362
+ "fabric_board_fixture.py": "69761ce205ec640762ec9b591c6903e5a87f844e8d423b041681924027e39d1e",
4363
+ "fabric_board.py": "34c1200860040aa61cdd35f911f70d34d64b4a5cd91f892328d1169e4a89d8cd",
4364
+ "fabric_http.py": "80e22ae0bba91de13a94d64b595108b39c58f16f7b4137f3a48bdd9503f424fe",
4365
+ "fabric_openrouter.py": "d06a40f83f2fb8bd441ab3485ae882f1fbdd9cd7a9c1ec175eb47cb8ae2cce81",
4366
+ "fabric-jsvalue.mjs": "dfbdb8c41584972c9389750a41719374a1cfc5652ed438dd1623025190b0106e",
4367
+ "fabric-time.mjs": "3ff932069038a720df1c68c6492976906737b2e67e5c12d9c81c418597f661de",
4368
+ "fabric-identifiers.mjs": "a18c2a501a4aa170bfd3d99e571ad6b7662649b4d3b9d2a540c002ea42811bbf",
4369
+ "fabric-secrets.mjs": "6ad8ab18ac899ecc2384e8ec6a3fb689b92be3b9a5ce3a59b92a37d52da5d766",
4370
+ "fabric-crypto.mjs": "038e03689701e3c9721a1e7f8e0a4d02a52d6a5d1661b0dc84035edc3ebbfcf6",
4371
+ "fabric-base.mjs": "7804b2df7715dbbf9702a9b61b6b8cef2110f9a52b04cabd8fb0a66458d87512",
4372
+ "fabric-platform.mjs": "a8119d95ebba4d589a9e401f5d6fc8dda62d59d44e4c1ff811d97fac3771ac0c",
4373
+ "fabric-paths.mjs": "aa630d611e748a899e7043480f4a4e46b444f2e15ff945f30c2fbef21c1ceea5",
4374
+ "fabric-estate-rules.mjs": "7476be71174aa5b1026134f2b335abf647feaa55584e2f9de8618e3054aa8e1e",
4375
+ "fabric-estate.mjs": "e8a2e62d2313121e6cb502f6e6abad94d1d546a44b4d9b3ce2be29e7808e8cf3",
4376
+ "fabric-mandate.mjs": "deaab2bfb929d1bd35ae1bad71e7b9ad9902cc23b8eb51819ed592fd80eddf95",
4377
+ "fabric-delegation.mjs": "04eaf6cd1786d4309a253a27dbdb05e27b408cb511aa41b1633a96634b775e65",
4378
+ "fabric-share.mjs": "bfb26581c21ad984c2a337da02429f9f3a165cc582f8ba48de4d3dfb7d163a59",
4379
+ "fabric-ceremonies.mjs": "117d4374c9e95c930a38de7adbd4323774798f4fe6ec6f24afcd6f2c7298ca44",
4380
+ "fabric-package-schema.mjs": "cd28092375db0fc21ffab1f0bb7794f7f8979ee08c64d3b9faf4b3845357caa6",
4381
+ "fabric-package.mjs": "13913ea6d12056c3a31b8222b6c4aab8395941fe519913692e1a06d8672e1c88",
4382
+ "fabric-protocols.mjs": "5fd8765fdd3e507cc85c108492682bf5cbb4ae08873245c50374fb01d33c75e4",
4383
+ "fabric-actions.mjs": "06e42f5e24c96311d5417d0d1effa93479ef7128a7ab139903b2bcf59253f6be",
4384
+ "fabric-connections.mjs": "303432e547ce563e90ca9ffcd827f5612f51d3582929834e1add0fdaf6485dcc",
4385
+ "fabric-a2a.mjs": "51b72fe1d80649d659fcad3a8f96370db3476c4a7b30cbabd8522c138be69346",
4386
+ "fabric-page-links.mjs": "a8834926e9d4bbf7c4857f551451d2ebf6ac8873bbccaaf89c5e30cf45b17ee6",
4387
+ "fabric-lock.mjs": "ac219ab0a326d5c43c7c4c255e0c3843d4794de795a60e3af661e7d5350ea052",
4388
+ "fabric-usage.mjs": "1c4d18004639409624ac3516a02f2b60bbf55abdb612e9a96c37e83666eb87a7",
4389
+ "fabric-backups.mjs": "cfd8c9085e3d597a783099c2bd2ffe2f3faa0daaadab46dedd30523894cfeb06",
4390
+ "fabric-descriptor.mjs": "243bbce42989f67c4c5ec6b7659e201b3f9a1c08c71d429d88ec934d870f5104",
4391
+ "fabric-context.mjs": "1112d695e872f9825cbc94f08484974bff3880087bc29b8be59f885f03e8f7be",
4392
+ "fabric-auth.mjs": "782c2aa732f8320f604194660117640a7ea145e12b8155c04e88cef7c516a5b3",
4393
+ "fabric-events.mjs": "c463d6ffcae24229a5c608d8fcea4268d2ccc5024b19fa10e5a452284068fa71",
4394
+ "fabric-logs.mjs": "58467e5719c16e099d05bbedec47a95712506ab03c33f3cd4be1252e8498a946",
4395
+ "fabric-supervisors.mjs": "d45c38de0cb3ed85e083496c2d3c51dab004454accdd87f4762a512a6d442573",
4396
+ "fabric-service.mjs": "6aa673657427211b491a9b63f94b9847a7e6aa3ee1b7353e1af11f46469803a3",
4397
+ "fabric-profiles.mjs": "314376cf2deb87f235fb18b11d3b532e211f585b9af0a9302b5f4cc39971b532",
4398
+ "fabric-interop-rules.mjs": "e4f8b133138e27353a7976c0360bd1653c90daed43b3f843f85a19f14f5e9221",
4399
+ "fabric-interop.mjs": "ee7e6d32be1f42e6d21a943b8886652352408c49c6404d9749b8a02dc3901e92",
4400
+ "fabric-hub.mjs": "c005115a864cfd67daa4862097bb14acfe5a60bf653897e5bf8a570dd80f1070",
4401
+ "fabric-board-shapes.mjs": "c1db7b7bd0d58d82bb6d8dfbc3cd1547a256a333052d367e82ff1b3edf2804d7",
4402
+ "fabric-board-link.mjs": "b1ac329b65b679193b94b81fe735922e14427ed540ba910b1a815ce3447e3220",
4403
+ "fabric-board-slots.mjs": "43eb7ceb6c62989a4eb4b2089d1808e2c3cf8f873fcf9216fcb4c285e5b39eb4",
4404
+ "fabric-board-session.mjs": "04aa920b24a379157c55ebe3de516eb8b46bd0b0db50e4b883528d4ede7ed978",
4405
+ "fabric-board-fixture.mjs": "83c4b7e33ee47b68385faf2569d38d5c8a0c5cb0f8656090f41e1b0eed2f436e",
4406
+ "fabric-board.mjs": "0d75c3e27a0b791bdbc35b2e93b3299e5831d3ab3003ce441e6268397e32b448",
4407
+ "fabric-http.mjs": "9f899829073470b9c2b449605a9371b773848eec4e3a0122ed4ccde5eddcdb4b",
4408
+ "fabric-openrouter.mjs": "6041f3ab30f516658e1dbab4897a651cc8509b2136cfa8e769802c6b40ec2f35",
4409
+ "fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
4410
+ "share-registration.schema.json": "34b3997eeaf936ebc861342a23045634a7c18c19f01d7ed4198310d81989f5b0"
4231
4411
  }
4232
4412
  },
4233
4413
  "data": {
@@ -5,9 +5,9 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
5
5
  compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned fabric-agent-contract checkout (a public repository). Works without those tools in an explicitly degraded structural-check mode. Ships in one plugin with adapting-projects-to-fabric, whose scripts it reuses.
6
6
  metadata:
7
7
  author: PassionCode.ai
8
- version: "0.56.0"
8
+ version: "0.58.0"
9
9
  contract-version: "0.1.0"
10
- contract-commit: "00e050ba7429c0c60261cec871779e0fd6aeeb28"
10
+ contract-commit: "3830a3353923e20f826d466610e1c479f120bec0"
11
11
  ---
12
12
 
13
13
  # Creating Fabric-compatible agents
@@ -73,8 +73,10 @@ failures, a retro), distil it before writing code:
73
73
  failures and dead ends).
74
74
  3. **Convert every trap into a planted eval fixture.** The new agent is not done until
75
75
  it has been watched rejecting the exact defects its predecessors were burned by:
76
- knowledge transfers as a check, not as prose.
77
- 4. Record the pack in the new project as `docs/knowledge-pack.md` with its sources, so
76
+ knowledge transfers as a check, not as prose. A fixture carries the defect on neutral
77
+ ids, never the predecessor's owner, paths or accounts.
78
+ 4. Record the pack in the new project as `docs/knowledge-pack.md` with its sources (a public URL or commit, else a
79
+ neutral name, the private address kept in the instance), so
78
80
  the provenance of every borrowed decision survives the person who borrowed it.
79
81
 
80
82
  Skipping this step because there is no prior art is legal; skipping it because reading
@@ -122,6 +124,13 @@ at start. Either way: no `.env` of its own, no key file beside its data, no valu
122
124
  configuration or a commit. A workflow names the keys it needs in its checkpoint (`credentials`),
123
125
  never their values.
124
126
 
127
+ **The source stays apart from the instance**, from the first commit: instance values (the
128
+ repository address of the owner's account, folders, the owner, accounts, hosts) live in a configuration outside the repository, read through a
129
+ named variable with a neutral default and a committed `*.example`; records, logs and state documents live in the
130
+ instance folder; fixtures use neutral ids. Load [the source and the instance](references/source-and-instance.md). The
131
+ sibling's `scripts/fabric_source_check.py check <project-root>` finds instance data in the tree without repeating it;
132
+ run it with the owner's list of their own strings, or record that none was given (the owner's own home name, when it is neutral, has one or two letters, or holds a space, `.`, `_`, `-` or `'`, is declared there with `home: <name>` first; a container's, a cloud image's or a CI runner's user that only the image uses, such as `node` or `vscode`, is never declared); the skeleton is done when it exits 0 and the owner has reviewed it (a floor, not a secret scanner; without the sibling or Python 3.9+, record the check as NOT_RUN, as in step 3). Handing the source over stays the owner's act.
133
+
125
134
  ## Step 3: scaffold the provider bundle
126
135
 
127
136
  Reuse the sibling skill's scaffolder against the new skeleton with the profile chosen at
@@ -139,7 +148,7 @@ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/adapt_project.py
139
148
  The effect class is declared, never defaulted: ask the author what the agent does outside itself when the request
140
149
  does not say. Cost presets are only for a run whose cost varies; their amounts come from the author or measured runs.
141
150
 
142
- Pin exactly contract `0.1.0` at commit `00e050ba7429c0c60261cec871779e0fd6aeeb28` and
151
+ Pin exactly contract `0.1.0` at commit `3830a3353923e20f826d466610e1c479f120bec0` and
143
152
  read the pinned guide before implementing protocol details. If this skill is installed
144
153
  without its sibling, the scaffolder is absent: create the bundle by hand from the pinned
145
154
  contract's `docs/guides/connecting-compatible-agents.md` and mark the structural check
@@ -181,8 +190,8 @@ lets the output decide what counts as success.
181
190
 
182
191
  Run the sibling skill's `check` (structural, then exact when the contract checkout is
183
192
  available) and complete `fabric/FABRIC-CONFORMANCE.md` with dated receipts, exactly as
184
- its workflow steps 5–7 prescribe; this skill adds no second verification path on
185
- purpose. Then record one expectation the report must carry:
193
+ its workflow steps 5–7 prescribe, and run its `fabric_source_check.py check` again (exit 0); this skill adds no
194
+ second verification path on purpose. Then record one expectation the report must carry:
186
195
 
187
196
  > When a Fabric host admits this provider, it enters under a **canary binding** (a
188
197
  > checker on its output and a budget cap), regardless of who wrote it. Unsupervised
@@ -42,12 +42,18 @@ to a person at the first refusal (the refused draft is not kept), where this pag
42
42
  (`/fabric/v1/events`; building-fabric-services, `references/events-and-notifications.md`): counts and codes only, the
43
43
  judge model and rubric version, and `notMeasured` naming every family not computed that day. A metric not measured is
44
44
  null and named, never 0. The day goes in the event's `data` (`{schema, value}`, as `fabric_events.py` writes it), at
45
- level `info` and without a notification. Until the contract carries the schema (A7), the producer names and pins its
46
- own: `data.schema` is the absolute URI of the payload schema the agent publishes, and `data.value` stays within
45
+ level `info` and without a notification. `data.value` is valid against the contract's
46
+ `support-quality-daily.schema.json` (`support-quality-daily/1`, DEC-0095), `data.schema` is the absolute URI of the
47
+ producer's published copy of it (the contract's conformance row for this producer), and the value stays within
47
48
  DEC-0070's bounds (at most 32 members, each a scalar, a list of scalars or a flat object; per-lane counts as objects
48
- such as `laneFailures` and `laneRecovered`; building-fabric-services, `references/protocol.md`). Check: the producer's
49
- day passes `make_event`; a planted day that writes 0 for a family not computed fails; and a test runs every
50
- `notMeasured` name the producer can emit through the published name pattern, iterating the producer's own list.
49
+ such as `laneFailures` and `laneRecovered`; building-fabric-services, `references/protocol.md`). A judge's
50
+ calibration, `calibration {week, labelled, helped}` with `calibrationChecks` beside it (DEC-0144), goes in only once
51
+ every reader of the feed it knows of has adopted DEC-0144: the producer then re-publishes its copy from DEC-0144's
52
+ bytes (CT-188), and leaves the calibration out when the judge or the rubric changed after the labelled week. A
53
+ reader validates against its own pinned copy, never one fetched by `$id`: the bytes under the unchanged `$id`
54
+ widened. Check: the producer's day passes `make_event` and validates against the producer's pinned copy of the
55
+ schema; a planted day that writes 0 for a family not computed fails; and a test runs every `notMeasured` name the
56
+ producer can emit through the published name pattern, iterating the producer's own list.
51
57
 
52
58
  ## Model lanes
53
59
 
@@ -0,0 +1,154 @@
1
+ # The source and the instance
2
+
3
+ An agent is two things. Its **source** is what can be handed to someone else: code, skills, prompts, schemas,
4
+ examples, the source documentation. Its **instance** is what belongs to one installation: records, logs, journals,
5
+ keys, the owner's names and paths, accounts, hosts and its configuration. A new agent keeps the two apart from its
6
+ first commit, so that its owner can hand the source over later without rewriting its history. Nothing is handed over
7
+ by itself: handing over, a new remote, a push or a change of visibility stays the owner's act, each time (a personal
8
+ agent stays private until its owner says so about that act).
9
+
10
+ The format of a source manifest, export and import is the contract's to decide (CT-194). What follows does not depend
11
+ on it.
12
+
13
+ ## Contents
14
+
15
+ - [The layout](#the-layout)
16
+ - [The check](#the-check)
17
+
18
+ ## The layout
19
+
20
+ | Where | What | In Git |
21
+ |---|---|---|
22
+ | the repository | code, skills, prompts, schemas, the source documentation, fixtures on neutral ids (`example-agent`, `/Users/example`) | yes |
23
+ | `config/<name>.example.json` (or `.env.example`, `*.example.yaml`) | every instance value the agent reads, with a neutral default: the repository address of the owner's account, folders, the owner, account ids, hosts | yes, the example only |
24
+ | the instance folder, outside the repository | the real configuration, records (a database included), logs, journals, state documents | never in the source's repository (a separate private repository of the owner's data belongs to the instance) |
25
+ | the secret store | key values; the source names each key by name only (`EXAMPLE_API_KEY`) | never |
26
+
27
+ - **The instance folder is the agent's data folder.** An agent that is not a kit service reads it through one named
28
+ variable (`<AGENT>_DATA_DIR`) that overrides its default. A service built with `building-fabric-services` takes the
29
+ kit's folders unchanged (the Directories table in its `references/lifecycle.md`, `fabric_paths.service_dirs`): on macOS `~/Library/Application Support/<id>/`,
30
+ on Linux `${XDG_DATA_HOME:-~/.local/share}/<id>/`, on Windows `%LOCALAPPDATA%\<id>\`. An agent's second context
31
+ (an organization's) is a sibling instance, `<id>.<instance>`, never a folder inside the personal one
32
+ (`references/estate-record.md` of that skill).
33
+ - **Ignore the instance in the source**: `.gitignore` names the real configuration (`config/*.json` with
34
+ `!config/*.example.json`), an instance folder that sits inside the checkout during development, and what running
35
+ the agent leaves (`__pycache__/`, `*.pyc`), which the check would otherwise report as binary in Git mode.
36
+ - **State documents are instance data.** A handoff, a decision log or a backlog about this codebase is source
37
+ documentation; a record of what this installation did (runs, conversations, the owner's notes, a journal) lives in
38
+ the instance folder.
39
+ - **Keys by name.** The README's Configure section lists key names, the agent reads each from its environment or the
40
+ secret store, and no value is ever written to a file, a fixture, an argument or a commit.
41
+ - **Fixtures on neutral ids.** A test that needs a home folder, an owner or an account uses `example`, `example-agent`,
42
+ `owner@example.com` or a one-letter home, and a credential-shaped test value says it is synthetic
43
+ (`sk-test-not-a-key`) or is assembled at run time.
44
+ - **Two names stay in the source until the contract decides (CT-194).** A service's supervisor label is the agent's
45
+ own name, reverse-DNS on the publisher's domain (`com.example.example-agent`), and `AGENTS.md` names it (LC-09):
46
+ never the owner's account or name. A provider's `createdBy` names the publisher; until one is chosen it
47
+ keeps the scaffold's sentinel, and a person's name or account is never written there. The adapter moves both when the
48
+ contract decides how an instance renames them (FAA-188 part 2).
49
+
50
+ ## The check
51
+
52
+ `fabric_source_check.py check` reads the files the source would carry (what Git would commit: tracked files and
53
+ untracked ones that are not ignored, as they are in the work tree; a staged copy that differs is not read) and reports each place where the instance shows through, by path, line and kind:
54
+
55
+ | Kind | Finds |
56
+ |---|---|
57
+ | `home-path` | an absolute path inside a person's home folder (a web route under `/home/` is reported too; a route under `/users/` is not): `/Users/<name>/`, `/home/<name>/`, `C:\Users\<name>\`, Git Bash's `/c/Users/<name>/`, WSL's `/mnt/c/Users/<name>/`, and the dashed (`-Users-<name>-`, `C--Users-<name>-`) and URL-encoded forms a tool makes of one. The name is ASCII, and in the dashed form it ends at the next dash: an owner whose home name holds a space, a dash, a dot, an underscore or an apostrophe (each a dash in the dashed form; a slashed name also ends at a space) declares it with `home: <name>` in the owner's list, which reads it whole in every form, and one whose home name is not ASCII, or holds another character, lists it as a plain string (a typographic apostrophe a keyboard typed, which the folder's name does not hold, is written as `'` in `home:`; a folder whose name holds `’` is listed as a plain string with `’` kept and declared too with `home: <name>` written with `'`, which reads the dashed forms; its URL-encoded `’` is not read; a name outside ASCII of one or two characters cannot be checked) |
58
+ | `secret` | a value shaped like a credential by the contract's detector (DEC-0044), read line by line: a provider key starting a word, a JWT, a bearer token, a long random value assigned to a credential's name (but a whole Ed25519 signature under a JSON `"sig"`, `"signature"` or `"signatures"` member, as `sign` writes it, which is public); or a private key: a PEM, OpenSSH or PGP block, or a JWK's `d` as a JSON member, escaped JSON or a Python dict; a URL with a password of 8 or more characters mixing letters and digits (a password without a digit or without a letter is not read) or a credential in its query, percent-encoded or not, JSON-escaped (`\u0026`, `\/`) or nested in another URL's parameter (two levels deep); a file that is a credential by its name, as `pack` refuses it (`.env`, `*.pem`, `*.key`, `.npmrc` and the rest), or a kit credential file (`*.token`, `board.credential`) |
59
+ | `instance-string` | a string from the owner's list, in a file, in a file's path or in a link's target |
60
+
61
+ ```bash
62
+ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/fabric_source_check.py check <project-root>
63
+ ```
64
+
65
+ - It **never repeats** a value it found: no value, no line holding one, no entry of the owner's list and not the
66
+ folder it checks reaches its output. A file's path is checked like its text (line `0` of a finding), and printed
67
+ with an entry of the list as `<line N>`, a home folder's name as `<home>` and each segment holding a
68
+ credential-shaped value as `<secret>` (two files can then print the same; the segments a found value runs across, an
69
+ assigned value, a bearer run or a URL, are masked too, while a key, a JWT or a JWK `d` is read up to the `/` that
70
+ cuts it, so the rest of a cut one can print in the next folder: find the file by the folder the finding names); an instance string is named by its line in the owner's list. The report can go in a commit
71
+ message, an issue or a chat. A declared home of one or two letters, once found anywhere in the tree, is masked wherever it stands in a printed
72
+ path, inside a word too (`qzone` prints `<home>one`); found nowhere, it is not masked.
73
+ - It **changes nothing.** Exit `0`: no finding and every file read; `1`: at least one finding (the step is not done);
74
+ `2`: the check could not run, or a file was not read: an unreadable file, a nested repository, or a binary file the
75
+ ignore file does not name as source (the summary counts each, and how many files were left out by name). A finding
76
+ sets `1` even when a file was not read too; the files not read are still listed, so fixing the findings can leave `2`.
77
+ - **What it reads.** A text file of any size is read whole, and the summary counts every text file read; a binary file (a NUL byte in its first 8 KiB) or one that
78
+ cannot be read is listed by its path as not read, and the summary counts it. A database or another binary of
79
+ records in the tree is instance data the check cannot read: move it to the instance folder. A binary that is source
80
+ (an icon, a font) is named in the ignore file. `--every-file` reads every file, those Git ignores included, but `.git`, `__pycache__`, `.DS_Store` and `*.pyc`
81
+ (litter `pack` refuses): run it
82
+ on a folder before `pack`, which carries them. A committed symbolic link is checked by the path it names, never followed. When the folder is
83
+ not in a Git checkout, Git lists nothing in it, or no `git` is found in PATH's absolute folders (with PATH unset, in `/bin` and `/usr/bin`; on Windows, nowhere), every file is read but `.git` and `__pycache__` (uncounted) and the dependency
84
+ folders (`node_modules`, virtual environments, caches), and the summary says Git was not used and how many dependency folders were not read.
85
+ Under a locale whose file-system encoding is not UTF-8 (ISO-8859-1, KOI8-R) the check restarts itself in Python's UTF-8
86
+ mode, so a file name, an argument and a file's text are read in one encoding; a name that is not UTF-8 is matched as its bytes.
87
+ A file's text is read as UTF-8, so an entry of the owner's list with a letter outside ASCII is found in a UTF-8 file
88
+ (composed or decomposed, as macOS may store a name), not in one saved as Latin-1 or CP1252.
89
+ In Git mode a nested repository (a submodule, a vendored checkout) is not read: check a nested repository in its own tree with
90
+ the same check (a submodule checked out first, `git submodule update --init`), then name its path in the ignore file,
91
+ with that reason on the line above. That line serves the check of the outer tree only: before `pack`, check the
92
+ nested repository with `--every-file` in its own tree too, because `pack` carries its files, ignored ones included.
93
+ - **The owner's list** holds the strings only the owner knows are theirs (their name, company, accounts, hosts), one
94
+ per line, at least three characters; a line starting with `#` is a comment, so list a channel or a hashtag without its `#`, and a `#` after a string is
95
+ part of that string. An entry matches in any case and inside any word; an invisible format character (a direction mark, a
96
+ soft hyphen, a joiner) at either end of a string is dropped, spaces between such characters too, and does not count
97
+ toward the three; one inside it is kept and counts (an emoji's joiner), so a string copied with a soft hyphen in it
98
+ matches only text that holds one. A line `home: <name>` declares the owner's home
99
+ name instead (ASCII letters, digits, `.`, `_`, `-`, `'` and spaces, starting with a letter or a digit; a name holding a
100
+ space, as a Windows profile may, is written whole, `home: Jane Doe`, and everything after the colon is the name, so
101
+ a note goes on a line of its own (`# laptop`); spaces and tabs may stand around the colon; a line
102
+ that starts with `home` and a colon and holds anything else is refused, exit 2 (an invisible format character before
103
+ the name, after it or inside `home` is dropped, one inside the name refuses the line; a NUL anywhere in the list
104
+ refuses it too); such a line is never a string
105
+ entry, so list a string like `home: page` by a part of it, `ome: page`): the check then finds that home in every form the table names (it is never neutral, even with one or two
106
+ letters), and the bare name is not looked for anywhere else, though a declared name of three or more letters and digits is
107
+ masked wherever a printed path holds it as a word, its parts joined by none or any run of a space, `.`, `_`, `-`, `+`, `'`, their
108
+ percent-encodings or an escaped apostrophe (`\'`, `\x27`, `\u0027`, `&#39;`, `&#x27;`, `&apos;`), the same separators it is found with in every form; a home that is also your name goes in the list
109
+ as a plain string too, to be found in text. It is `--instance-strings FILE`, else the file
110
+ `FABRIC_INSTANCE_STRINGS` names, else `passioncode-fabric/instance-strings.txt` in the user's configuration folder
111
+ (`$XDG_CONFIG_HOME` when it is absolute, else `~/.config`; `%APPDATA%` on Windows). A list inside the tree is refused, because it would
112
+ travel with the source. A person who already keeps private terms for org-index's `check_private.py`
113
+ (`~/.config/passioncode/private-terms.txt`) passes that file with `--instance-strings`; this check matches a term
114
+ anywhere in a word, and it does not look for e-mail addresses or account ids by their shape.
115
+ - **Leaving paths out.** `.fabric-source-ignore` at the root (globs, one per line, `#` comments) or `--exclude GLOB`
116
+ leaves out files that hold synthetic values on purpose, such as test vectors. A line is a path from the root, not a
117
+ `.gitignore` line (a leading `/` changes nothing, a line with no `/` matches at the root only, and a line holding `\`, `//`, an unclosed `[` or a class such as `[[:digit:]]` is refused, as Git reads each
118
+ otherwise): `*`, `?` and `[...]` stay inside one folder (`?` and `[...]` match one byte, as Git's do, so a letter
119
+ outside ASCII takes two or more) and `**` as a whole segment crosses
120
+ folders, so `vectors/*` takes the files in `vectors` and none in its subfolders. A line ending in `/`, or a path
121
+ with no wildcard, takes that folder and all it holds; only such a line leaves out a nested repository or a
122
+ submodule (`vendor/sub/`), never a wildcard line without the `/` (`vendor/*`). A wildcard folder line (`vendor/*/`)
123
+ takes every nested repository it reaches, checked or not, so name each one by its path. In Git mode a nested
124
+ repository is not read; `--every-file` and a folder outside Git read its files, its `.git` left out. An exception line (`!`) is refused, since what it would
125
+ bring back would go unread. Name the files, or a folder that holds
126
+ only synthetic vectors, never a whole source folder (a nested repository checked in its own tree is the one
127
+ exception), and say why on the line above. A file `pack` refuses by its name cannot ship in a package: a public
128
+ certificate is renamed `*.crt`; a project `.npmrc` that holds no credential may be named in the ignore file, with
129
+ that reason, for the source check (the line then hides whatever is added to it later, so keep it credential-free),
130
+ and `pack` still refuses it, so a package is made from a copy without it (its
131
+ settings then apply only where the owner sets them: `~/.npmrc` reaches every project of the owner, and
132
+ `package.json`'s `publishConfig` carries publish-time settings such as `registry`, `tag` and `access`). A file
133
+ holding a credential moves to the instance, never into the ignore file.
134
+ - A neutral home (`example`, `user`, `runner`, a container's, a cloud machine's or a dev container's user such as `node`, `ubuntu` or `vscode`, the fixture id
135
+ `example-agent`, a
136
+ one-letter name, a placeholder; the whole set is `NEUTRAL_HOMES` in the script. An owner whose home name is in it, a
137
+ first name such as `alice` or an `admin` account, or has one or two letters, writes `home: <name>` in the owner's
138
+ list; a container's, a cloud image's or a CI runner's user that only the image uses, such as `node` or `vscode`, is never declared, since
139
+ its paths are the image's and stay in the source; the home of the owner's own machine is declared even when its
140
+ name is an image's user, as `admin` or `ubuntu` on a cloud machine the owner works on; when that name is also the
141
+ user of an image in the tree, the image's paths are reported, and they are written through a build argument that
142
+ names the user, `ARG APP_USER=ubuntu`, `USER ${APP_USER}`, `WORKDIR /home/${APP_USER}/app`, so no home path stands
143
+ in the source; `$HOME` serves only where a shell in the image expands it, a `RUN` line or a script, since a
144
+ Dockerfile's `WORKDIR` and `COPY` see only `ENV` and `ARG` values) and a value that says it is synthetic (`EXAMPLE`, `not-a-key`, `fake`, `dummy`) are
145
+ not findings.
146
+
147
+ The check finds the forms the table names, and only those: a credential in another shape (a bare token with no name
148
+ before it, a provider's key the contract's names do not cover) passes it. It is a floor under the owner's review and a
149
+ secret scanner, never a replacement for either.
150
+
151
+ The check finds the repository from the folder it checks: a Git location the caller exports (`GIT_DIR`,
152
+ `GIT_INDEX_FILE`, as a hook in a linked worktree has) is not passed to Git. The check reads the tree, not Git history. A value that was committed once is still in the history after the tree is
153
+ clean: handing such a source over needs a fresh history, which is the owner's act, never the agent's (no history
154
+ rewrite, no force-push).
@@ -18,7 +18,7 @@ compatibility: >-
18
18
  this plugin; Codex/Kimi use command hooks; Hermes/OpenCode/OpenClaw/Pi use native context plugins after opt-in.
19
19
  metadata:
20
20
  author: PassionCode.ai
21
- version: "0.56.0"
21
+ version: "0.58.0"
22
22
  ---
23
23
 
24
24
  # Working with Fabric
@@ -35,12 +35,12 @@ Use it to work in a project through Fabric. Do not use it to:
35
35
 
36
36
  - build, adapt or run an agent as a Fabric provider or service: `creating-fabric-agents`,
37
37
  `adapting-projects-to-fabric`, `building-fabric-services`;
38
- - change Fabric itself (its hub, enrollment, journal): that is Fabric's repository and its own rules;
38
+ - change Fabric itself (its hub, enrollment, journal): Fabric's repository and rules own that;
39
39
  - take agent-sync leases on a repository's guarded files: agent-sync owns those; Fabric only shows them.
40
40
 
41
41
  ## Step 0: where Fabric stands
42
42
 
43
- Run the bundled status script; it reads files only, never a token, and prints one next action:
43
+ The bundled status script reads files only, never a token, and prints one next action:
44
44
 
45
45
  ```bash
46
46
  python3 <skill-dir>/scripts/fabric_session.py status # --json for a machine-readable report
@@ -55,7 +55,7 @@ By hand, when Python is absent: Fabric publishes `hub.json` in its folder while
55
55
  | Linux | `$XDG_DATA_HOME/passioncode-fabric/` (default `~/.local/share/`) | the install folder's `resources/bin`; the `.deb` puts it in `/opt/Fabric` |
56
56
 
57
57
  Fabric is up only when `hub.json` exists, says `"protocol": "fabric-hub/0.1"`, names the loopback origin
58
- `http://127.0.0.1:<port>` and a `pid` that is alive. No file, or a dead pid, means no Fabric, whatever answers on
58
+ `http://127.0.0.1:<port>` and a live `pid`. No file, or a dead pid, means no Fabric, whatever answers on
59
59
  the port. Never send anything to the port yourself, and never read the door token `hub.json` names: `fabric-mcp`
60
60
  does that. On Linux an AppImage mounts at a new path each start, so a registration pointing into it breaks; use the
61
61
  `.deb`.
@@ -229,8 +229,8 @@ already approved.
229
229
  the handoff (OA-6). A stop rule written into a request does not replace an approval whose scope covers the case: act
230
230
  on it.
231
231
  - Human gates stay (OA-5): sign-in, a one-time code, consent, payment or top-up, a typed secret, spend above a limit
232
- (handed to the person with its link and the amount, never asked in chat), a passkey. A policy change, a promotion or
233
- a grant of your own is never covered (AP-5).
232
+ (handed over with its link and amount, never asked in chat), a passkey, a comparison of codes with another person
233
+ or the choice to share without one (DEC-0142). A policy change, a promotion or a grant of your own is never covered (AP-5).
234
234
  - A prose relay that carries the four is accepted (OA-2): state your decision (*relay their decision*) or your own
235
235
  mandate from it, `instruction` and `at` copied unchanged, `source` naming where he said them, the scope no wider than
236
236
  the relayed one and his quoted words. You then lead your own part of the task.
@@ -300,8 +300,8 @@ resolve (a repository the project does not hold) is refused, naming the part tha
300
300
  3. `fabric_work_release` with how it ended: `done` (the task goes to review), handed over (to whom, with the note
301
301
  the next agent reads) or let go (why). Older Fabric: `fabric_task_release`.
302
302
 
303
- A session that ends without releasing lapses at its claim's expiry; release anyway; a lapsed claim reads as
304
- stuck work to the operator.
303
+ A session that ends without releasing lapses at its claim's expiry; release anyway: a lapsed claim reads as stuck
304
+ work.
305
305
 
306
306
  ## Refusals and lost answers
307
307
 
@@ -316,7 +316,7 @@ stuck work to the operator.
316
316
  | `operator-decision-required` | a service's action needs the operator's decision and none travelled; with `data.detail` `outside-mandate: <part>`, the mandate does not cover that part | ask the operator about this action, then relay their answer by the first route of Step 5 that carries it, the page only when none does; under a mandate, call again within your own mandate if it covers the part, else pass the refusal to the agent that called you, and only the lead asks him, once, about that part alone; `mandate-capability-missing`: no mandate covers that step, only his decision |
317
317
  | `decision-invalid` | the decision names another action or object, is older than 24 hours, lies over 60 s ahead of the service's clock, or is malformed; or the mandate is (`data.detail` `mandate-malformed`, `-widened`, `-expired`, `-early`, `-not-for-this-call`) | never edit, widen or re-date it; ask the operator again when their words do not cover this call |
318
318
  | `approval-required` with `data.actionDigest` | a caller outside the machine's trust (T2): a chat decision changes nothing | an `approval/1` for that digest through the hub |
319
- | `human-step-required` with `data.humanStep` and `data.url` | a sign-in, a one-time code, consent, payment or top-up, typed secret, spend above a limit or passkey stays the person's | hand the person `data.url`: a path on the service's origin as Fabric Dashboards' `open_link` (`fallback=never`), an https URL as it is; never take the step or ask for the secret; continue other work |
319
+ | `human-step-required` with `data.humanStep` and `data.url` | a human gate of OA-5 (above) stays the person's | hand the person `data.url`: a path on the service's origin as Fabric Dashboards' `open_link` (`fallback=never`), an https URL as it is; never take the step or ask for the secret; continue other work |
320
320
 
321
321
  Never tell the person a call failed or succeeded when its outcome is unknown.
322
322
 
@@ -58,7 +58,7 @@ SESSION_ID = re.compile(r"[A-Za-z0-9._:-]{1,128}")
58
58
  LOOPBACK_ORIGIN = re.compile(r"http://127\.0\.0\.1:(\d{1,5})")
59
59
 
60
60
 
61
- VERSION = "0.56.0"
61
+ VERSION = "0.58.0"
62
62
 
63
63
 
64
64
  HOSTS = {"claude": "Claude Code", "codex": "Codex", "kimi": "Kimi Code",