@passioncode-ai/fabric-agent-adapter 0.8.2 → 0.8.3
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 +27 -0
- package/README.md +3 -3
- 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 +13 -6
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +2 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +2 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +13 -8
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +13 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.8.3 - 2026-10-10
|
|
4
|
+
|
|
5
|
+
The contract pin moves to Fabric Agent Contract `main` `52da526` (DEC-0034 and DEC-0035, the operator
|
|
6
|
+
channel), so the operator channel proposal is normative under the pin. Bundles issued under the DEC-0033,
|
|
7
|
+
DEC-0031, DEC-0024, DEC-0021, DEC-0020 and DEC-0019 revisions stay valid.
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **Default contract pin `78b2da0` → `52da526d7cc1e063d74c5b520dbc03d0ace15246`** (FAA-15). `78b2da0`
|
|
12
|
+
(DEC-0033) joins `SUPPORTED_CONTRACT_COMMITS`. The revisions between add the `fabric-operator-channel/0.1`
|
|
13
|
+
profile (DEC-0034, OC-1…OC-13; DEC-0035, OC-14…OC-17 for shared groups), its status schema
|
|
14
|
+
`operator-channel-status.schema.json` and the optional well-known `surfaces.operatorChannel`. Nothing in the
|
|
15
|
+
provider manifest or the MCP, A2A and local-runner profiles changes, and every descriptor and well-known
|
|
16
|
+
document the kits write stays valid; the kits do not serve the channel yet. Checked: `npm test`; both
|
|
17
|
+
compiled-schema arms against clean checkouts at `2ce3922` and `52da526`; descriptors written by the sample
|
|
18
|
+
service (`none` and `launchd`) validate against the new `service-descriptor.schema.json`.
|
|
19
|
+
- **The operator channel proposal is no longer "newer than the pin".** `creating-fabric-agents` step 6 and
|
|
20
|
+
`adapting-projects-to-fabric` step 8 cite DEC-0034 under the pin, show the recorded answer as `proposal` in
|
|
21
|
+
the channel status document when the agent serves `surfaces.operatorChannel`, check that document against
|
|
22
|
+
the pinned `operator-channel-status.schema.json`, and keep the channel's runtime rules `NOT_RUN` (the probe
|
|
23
|
+
has no rule for them). For a channel bound in a group shared with other bots they name OC-14…OC-17: silent
|
|
24
|
+
unless addressed; a bare `/command` in a group is not addressed. Scenario evals `operator-channel-proposal`
|
|
25
|
+
changed first.
|
|
26
|
+
- **`references/protocol.md`** summarises what the pin carries: the Windows services folder, the `systemd`
|
|
27
|
+
and `task-scheduler` managers, Windows paths and token files (DEC-0032, DEC-0033), and
|
|
28
|
+
`surfaces.operatorChannel` (DEC-0034).
|
|
29
|
+
|
|
3
30
|
## 0.8.2 - 2026-10-10
|
|
4
31
|
|
|
5
32
|
The Python service kit runs on Windows and Linux (contract DEC-0032, DEC-0033), and the contract pin moves to the DEC-0033 merge.
|
package/README.md
CHANGED
|
@@ -191,7 +191,7 @@ Scaffolding is non-destructive by default. It writes only the paths declared in
|
|
|
191
191
|
The default pin for new bundles is [`fabric-contract.lock.json`](fabric-contract.lock.json):
|
|
192
192
|
|
|
193
193
|
- version: `0.1.0`
|
|
194
|
-
- commit: `
|
|
194
|
+
- commit: `52da526d7cc1e063d74c5b520dbc03d0ace15246`
|
|
195
195
|
|
|
196
196
|
Every other mention of the default contract revision — this section, the skills' metadata, the
|
|
197
197
|
skill card, `adapt_project.py` — must equal it; `python3 test/validate.py` fails a tree
|
|
@@ -218,8 +218,8 @@ FABRIC_CONTRACT_OLD=/path/to/legacy-contract FABRIC_CONTRACT_NEW=/path/to/curren
|
|
|
218
218
|
```
|
|
219
219
|
|
|
220
220
|
Without both environment variables, those tests explicitly skip as `NOT_RUN`.
|
|
221
|
-
This source checkout is 0.8.
|
|
222
|
-
released); 0.8.
|
|
221
|
+
This source checkout is 0.8.3. 0.8.2 is the latest published GitHub/npm release (2026-10-10; 0.7.0 was never
|
|
222
|
+
released); 0.8.3 is published by its `v0.8.3` tag. Source delivery does not update installed skills or live sessions.
|
|
223
223
|
|
|
224
224
|
## License
|
|
225
225
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@passioncode-ai/fabric-agent-adapter",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.3",
|
|
4
4
|
"description": "Create Fabric-compatible agents, run them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract. This package is the installer CLI.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "python3 test/validate.py && python3 -m unittest discover -s test -q && node --test 'test/*.test.mjs'"
|
|
@@ -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.8.
|
|
6
|
+
"version": "0.8.3",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "PassionCode.ai",
|
|
9
9
|
"url": "https://passioncode.ai/"
|
|
@@ -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.
|
|
6
6
|
metadata:
|
|
7
7
|
author: PassionCode.ai
|
|
8
|
-
version: "0.8.
|
|
8
|
+
version: "0.8.3"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
|
-
contract-commit: "
|
|
10
|
+
contract-commit: "52da526d7cc1e063d74c5b520dbc03d0ace15246"
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Adapting projects to Fabric
|
|
@@ -70,7 +70,7 @@ Use exactly:
|
|
|
70
70
|
|
|
71
71
|
- contract version `0.1.0`;
|
|
72
72
|
- repository `https://github.com/passioncode-ai/fabric-agent-contract`;
|
|
73
|
-
- commit `
|
|
73
|
+
- commit `52da526d7cc1e063d74c5b520dbc03d0ace15246`.
|
|
74
74
|
|
|
75
75
|
This is the default for new bundles. When checking an issued legacy bundle, preserve its
|
|
76
76
|
explicit supported lock and use that exact clean checkout. Never silently upgrade or
|
|
@@ -200,11 +200,18 @@ operator's four steps:
|
|
|
200
200
|
3. run the agent's link command;
|
|
201
201
|
4. type the code it shows in the chat with the bot.
|
|
202
202
|
|
|
203
|
+
In a group shared with other bots the channel follows OC-14…OC-17 (DEC-0035): it stays silent
|
|
204
|
+
unless addressed — `/command@ThisBot`, a reply to its own message or a press of its own button; a
|
|
205
|
+
bare `/command` in a group is not addressed — and a channel nobody receives on is `degraded`
|
|
206
|
+
(`receiver-missing`). Say so in the proposal when the operator means to bind a shared group.
|
|
207
|
+
|
|
203
208
|
Record the answer — `accepted`, `declined` or `later` — in the agent's state and the
|
|
204
|
-
conformance report, and do not ask again
|
|
209
|
+
conformance report, and do not ask again; an agent that serves `surfaces.operatorChannel` also
|
|
210
|
+
shows it as `proposal` in its status document. Creating the bot, storing the token and enabling the
|
|
205
211
|
channel are the operator's action: never create the bot, ask for or store the token's value, or
|
|
206
|
-
enable the channel yourself.
|
|
207
|
-
|
|
212
|
+
enable the channel yourself. The default pin carries DEC-0034 and DEC-0035: a served status document is checked
|
|
213
|
+
against the pinned `schemas/operator-channel-status.schema.json`; the channel's runtime rules have
|
|
214
|
+
no probe rule here yet, so report them `NOT_RUN`. An agent with neither stops nor notify
|
|
208
215
|
events skips this step.
|
|
209
216
|
|
|
210
217
|
## The repository around the provider
|
package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py
CHANGED
|
@@ -16,10 +16,10 @@ from urllib.parse import urlparse
|
|
|
16
16
|
|
|
17
17
|
CONTRACT_VERSION = "0.1.0"
|
|
18
18
|
CONTRACT_REPOSITORY = "https://github.com/passioncode-ai/fabric-agent-contract"
|
|
19
|
-
CONTRACT_COMMIT = "
|
|
19
|
+
CONTRACT_COMMIT = "52da526d7cc1e063d74c5b520dbc03d0ace15246"
|
|
20
20
|
# #region supported-contract-revisions — docs: README.md#contract-pin
|
|
21
21
|
# Only this declaration may name a legacy revision in live files.
|
|
22
|
-
SUPPORTED_CONTRACT_COMMITS = (CONTRACT_COMMIT, "623bf61358c339cb10297807b3f024b5d9f1f327", "23f9fda4c05f8a3852246ee98d4f2adf74ed0875", "9091d3d6606b0c4b5591a38c3674356a01fd7f55", "df55c8c54a23251342a7ee57ba95642b7eb39e61", "2ce392291c6668598d12cd38327e24696b5ca15c")
|
|
22
|
+
SUPPORTED_CONTRACT_COMMITS = (CONTRACT_COMMIT, "78b2da018d2c4bd9ac1bde1dc3b7f1a110a175f5", "623bf61358c339cb10297807b3f024b5d9f1f327", "23f9fda4c05f8a3852246ee98d4f2adf74ed0875", "9091d3d6606b0c4b5591a38c3674356a01fd7f55", "df55c8c54a23251342a7ee57ba95642b7eb39e61", "2ce392291c6668598d12cd38327e24696b5ca15c")
|
|
23
23
|
# #endregion supported-contract-revisions
|
|
24
24
|
INTEROP_KEY = "https://fabric.passioncode.ai/agent-contract/extensions/interop/0.1"
|
|
25
25
|
MCP_REVISION = "2026-07-28"
|
|
@@ -16,10 +16,10 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
16
16
|
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.
|
|
17
17
|
metadata:
|
|
18
18
|
author: PassionCode.ai
|
|
19
|
-
version: "0.8.
|
|
19
|
+
version: "0.8.3"
|
|
20
20
|
contract-version: "0.1.0"
|
|
21
21
|
extension: "fabric-service/0.1"
|
|
22
|
-
extension-commit: "
|
|
22
|
+
extension-commit: "52da526d7cc1e063d74c5b520dbc03d0ace15246"
|
|
23
23
|
---
|
|
24
24
|
|
|
25
25
|
# Building Fabric services
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
# fabric-service/0.1 — wire reference
|
|
2
2
|
|
|
3
|
-
Pinned to `fabric-agent-contract` commit `
|
|
4
|
-
(`docs/specification/service.md`, DEC-0015; the usage report DEC-0021
|
|
3
|
+
Pinned to `fabric-agent-contract` commit `52da526d7cc1e063d74c5b520dbc03d0ace15246`
|
|
4
|
+
(`docs/specification/service.md`, DEC-0015; the usage report DEC-0021; Windows and Linux supervision
|
|
5
|
+
DEC-0032 and DEC-0033; the operator channel DEC-0034 and DEC-0035). The contract's schemas are normative;
|
|
5
6
|
this page is the working summary. Extension key:
|
|
6
7
|
`https://fabric.passioncode.ai/agent-contract/extensions/service/0.1`.
|
|
7
8
|
|
|
8
9
|
## Descriptor — written by the installer
|
|
9
10
|
|
|
10
11
|
Directory: macOS `~/Library/Application Support/ai.passioncode.fabric/services/`,
|
|
11
|
-
Linux `${XDG_DATA_HOME:-~/.local/share}/passioncode-fabric/services/`,
|
|
12
|
-
`FABRIC_SERVICES_DIR`.
|
|
12
|
+
Linux `${XDG_DATA_HOME:-~/.local/share}/passioncode-fabric/services/`, Windows
|
|
13
|
+
`%LOCALAPPDATA%\passioncode-fabric\services\` (DEC-0032), or `FABRIC_SERVICES_DIR`.
|
|
14
|
+
File `<id>.<instance>.json`, mode 0600 (on Windows a protected ACL), atomic.
|
|
13
15
|
|
|
14
16
|
| Field | Rule |
|
|
15
17
|
|---|---|
|
|
@@ -17,10 +19,10 @@ Linux `${XDG_DATA_HOME:-~/.local/share}/passioncode-fabric/services/`, or
|
|
|
17
19
|
| `id`, `instance` | `^[a-z][a-z0-9-]{1,62}$`, `^[a-z][a-z0-9-]{0,31}$` (default `default`); the pair is unique per machine |
|
|
18
20
|
| `name`, `summary` | ≤ 80 and ≤ 200 characters |
|
|
19
21
|
| `origin` | `http://127.0.0.1:<port>`; the port is a machine-wide claim |
|
|
20
|
-
| `auth` | `tokenFile` (0600); `header` default `Authorization` with `scheme` `Bearer`; any other header carries the raw token with `scheme: "none"` |
|
|
21
|
-
| `lifecycle` | `manager` `launchd` (then `label` and `plist`) or `none` |
|
|
22
|
+
| `auth` | `tokenFile` (0600; on Windows a protected ACL — owner and every granting entry the current user, SYSTEM or Administrators: service.md *Windows token files*, DEC-0032, DEC-0033); `header` default `Authorization` with `scheme` `Bearer`; any other header carries the raw token with `scheme: "none"` |
|
|
23
|
+
| `lifecycle` | `manager` `launchd` (then `label` and `plist`), `systemd` (then `unit`, a `systemctl --user` unit), `task-scheduler` (then `task`, a per-user Scheduled Task) or `none`; `unit` and `task` are refused beside any other manager (DEC-0032). The Python kit and the probe accept all four; the Node kit still accepts only `launchd` and `none` (FAA-16) |
|
|
22
24
|
| `paths` | `data` (required), `logs[]`, optional `config`, `cache` |
|
|
23
|
-
| `commands` | only `doctor` and `update`, argument arrays whose first item is an absolute or `~/` path |
|
|
25
|
+
| `commands` | only `doctor` and `update`, argument arrays whose first item is an absolute or `~/` path (Windows: also `C:\…`, `C:/…` or `~\…`, never a network share — DEC-0032) |
|
|
24
26
|
| `source.repository`, `fabricManifest` | optional |
|
|
25
27
|
| `installedAt`, `installedBy` | when and by which installer version |
|
|
26
28
|
|
|
@@ -48,7 +50,10 @@ No auth; the Host/Origin guard applies; answered from memory in under 100 ms.
|
|
|
48
50
|
- `build` needs `commit` or `digest` (`sha256:<64 hex>`).
|
|
49
51
|
- `summary`: at most six tiles; `attention: true` counts toward the host's badge.
|
|
50
52
|
- `surfaces.events` is required; `dashboard` and `mcp` when the service has them; `usage`
|
|
51
|
-
(DEC-0021) when the service reports its spend — see [the usage reference](usage.md)
|
|
53
|
+
(DEC-0021) when the service reports its spend — see [the usage reference](usage.md);
|
|
54
|
+
`operatorChannel.path` (DEC-0034) when the service has an operator channel — its status
|
|
55
|
+
document follows the contract's `operator-channel-status.schema.json` and is token-protected
|
|
56
|
+
like the events feed. The kits do not serve it yet.
|
|
52
57
|
|
|
53
58
|
## Events page — `GET /fabric/v1/events?after=<cursor>&limit=<n>`
|
|
54
59
|
|
|
@@ -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.8.
|
|
8
|
+
version: "0.8.3"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
|
-
contract-commit: "
|
|
10
|
+
contract-commit: "52da526d7cc1e063d74c5b520dbc03d0ace15246"
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Creating Fabric-compatible agents
|
|
@@ -119,7 +119,7 @@ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/adapt_project.py
|
|
|
119
119
|
--schema-base <immutable-base-uri>
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
Pin exactly contract `0.1.0` at commit `
|
|
122
|
+
Pin exactly contract `0.1.0` at commit `52da526d7cc1e063d74c5b520dbc03d0ace15246` and
|
|
123
123
|
read the pinned guide before implementing protocol details. If this skill is installed
|
|
124
124
|
without its sibling, the scaffolder is absent: create the bundle by hand from the pinned
|
|
125
125
|
contract's `docs/guides/connecting-compatible-agents.md` and mark the structural check
|
|
@@ -179,11 +179,18 @@ operator's four steps:
|
|
|
179
179
|
3. run the agent's link command;
|
|
180
180
|
4. type the code it shows in the chat with the bot.
|
|
181
181
|
|
|
182
|
+
In a group shared with other bots the channel follows OC-14…OC-17 (DEC-0035): it stays silent
|
|
183
|
+
unless addressed — `/command@ThisBot`, a reply to its own message or a press of its own button; a
|
|
184
|
+
bare `/command` in a group is not addressed — and a channel nobody receives on is `degraded`
|
|
185
|
+
(`receiver-missing`). Say so in the proposal when the operator means to bind a shared group.
|
|
186
|
+
|
|
182
187
|
Record the answer — `accepted`, `declined` or `later` — in the agent's state and in the
|
|
183
|
-
report, and do not ask again
|
|
188
|
+
report, and do not ask again; an agent that serves `surfaces.operatorChannel` also shows it as
|
|
189
|
+
`proposal` in its status document. Creating the bot, storing the token and enabling the channel are the
|
|
184
190
|
operator's action: never create the bot, ask for or store the token's value, or enable the
|
|
185
|
-
channel yourself.
|
|
186
|
-
|
|
191
|
+
channel yourself. The default pin carries DEC-0034 and DEC-0035: a served status document is checked against
|
|
192
|
+
the pinned `schemas/operator-channel-status.schema.json`; the channel's runtime rules have no
|
|
193
|
+
probe rule here yet, so report them `NOT_RUN`. An agent with neither stops nor notify
|
|
187
194
|
events skips this step.
|
|
188
195
|
|
|
189
196
|
## Completion format
|