@passioncode-ai/fabric-agent-adapter 0.44.0 → 0.44.1
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.
- package/CHANGELOG.md +17 -0
- package/package.json +1 -1
- package/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/kit-modules.md +6 -3
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop-rules.mjs +264 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop.mjs +31 -254
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-package-schema.mjs +100 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-package.mjs +2 -89
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop.py +54 -369
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop_rules.py +390 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_package.py +20 -187
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_package_schema.py +207 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +132 -14
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +1 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"""fabric-package/1, the schema reading: the package schema bundled from the contract at the pin, read by a JSON Schema
|
|
2
|
+
2020-12 subset with JavaScript's patterns, lengths in code points and the formats the contract uses, as
|
|
3
|
+
fabric-package.mjs reads it. fabric_package checks, packs, signs and verifies on it and re-exports these names. Part of
|
|
4
|
+
the service kit (FAA-92, split from fabric_package; layer L2). Standard library only, Python 3.9+."""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any, Dict, List
|
|
11
|
+
|
|
12
|
+
import sys as _sys # noqa: E402
|
|
13
|
+
from pathlib import Path as _Path # noqa: E402
|
|
14
|
+
if str(_Path(__file__).resolve().parent) not in _sys.path: # the kit loads from any working directory (FAA-65)
|
|
15
|
+
_sys.path.insert(0, str(_Path(__file__).resolve().parent))
|
|
16
|
+
|
|
17
|
+
# What pack refuses to list is matched with JavaScript's `.`; fabric_package reads it from here.
|
|
18
|
+
_JS_DOT = "[^\n\r\u2028\u2029]"
|
|
19
|
+
|
|
20
|
+
#: JavaScript's whitespace, what String.prototype.trim and the regular expression class \s take (ECMA-262 WhiteSpace
|
|
21
|
+
#: and LineTerminator), so a key file and a URI are read as fabric-package.mjs reads them.
|
|
22
|
+
JS_WHITESPACE = "\t\n\x0b\x0c\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000\ufeff"
|
|
23
|
+
|
|
24
|
+
SCHEMA_PATH = Path(__file__).resolve().parent / "fabric-package.schema.json"
|
|
25
|
+
|
|
26
|
+
# --- the schema (bundled from the contract at the pin) ------------------------------------------------
|
|
27
|
+
|
|
28
|
+
_SCHEMA_CACHE: Dict[str, Any] = {}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _schema() -> Dict[str, Any]:
|
|
32
|
+
if "s" not in _SCHEMA_CACHE:
|
|
33
|
+
_SCHEMA_CACHE["s"] = json.loads(SCHEMA_PATH.read_text(encoding="utf-8"))
|
|
34
|
+
return _SCHEMA_CACHE["s"]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
from fabric_jsvalue import json_equal as _json_equal # noqa: E402 - the core's (FAA-65)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _type_of(value: Any) -> str:
|
|
41
|
+
if value is None:
|
|
42
|
+
return "null"
|
|
43
|
+
if isinstance(value, bool):
|
|
44
|
+
return "boolean"
|
|
45
|
+
if isinstance(value, int) or (isinstance(value, float) and value.is_integer()):
|
|
46
|
+
return "integer"
|
|
47
|
+
if isinstance(value, float):
|
|
48
|
+
return "number"
|
|
49
|
+
if isinstance(value, str):
|
|
50
|
+
return "string"
|
|
51
|
+
if isinstance(value, list):
|
|
52
|
+
return "array"
|
|
53
|
+
return "object"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# ASCII digits only and the whole string (fullmatch): Python's \d takes any Unicode digit and its $ a trailing newline,
|
|
57
|
+
# which JavaScript's do not (FAA-78, finding 43).
|
|
58
|
+
_DATE_TIME = re.compile(r"([0-9]{4})-([0-9]{2})-([0-9]{2})[Tt]([0-9]{2}):([0-9]{2}):([0-9]{2})(\.[0-9]+)?([Zz]|[+-]([0-9]{2}):([0-9]{2}))")
|
|
59
|
+
_URI = re.compile(r"[A-Za-z][A-Za-z0-9+.-]*:[^%s]*" % JS_WHITESPACE)
|
|
60
|
+
_MONTH_DAYS = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _leap(year: int) -> bool:
|
|
64
|
+
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _format_ok(fmt: str, value: Any) -> bool:
|
|
68
|
+
if not isinstance(value, str):
|
|
69
|
+
return True
|
|
70
|
+
if fmt == "date-time":
|
|
71
|
+
m = _DATE_TIME.fullmatch(value)
|
|
72
|
+
if not m:
|
|
73
|
+
return False
|
|
74
|
+
year, month, day, hour, minute, second = (int(g) for g in m.groups()[:6])
|
|
75
|
+
# The proleptic calendar the contract's ajv-formats checks: year 0000 exists and is a leap year (0000-02-29
|
|
76
|
+
# holds). datetime starts at year 1, so the days are counted here, as fabric-package.mjs counts them.
|
|
77
|
+
if not 1 <= month <= 12 or not 1 <= day <= (29 if month == 2 and _leap(year) else _MONTH_DAYS[month]):
|
|
78
|
+
return False
|
|
79
|
+
if hour > 23 or minute > 59 or second > 59:
|
|
80
|
+
return False
|
|
81
|
+
return m.group(8) in ("Z", "z") or (int(m.group(9)) < 24 and int(m.group(10)) < 60)
|
|
82
|
+
if fmt == "uri":
|
|
83
|
+
return bool(_URI.fullmatch(value))
|
|
84
|
+
return True
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
_PATTERNS: Dict[str, Any] = {}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _js_pattern(source: str) -> Any:
|
|
91
|
+
"""A schema's ECMAScript pattern (``u`` flag) as Python reads it the same way: ``$`` is the end of the string, not
|
|
92
|
+
the end before a final newline; ``.`` stops at JavaScript's line terminators (\\n, \\r, U+2028, U+2029); ``\\d`` and
|
|
93
|
+
``\\w`` are ASCII. Escapes and character classes are copied as written."""
|
|
94
|
+
if source not in _PATTERNS:
|
|
95
|
+
out: List[str] = []
|
|
96
|
+
i, in_class = 0, False
|
|
97
|
+
while i < len(source):
|
|
98
|
+
ch = source[i]
|
|
99
|
+
if ch == "\\":
|
|
100
|
+
out.append(source[i:i + 2])
|
|
101
|
+
i += 2
|
|
102
|
+
continue
|
|
103
|
+
if in_class:
|
|
104
|
+
in_class = ch != "]"
|
|
105
|
+
elif ch == "[":
|
|
106
|
+
in_class = True
|
|
107
|
+
elif ch == "$":
|
|
108
|
+
ch = r"\Z"
|
|
109
|
+
elif ch == ".":
|
|
110
|
+
ch = _JS_DOT
|
|
111
|
+
out.append(ch)
|
|
112
|
+
i += 1
|
|
113
|
+
_PATTERNS[source] = re.compile("".join(out), re.ASCII)
|
|
114
|
+
return _PATTERNS[source]
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _pointer(token: Any) -> str:
|
|
118
|
+
return str(token).replace("~", "~0").replace("/", "~1")
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _validate(schema: Any, value: Any, at: str, out: List[Dict[str, str]]) -> None:
|
|
122
|
+
"""The JSON Schema 2020-12 keywords the package schema uses, nothing more."""
|
|
123
|
+
if schema is True:
|
|
124
|
+
return
|
|
125
|
+
if schema is False:
|
|
126
|
+
out.append({"instancePath": at, "message": "is not allowed here"})
|
|
127
|
+
return
|
|
128
|
+
if "$ref" in schema:
|
|
129
|
+
target = _schema()
|
|
130
|
+
for token in schema["$ref"].lstrip("#/").split("/"):
|
|
131
|
+
target = target[token.replace("~1", "/").replace("~0", "~")]
|
|
132
|
+
_validate(target, value, at, out)
|
|
133
|
+
kind = _type_of(value)
|
|
134
|
+
if "type" in schema:
|
|
135
|
+
allowed = schema["type"] if isinstance(schema["type"], list) else [schema["type"]]
|
|
136
|
+
if not (kind in allowed or (kind == "integer" and "number" in allowed)):
|
|
137
|
+
out.append({"instancePath": at, "message": "must be %s" % " or ".join(allowed)})
|
|
138
|
+
return
|
|
139
|
+
if "const" in schema and not _json_equal(schema["const"], value):
|
|
140
|
+
out.append({"instancePath": at, "message": "must be %s" % json.dumps(schema["const"])})
|
|
141
|
+
if "enum" in schema and not any(_json_equal(item, value) for item in schema["enum"]):
|
|
142
|
+
out.append({"instancePath": at, "message": "must be one of %s" % ", ".join(json.dumps(i) for i in schema["enum"])})
|
|
143
|
+
if kind == "string":
|
|
144
|
+
length = len(value) # code points, as JSON Schema counts
|
|
145
|
+
if length < schema.get("minLength", 0):
|
|
146
|
+
out.append({"instancePath": at, "message": "is shorter than %d" % schema["minLength"]})
|
|
147
|
+
if "maxLength" in schema and length > schema["maxLength"]:
|
|
148
|
+
out.append({"instancePath": at, "message": "is longer than %d" % schema["maxLength"]})
|
|
149
|
+
if "pattern" in schema and not _js_pattern(schema["pattern"]).search(value):
|
|
150
|
+
out.append({"instancePath": at, "message": "does not match %s" % schema["pattern"]})
|
|
151
|
+
if "format" in schema and not _format_ok(schema["format"], value):
|
|
152
|
+
out.append({"instancePath": at, "message": "is not a %s" % schema["format"]})
|
|
153
|
+
if kind in ("integer", "number") and "minimum" in schema and value < schema["minimum"]:
|
|
154
|
+
out.append({"instancePath": at, "message": "is below %s" % schema["minimum"]})
|
|
155
|
+
if kind == "array":
|
|
156
|
+
if len(value) < schema.get("minItems", 0):
|
|
157
|
+
out.append({"instancePath": at, "message": "has fewer than %d items" % schema["minItems"]})
|
|
158
|
+
if "maxItems" in schema and len(value) > schema["maxItems"]:
|
|
159
|
+
out.append({"instancePath": at, "message": "has more than %d items" % schema["maxItems"]})
|
|
160
|
+
if schema.get("uniqueItems") and any(_json_equal(value[i], value[j]) for i in range(len(value)) for j in range(i)):
|
|
161
|
+
out.append({"instancePath": at, "message": "has duplicate items"})
|
|
162
|
+
if "items" in schema:
|
|
163
|
+
for index, item in enumerate(value):
|
|
164
|
+
_validate(schema["items"], item, "%s/%d" % (at, index), out)
|
|
165
|
+
if "contains" in schema:
|
|
166
|
+
matches = sum(1 for item in value if not _problems(schema["contains"], item))
|
|
167
|
+
if matches < schema.get("minContains", 1):
|
|
168
|
+
out.append({"instancePath": at, "message": "has fewer than %d matching items" % schema.get("minContains", 1)})
|
|
169
|
+
if "maxContains" in schema and matches > schema["maxContains"]:
|
|
170
|
+
out.append({"instancePath": at, "message": "has more than %d matching items" % schema["maxContains"]})
|
|
171
|
+
if kind == "object":
|
|
172
|
+
for name in schema.get("required", []):
|
|
173
|
+
if name not in value:
|
|
174
|
+
out.append({"instancePath": at, "message": "must have %s" % name})
|
|
175
|
+
properties = schema.get("properties", {})
|
|
176
|
+
for name, member in value.items():
|
|
177
|
+
if name in properties:
|
|
178
|
+
_validate(properties[name], member, "%s/%s" % (at, _pointer(name)), out)
|
|
179
|
+
elif "additionalProperties" in schema:
|
|
180
|
+
if schema["additionalProperties"] is False:
|
|
181
|
+
out.append({"instancePath": "%s/%s" % (at, _pointer(name)), "message": "is not a member of this object"})
|
|
182
|
+
else:
|
|
183
|
+
_validate(schema["additionalProperties"], member, "%s/%s" % (at, _pointer(name)), out)
|
|
184
|
+
if "propertyNames" in schema:
|
|
185
|
+
_validate(schema["propertyNames"], name, "%s/%s" % (at, _pointer(name)), out)
|
|
186
|
+
for sub in schema.get("allOf", []):
|
|
187
|
+
_validate(sub, value, at, out)
|
|
188
|
+
if "not" in schema and not _problems(schema["not"], value):
|
|
189
|
+
out.append({"instancePath": at, "message": "must not match"})
|
|
190
|
+
if "if" in schema:
|
|
191
|
+
branch = schema.get("then") if not _problems(schema["if"], value) else schema.get("else")
|
|
192
|
+
if branch is not None:
|
|
193
|
+
_validate(branch, value, at, out)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def _problems(schema: Any, value: Any) -> List[Dict[str, str]]:
|
|
197
|
+
out: List[Dict[str, str]] = []
|
|
198
|
+
_validate(schema, value, "", out)
|
|
199
|
+
return out
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def schema_problems(pkg: Any) -> List[Dict[str, str]]:
|
|
203
|
+
"""Where the package breaks ``fabric-package.schema.json`` (the contract's, bundled at the pin)."""
|
|
204
|
+
return _problems(_schema(), pkg)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
# --- the contract's rules (FAC-SEM-064…066, FAC-SEM-102) ------------------------------------------------
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fabric-service-kit",
|
|
3
|
-
"version": "0.44.
|
|
3
|
+
"version": "0.44.1",
|
|
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
|
{
|
|
@@ -91,6 +91,18 @@
|
|
|
91
91
|
],
|
|
92
92
|
"sha256": "a59e83cf4adb2669a9b98008e3d3a0cba991a35cbff97bc604fc82fe81cfd49f"
|
|
93
93
|
},
|
|
94
|
+
{
|
|
95
|
+
"module": "fabric_package_schema",
|
|
96
|
+
"file": "fabric_package_schema.py",
|
|
97
|
+
"layer": "L2",
|
|
98
|
+
"imports": [
|
|
99
|
+
"fabric_jsvalue"
|
|
100
|
+
],
|
|
101
|
+
"data": [
|
|
102
|
+
"fabric-package.schema.json"
|
|
103
|
+
],
|
|
104
|
+
"sha256": "e623f0408d38e3343ed66222fb812907c6c52e1a286eb1c1176ab2e64640c9ad"
|
|
105
|
+
},
|
|
94
106
|
{
|
|
95
107
|
"module": "fabric_package",
|
|
96
108
|
"file": "fabric_package.py",
|
|
@@ -99,12 +111,10 @@
|
|
|
99
111
|
"fabric_crypto",
|
|
100
112
|
"fabric_delegation",
|
|
101
113
|
"fabric_jsvalue",
|
|
114
|
+
"fabric_package_schema",
|
|
102
115
|
"fabric_secrets"
|
|
103
116
|
],
|
|
104
|
-
"sha256": "
|
|
105
|
-
"data": [
|
|
106
|
-
"fabric-package.schema.json"
|
|
107
|
-
]
|
|
117
|
+
"sha256": "ff533f1b3f92b4ea0f532fcec50b68c610d47549930eef8ad5247692a64dfb3c"
|
|
108
118
|
},
|
|
109
119
|
{
|
|
110
120
|
"module": "fabric_base",
|
|
@@ -281,6 +291,17 @@
|
|
|
281
291
|
],
|
|
282
292
|
"sha256": "26e21ec29c016000f8ca8053b7b489184854a73be1b7fdc0a18d12990203db9b"
|
|
283
293
|
},
|
|
294
|
+
{
|
|
295
|
+
"module": "fabric_interop_rules",
|
|
296
|
+
"file": "fabric_interop_rules.py",
|
|
297
|
+
"layer": "L3",
|
|
298
|
+
"imports": [
|
|
299
|
+
"fabric_base",
|
|
300
|
+
"fabric_delegation",
|
|
301
|
+
"fabric_time"
|
|
302
|
+
],
|
|
303
|
+
"sha256": "845d87f7ec601bc2a8ce1ab0dcdc48a95f474ec38ba0ebd7aace85046c3c43f5"
|
|
304
|
+
},
|
|
284
305
|
{
|
|
285
306
|
"module": "fabric_interop",
|
|
286
307
|
"file": "fabric_interop.py",
|
|
@@ -288,10 +309,10 @@
|
|
|
288
309
|
"imports": [
|
|
289
310
|
"fabric_base",
|
|
290
311
|
"fabric_delegation",
|
|
291
|
-
"
|
|
292
|
-
"
|
|
312
|
+
"fabric_interop_rules",
|
|
313
|
+
"fabric_service"
|
|
293
314
|
],
|
|
294
|
-
"sha256": "
|
|
315
|
+
"sha256": "0b4ca623caad90814426f00e328a7cf2bb52b936d824972136372dd9a0f87d7b"
|
|
295
316
|
},
|
|
296
317
|
{
|
|
297
318
|
"module": "fabric_hub",
|
|
@@ -464,6 +485,18 @@
|
|
|
464
485
|
],
|
|
465
486
|
"sha256": "117d4374c9e95c930a38de7adbd4323774798f4fe6ec6f24afcd6f2c7298ca44"
|
|
466
487
|
},
|
|
488
|
+
{
|
|
489
|
+
"module": "fabric-package-schema",
|
|
490
|
+
"file": "fabric-package-schema.mjs",
|
|
491
|
+
"layer": "L2",
|
|
492
|
+
"imports": [
|
|
493
|
+
"fabric-jsvalue"
|
|
494
|
+
],
|
|
495
|
+
"data": [
|
|
496
|
+
"fabric-package.schema.json"
|
|
497
|
+
],
|
|
498
|
+
"sha256": "cd28092375db0fc21ffab1f0bb7794f7f8979ee08c64d3b9faf4b3845357caa6"
|
|
499
|
+
},
|
|
467
500
|
{
|
|
468
501
|
"module": "fabric-package",
|
|
469
502
|
"file": "fabric-package.mjs",
|
|
@@ -471,12 +504,10 @@
|
|
|
471
504
|
"imports": [
|
|
472
505
|
"fabric-delegation",
|
|
473
506
|
"fabric-jsvalue",
|
|
507
|
+
"fabric-package-schema",
|
|
474
508
|
"fabric-secrets"
|
|
475
509
|
],
|
|
476
|
-
"sha256": "
|
|
477
|
-
"data": [
|
|
478
|
-
"fabric-package.schema.json"
|
|
479
|
-
]
|
|
510
|
+
"sha256": "49b757eefcc50e4c91585d5a5694bf3c83d0b03d112c1837f1c9f01466797ab5"
|
|
480
511
|
},
|
|
481
512
|
{
|
|
482
513
|
"module": "fabric-base",
|
|
@@ -652,16 +683,27 @@
|
|
|
652
683
|
],
|
|
653
684
|
"sha256": "314376cf2deb87f235fb18b11d3b532e211f585b9af0a9302b5f4cc39971b532"
|
|
654
685
|
},
|
|
686
|
+
{
|
|
687
|
+
"module": "fabric-interop-rules",
|
|
688
|
+
"file": "fabric-interop-rules.mjs",
|
|
689
|
+
"layer": "L3",
|
|
690
|
+
"imports": [
|
|
691
|
+
"fabric-base",
|
|
692
|
+
"fabric-delegation",
|
|
693
|
+
"fabric-jsvalue"
|
|
694
|
+
],
|
|
695
|
+
"sha256": "317f29e407d30ab2afa9bc5e87b3c57c547f216a4c51844d6427d05d6f8f6c9e"
|
|
696
|
+
},
|
|
655
697
|
{
|
|
656
698
|
"module": "fabric-interop",
|
|
657
699
|
"file": "fabric-interop.mjs",
|
|
658
700
|
"layer": "L3",
|
|
659
701
|
"imports": [
|
|
660
702
|
"fabric-delegation",
|
|
661
|
-
"fabric-
|
|
703
|
+
"fabric-interop-rules",
|
|
662
704
|
"fabric-service"
|
|
663
705
|
],
|
|
664
|
-
"sha256": "
|
|
706
|
+
"sha256": "11051f914f2457fd1b3424d7b4174d64500a08f7ce66ac10ed8eda71565511b1"
|
|
665
707
|
},
|
|
666
708
|
{
|
|
667
709
|
"module": "fabric-hub",
|
|
@@ -1919,6 +1961,82 @@
|
|
|
1919
1961
|
"fabric-openrouter.mjs": "f8f0168691f968b7cd85f36aa98e2167e88cc44f1104ff514fd0c7699b339253",
|
|
1920
1962
|
"fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
|
|
1921
1963
|
"share-registration.schema.json": "0df979d5973809d194723b23a0d18e520d9f1badc0f4a9e557aa33cbe7bc2922"
|
|
1964
|
+
},
|
|
1965
|
+
"0.44.1": {
|
|
1966
|
+
"fabric_jsvalue.py": "0cd4eab0a5d6ae35d097f7c59a08dc29173cb61c561c49e5291a8dad15d36779",
|
|
1967
|
+
"fabric_time.py": "588f383da4ac6a243ea95b6ffc3a0aa99ca94245732dc4937734f190b7af4ae9",
|
|
1968
|
+
"fabric_identifiers.py": "0fd814d521ac3aa39907458265870753046a73f48af3d8581ab864b93b211607",
|
|
1969
|
+
"fabric_secrets.py": "68a0b5e9e90c468ec9ac67b2f0fd1848e08813d6ec1ec14a2a47337eb1a98911",
|
|
1970
|
+
"fabric_crypto.py": "9c34aee20dbe4d6742e4fdbaab68ceb934bbe7dbd3a904c0010824ace16cdeaa",
|
|
1971
|
+
"fabric_estate.py": "50cc12166a00b680ba5b2e458200912d7bcfbef70bd73ec4edf57c7fcfa9b687",
|
|
1972
|
+
"fabric_delegation.py": "350e30cc0fb527bce1739c5f96bb9bec9028144def9d1b2630d1478529f8f996",
|
|
1973
|
+
"fabric_share.py": "78506fe1a60829c525dbf6266a0aa0749a2164290ed94da8249a20b4e9be5605",
|
|
1974
|
+
"fabric_ceremonies.py": "a59e83cf4adb2669a9b98008e3d3a0cba991a35cbff97bc604fc82fe81cfd49f",
|
|
1975
|
+
"fabric_package_schema.py": "e623f0408d38e3343ed66222fb812907c6c52e1a286eb1c1176ab2e64640c9ad",
|
|
1976
|
+
"fabric_package.py": "ff533f1b3f92b4ea0f532fcec50b68c610d47549930eef8ad5247692a64dfb3c",
|
|
1977
|
+
"fabric_base.py": "684533b3a2aa3acd9b9e645a7a443427d279408f9f12f13456a0a991d57954ce",
|
|
1978
|
+
"fabric_platform.py": "8b0cd89193bc55da204a4a1850665c96929c6778523a8715b8156c5643745288",
|
|
1979
|
+
"fabric_paths.py": "0d87e572bde2b930391b27aa370d808e093ce45cfba6148706f5318219906d30",
|
|
1980
|
+
"fabric_protocols.py": "71482284e57334b2d364a44596fc4183baddfe61a80083d3099b7ef423dc6f38",
|
|
1981
|
+
"fabric_connections.py": "77d3ccf863c70e9209d21ef45c46a6db9c06237019bc20d54f8d3946873f3f11",
|
|
1982
|
+
"fabric_lock.py": "ba2399d2137c7a7791b7133b9db9cca36693f4eb7e30955b25a75ade814e95ba",
|
|
1983
|
+
"fabric_usage.py": "ce685cb9fdfd62ea75fff8b1b2be12a2ba758da783e4bfb4dcebe47bcbeb832b",
|
|
1984
|
+
"fabric_backups.py": "02dc5eb66ec956723d3ddba07b6dd15f6a9726d901f4d60edfd02eee57880ceb",
|
|
1985
|
+
"fabric_descriptor.py": "5f6c8f3593fe0cef92d866109cd9def807f67dd5beae2c4bca05452f50521080",
|
|
1986
|
+
"fabric_auth.py": "55794587750f6c9f40935b74295d83d7096cb4b26a0b36ac292334cd87d8f853",
|
|
1987
|
+
"fabric_events.py": "0086886c2c29dbd5c9d152be9d375c5bdf4a29f89b8095baff8490c2bcd64e47",
|
|
1988
|
+
"fabric_logs.py": "86dc55bfafa2a57264722e2403510a249b95de0e4a722b2e4bc3948e3bd93da9",
|
|
1989
|
+
"fabric_supervisors.py": "a2dbf15aa1c4eb9de42996b413103fa4814afd2e4e66d1ab7315f30e06ab6841",
|
|
1990
|
+
"fabric_service.py": "d411433ce6ff3e81189b10b2c1a8462335a97cd99574ab0ee7d1c28cf48e1694",
|
|
1991
|
+
"fabric_profiles.py": "26e21ec29c016000f8ca8053b7b489184854a73be1b7fdc0a18d12990203db9b",
|
|
1992
|
+
"fabric_interop_rules.py": "845d87f7ec601bc2a8ce1ab0dcdc48a95f474ec38ba0ebd7aace85046c3c43f5",
|
|
1993
|
+
"fabric_interop.py": "0b4ca623caad90814426f00e328a7cf2bb52b936d824972136372dd9a0f87d7b",
|
|
1994
|
+
"fabric_hub.py": "b9ac852e601b1d54cf61351677a628afc69faeed7d1fc74ebe541c1cf38e0c2a",
|
|
1995
|
+
"fabric_board_shapes.py": "a8daefdc9283219206875b5d964b49552b6b3ba7e69c925abe08a44afc91c234",
|
|
1996
|
+
"fabric_board_link.py": "b5bff994cb615c6a4bb0d88d020e3a59504166180e1fa1aea3be93224f2aeccb",
|
|
1997
|
+
"fabric_board_session.py": "878ceed970a84087a320fd8eb971c210613a0fa2c524b68793fb32042910581e",
|
|
1998
|
+
"fabric_board_fixture.py": "69761ce205ec640762ec9b591c6903e5a87f844e8d423b041681924027e39d1e",
|
|
1999
|
+
"fabric_board.py": "0f075894b3e352194fcaf3fc7d08dee4e9f1c215e859769ed85fa5010e4a1599",
|
|
2000
|
+
"fabric_http.py": "5d7f72af3a73fdbe8c1f487ecf60cef23a7c46289eba542b03aff4706b8218d4",
|
|
2001
|
+
"fabric_openrouter.py": "2017d898c17001d7275f58267de653be7ecf6acd17ad8d9b24ecb7a43e5617d4",
|
|
2002
|
+
"fabric-jsvalue.mjs": "dfbdb8c41584972c9389750a41719374a1cfc5652ed438dd1623025190b0106e",
|
|
2003
|
+
"fabric-time.mjs": "3ff932069038a720df1c68c6492976906737b2e67e5c12d9c81c418597f661de",
|
|
2004
|
+
"fabric-identifiers.mjs": "a18c2a501a4aa170bfd3d99e571ad6b7662649b4d3b9d2a540c002ea42811bbf",
|
|
2005
|
+
"fabric-secrets.mjs": "6ad8ab18ac899ecc2384e8ec6a3fb689b92be3b9a5ce3a59b92a37d52da5d766",
|
|
2006
|
+
"fabric-crypto.mjs": "038e03689701e3c9721a1e7f8e0a4d02a52d6a5d1661b0dc84035edc3ebbfcf6",
|
|
2007
|
+
"fabric-estate.mjs": "912b1ceab57ed20f946986bf14ae2faf41fb8ea539e818164496874f3749ef65",
|
|
2008
|
+
"fabric-delegation.mjs": "2bc4310c6c7f0f6a11ba29d8bad2341feb0e0285758c33080e879e0a3a5cf128",
|
|
2009
|
+
"fabric-share.mjs": "d40a7405d7bd4c3213ed691330b7549afe8e023db0753b582e249714e672010d",
|
|
2010
|
+
"fabric-ceremonies.mjs": "117d4374c9e95c930a38de7adbd4323774798f4fe6ec6f24afcd6f2c7298ca44",
|
|
2011
|
+
"fabric-package-schema.mjs": "cd28092375db0fc21ffab1f0bb7794f7f8979ee08c64d3b9faf4b3845357caa6",
|
|
2012
|
+
"fabric-package.mjs": "49b757eefcc50e4c91585d5a5694bf3c83d0b03d112c1837f1c9f01466797ab5",
|
|
2013
|
+
"fabric-base.mjs": "17a92f5e9b71a855648e39e06388bad7f1b969605bd7b1f534ddf67b41a2fb5d",
|
|
2014
|
+
"fabric-platform.mjs": "1349e3638c21caf7da7937ef6a5dfeefe05a8ee733520f0d581624095efeb388",
|
|
2015
|
+
"fabric-paths.mjs": "e6f5e2ce7c8e7a1452d6ee69977489f4c09ca6f1d3100df9c303274f0b7b16b1",
|
|
2016
|
+
"fabric-protocols.mjs": "0ecc3c19bb0bd0393ff3a9ec503034e0ab251eaaf0254edf353e15d1b561f761",
|
|
2017
|
+
"fabric-connections.mjs": "303432e547ce563e90ca9ffcd827f5612f51d3582929834e1add0fdaf6485dcc",
|
|
2018
|
+
"fabric-lock.mjs": "ac219ab0a326d5c43c7c4c255e0c3843d4794de795a60e3af661e7d5350ea052",
|
|
2019
|
+
"fabric-usage.mjs": "e413569620bbc8221bc59e24b27e22d1483825ed18457801ed58d54a57de8114",
|
|
2020
|
+
"fabric-backups.mjs": "849acdc6eba0fff648c8158e61f6b68cccd7bedf0880f7d5ec03a6a20f1e7005",
|
|
2021
|
+
"fabric-descriptor.mjs": "e75b16bbf15ee72a3c581df8164533ea84270f6167e7a0d2527e15bf4b78457d",
|
|
2022
|
+
"fabric-auth.mjs": "3ea6796470fcd829bc72a772fb7e4c37532a09d1e37ff41592dcf1a1a3074ca2",
|
|
2023
|
+
"fabric-events.mjs": "c463d6ffcae24229a5c608d8fcea4268d2ccc5024b19fa10e5a452284068fa71",
|
|
2024
|
+
"fabric-logs.mjs": "58467e5719c16e099d05bbedec47a95712506ab03c33f3cd4be1252e8498a946",
|
|
2025
|
+
"fabric-supervisors.mjs": "9d61c1a17538a5e2453e33e5ae347337336748041bc054478a96dd51f3d4fc51",
|
|
2026
|
+
"fabric-service.mjs": "bc67550e52aa6aa9c6d2ed6cbae52418a3e836623e17164166699f953d8aafa8",
|
|
2027
|
+
"fabric-profiles.mjs": "314376cf2deb87f235fb18b11d3b532e211f585b9af0a9302b5f4cc39971b532",
|
|
2028
|
+
"fabric-interop-rules.mjs": "317f29e407d30ab2afa9bc5e87b3c57c547f216a4c51844d6427d05d6f8f6c9e",
|
|
2029
|
+
"fabric-interop.mjs": "11051f914f2457fd1b3424d7b4174d64500a08f7ce66ac10ed8eda71565511b1",
|
|
2030
|
+
"fabric-hub.mjs": "c005115a864cfd67daa4862097bb14acfe5a60bf653897e5bf8a570dd80f1070",
|
|
2031
|
+
"fabric-board-shapes.mjs": "ad1094397540862b104d9317d6902031d35e64b16c12bf849fb883e12cb78d45",
|
|
2032
|
+
"fabric-board-link.mjs": "4cd6d4e21713a38c8e56f7d59db3148638b8c27c08e774d96a0f6283c6049e0a",
|
|
2033
|
+
"fabric-board-session.mjs": "744a8c9a518c27f2ddfd20b1b22afebc3ccc4f59aeeb7a38d7c12c2ddcae158d",
|
|
2034
|
+
"fabric-board-fixture.mjs": "83c4b7e33ee47b68385faf2569d38d5c8a0c5cb0f8656090f41e1b0eed2f436e",
|
|
2035
|
+
"fabric-board.mjs": "9e7bfe4d412521982224ef12bebfc2ff255eeeaf8d96cf40234ac18de68e7a59",
|
|
2036
|
+
"fabric-http.mjs": "f886bcb49c4353d039387ac9568738dda26697a94dd07fc6a6204500f0bc27bf",
|
|
2037
|
+
"fabric-openrouter.mjs": "f8f0168691f968b7cd85f36aa98e2167e88cc44f1104ff514fd0c7699b339253",
|
|
2038
|
+
"fabric-package.schema.json": "2ba799f576fad0f608029223c4ccccd122152f1c5dbfa8ce8b31cd63ac92ad44",
|
|
2039
|
+
"share-registration.schema.json": "0df979d5973809d194723b23a0d18e520d9f1badc0f4a9e557aa33cbe7bc2922"
|
|
1922
2040
|
}
|
|
1923
2041
|
},
|
|
1924
2042
|
"data": {
|
|
@@ -5,7 +5,7 @@ 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.44.
|
|
8
|
+
version: "0.44.1"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
10
|
contract-commit: "bfa9a67aa3c6cb808c093e7d83cd59799f1ee7d0"
|
|
11
11
|
---
|