@passioncode-ai/fabric-agent-adapter 0.38.0 → 0.39.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 +77 -0
- package/README.md +20 -16
- package/bin/fabric-agent-adapter.js +6 -6
- 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 +15 -15
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/dashboard-links.md +1 -1
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/provider-entry.md +4 -4
- 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 +44 -43
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/demo.html +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-button.js +3 -3
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-dashboard.css +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-dashboard.js +2 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/kit.json +9 -4
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/board.md +12 -12
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-kit.md +4 -4
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-links.md +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard.md +4 -4
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/delegation.md +19 -9
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/estate-record.md +19 -9
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/events-and-notifications.md +6 -6
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +8 -6
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md +26 -26
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/migrating-a-service.md +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/package.md +10 -4
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/profiles.md +10 -10
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +14 -14
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/remote-placement.md +4 -4
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/settings-backups.md +3 -3
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/surfaces-and-auth.md +5 -5
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/usage.md +8 -3
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service.py +20 -43
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/dashboard_kit.py +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board.mjs +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-delegation.mjs +9 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-estate.mjs +33 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-package.mjs +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-service.mjs +40 -13
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board.py +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_delegation.py +15 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_estate.py +32 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_package.py +1 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_service.py +52 -18
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/sample_service.py +1 -1
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +35 -35
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/dashboard-links.md +1 -1
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/resilience-and-autonomy.md +27 -27
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/where-agents-run.md +2 -1
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +31 -31
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/references/project-board.md +9 -9
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/references/session-hooks.md +8 -8
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session.py +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,82 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.39.1 - 2026-10-21
|
|
4
|
+
|
|
5
|
+
Fixes from two rounds of blind review of 0.39.0 (FAA-64).
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- **The probe no longer crashes on a usage report it is checking.** `check_service.py` compared `unpricedCalls` and
|
|
10
|
+
`unmeasuredCalls` raw, so `null` or a string raised `TypeError`, and a 400-digit cost raised `OverflowError`; either
|
|
11
|
+
stopped the whole probe before its other rules ran. Its FAC-SEM-025 arithmetic is now the kit's `usage_findings`, one
|
|
12
|
+
implementation held to the contract's vectors.
|
|
13
|
+
- **The Python and Node kits answer FAC-SEM-025 as the contract does, message for message.** Both read each count as
|
|
14
|
+
the contract's `toNumber(x ?? 0)`, each date and project id with `show`, a cost as JavaScript holds the number (an
|
|
15
|
+
integer beyond a double is Infinity, which is never close to a sum), and a whole number written `5.0` as a count.
|
|
16
|
+
Python compared raw values and read `5.0` as 0; Node threw on an object such as `{"toString": 1}` in a count, a date
|
|
17
|
+
or a project id. The vectors now carry each finding's message and both kits compare it: 183 new report cases (208)
|
|
18
|
+
set every count and the cost of a day and of its first model to eleven values the schema refuses, plus three days
|
|
19
|
+
with no model rows and four dates and ids that are objects or numbers; eight new cases are the report's JSON text,
|
|
20
|
+
which each kit parses itself (a 400-digit integer, `1e400`, `2^53 + 1`, `5.0`). The field list is the contract's at this pin,
|
|
21
|
+
written in the generator.
|
|
22
|
+
- **Messages a person reads carry no em dash**: the probe, the dashboard-kit notice, the board's retry hint and the
|
|
23
|
+
package refusal (Python and Node alike), the installer and the `npx` CLI, the sample service's page, the session
|
|
24
|
+
hooks' unread and status lines (`2 unread on the project board: com.list`) and the dashboard kit's Fabric button
|
|
25
|
+
(`Fabric is not installed. Get it at passioncode.ai/fabric`; kit **1.1.1**, so a service's kit copy is offered the
|
|
26
|
+
upgrade). The live documentation, evals and the kit's demo page were rewritten the same way.
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- Tests for the producer side of DEC-0091 in both kits: receipts with `tokens_measured=False` through
|
|
31
|
+
`usage_report`, the day and model `unmeasuredCalls`, none on `byProject`, the probe clean, and the refusal of a
|
|
32
|
+
non-boolean flag.
|
|
33
|
+
- Evals: the spend scenario expects unknown tokens in `unmeasuredCalls`; a new scenario covers a partner's package
|
|
34
|
+
and calls (DEC-0090).
|
|
35
|
+
- `interop.md` and `usage.md` say a job whose usage is sent as `null` or `partial` is recorded with
|
|
36
|
+
`tokens_measured=False`; `estate-record.md` says a service updates its copied kit before a revision carries
|
|
37
|
+
`publisherScopes` (an older copy trusts a partner's key in every context); FAC-SEM-122 in its header and DEC-0091 in
|
|
38
|
+
protocol.md's FAC-SEM-025 row.
|
|
39
|
+
- `test/validate.py` fails on U+2014 in the live documentation, the evals, the installer, the CLI and the kit's demo,
|
|
40
|
+
and when README states which version a checkout is or which release is the latest (it said 0.21.0 until now); both
|
|
41
|
+
checks have tests. The compiled-revision tests name the two contract revisions they need when they skip.
|
|
42
|
+
|
|
43
|
+
### Raised with the contract (not changed here)
|
|
44
|
+
|
|
45
|
+
- `chainOf` names a `{sub, partner}` node by its `org:` id, and job ownership and idempotency keys do not include the
|
|
46
|
+
partner. The kits follow `c55f2d5` until the contract decides (board thread `6e66a023`, FAA-64).
|
|
47
|
+
|
|
48
|
+
## 0.39.0 - 2026-10-20
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- **Pinned to contract `c55f2d5`** (FAA-61; DEC-0089 to DEC-0095). `0704218` (0.36.0 to 0.38.0) joins the supported
|
|
53
|
+
revisions. Every new vector is answered by the contract's own functions at the pin.
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
|
|
57
|
+
- **Unmeasured tokens are named** (DEC-0091, contract CT-62). `make_usage_receipt(..., tokens_measured=False)` /
|
|
58
|
+
`makeUsageReceipt(..., { tokensMeasured: false })` writes `tokensMeasured: false`; the report counts such calls in
|
|
59
|
+
`unmeasuredCalls` on the day and the model row, and FAC-SEM-025 in both kits and `check_service.py` refuses a row
|
|
60
|
+
with more unmeasured calls than calls or a day whose count is not its models' sum. Four new usage vectors (25; this
|
|
61
|
+
line said three until 0.39.1).
|
|
62
|
+
- **A partner in the delegation chain** (DEC-0090, contract CT-58). Both verifiers take `{partner: "org:<id>"}` as the
|
|
63
|
+
innermost actor under at least one agent: it counts toward the depth limit and ends the chain, and the checked chain
|
|
64
|
+
lists it by its `org:` id. Outermost, with an `act` beneath, `personal` or an `ORG:` prefix is `malformed-chain`.
|
|
65
|
+
`is_partner_actor` / `isPartnerActor` are exported. Eight new delegation vectors (90) and thirteen `chainDepths`
|
|
66
|
+
vectors held by both kits.
|
|
67
|
+
- **A partner's publisher key, per organization context** (DEC-0090, FAC-SEM-122). The estate kits read
|
|
68
|
+
`publisherScopes[]`: `placement_trust` / `placementTrust` answer no key for a placement outside its key's scope, and
|
|
69
|
+
`estate-record` and `estate-placement` flag a key scoped twice, a scope over a key `publisherKeys` does not pin, and a
|
|
70
|
+
placement in a context its key's scope does not name. Seven new rule cases (137) and 45 placementTrust cases (64).
|
|
71
|
+
- **Protocol register at the pin**: `coding-agents/1` and `support-quality-daily/1` (DEC-0093, DEC-0095).
|
|
72
|
+
|
|
73
|
+
### Not here
|
|
74
|
+
|
|
75
|
+
- Minting a partner's token and its grant (FAC-SEM-124) are the issuer's; the kits verify, never mint.
|
|
76
|
+
- `partnerUsage` and FAC-SEM-123 (a partner's access-log reads) are the organization server's.
|
|
77
|
+
- DEC-0089 (folder attribution, FAC-SEM-121) and DEC-0092 (`fabric.project.resolve`) are Fabric's; DEC-0094 (a device
|
|
78
|
+
key in a file, FAC-SEM-125) is the device's and its server's. No kit reads them.
|
|
79
|
+
|
|
3
80
|
## 0.38.0 - 2026-10-20
|
|
4
81
|
|
|
5
82
|
### Changed
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
**Fabric Agent Adapter** makes any agent Fabric-compatible. Fabric is PassionCode.ai's
|
|
10
10
|
product, the CEO AI agent: you talk to Fabric, and it chooses, binds and runs the agents that
|
|
11
|
-
do the work. This adapter is how an agent becomes one Fabric can bind
|
|
11
|
+
do the work. This adapter is how an agent becomes one Fabric can bind: four Agent Skills,
|
|
12
12
|
Python and Node reference kits and a live conformance probe for the
|
|
13
13
|
[Fabric Agent Contract](https://github.com/passioncode-ai/fabric-agent-contract). It also works
|
|
14
14
|
on its own: the skills, kits and probe need no Fabric install.
|
|
@@ -51,8 +51,8 @@ is the board-first workflow.
|
|
|
51
51
|
|
|
52
52
|
`building-fabric-services` makes an agent a long-lived local service with a dashboard
|
|
53
53
|
that is always alive, runs as one copy, keeps its state through a reinstall and appears
|
|
54
|
-
in Fabric Dashboards by itself
|
|
55
|
-
or dashboard
|
|
54
|
+
in Fabric Dashboards by itself: the `fabric-service/0.1` extension. It also makes an **online** agent
|
|
55
|
+
or dashboard (an `https` origin on a platform) a Fabric service (the remote placement, DEC-0019): the same
|
|
56
56
|
four routes behind the token, a `__Host-` session cookie, and one descriptor on the operator's computer;
|
|
57
57
|
`scripts/sample-remote-service.mjs` is the complete example. It ships Python and
|
|
58
58
|
Node reference kits (`scripts/fabric_service.py`, `scripts/fabric-service.mjs`), a
|
|
@@ -68,8 +68,8 @@ python3 plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/che
|
|
|
68
68
|
|
|
69
69
|
The dashboard itself is built from the **dashboard kit** (`assets/dashboard-kit/`, `fabric-dashboard/0.1`,
|
|
70
70
|
contract DEC-0036): one stylesheet and one script that keep the page usable from 360 CSS px inside a host
|
|
71
|
-
pane beside the agent console
|
|
72
|
-
box, sticky chrome at most 120 px
|
|
71
|
+
pane beside the agent console (navigation that folds into a More menu, wide tables in their own scroll
|
|
72
|
+
box, sticky chrome at most 120 px) with seven WCAG AA themes (light and dark) that follow the host's
|
|
73
73
|
`fabric_appearance` cookie. `scripts/dashboard_kit.py install|status` copies and checks it,
|
|
74
74
|
`scripts/check_dashboard_layout.mjs` measures a rendered page in WebKit at 360, 480, 768 and 1280 px
|
|
75
75
|
(Playwright; `NOT_RUN` without it), and the probe's `dashboard.declared` checks the declaration. The
|
|
@@ -95,7 +95,9 @@ checks the interop rules. A job a provider limit paused or stopped, and an effec
|
|
|
95
95
|
(`quota-exhausted`, `outcome-unknown`) and keys per caller (contract DEC-0087). The estate kits check share grants into
|
|
96
96
|
an organization (`scripts/fabric_share.py`, DEC-0086) and the estate ceremonies: a revision's record rules, a headless
|
|
97
97
|
machine's enroll token, the nearby pairing by a comparison code and the hub's single use of a token
|
|
98
|
-
(`scripts/fabric_ceremonies.py`, DEC-0084); each has a Node twin.
|
|
98
|
+
(`scripts/fabric_ceremonies.py`, DEC-0084); each has a Node twin. A partner's publisher key is trusted only in the
|
|
99
|
+
organization contexts its scope names, and a partner may sit innermost in a delegation chain (DEC-0090); a usage report
|
|
100
|
+
counts calls whose tokens are unknown in `unmeasuredCalls` (DEC-0091). An agent that is not a service is announced with a provider
|
|
99
101
|
entry: `adapting-projects-to-fabric/scripts/fabric_provider.py`.
|
|
100
102
|
|
|
101
103
|
For provider bundles the adapting skill helps an agent author:
|
|
@@ -115,7 +117,7 @@ yet ship the host registry/runtime needed to connect and authorize a live provid
|
|
|
115
117
|
### Install
|
|
116
118
|
|
|
117
119
|
With the [PassionCode.ai launcher](https://github.com/passioncode-ai/passioncode) the adapter
|
|
118
|
-
comes with every other PassionCode.ai skill
|
|
120
|
+
comes with every other PassionCode.ai skill: `npx @passioncode-ai/passioncode@latest update`,
|
|
119
121
|
then restart your agents. Alone, without any account:
|
|
120
122
|
|
|
121
123
|
```bash
|
|
@@ -173,8 +175,8 @@ kill %1
|
|
|
173
175
|
|
|
174
176
|
Verified 2026-10-01 from the published npm package 0.5.4 (`npx` into a throwaway hub, `KIT`
|
|
175
177
|
pointing at the installed skill) with Claude Code 2.1.286: the probe reported 27 rules, 0 FAIL;
|
|
176
|
-
the CLI connected to the sample over streamable HTTP, called `sample.echo` and printed `ping`. The probe prints one line per rule
|
|
177
|
-
`PASS`, `FAIL` or `NOT_RUN` with its evidence
|
|
178
|
+
the CLI connected to the sample over streamable HTTP, called `sample.echo` and printed `ping`. The probe prints one line per rule
|
|
179
|
+
(`PASS`, `FAIL` or `NOT_RUN` with its evidence) and exits 1 on any `FAIL`; run it against your
|
|
178
180
|
own service by its id once its installer has written the descriptor.
|
|
179
181
|
`FABRIC_REAL_CLIENT=1 python3 -m unittest discover -s test -p test_real_client.py` repeats the connection check
|
|
180
182
|
(every sample tool listed, no model call) in the test suite.
|
|
@@ -260,10 +262,10 @@ Scaffolding is non-destructive by default. It writes only the paths declared in
|
|
|
260
262
|
The default pin for new bundles is [`fabric-contract.lock.json`](fabric-contract.lock.json):
|
|
261
263
|
|
|
262
264
|
- version: `0.1.0`
|
|
263
|
-
- commit: `
|
|
265
|
+
- commit: `c55f2d5a11c9a0197e958e87212fca7ae1154769`
|
|
264
266
|
|
|
265
|
-
Every other mention of the default contract revision
|
|
266
|
-
skill card, `adapt_project.py`
|
|
267
|
+
Every other mention of the default contract revision (this section, the skills' metadata, the
|
|
268
|
+
skill card, `adapt_project.py`) must equal it; `python3 test/validate.py` fails a tree
|
|
267
269
|
where one does not. The sole live legacy exception is the immutable
|
|
268
270
|
`SUPPORTED_CONTRACT_COMMITS` declaration in the scaffolder: previously issued bundles
|
|
269
271
|
keep their selected legacy lock and require that exact clean contract checkout. The
|
|
@@ -286,14 +288,16 @@ FABRIC_CONTRACT_OLD=/path/to/legacy-contract FABRIC_CONTRACT_NEW=/path/to/curren
|
|
|
286
288
|
python3 -m unittest discover -s test -p test_contract_revisions.py -v
|
|
287
289
|
```
|
|
288
290
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
291
|
+
`FABRIC_CONTRACT_OLD` is a checkout of the legacy fixtures' revision (`OLD` in `test/test_contract_revisions.py`) and
|
|
292
|
+
`FABRIC_CONTRACT_NEW` one of the pin; each needs `pnpm install --frozen-lockfile` in its own folder (pnpm refuses a
|
|
293
|
+
symlinked `node_modules`). Without both environment variables, those tests explicitly skip as `NOT_RUN`, naming the
|
|
294
|
+
two revisions. What each version changed and when it was released is in [CHANGELOG.md](CHANGELOG.md). Source delivery
|
|
295
|
+
does not update installed skills or live sessions.
|
|
292
296
|
|
|
293
297
|
## License
|
|
294
298
|
|
|
295
299
|
Open source under the [GNU AGPL-3.0](LICENSE). A [commercial license](COMMERCIAL-LICENSE.md) is
|
|
296
|
-
available for use that does not meet the AGPL's terms
|
|
300
|
+
available for use that does not meet the AGPL's terms: [passioncode.ai/business](https://passioncode.ai/business/).
|
|
297
301
|
Versions before 0.5.3 were released under PolyForm Noncommercial or Internal Use (v0.4.3 to
|
|
298
302
|
v0.5.2) and MIT (v0.4.2 and earlier); each keeps the licence it was released under.
|
|
299
303
|
Contributions are accepted under [CLA.md](CLA.md) ([CONTRIBUTING.md](CONTRIBUTING.md)).
|
|
@@ -26,7 +26,7 @@ Usage:
|
|
|
26
26
|
npx @passioncode-ai/fabric-agent-adapter [--force]
|
|
27
27
|
install every skill into the agents hub ~/.agents/skills
|
|
28
28
|
npx @passioncode-ai/fabric-agent-adapter --target claude [--force]
|
|
29
|
-
plain copy into ~/.claude/skills
|
|
29
|
+
plain copy into ~/.claude/skills (refused while the plugin is installed)
|
|
30
30
|
npx @passioncode-ai/fabric-agent-adapter --prune-shadow
|
|
31
31
|
remove plain ~/.claude/skills copies that shadow the installed plugin
|
|
32
32
|
npx @passioncode-ai/fabric-agent-adapter --help
|
|
@@ -124,7 +124,7 @@ function main(argv) {
|
|
|
124
124
|
|
|
125
125
|
const { skillRoot, names } = skillNames();
|
|
126
126
|
if (!names.length) {
|
|
127
|
-
console.error(`error: no skills found under ${skillRoot}
|
|
127
|
+
console.error(`error: no skills found under ${skillRoot}; corrupted package?`);
|
|
128
128
|
return 1;
|
|
129
129
|
}
|
|
130
130
|
const home = os.homedir();
|
|
@@ -132,7 +132,7 @@ function main(argv) {
|
|
|
132
132
|
|
|
133
133
|
if (prune) {
|
|
134
134
|
if (!hasPlugin) {
|
|
135
|
-
console.error(`error: the ${PLUGIN_ID} plugin is not installed, so a copy in ~/.claude/skills is not a shadow
|
|
135
|
+
console.error(`error: the ${PLUGIN_ID} plugin is not installed, so a copy in ~/.claude/skills is not a shadow; nothing removed.`);
|
|
136
136
|
return 1;
|
|
137
137
|
}
|
|
138
138
|
pruneShadows(home, names);
|
|
@@ -151,8 +151,8 @@ function main(argv) {
|
|
|
151
151
|
// One owner per artefact on disk: a plain copy over someone else's link freezes the skill
|
|
152
152
|
// at this version, and its owner stops updating it. --force does not override this.
|
|
153
153
|
console.log(owner === 'launcher'
|
|
154
|
-
? `skip: ${name} at ${dest} is managed by the PassionCode launcher
|
|
155
|
-
: `skip: ${name} at ${dest} is a link managed elsewhere
|
|
154
|
+
? `skip: ${name} at ${dest} is managed by the PassionCode launcher; update it with: npx @passioncode-ai/passioncode@latest update`
|
|
155
|
+
: `skip: ${name} at ${dest} is a link managed elsewhere; remove the link first to install a copy here`);
|
|
156
156
|
continue;
|
|
157
157
|
}
|
|
158
158
|
if (fs.existsSync(dest) && !force) {
|
|
@@ -166,7 +166,7 @@ function main(argv) {
|
|
|
166
166
|
if (target === 'agents' && !hasPlugin) {
|
|
167
167
|
console.log(`Claude Code reads plugins, not the hub:\n claude plugin marketplace add ${REPO} && claude plugin install ${PLUGIN_ID}`);
|
|
168
168
|
}
|
|
169
|
-
console.log('Restart your agent
|
|
169
|
+
console.log('Restart your agent: skills load at session start.');
|
|
170
170
|
return 0;
|
|
171
171
|
}
|
|
172
172
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@passioncode-ai/fabric-agent-adapter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.39.1",
|
|
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; and teach a coding agent to work in a project through Fabric (fabric-mcp, fabric_whoami, claim and release), with Claude Code session hooks.",
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.39.1",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "PassionCode.ai",
|
|
9
9
|
"url": "https://passioncode.ai/"
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: adapting-projects-to-fabric
|
|
3
|
-
description: Use when adapting an existing agent, MCP server, A2A peer, HTTP service, or terminal CLI to the Fabric Agent Contract
|
|
3
|
+
description: Use when adapting an existing agent, MCP server, A2A peer, HTTP service, or terminal CLI to the Fabric Agent Contract (choosing MCP/A2A/local-runner, scaffolding a provider bundle, or checking Fabric compatibility); also for «подключить проект к Fabric» or «сделать агента совместимым с Fabric». NOT for building the Fabric host/orchestrator, configuring an MCP client, or a brand-new agent (that is creating-fabric-agents).
|
|
4
4
|
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
|
+
version: "0.39.1"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
|
-
contract-commit: "
|
|
10
|
+
contract-commit: "c55f2d5a11c9a0197e958e87212fca7ae1154769"
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Adapting projects to Fabric
|
|
@@ -23,9 +23,9 @@ Use this skill to adapt or assess a provider project. Do not use it to:
|
|
|
23
23
|
- design the Fabric host, registry, scheduler, admission service, or project binding runtime;
|
|
24
24
|
- add an MCP server to Claude Code, Codex, or an agent gateway;
|
|
25
25
|
- answer wire-level MCP or A2A questions (transports, sessions, auth handshakes, task
|
|
26
|
-
states on the wire)
|
|
26
|
+
states on the wire): that is `agent-interop` (agent-stack); the pinned contract stays
|
|
27
27
|
normative for what Fabric requires;
|
|
28
|
-
- design a new agent from scratch
|
|
28
|
+
- design a new agent from scratch: that is the sibling skill creating-fabric-agents;
|
|
29
29
|
- claim admission merely because generated files or a valid manifest exist.
|
|
30
30
|
|
|
31
31
|
If the project has only a browser interface and no stable API, MCP/A2A surface, or CLI,
|
|
@@ -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 `c55f2d5a11c9a0197e958e87212fca7ae1154769`.
|
|
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
|
|
@@ -133,14 +133,14 @@ Preserve the chosen ownership boundary:
|
|
|
133
133
|
heartbeat, and partial results without relying on ambient accounts.
|
|
134
134
|
|
|
135
135
|
Keep model selection and provider-internal reasoning outside the Fabric contract. Expose
|
|
136
|
-
typed outcomes, evidence, artifacts, and protocol-visible state
|
|
136
|
+
typed outcomes, evidence, artifacts, and protocol-visible state, not chain-of-thought.
|
|
137
137
|
Treat all provider output as untrusted until schemas and semantic assertions pass.
|
|
138
138
|
|
|
139
139
|
### 4b. Announce an agent that is not a service
|
|
140
140
|
|
|
141
141
|
An agent Fabric reaches as a CLI or a stdio MCP server gets a provider entry, written by
|
|
142
142
|
its installer with [`scripts/fabric_provider.py`](scripts/fabric_provider.py) and removed
|
|
143
|
-
by its uninstaller
|
|
143
|
+
by its uninstaller: argv arrays only, env values as `secret-ref:` references, never the
|
|
144
144
|
id of an existing service, and a `providerId` equal to the manifest's `provider.id`. Load [provider entries](references/provider-entry.md). An
|
|
145
145
|
agent that runs as a service uses a descriptor instead (`building-fabric-services`).
|
|
146
146
|
|
|
@@ -174,8 +174,8 @@ python3 <skill-dir>/scripts/adapt_project.py check <project-root> \
|
|
|
174
174
|
```
|
|
175
175
|
|
|
176
176
|
The local check also refuses two lifecycle faults (LC-19, LC-21): a Claude Code plugin in
|
|
177
|
-
the project that declares a stdio MCP server
|
|
178
|
-
plugin; serve it over HTTP from one resident process or register it at project scope
|
|
177
|
+
the project that declares a stdio MCP server (it starts in every session that enables the
|
|
178
|
+
plugin; serve it over HTTP from one resident process or register it at project scope), and a
|
|
179
179
|
credential in a launch argument or a URL query, where every process and every log can read it.
|
|
180
180
|
Fix both at their cause; never weaken the check.
|
|
181
181
|
|
|
@@ -214,11 +214,11 @@ operator's four steps:
|
|
|
214
214
|
4. type the code it shows in the chat with the bot.
|
|
215
215
|
|
|
216
216
|
In a group shared with other bots the channel follows OC-14…OC-17 (DEC-0035): it stays silent
|
|
217
|
-
unless addressed
|
|
218
|
-
bare `/command` in a group is not addressed
|
|
217
|
+
unless addressed (`/command@ThisBot`, a reply to its own message or a press of its own button; a
|
|
218
|
+
bare `/command` in a group is not addressed), and a channel nobody receives on is `degraded`
|
|
219
219
|
(`receiver-missing`). Say so in the proposal when the operator means to bind a shared group.
|
|
220
220
|
|
|
221
|
-
Record the answer
|
|
221
|
+
Record the answer (`accepted`, `declined` or `later`) in the agent's state and the
|
|
222
222
|
conformance report, and do not ask again; an agent that serves `surfaces.operatorChannel` also
|
|
223
223
|
shows it as `proposal` in its status document. Creating the bot, storing the token and enabling the
|
|
224
224
|
channel are the operator's action: never create the bot, ask for or store the token's value, or
|
|
@@ -246,7 +246,7 @@ first commit:
|
|
|
246
246
|
org-index `scripts/check_format.py` reports 0 findings for it before it is called done. **An agent
|
|
247
247
|
someone builds for themselves is not a PassionCode.ai repository:** its licence is its owner's
|
|
248
248
|
choice, nothing about it is published or listed by the organization, and none of these files is
|
|
249
|
-
required of it
|
|
249
|
+
required of it, though the verified MCP quick start is still how anyone learns to drive it.
|
|
250
250
|
|
|
251
251
|
## Completion format
|
|
252
252
|
|
|
@@ -263,7 +263,7 @@ Report:
|
|
|
263
263
|
Never summarize the outcome as “Fabric-compatible” unless all required admission gates
|
|
264
264
|
passed against a real provider and the project binding is valid.
|
|
265
265
|
|
|
266
|
-
## Dashboard handoff
|
|
266
|
+
## Dashboard handoff: also for consumers
|
|
267
267
|
|
|
268
268
|
When handing a registered service dashboard to a person, or writing the generated
|
|
269
269
|
agent's completion/notification instructions, read and apply
|
package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/provider-entry.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Normative source: the Fabric Agent Contract's `docs/specification/provider.md`
|
|
4
4
|
(`fabric-provider/0.1`, DEC-0016, rulings DEC-0017) at the commit this plugin pins.
|
|
5
5
|
|
|
6
|
-
An agent Fabric reaches as a CLI or a stdio MCP server
|
|
6
|
+
An agent Fabric reaches as a CLI or a stdio MCP server (not a long-running service)
|
|
7
7
|
is announced by one entry, `providers/<id>.json`, in the same root as the services
|
|
8
8
|
directory:
|
|
9
9
|
|
|
@@ -34,17 +34,17 @@ python3 scripts/fabric_provider.py remove example-agent # the uninstaller
|
|
|
34
34
|
|
|
35
35
|
`--stdio` takes the rest of the line as the argument array; there is no shell string. An entry may carry
|
|
36
36
|
`run.mcp.stdio.scope` (DEC-0044): `project` (started for the sessions of a project that binds it) or `on-demand`;
|
|
37
|
-
`session`
|
|
37
|
+
`session` (a server in every coding session) is refused (FAC-SEM-056, LC-19). The validator accepts the field; the
|
|
38
38
|
writer does not set it until Fabric reads it. An argument that carries a credential is refused
|
|
39
39
|
(LC-21, FAC-SEM-057): a key goes in `env` as a `secret-ref:<name>`, never in argv.
|
|
40
40
|
|
|
41
41
|
It refuses, with one sentence that never quotes a value:
|
|
42
42
|
|
|
43
43
|
- a manifest that does not resolve, or whose `provider.id` is not the entry's
|
|
44
|
-
`providerId
|
|
44
|
+
`providerId`: the two URIs are compared as URIs (FAC-SEM-014);
|
|
45
45
|
- an id that is already a service in `services/` (FAC-SEM-013);
|
|
46
46
|
- an env value that is not `secret-ref:<name>`, or a reference that has the shape of a
|
|
47
|
-
credential itself
|
|
47
|
+
credential itself: a token prefix, a private key, a JWT (FAC-SEM-015: a value is
|
|
48
48
|
checked by its form; name patterns apply to names);
|
|
49
49
|
- a URL other than `http://127.0.0.1:<port>/mcp`, a manifest path that is not an
|
|
50
50
|
absolute or `~/` path to `fabric-agent.json`, a shell-string command, unknown fields.
|
package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py
CHANGED
|
@@ -21,10 +21,10 @@ import fabric_secrets as _secrets # noqa: E402 - the contract's credential dete
|
|
|
21
21
|
|
|
22
22
|
CONTRACT_VERSION = "0.1.0"
|
|
23
23
|
CONTRACT_REPOSITORY = "https://github.com/passioncode-ai/fabric-agent-contract"
|
|
24
|
-
CONTRACT_COMMIT = "
|
|
24
|
+
CONTRACT_COMMIT = "c55f2d5a11c9a0197e958e87212fca7ae1154769"
|
|
25
25
|
# #region supported-contract-revisions — docs: README.md#contract-pin
|
|
26
26
|
# Only this declaration may name a legacy revision in live files.
|
|
27
|
-
SUPPORTED_CONTRACT_COMMITS = (CONTRACT_COMMIT, "d8146cfb0a1c74fc6432284c4356bb0c864b37b5", "82e163665e156a08aa3b92e4711015582c06162c", "1636fa97262f4a26e2086572d540c2ee701e0010", "f00a7685e3861c27f7899c033fb850a145a1708f", "a046f57cf46ea9e3da57ff8ce6a3ed4d26d8774b", "fe55fc67cba1a9e34a736da7d148d4fe2a8fbfa0", "b291bf09e0a9f9fd3c16cf540832cd021203b7d1", "0cacd08b0e95b6abf131eae1206b60792138bc3c", "2eb91c00e852d9c31d804310d38fad91589fcbac", "8e49fbd5fbbf230e32c1969cd24ac3c22422f0a5", "a83bec6b47776af688402c18efec507143061f68", "52da526d7cc1e063d74c5b520dbc03d0ace15246", "78b2da018d2c4bd9ac1bde1dc3b7f1a110a175f5", "623bf61358c339cb10297807b3f024b5d9f1f327", "23f9fda4c05f8a3852246ee98d4f2adf74ed0875", "9091d3d6606b0c4b5591a38c3674356a01fd7f55", "df55c8c54a23251342a7ee57ba95642b7eb39e61", "2ce392291c6668598d12cd38327e24696b5ca15c")
|
|
27
|
+
SUPPORTED_CONTRACT_COMMITS = (CONTRACT_COMMIT, "07042181bfae2a481aa0da1a5651f24c76669c48", "d8146cfb0a1c74fc6432284c4356bb0c864b37b5", "82e163665e156a08aa3b92e4711015582c06162c", "1636fa97262f4a26e2086572d540c2ee701e0010", "f00a7685e3861c27f7899c033fb850a145a1708f", "a046f57cf46ea9e3da57ff8ce6a3ed4d26d8774b", "fe55fc67cba1a9e34a736da7d148d4fe2a8fbfa0", "b291bf09e0a9f9fd3c16cf540832cd021203b7d1", "0cacd08b0e95b6abf131eae1206b60792138bc3c", "2eb91c00e852d9c31d804310d38fad91589fcbac", "8e49fbd5fbbf230e32c1969cd24ac3c22422f0a5", "a83bec6b47776af688402c18efec507143061f68", "52da526d7cc1e063d74c5b520dbc03d0ace15246", "78b2da018d2c4bd9ac1bde1dc3b7f1a110a175f5", "623bf61358c339cb10297807b3f024b5d9f1f327", "23f9fda4c05f8a3852246ee98d4f2adf74ed0875", "9091d3d6606b0c4b5591a38c3674356a01fd7f55", "df55c8c54a23251342a7ee57ba95642b7eb39e61", "2ce392291c6668598d12cd38327e24696b5ca15c")
|
|
28
28
|
# #endregion supported-contract-revisions
|
|
29
29
|
INTEROP_KEY = "https://fabric.passioncode.ai/agent-contract/extensions/interop/0.1"
|
|
30
30
|
MCP_REVISION = "2026-07-28"
|