@passioncode-ai/passioncode 0.1.20 → 0.1.21

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 CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.21 - 2026-10-03
4
+
5
+ ### Changed
6
+
7
+ - **Fabric Agent Adapter is pinned at `v0.6.1`:** `check_service.py` no longer fails an online
8
+ service hosted behind a platform router. Heroku, Fly, Render and CDNs answer a foreign `Host`
9
+ themselves (`404`/`421`), and that now counts as the refusal it is, unless the body is the
10
+ well-known document.
11
+
3
12
  ## 0.1.20 - 2026-10-02
4
13
 
5
14
  ### Changed
package/family.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "name": "fabric-agent-adapter",
9
9
  "displayName": "Fabric Agent Adapter",
10
10
  "repo": "passioncode-ai/fabric-agent-adapter",
11
- "ref": "v0.6.0",
11
+ "ref": "v0.6.1",
12
12
  "kind": "plugin",
13
13
  "path": "plugins/fabric-agent-adapter",
14
14
  "legacyPluginIds": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@passioncode-ai/passioncode",
3
- "version": "0.1.20",
3
+ "version": "0.1.21",
4
4
  "description": "The PassionCode.ai agent skill set \u2014 Fabric Agent Adapter, Observatory Log and the organisation's working rules \u2014 for Claude Code and every other agent on the machine, updated as one set.",
5
5
  "bin": {
6
6
  "passioncode": "bin/passioncode.js"
@@ -11,7 +11,7 @@
11
11
  "name": "fabric-agent-adapter",
12
12
  "displayName": "Fabric Agent Adapter",
13
13
  "source": "./plugins/fabric-agent-adapter",
14
- "version": "0.6.0",
14
+ "version": "0.6.1",
15
15
  "description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles.",
16
16
  "author": {
17
17
  "name": "PassionCode.ai",
@@ -35,7 +35,7 @@
35
35
  "name": "passioncode",
36
36
  "displayName": "PassionCode.ai",
37
37
  "source": "./plugins/passioncode",
38
- "version": "0.1.20",
38
+ "version": "0.1.21",
39
39
  "description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
40
40
  "author": {
41
41
  "name": "PassionCode.ai",
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "family": "passioncode",
3
- "version": "0.1.20",
3
+ "version": "0.1.21",
4
4
  "release": true,
5
5
  "members": [
6
6
  {
7
7
  "name": "fabric-agent-adapter",
8
8
  "displayName": "Fabric Agent Adapter",
9
9
  "repo": "passioncode-ai/fabric-agent-adapter",
10
- "ref": "v0.6.0",
11
- "commit": "447b55819b83d25f168afa7abd99cafa0ab29812",
12
- "version": "0.6.0",
10
+ "ref": "v0.6.1",
11
+ "commit": "d3a4c67262e242b0a4422ecdcf99a7d892db6caa",
12
+ "version": "0.6.1",
13
13
  "via": "clone of https://***@github.com/passioncode-ai/fabric-agent-adapter.git",
14
14
  "skills": [
15
15
  "adapting-projects-to-fabric",
@@ -22,7 +22,7 @@
22
22
  "legacyMarketplaces": [
23
23
  "fabric-agent-adapter"
24
24
  ],
25
- "contentHash": "sha256:f714e1620093378f3c790287270608ad8b6084109e813eead03dea9c159e964e",
25
+ "contentHash": "sha256:654511f4332892aa9a709e1946566d017179edc294e136fbe5c6466c5c32b5c8",
26
26
  "description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles.",
27
27
  "author": {
28
28
  "name": "PassionCode.ai",
@@ -61,16 +61,16 @@
61
61
  "name": "passioncode",
62
62
  "displayName": "PassionCode.ai",
63
63
  "repo": "passioncode-ai/passioncode",
64
- "ref": "v0.1.20",
64
+ "ref": "v0.1.21",
65
65
  "commit": null,
66
- "version": "0.1.20",
66
+ "version": "0.1.21",
67
67
  "via": "this repository",
68
68
  "skills": [
69
69
  "working-in-passioncode"
70
70
  ],
71
71
  "legacyPluginIds": [],
72
72
  "legacyMarketplaces": [],
73
- "contentHash": "sha256:b230828150120df33b6c48eccf6a6d4e20e35f0dff8089df4d9554c29957016a",
73
+ "contentHash": "sha256:63c4bc3c353c3e7b3762c4ab20a50e4684504c142a378c988c73d86049892a50",
74
74
  "description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
75
75
  "author": {
76
76
  "name": "PassionCode.ai",
@@ -3,7 +3,7 @@
3
3
  "name": "fabric-agent-adapter",
4
4
  "displayName": "Fabric Agent Adapter",
5
5
  "description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles.",
6
- "version": "0.6.0",
6
+ "version": "0.6.1",
7
7
  "author": {
8
8
  "name": "PassionCode.ai",
9
9
  "url": "https://passioncode.ai/"
@@ -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.
6
6
  metadata:
7
7
  author: PassionCode.ai
8
- version: "0.6.0"
8
+ version: "0.6.1"
9
9
  contract-version: "0.1.0"
10
10
  contract-commit: "2ce392291c6668598d12cd38327e24696b5ca15c"
11
11
  ---
@@ -15,7 +15,7 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
15
15
  compatibility: Python 3.9+ or Node.js 20+ for the kits; the probe needs Python 3.9+. launchd steps are macOS-only (Linux services use lifecycle manager none until a systemd adapter exists). Dashboard handoff optionally uses Fabric Dashboards MCP link/host_status/open; without it, report unresolved host capability. The contract checkout is optional.
16
16
  metadata:
17
17
  author: PassionCode.ai
18
- version: "0.6.0"
18
+ version: "0.6.1"
19
19
  contract-version: "0.1.0"
20
20
  extension: "fabric-service/0.1"
21
21
  extension-commit: "2ce392291c6668598d12cd38327e24696b5ca15c"
@@ -44,6 +44,14 @@ same objects — well-known document, events feed, login code — at the same pa
44
44
  - **Behind a router**: check the platform-set forwarded scheme; `Host` is preserved by common
45
45
  platforms and must equal the origin's host.
46
46
 
47
+ ## Checking it
48
+
49
+ `check_service.py <id>` probes a remote placement over verified TLS. Behind a platform router
50
+ (Heroku, Fly, Render, a CDN) a request that names a foreign `Host` never reaches the process: the
51
+ router answers it, usually `404` or `421`. The probe counts that as the refusal it is, as long as
52
+ the body is not the well-known document. The Origin and cross-site checks name the right `Host`,
53
+ reach the service, and still need its own `403`.
54
+
47
55
  ## What a host does and will not do
48
56
 
49
57
  | Situation | Host |
@@ -79,6 +79,23 @@ def priority_problems(plist: dict) -> list:
79
79
  return out
80
80
 
81
81
 
82
+ # A platform router (Heroku, Fly, Render, a CDN) routes by Host, so a request naming a foreign
83
+ # Host never reaches an online service: the router itself answers, typically 404 or 421. That is
84
+ # still a refusal — the service disclosed nothing — so for a remote placement the host check
85
+ # accepts it, as long as the body is not the well-known document. Every other guard request names
86
+ # the right Host, reaches the service, and must be the service's own 403.
87
+ PLATFORM_HOST_REFUSALS = (400, 404, 421)
88
+
89
+
90
+ def guard_verdict(rule: str, remote: bool, status: int, body: bytes) -> Tuple[str, str]:
91
+ if status == 403:
92
+ return "PASS", "HTTP 403"
93
+ disclosed = b"fabric-service/" in (body or b"")
94
+ if rule == "network.host-check" and remote and status in PLATFORM_HOST_REFUSALS and not disclosed:
95
+ return "PASS", "HTTP %d from the platform router: a foreign Host never reaches the service" % status
96
+ return "FAIL", "HTTP %d%s" % (status, ", and the body is the well-known document" if disclosed else "")
97
+
98
+
82
99
  class _PinnedHTTPS(http.client.HTTPSConnection):
83
100
  """HTTPS to the origin's name (SNI, certificate, Host) over a socket dialled elsewhere."""
84
101
 
@@ -243,8 +260,9 @@ class Probe:
243
260
  sent.update(self.auth_headers())
244
261
  if "Origin" in sent:
245
262
  sent["Origin"] = "https://evil.example"
246
- status, _, _ = self.request("GET", "/.well-known/fabric-service", sent)
247
- self.add(rule, "PASS" if status == 403 else "FAIL", "HTTP %d" % status)
263
+ status, _, body = self.request("GET", "/.well-known/fabric-service", sent)
264
+ verdict, evidence = guard_verdict(rule, self.remote, status, body)
265
+ self.add(rule, verdict, evidence)
248
266
  except (OSError, ssl.SSLError) as exc:
249
267
  self.add(rule, "NOT_RUN", str(exc))
250
268
  if self.remote:
@@ -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.6.0"
8
+ version: "0.6.1"
9
9
  contract-version: "0.1.0"
10
10
  contract-commit: "2ce392291c6668598d12cd38327e24696b5ca15c"
11
11
  ---
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "passioncode",
4
4
  "displayName": "PassionCode.ai",
5
- "version": "0.1.20",
5
+ "version": "0.1.21",
6
6
  "description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check at session start that keeps the PassionCode.ai skill set current.",
7
7
  "author": {
8
8
  "name": "PassionCode.ai",