@passioncode-ai/passioncode 0.2.18 → 0.2.20

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.
Files changed (124) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/family.json +1 -1
  3. package/package.json +1 -1
  4. package/payload/.claude-plugin/marketplace.json +2 -2
  5. package/payload/manifest.json +8 -8
  6. package/payload/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
  7. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +42 -66
  8. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/dashboard-links.md +4 -2
  9. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/operator-channel-and-repository.md +55 -0
  10. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/provider-entry.md +9 -3
  11. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/verification.md +15 -0
  12. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +181 -26
  13. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/check_dashboard_link.py +66 -5
  14. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/fabric_provider.py +81 -23
  15. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/fabric_secrets.py +1 -1
  16. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +42 -33
  17. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-button.js +21 -9
  18. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-dashboard.css +1 -1
  19. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/fabric-dashboard.js +2 -2
  20. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/assets/dashboard-kit/kit.json +9 -4
  21. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/README.md +104 -0
  22. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/config.example.json +15 -0
  23. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/knowledge.example.json +13 -0
  24. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/support_agent.py +465 -0
  25. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/board.md +21 -5
  26. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/connectors.md +93 -0
  27. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-kit.md +2 -1
  28. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-links.md +4 -2
  29. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/delegation.md +3 -2
  30. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/estate-record.md +5 -4
  31. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +5 -0
  32. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/kit-modules.md +129 -0
  33. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md +3 -1
  34. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/package.md +5 -1
  35. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/usage.md +2 -0
  36. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_dashboard_layout.mjs +48 -19
  37. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_dashboard_link.py +66 -5
  38. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service.py +11 -184
  39. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service_rules.py +204 -0
  40. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/dashboard_kit.py +53 -19
  41. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-auth.mjs +288 -0
  42. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-backups.mjs +327 -0
  43. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-base.mjs +47 -0
  44. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board-fixture.mjs +79 -0
  45. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board-link.mjs +145 -0
  46. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board-session.mjs +848 -0
  47. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board-shapes.mjs +340 -0
  48. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-board.mjs +42 -1237
  49. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-ceremonies.mjs +7 -18
  50. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-crypto.mjs +41 -0
  51. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-delegation.mjs +15 -46
  52. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-descriptor.mjs +387 -0
  53. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-estate.mjs +11 -68
  54. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-events.mjs +52 -0
  55. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-http.mjs +231 -0
  56. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-interop.mjs +50 -16
  57. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-jsvalue.mjs +67 -0
  58. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-lock.mjs +235 -0
  59. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-logs.mjs +136 -0
  60. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-openrouter.mjs +335 -0
  61. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-package.mjs +146 -32
  62. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-paths.mjs +69 -0
  63. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-platform.mjs +164 -0
  64. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-profiles.mjs +1 -32
  65. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-protocols.mjs +122 -0
  66. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-service.mjs +177 -2541
  67. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-share.mjs +1 -8
  68. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-supervisors.mjs +404 -0
  69. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-time.mjs +46 -0
  70. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-usage.mjs +458 -0
  71. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_auth.py +408 -0
  72. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_backups.py +399 -0
  73. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_base.py +91 -0
  74. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board.py +64 -1398
  75. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board_fixture.py +116 -0
  76. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board_link.py +162 -0
  77. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board_session.py +882 -0
  78. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_board_shapes.py +457 -0
  79. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_ceremonies.py +36 -39
  80. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_crypto.py +336 -0
  81. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_delegation.py +113 -222
  82. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_descriptor.py +586 -0
  83. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_estate.py +44 -405
  84. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_events.py +140 -0
  85. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_http.py +402 -0
  86. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_hub.py +6 -2
  87. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_interop.py +119 -77
  88. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_jsvalue.py +310 -0
  89. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_kit.py +243 -0
  90. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_lock.py +308 -0
  91. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_logs.py +202 -0
  92. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_openrouter.py +431 -0
  93. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_package.py +285 -109
  94. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_paths.py +102 -0
  95. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_platform.py +338 -0
  96. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_profiles.py +32 -39
  97. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_protocols.py +173 -0
  98. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_secrets.py +1 -1
  99. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_service.py +298 -3450
  100. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_share.py +8 -8
  101. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_supervisors.py +437 -0
  102. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_time.py +120 -0
  103. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_usage.py +697 -0
  104. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +1621 -0
  105. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/sample_service.py +25 -7
  106. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +29 -60
  107. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/dashboard-links.md +4 -2
  108. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/models-and-providers.md +3 -0
  109. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/operator-channel-and-repository.md +55 -0
  110. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/scripts/check_dashboard_link.py +66 -5
  111. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +3 -3
  112. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/references/native-host-hooks.md +2 -1
  113. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/references/session-hooks.md +26 -13
  114. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session.py +122 -1392
  115. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_cli.py +278 -0
  116. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +539 -0
  117. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_hosts.py +324 -0
  118. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_mail.py +173 -0
  119. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_mcp.py +491 -0
  120. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/host_hooks.py +11 -1
  121. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/hosts/context.mjs +25 -2
  122. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/hosts/openclaw/index.mjs +4 -2
  123. package/payload/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/hosts/opencode/fabric.mjs +2 -1
  124. package/payload/plugins/passioncode/.claude-plugin/plugin.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.20 - 2026-10-22
