@passioncode-ai/passioncode 0.2.19 → 0.2.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 +21 -0
- package/family.json +1 -1
- package/package.json +1 -1
- package/payload/.claude-plugin/marketplace.json +2 -2
- package/payload/manifest.json +8 -8
- package/payload/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +42 -66
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/dashboard-links.md +4 -2
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/operator-channel-and-repository.md +55 -0
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/provider-entry.md +9 -3
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/verification.md +15 -0
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +181 -26
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/check_dashboard_link.py +66 -5
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/fabric_provider.py +81 -23
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/fabric_secrets.py +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +28 -30
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-button.js +21 -9
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-dashboard.css +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-dashboard.js +2 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/kit.json +9 -4
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/README.md +47 -7
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/support_agent.py +230 -29
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/board.md +21 -5
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-kit.md +2 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-links.md +4 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/delegation.md +3 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/estate-record.md +2 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +5 -0
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/kit-modules.md +3 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md +3 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/package.md +5 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_dashboard_layout.mjs +68 -24
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_dashboard_link.py +66 -5
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service.py +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service_rules.py +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/dashboard_kit.py +53 -19
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-auth.mjs +4 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board-link.mjs +145 -0
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board-session.mjs +196 -188
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board-shapes.mjs +5 -5
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board.mjs +2 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-ceremonies.mjs +6 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-delegation.mjs +2 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-descriptor.mjs +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-estate.mjs +3 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop.mjs +48 -14
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-lock.mjs +34 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-package.mjs +157 -22
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-supervisors.mjs +7 -3
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_auth.py +12 -6
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_backups.py +6 -6
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_base.py +17 -4
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board.py +3 -3
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board_link.py +162 -0
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board_session.py +207 -227
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board_shapes.py +4 -4
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_ceremonies.py +0 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_crypto.py +52 -5
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_delegation.py +101 -45
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_descriptor.py +12 -12
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_estate.py +5 -5
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_events.py +13 -10
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_http.py +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_hub.py +6 -2
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop.py +118 -71
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_package.py +272 -74
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_profiles.py +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_secrets.py +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_supervisors.py +36 -11
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_usage.py +3 -3
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +270 -35
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/sample_service.py +25 -7
- package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +29 -60
- package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/dashboard-links.md +4 -2
- package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/operator-channel-and-repository.md +55 -0
- package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/scripts/check_dashboard_link.py +66 -5
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +3 -3
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/references/native-host-hooks.md +2 -1
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/references/session-hooks.md +36 -16
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session.py +11 -0
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_cli.py +44 -22
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +54 -6
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_hosts.py +72 -13
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_mail.py +28 -7
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_mcp.py +277 -49
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/host_hooks.py +10 -1
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/hosts/context.mjs +25 -2
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/hosts/openclaw/index.mjs +4 -2
- package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/hosts/opencode/fabric.mjs +2 -1
- package/payload/plugins/passioncode/.claude-plugin/plugin.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.21 - 2026-10-22
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- **Fabric Agent Adapter is pinned at `v0.42.1`** (it was `v0.41.0`): the session hooks follow Fabric 0.3.9 (a
|
|
8
|
+
`/clear` keeps the Fabric session, an end from before a `--resume` is not delivered, the release says when the end
|
|
9
|
+
was observed, a rejoin Fabric answers with "no session" is not retried every turn); the kit's layout check and its
|
|
10
|
+
`pack`/`sign`/`verify` run when started through the launcher's symlinked folder. `v0.42.0` was tagged and never
|
|
11
|
+
published. Notes are in the adapter's CHANGELOG.
|
|
12
|
+
|
|
13
|
+
## 0.2.20 - 2026-10-22
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **Fabric Agent Adapter is pinned at `v0.41.0`** (it was `v0.40.0`): the 2026-10-22 audit closed. Session hooks that
|
|
18
|
+
survive a refused call, a wrapped `fabric-mcp` and a slow process table; a board responder that recovers a request
|
|
19
|
+
after lost answers; Python twins of the service kit that lock their stores and refuse what the Node twins refuse;
|
|
20
|
+
package and estate checks that agree across the kits; safer installers (a copy in the hub is replaced only with
|
|
21
|
+
`--force`, atomically); nightly CI with the contract at the pin, Python 3.9, Node 18, macOS and Windows. A Linux
|
|
22
|
+
service on the Node kit needs Node 22. Upgrading notes are in the adapter's CHANGELOG.
|
|
23
|
+
|
|
3
24
|
## 0.2.19 - 2026-10-21
|
|
4
25
|
|
|
5
26
|
### Changed
|
package/family.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@passioncode-ai/passioncode",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.21",
|
|
4
4
|
"description": "Set up PassionCode.ai on a computer with one command — the apps from their verified releases, their MCP servers for every coding agent and the PassionCode.ai skills — and check and repair it with the same command or `doctor`.",
|
|
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.
|
|
14
|
+
"version": "0.42.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; and teach a coding agent to work in a project through Fabric (fabric-mcp, fabric_whoami, claim and release), with Claude Code session hooks.",
|
|
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.2.
|
|
38
|
+
"version": "0.2.21",
|
|
39
39
|
"description": "Set up and check PassionCode.ai on a computer with one command (setting-up-passioncode), 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",
|
package/payload/manifest.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"family": "passioncode",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.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.
|
|
11
|
-
"commit": "
|
|
12
|
-
"version": "0.
|
|
10
|
+
"ref": "v0.42.1",
|
|
11
|
+
"commit": "132d03d3e681a9183f4354d1520ab25468231cf4",
|
|
12
|
+
"version": "0.42.1",
|
|
13
13
|
"via": "clone of https://***@github.com/passioncode-ai/fabric-agent-adapter.git",
|
|
14
14
|
"skills": [
|
|
15
15
|
"adapting-projects-to-fabric",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"legacyMarketplaces": [
|
|
24
24
|
"fabric-agent-adapter"
|
|
25
25
|
],
|
|
26
|
-
"contentHash": "sha256:
|
|
26
|
+
"contentHash": "sha256:1ac326b0358f00a1ab91b848ae1c2385277f7530449436f72017c16ec33b15e3",
|
|
27
27
|
"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.",
|
|
28
28
|
"author": {
|
|
29
29
|
"name": "PassionCode.ai",
|
|
@@ -62,9 +62,9 @@
|
|
|
62
62
|
"name": "passioncode",
|
|
63
63
|
"displayName": "PassionCode.ai",
|
|
64
64
|
"repo": "passioncode-ai/passioncode",
|
|
65
|
-
"ref": "v0.2.
|
|
65
|
+
"ref": "v0.2.21",
|
|
66
66
|
"commit": null,
|
|
67
|
-
"version": "0.2.
|
|
67
|
+
"version": "0.2.21",
|
|
68
68
|
"via": "this repository",
|
|
69
69
|
"skills": [
|
|
70
70
|
"setting-up-passioncode",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
],
|
|
73
73
|
"legacyPluginIds": [],
|
|
74
74
|
"legacyMarketplaces": [],
|
|
75
|
-
"contentHash": "sha256:
|
|
75
|
+
"contentHash": "sha256:93677f6b0cf601389cbe224d4fe90f1e11dfabee369c45eb13416b0ad845518b",
|
|
76
76
|
"description": "Set up and check PassionCode.ai on a computer with one command (setting-up-passioncode), 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.",
|
|
77
77
|
"author": {
|
|
78
78
|
"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; 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.42.1",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "PassionCode.ai",
|
|
9
9
|
"url": "https://passioncode.ai/"
|
|
@@ -1,11 +1,11 @@
|
|
|
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 (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,
|
|
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, a brand-new agent (creating-fabric-agents), running an agent as a local or online Fabric service with a dashboard (building-fabric-services), or a coding session working through Fabric, its board or claims, «подключись к Fabric» (working-with-fabric).
|
|
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.42.1"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
10
|
contract-commit: "c55f2d5a11c9a0197e958e87212fca7ae1154769"
|
|
11
11
|
---
|
|
@@ -25,7 +25,11 @@ Use this skill to adapt or assess a provider project. Do not use it to:
|
|
|
25
25
|
- answer wire-level MCP or A2A questions (transports, sessions, auth handshakes, task
|
|
26
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: that is the sibling skill creating-fabric-agents
|
|
28
|
+
- design a new agent from scratch: that is the sibling skill `creating-fabric-agents`;
|
|
29
|
+
- run the agent as a resident service with a dashboard, a descriptor and launchd: that is
|
|
30
|
+
`building-fabric-services`;
|
|
31
|
+
- work in a project through Fabric from a coding session (registering `fabric-mcp`, the board,
|
|
32
|
+
claims): that is `working-with-fabric`;
|
|
29
33
|
- claim admission merely because generated files or a valid manifest exist.
|
|
30
34
|
|
|
31
35
|
If the project has only a browser interface and no stable API, MCP/A2A surface, or CLI,
|
|
@@ -57,7 +61,9 @@ python3 <skill-dir>/scripts/adapt_project.py inspect <project-root> --json
|
|
|
57
61
|
```
|
|
58
62
|
|
|
59
63
|
The inspector samples repository files but does not execute the project. Verify its
|
|
60
|
-
evidence manually. Existing runtime documentation and code outrank filename heuristics.
|
|
64
|
+
evidence manually. Existing runtime documentation and code outrank filename heuristics. A
|
|
65
|
+
client configuration (`.mcp.json`, an `mcpServers` block) lists servers the project calls, not one
|
|
66
|
+
it serves: inspect reports it as `mcp-client-config` and asks instead of choosing `mcp`.
|
|
61
67
|
|
|
62
68
|
If the inspector returns `undetermined`, answer its lifecycle question before creating
|
|
63
69
|
files. A repository can expose multiple surfaces; choose a profile per capability, not
|
|
@@ -110,12 +116,18 @@ target paths. It refuses any collision.
|
|
|
110
116
|
`charge`, `delete`, `merge`, `deploy`, `change-policy`), read from what the code does or asked of the author. Choose
|
|
111
117
|
`--idempotency required|supported|none` for an external effect on purpose. When a run's cost varies, give the
|
|
112
118
|
launcher fixed options (DEC-0037): `--cost-preset ID MAX_USD LABEL` per option and `--default-cost-preset ID`; the
|
|
113
|
-
amounts come from the author or measured runs, never invented.
|
|
114
|
-
|
|
119
|
+
amounts come from the author or measured runs, never invented. Pass what the author knows so it is not written as a
|
|
120
|
+
scaffold default: `--data-class` (repeat), `--created-by URI`, `--identity-method`, `--probe-assertion` (repeat).
|
|
115
121
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
122
|
+
On a collision run `scaffold --dry-run` first: it writes nothing and prints the planned writes and a unified diff of
|
|
123
|
+
each existing file. Use `--force` only when the user authorizes replacing exactly those files.
|
|
124
|
+
|
|
125
|
+
Every value the scaffold invents is a sentinel that `check` names: the zero hash, `.invalid` endpoints,
|
|
126
|
+
`replace-me` values, `urn:fabric:adapter:author`, the generic schemas (marked `fabric-adapter-template`), the
|
|
127
|
+
generic fixture and assertions, and each value listed under the manifest's `urn:fabric:adapter:template`
|
|
128
|
+
extension (the defaulted `dataClasses`, a defaulted `tls` identity method). Replace each with an
|
|
129
|
+
implementation-backed fact, then remove it from that list and the block when it is empty. While one remains,
|
|
130
|
+
`readyForAdmission` is false.
|
|
119
131
|
|
|
120
132
|
### 4. Implement the adapter seam
|
|
121
133
|
|
|
@@ -138,11 +150,14 @@ Treat all provider output as untrusted until schemas and semantic assertions pas
|
|
|
138
150
|
|
|
139
151
|
### 4b. Announce an agent that is not a service
|
|
140
152
|
|
|
141
|
-
An agent Fabric reaches as a
|
|
142
|
-
its installer with
|
|
143
|
-
by its uninstaller: argv
|
|
144
|
-
|
|
145
|
-
|
|
153
|
+
An agent Fabric reaches as a stdio MCP server, or as an MCP server on a loopback URL that is not
|
|
154
|
+
a service, gets a provider entry, written by its installer with
|
|
155
|
+
[`scripts/fabric_provider.py`](scripts/fabric_provider.py) and removed by its uninstaller: argv
|
|
156
|
+
arrays only, env values as `secret-ref:` references, never the id of an existing service, and a
|
|
157
|
+
`providerId` equal to the manifest's `provider.id`. Load [provider entries](references/provider-entry.md).
|
|
158
|
+
A provider entry only describes an MCP server: a CLI that does not speak MCP gets no entry; it is
|
|
159
|
+
announced by its `local-runner` manifest (step 3). An agent that runs as a service uses a
|
|
160
|
+
descriptor instead (`building-fabric-services`).
|
|
146
161
|
|
|
147
162
|
### 5. Make probes safe and meaningful
|
|
148
163
|
|
|
@@ -195,58 +210,25 @@ Update `fabric/FABRIC-CONFORMANCE.md` with dated receipts for:
|
|
|
195
210
|
|
|
196
211
|
Include commands and exit codes, immutable endpoint or artifact identities, and explicit
|
|
197
212
|
unverified surfaces. If live Fabric admission/runtime does not yet exist, the last gates
|
|
198
|
-
remain `
|
|
213
|
+
remain `NOT_VERIFIED`; the completed deliverable is an adaptation-ready provider bundle,
|
|
199
214
|
not a connected provider.
|
|
200
215
|
|
|
201
216
|
### 8. Propose the operator channel
|
|
202
217
|
|
|
203
218
|
If the agent has a human stop (a choice, an approval, a confirmation) or emits `notify: true`
|
|
204
|
-
events, propose its
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
1. create a bot with @BotFather;
|
|
211
|
-
2. put its token into the operator's secret store under the name the agent reads (for example
|
|
212
|
-
`EXAMPLE_AGENT_TELEGRAM_BOT_TOKEN`), never into a chat, a file or the bundle;
|
|
213
|
-
3. run the agent's link command;
|
|
214
|
-
4. type the code it shows in the chat with the bot.
|
|
215
|
-
|
|
216
|
-
In a group shared with other bots the channel follows OC-14…OC-17 (DEC-0035): it stays silent
|
|
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
|
-
(`receiver-missing`). Say so in the proposal when the operator means to bind a shared group.
|
|
220
|
-
|
|
221
|
-
Record the answer (`accepted`, `declined` or `later`) in the agent's state and the
|
|
222
|
-
conformance report, and do not ask again; an agent that serves `surfaces.operatorChannel` also
|
|
223
|
-
shows it as `proposal` in its status document. Creating the bot, storing the token and enabling the
|
|
224
|
-
channel are the operator's action: never create the bot, ask for or store the token's value, or
|
|
225
|
-
enable the channel yourself. The default pin carries DEC-0034 and DEC-0035: a served status document is checked
|
|
226
|
-
against the pinned `schemas/operator-channel-status.schema.json`; the channel's runtime rules have
|
|
227
|
-
no probe rule here yet, so report them `NOT_RUN`. An agent with neither stops nor notify
|
|
228
|
-
events skips this step.
|
|
219
|
+
events, propose its operator channel (`fabric-operator-channel/0.1`, OC-11) to the operator once,
|
|
220
|
+
now, as [the operator channel and the repository standard](references/operator-channel-and-repository.md)
|
|
221
|
+
describes: the operator's four steps, the answer recorded and never asked again, and the bot, the
|
|
222
|
+
token and enabling the channel left to the operator. An agent with neither stops nor notify events
|
|
223
|
+
skips this step.
|
|
229
224
|
|
|
230
225
|
## The repository around the provider
|
|
231
226
|
|
|
232
227
|
**For a PassionCode.ai repository**, the adapted project's repository follows the organization's
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
- `LICENSE`, `COMMERCIAL-LICENSE.md` and `CLA.md` copied byte for byte from the knowledge base's
|
|
238
|
-
`templates/`, and `AGPL-3.0-only OR LicenseRef-PassionCode-Commercial` in every manifest and
|
|
239
|
-
every SKILL.md `license:`; `SECURITY.md` when the repository is public;
|
|
240
|
-
- a README whose first heading is the full name, with `## Quick start for a new teammate`
|
|
241
|
-
(Install; Configure, key names only; MCP, the registration command and one proving tool call,
|
|
242
|
-
verified with a real client in a temporary config; Develop) and `## License`;
|
|
243
|
-
- an `AGENTS.md` that opens with the template's *Read first* block and closes with *After work*,
|
|
244
|
-
and a `CLAUDE.md` whose first line is `@AGENTS.md`.
|
|
245
|
-
|
|
246
|
-
org-index `scripts/check_format.py` reports 0 findings for it before it is called done. **An agent
|
|
247
|
-
someone builds for themselves is not a PassionCode.ai repository:** its licence is its owner's
|
|
248
|
-
choice, nothing about it is published or listed by the organization, and none of these files is
|
|
249
|
-
required of it, though the verified MCP quick start is still how anyone learns to drive it.
|
|
228
|
+
repository standard (`knowledge/repository-standard.md`) from its first commit: the licence files,
|
|
229
|
+
the README quick start verified with a real client, `AGENTS.md` and `CLAUDE.md`, listed in the
|
|
230
|
+
shared reference above. An agent someone builds for themselves is not a PassionCode.ai repository:
|
|
231
|
+
its licence is its owner's choice and none of those files is required of it.
|
|
250
232
|
|
|
251
233
|
## Completion format
|
|
252
234
|
|
|
@@ -265,12 +247,6 @@ passed against a real provider and the project binding is valid.
|
|
|
265
247
|
|
|
266
248
|
## Dashboard handoff: also for consumers
|
|
267
249
|
|
|
268
|
-
When handing a registered service dashboard to a person, or writing the generated
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
check the target device and host, and run the bundled output gate before delivery.
|
|
272
|
-
An installed host failure never means browser fallback. This applies in Claude
|
|
273
|
-
Code, Codex and other providers; it needs no host-specific hook. MCP unavailable:
|
|
274
|
-
report the unresolved capability or use an approved project resolver; no automatic
|
|
275
|
-
client configuration. Python unavailable: perform the reference's manual checks
|
|
276
|
-
and report the executable gate NOT_RUN. Headless agents need no dashboard.
|
|
250
|
+
When handing a registered service dashboard to a person, or writing the generated agent's
|
|
251
|
+
completion or notification instructions, read and apply [dashboard links](references/dashboard-links.md)
|
|
252
|
+
and run its output gate before delivery, in any host. Headless agents need no dashboard.
|
|
@@ -83,8 +83,10 @@ or instructions alone do not prove all final answers from every agent are filter
|
|
|
83
83
|
path is required. Skills must be activated/loaded; install does not intercept every answer.
|
|
84
84
|
- MCP absent: report unresolved host capability once, use the project's approved
|
|
85
85
|
resolver/CLI if available. Do not write machine or agent MCP config automatically.
|
|
86
|
-
- Python absent: perform the comparisons above manually
|
|
87
|
-
|
|
86
|
+
- Python absent: perform the comparisons above manually, including the gate's own rules (a
|
|
87
|
+
path with a `.` or `..` segment, an encoded or backslash separator, or a query or fragment
|
|
88
|
+
name or value that reads as a credential, such as `code`, `key`, `auth` or `api_key`, is
|
|
89
|
+
refused); mark the executable gate NOT_RUN. Do not label the output mechanically validated.
|
|
88
90
|
|
|
89
91
|
Syntax is owned by Fabric Dashboards and `@passioncode-ai/fabric-service-host`:
|
|
90
92
|
[ADR-0005](https://github.com/passioncode-ai/fabric-dashboards/blob/51a7a80acf42781d7bec304cc87c655d48cc309b/docs/adr/0005-service-links.md).
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# The operator channel and the repository standard
|
|
2
|
+
|
|
3
|
+
Shared by `adapting-projects-to-fabric` and `creating-fabric-agents`; the two copies are byte-identical
|
|
4
|
+
(`test/test_shared_references.py`). "The agent" is the provider being adapted or created.
|
|
5
|
+
|
|
6
|
+
## The operator channel
|
|
7
|
+
|
|
8
|
+
If the agent has a human stop (a choice, an approval, a confirmation) or emits `notify: true`
|
|
9
|
+
events, propose its **operator channel** to the operator once, at the step that links here. The
|
|
10
|
+
channel is the agent's own messenger channel, first Telegram, that sends those events and answers
|
|
11
|
+
its stops with buttons: `fabric-operator-channel/0.1` (contract DEC-0034,
|
|
12
|
+
`docs/specification/operator-channel.md`), whose rule OC-11 this follows. Give the operator's four
|
|
13
|
+
steps:
|
|
14
|
+
|
|
15
|
+
1. create a bot with @BotFather;
|
|
16
|
+
2. put its token into the operator's secret store (Project Observatory where it is installed) under
|
|
17
|
+
the name the agent reads (for example `EXAMPLE_AGENT_TELEGRAM_BOT_TOKEN`), never into a chat, a
|
|
18
|
+
file or the bundle;
|
|
19
|
+
3. run the agent's link command;
|
|
20
|
+
4. type the code it shows in the chat with the bot.
|
|
21
|
+
|
|
22
|
+
In a group shared with other bots the channel follows OC-14 to OC-17 (DEC-0035): it stays silent
|
|
23
|
+
unless addressed (`/command@ThisBot`, a reply to its own message or a press of its own button; a
|
|
24
|
+
bare `/command` in a group is not addressed), and a channel nobody receives on is `degraded`
|
|
25
|
+
(`receiver-missing`). Say so in the proposal when the operator means to bind a shared group.
|
|
26
|
+
|
|
27
|
+
Record the answer (`accepted`, `declined` or `later`) in the agent's state and in its conformance
|
|
28
|
+
report, and do not ask again; an agent that serves `surfaces.operatorChannel` also shows it as
|
|
29
|
+
`proposal` in its status document. Creating the bot, storing the token and enabling the channel
|
|
30
|
+
are the operator's action: never create the bot, ask for or store the token's value, or enable the
|
|
31
|
+
channel yourself. The default pin carries DEC-0034 and DEC-0035: a served status document is
|
|
32
|
+
checked against the pinned `schemas/operator-channel-status.schema.json`; the channel's runtime
|
|
33
|
+
rules have no probe rule here yet, so report them `NOT_RUN`. An agent with neither stops nor notify
|
|
34
|
+
events skips this.
|
|
35
|
+
|
|
36
|
+
## The repository standard
|
|
37
|
+
|
|
38
|
+
For a PassionCode.ai repository, the agent's repository follows the organization's
|
|
39
|
+
[repository standard](https://github.com/passioncode-ai/fabric-workspace/blob/main/knowledge/repository-standard.md)
|
|
40
|
+
(`knowledge/repository-standard.md` in the organization's knowledge base; a clone has it at
|
|
41
|
+
`fabric-workspace/knowledge/`) from its first commit:
|
|
42
|
+
|
|
43
|
+
- `LICENSE`, `COMMERCIAL-LICENSE.md` and `CLA.md` copied byte for byte from the knowledge base's
|
|
44
|
+
`templates/`, and `AGPL-3.0-only OR LicenseRef-PassionCode-Commercial` in every manifest and
|
|
45
|
+
every SKILL.md `license:`; `SECURITY.md` when the repository is public;
|
|
46
|
+
- a README whose first heading is the full name, with `## Quick start for a new teammate`
|
|
47
|
+
(Install; Configure, key names only; MCP, the registration command and one proving tool call,
|
|
48
|
+
verified with a real client in a temporary config; Develop) and `## License`;
|
|
49
|
+
- an `AGENTS.md` that opens with the template's *Read first* block and closes with *After work*,
|
|
50
|
+
and a `CLAUDE.md` whose first line is `@AGENTS.md`.
|
|
51
|
+
|
|
52
|
+
org-index `scripts/check_format.py` reports 0 findings for it before it is called done. An agent
|
|
53
|
+
someone builds for themselves is not a PassionCode.ai repository: its licence is its owner's
|
|
54
|
+
choice, nothing about it is published or listed by the organization, and none of these files is
|
|
55
|
+
required of it, though the verified MCP quick start is still how anyone learns to drive it.
|
|
@@ -32,7 +32,9 @@ python3 scripts/fabric_provider.py validate ~/Library/Application\ Support/ai.pa
|
|
|
32
32
|
python3 scripts/fabric_provider.py remove example-agent # the uninstaller
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
`--stdio` takes the rest of the line as the argument array; there is no shell string.
|
|
35
|
+
`--stdio` comes last and takes the rest of the line as the argument array; there is no shell string. A writer
|
|
36
|
+
option after it (`--env`, `--name`, ...) is refused rather than swallowed into argv; write `--stdio -- EXECUTABLE ...`
|
|
37
|
+
when the server itself takes an option of that name. `--env` belongs to a stdio server and is refused with `--url`. An entry may carry
|
|
36
38
|
`run.mcp.stdio.scope` (DEC-0044): `project` (started for the sessions of a project that binds it) or `on-demand`;
|
|
37
39
|
`session` (a server in every coding session) is refused (FAC-SEM-056, LC-19). The validator accepts the field; the
|
|
38
40
|
writer does not set it until Fabric reads it. An argument that carries a credential is refused
|
|
@@ -46,8 +48,12 @@ It refuses, with one sentence that never quotes a value:
|
|
|
46
48
|
- an env value that is not `secret-ref:<name>`, or a reference that has the shape of a
|
|
47
49
|
credential itself: a token prefix, a private key, a JWT (FAC-SEM-015: a value is
|
|
48
50
|
checked by its form; name patterns apply to names);
|
|
49
|
-
- a URL other than `http://127.0.0.1:<port>/mcp
|
|
50
|
-
absolute or `~/` path to `fabric-agent.json
|
|
51
|
+
- what the pinned `provider.schema.json` refuses: a URL other than `http://127.0.0.1:<port>/mcp` with a port from 100
|
|
52
|
+
to 65535, a manifest path that is not an absolute or `~/` path to `fabric-agent.json` (or is a network share, or over
|
|
53
|
+
1024 characters), a shell-string command, more than 32 arguments or one over 1024 characters, more than 64 env
|
|
54
|
+
names, a `source.repository` that is not an absolute URI, an `installedAt` that is not an RFC 3339 date-time,
|
|
55
|
+
unknown fields. The patterns are the schema's, copied (`test_provider.SchemaParityTests` compares them with a
|
|
56
|
+
contract checkout at the pin when `FABRIC_CONTRACT_NEW` names one).
|
|
51
57
|
|
|
52
58
|
`validate` also checks that the file is named `<id>.json` (FAC-SEM-014, slug half).
|
|
53
59
|
From Python: `write_provider_entry(entry)`, `remove_provider_entry(id)`,
|
|
@@ -18,6 +18,21 @@ Use only `PASS`, `FAIL`, `NOT_RUN`, and `NOT_VERIFIED`:
|
|
|
18
18
|
- `NOT_VERIFIED`: no implemented verifier/runtime currently exists for the claim.
|
|
19
19
|
- Never relabel either as a warning-level pass.
|
|
20
20
|
|
|
21
|
+
## Template sentinels
|
|
22
|
+
|
|
23
|
+
`check` lists every value the scaffold invented as a warning, and `readyForAdmission` stays false
|
|
24
|
+
while one remains: `placeholder:` for a fixed sentinel (the zero content hash, `replace-me`,
|
|
25
|
+
`.invalid`, `urn:fabric:adapter:author`, the generic probe assertion, a generated file still marked
|
|
26
|
+
`fabric-adapter-template` or still in the generic request/summary shape, the generic fixture) and
|
|
27
|
+
`template-default:` for each JSON pointer listed under the manifest's `urn:fabric:adapter:template`
|
|
28
|
+
extension (a legal value the author did not choose, such as `dataClasses: ["public"]`). A warning
|
|
29
|
+
is cleared by replacing the value with an implementation-backed fact and removing the pointer from
|
|
30
|
+
that list; deleting the block without confirming its values is a false receipt.
|
|
31
|
+
|
|
32
|
+
`check --contract` runs the checkout's own `node_modules/.bin/tsx`, never `pnpm exec`, so it cannot
|
|
33
|
+
reinstall or purge the contract checkout. A manifest that is not UTF-8 or not JSON is an
|
|
34
|
+
`invalid-json:` receipt, not a crash.
|
|
35
|
+
|
|
21
36
|
## Receipts
|
|
22
37
|
|
|
23
38
|
A receipt names what ran and what identity was tested:
|