4
+
5
+ ### Changed
6
+
7
+ - **Fabric Agent Adapter is pinned at `v0.41.0`** (it was `v0.40.0`): the 2026-10-22 audit closed. Session hooks that
8
+ survive a refused call, a wrapped `fabric-mcp` and a slow process table; a board responder that recovers a request
9
+ after lost answers; Python twins of the service kit that lock their stores and refuse what the Node twins refuse;
10
+ package and estate checks that agree across the kits; safer installers (a copy in the hub is replaced only with
11
+ `--force`, atomically); nightly CI with the contract at the pin, Python 3.9, Node 18, macOS and Windows. A Linux
12
+ service on the Node kit needs Node 22. Upgrading notes are in the adapter's CHANGELOG.
13
+
14
+ ## 0.2.19 - 2026-10-21
15
+
16
+ ### Changed
17
+
18
+ - **Fabric Agent Adapter is pinned at `v0.40.0`** (it was `v0.39.1`): the service kit as layered modules behind
19
+ compatibility facades, installed into a service with `fabric_kit.py install` and checked with `fabric_kit.py status`;
20
+ connectors for outbound HTTP and OpenRouter (the agent's own key, a spend ceiling before every attempt, usage
21
+ receipts, a fallback model); a support-agent recipe. A service that copied one kit file installs the kit as a set now.
22
+
3
23
  ## 0.2.18 - 2026-10-21
4
24
 
5
25
  ### 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.39.1",
11
+ "ref": "v0.41.0",
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.2.18",
3
+ "version": "0.2.20",
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.39.1",
14
+ "version": "0.41.0",
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.18",
38
+ "version": "0.2.20",
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",
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "family": "passioncode",
3
- "version": "0.2.18",
3
+ "version": "0.2.20",
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.39.1",
11
- "commit": "92037c3e0d27f4888806a1c4ae5b36167de50067",
12
- "version": "0.39.1",
10
+ "ref": "v0.41.0",
11
+ "commit": "5876df808ec18d4fbcb2f6585c2fb7a2c102411a",
12
+ "version": "0.41.0",
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:4200dac01fb7296bd45ee2b52ff5a0fcec02e7e80bbb971c02f569feab84c1cb",
26
+ "contentHash": "sha256:0446f2397dfc5b781756dc95f33e33755b6369cab06569619a93d26a0166752e",
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.18",
65
+ "ref": "v0.2.20",
66
66
  "commit": null,
67
- "version": "0.2.18",
67
+ "version": "0.2.20",
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:6c506bf0504dbaa41ce2768e6205e8beba1bffff41c054e53b4eec230d7b5b3e",
75
+ "contentHash": "sha256:f113b6dd1f4da47f05a1db6388dad059fb804c693f96f909b23a8a8ee996ae75",
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.39.1",
6
+ "version": "0.41.0",
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, or a brand-new agent (that is creating-fabric-agents).
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.39.1"
8
+ version: "0.41.0"
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. Do not use `--force` unless the user explicitly
114
- authorizes replacement after the exact conflicting files and diff are shown.
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
- The generated zero hash, `.invalid` endpoints, `replace-me` values, generic schemas, and
117
- assertions are deliberate blockers. Replace them with implementation-backed facts. A
118
- template that still contains one is not ready for admission.
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 CLI or a stdio MCP server gets a provider entry, written by
142
- its installer with [`scripts/fabric_provider.py`](scripts/fabric_provider.py) and removed
143
- by its uninstaller: argv arrays only, env values as `secret-ref:` references, never the
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
- agent that runs as a service uses a descriptor instead (`building-fabric-services`).
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 `NOT VERIFIED`; the completed deliverable is an adaptation-ready provider bundle,
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 **operator channel** to the operator once, now. The channel is the agent's
205
- own messenger channel, first Telegram, that sends those events and answers its stops with
206
- buttons: `fabric-operator-channel/0.1` (contract DEC-0034,
207
- `docs/specification/operator-channel.md`), whose rule OC-11 this step follows. Give the
208
- operator's four steps:
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
- [repository standard](https://github.com/passioncode-ai/fabric-workspace/blob/main/knowledge/repository-standard.md) (`knowledge/repository-standard.md`
234
- in the organization's knowledge base; a clone has it at `fabric-workspace/knowledge/`) from its
235
- first commit:
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
- agent's completion/notification instructions, read and apply
270
- [dashboard links](references/dashboard-links.md): use the host's `open_link`,
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; mark the executable gate
87
- NOT_RUN. Do not label the output mechanically validated.
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. An entry may carry
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`, a manifest path that is not an
50
- absolute or `~/` path to `fabric-agent.json`, a shell-string command, unknown fields.
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: