@passioncode-ai/passioncode 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.11 - 2026-09-30
4
+
5
+ ### Fixed
6
+
7
+ - Fabric Agent Adapter 0.5.2 in the set (`family.json` pins `v0.5.2`, was `v0.5.1`): services built on its
8
+ kits answer the MCP `initialize` handshake, so a real client such as Claude Code connects (0.5.0
9
+ and 0.5.1 did not), and every tool's `outputSchema` has an object root (contract DEC-0018).
10
+
3
11
  ## 0.1.10 - 2026-09-30
4
12
 
5
13
  ### 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.5.1",
11
+ "ref": "v0.5.2",
12
12
  "kind": "plugin",
13
13
  "path": "plugins/fabric-agent-adapter",
14
14
  "legacyPluginIds": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@passioncode-ai/passioncode",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "description": "Every PassionCode.ai agent skill — Fabric Agent Adapter, Observatory Log and the organisation's working rules — for Claude Code and every other agent on the machine, updated as one set.",
5
5
  "bin": {
6
6
  "passioncode": "bin/passioncode.js"
@@ -11,7 +11,7 @@
11
11
  "name": "fabric-agent-adapter",
12
12
  "displayName": "Fabric Agent Adapter",
13
13
  "source": "./plugins/fabric-agent-adapter",
14
- "version": "0.5.1",
14
+ "version": "0.5.2",
15
15
  "description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles.",
16
16
  "author": {
17
17
  "name": "PassionCode.ai",
@@ -35,7 +35,7 @@
35
35
  "name": "passioncode",
36
36
  "displayName": "PassionCode.ai",
37
37
  "source": "./plugins/passioncode",
38
- "version": "0.1.10",
38
+ "version": "0.1.11",
39
39
  "description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
40
40
  "author": {
41
41
  "name": "PassionCode.ai",
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "family": "passioncode",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
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.5.1",
11
- "commit": "761be46e5047879f65630cbb05a82344220f0175",
12
- "version": "0.5.1",
10
+ "ref": "v0.5.2",
11
+ "commit": "b7a6b8ea081894ea8c0d3765879721c17f6a3655",
12
+ "version": "0.5.2",
13
13
  "via": "clone of https://***@github.com/passioncode-ai/fabric-agent-adapter.git",
14
14
  "skills": [
15
15
  "adapting-projects-to-fabric",
@@ -22,7 +22,7 @@
22
22
  "legacyMarketplaces": [
23
23
  "fabric-agent-adapter"
24
24
  ],
25
- "contentHash": "sha256:b3dd5a474a99f51fefa353134f47f23730251ccec7b9052327be0e338ceffef2",
25
+ "contentHash": "sha256:8d2a7d2795b1ab1e0dd3a1fc9a073c70e6085f160fa125bd5ada5a5f3d8d4c0b",
26
26
  "description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles.",
27
27
  "author": {
28
28
  "name": "PassionCode.ai",
@@ -61,16 +61,16 @@
61
61
  "name": "passioncode",
62
62
  "displayName": "PassionCode.ai",
63
63
  "repo": "passioncode-ai/passioncode",
64
- "ref": "v0.1.10",
64
+ "ref": "v0.1.11",
65
65
  "commit": null,
66
- "version": "0.1.10",
66
+ "version": "0.1.11",
67
67
  "via": "this repository",
68
68
  "skills": [
69
69
  "working-in-passioncode"
70
70
  ],
71
71
  "legacyPluginIds": [],
72
72
  "legacyMarketplaces": [],
73
- "contentHash": "sha256:57360b29ce3e8dcd3e846ed94c1798385400bc68c43e40c398869e459dd3f9cc",
73
+ "contentHash": "sha256:917c5c1429a60a70666f1f8c7b2ee73d2e50bb8db56f64104f418ab0b7a46816",
74
74
  "description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
75
75
  "author": {
76
76
  "name": "PassionCode.ai",
@@ -3,7 +3,7 @@
3
3
  "name": "fabric-agent-adapter",
4
4
  "displayName": "Fabric Agent Adapter",
5
5
  "description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles.",
6
- "version": "0.5.1",
6
+ "version": "0.5.2",
7
7
  "author": {
8
8
  "name": "PassionCode.ai",
9
9
  "url": "https://passioncode.ai/"
@@ -5,9 +5,9 @@ license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
5
5
  compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned private fabric-agent-contract checkout. Works without those tools in an explicitly degraded structural-check mode.
6
6
  metadata:
7
7
  author: PassionCode.ai
8
- version: "0.5.1"
8
+ version: "0.5.2"
9
9
  contract-version: "0.1.0"
10
- contract-commit: "9cd778eb6f14b977f9a5b4930826f62dc95c5619"
10
+ contract-commit: "2ea54f70c161c8b3bf7ec3c567735c7a2d4ce12f"
11
11
  ---
12
12
 
13
13
  # Adapting projects to Fabric
@@ -70,7 +70,7 @@ Use exactly:
70
70
 
71
71
  - contract version `0.1.0`;
72
72
  - repository `https://github.com/passioncode-ai/fabric-agent-contract`;
73
- - commit `9cd778eb6f14b977f9a5b4930826f62dc95c5619`.
73
+ - commit `2ea54f70c161c8b3bf7ec3c567735c7a2d4ce12f`.
74
74
 
75
75
  Read the pinned contract's guide
76
76
  `docs/guides/connecting-compatible-agents.md`, the selected profile specification, and
@@ -16,7 +16,7 @@ from urllib.parse import urlparse
16
16
 
17
17
  CONTRACT_VERSION = "0.1.0"
18
18
  CONTRACT_REPOSITORY = "https://github.com/passioncode-ai/fabric-agent-contract"
19
- CONTRACT_COMMIT = "9cd778eb6f14b977f9a5b4930826f62dc95c5619"
19
+ CONTRACT_COMMIT = "2ea54f70c161c8b3bf7ec3c567735c7a2d4ce12f"
20
20
  INTEROP_KEY = "https://fabric.passioncode.ai/agent-contract/extensions/interop/0.1"
21
21
  MCP_REVISION = "2026-07-28"
22
22
  A2A_VERSION = "1.0"
@@ -15,10 +15,10 @@ license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
15
15
  compatibility: Python 3.9+ or Node.js 20+ for the kits; the probe needs Python 3.9+. launchd steps are macOS-only (Linux services use lifecycle manager none until a systemd adapter exists). No network or package install; the contract checkout is optional.
16
16
  metadata:
17
17
  author: PassionCode.ai
18
- version: "0.5.1"
18
+ version: "0.5.2"
19
19
  contract-version: "0.1.0"
20
20
  extension: "fabric-service/0.1"
21
- extension-commit: "9cd778eb6f14b977f9a5b4930826f62dc95c5619"
21
+ extension-commit: "2ea54f70c161c8b3bf7ec3c567735c7a2d4ce12f"
22
22
  ---
23
23
 
24
24
  # Building Fabric services
@@ -1,6 +1,6 @@
1
1
  # Being called: `fabric-interop/0.1`
2
2
 
3
- Normative source: the Fabric Agent Contract's `docs/specification/interop.md` (DEC-0016, rulings DEC-0017)
3
+ Normative source: the Fabric Agent Contract's `docs/specification/interop.md` (DEC-0016, rulings DEC-0017 and DEC-0018)
4
4
  at the commit this plugin pins. This page says how the kit implements it; where the two
5
5
  differ, the contract is right.
6
6
 
@@ -50,15 +50,32 @@ response = server.handle(json_rpc_message) # POST /mcp body in, JSON re
50
50
  - Log events about the work with `**fi.trace_ids(ctx.traceparent)` so the pair lands on
51
51
  the event.
52
52
 
53
- `McpToolServer` answers `server/discover`, `tools/list` and `tools/call` with JSON
54
- responses — enough for Fabric and for the probe. A service already on an MCP SDK keeps
53
+ `McpToolServer` answers `initialize` and `ping` (clients such as Claude Code 2.1.285 still
54
+ open with a handshake, and a server that refuses it is marked failed), `server/discover`,
55
+ `tools/list` and `tools/call` with JSON responses. Every tool's `outputSchema` must be
56
+ rooted at `type: object` (DEC-0018): `add_tool` refuses any other root, because a client may
57
+ drop the whole tool list over one bad schema — an SDK-level test will not show it, so check
58
+ with the real client (below). A service already on an MCP SDK keeps
55
59
  the SDK and uses only the helpers. The Node kit has the helpers and the same job file
56
60
  format, without the dispatcher. `scripts/sample_service.py` is the worked example:
57
61
  `sample.echo` answers at once, `sample.draft` is a job that stops for a title choice.
58
62
 
59
- The contract owner's rulings (DEC-0017) the kit follows: a job tool's `outputSchema` is the
60
- self-contained union `oneOf[result envelope, job handle]` (`job_tool_output_schema`), so
61
- its `structuredContent` always conforms; an event about untraced work carries no trace pair.
63
+ The contract owner's rulings the kit follows: a job tool's `outputSchema` is the
64
+ self-contained `{type: object, oneOf: [result envelope, job handle]}` (`job_tool_output_schema`,
65
+ DEC-0017 amended by DEC-0018), so its `structuredContent` always conforms; an event about
66
+ untraced work carries no trace pair.
67
+
68
+ **Check with a real client**, never only an SDK: `FABRIC_REAL_CLIENT=1 python3 -m unittest
69
+ test.test_real_client` in the adapter repository, or by hand — a throwaway directory, a
70
+ temporary `--mcp-config` (mode 600, the token in a header) and `--strict-mcp-config`, so
71
+ the operator's own configuration is not touched:
72
+
73
+ ```bash
74
+ claude -p "Reply with the single word OK." --strict-mcp-config --mcp-config "$TMP/mcp.json" \
75
+ --output-format stream-json --verbose --max-turns 1
76
+ ```
77
+
78
+ The first `system/init` event lists `mcp_servers` (`connected`) and the `mcp__<server>__*` tools.
62
79
 
63
80
  ## What the probe checks
64
81
 
@@ -66,6 +83,7 @@ its `structuredContent` always conforms; an event about untraced work carries no
66
83
 
67
84
  | Rule | PASS when | NOT_RUN when |
68
85
  |---|---|---|
86
+ | `interop.output-schema-object` | every listed tool's `outputSchema`, when present, has root `type: object` (FAC-SEM-023) | no MCP surface |
69
87
  | `interop.manifest-link` | the manifest `fabricManifest` names carries the service key with this `<id>.<instance>` (G-07) | the descriptor names no manifest |
70
88
  | `interop.well-known-capabilities` | every name in `surfaces.mcp.capabilities` is a manifest capability | the surface lists none |
71
89
  | `interop.tools-match` | every `mcp` capability is served as its tool, schemas equal to the files beside the manifest (matched by `$id`; a job's output wrapped in the DEC-0017 union), annotations derived | no manifest, no MCP surface, or a schema is not beside the manifest |
@@ -1,6 +1,6 @@
1
1
  # fabric-service/0.1 — wire reference
2
2
 
3
- Pinned to `fabric-agent-contract` commit `9cd778eb6f14b977f9a5b4930826f62dc95c5619`
3
+ Pinned to `fabric-agent-contract` commit `2ea54f70c161c8b3bf7ec3c567735c7a2d4ce12f`
4
4
  (`docs/specification/service.md`, DEC-0015). The contract's schemas are normative;
5
5
  this page is the working summary. Extension key:
6
6
  `https://fabric.passioncode.ai/agent-contract/extensions/service/0.1`.
@@ -287,7 +287,7 @@ class Probe:
287
287
  self.add("interop.well-known-capabilities", "FAIL" if extra else "PASS",
288
288
  ("listed but not in the manifest: " + ", ".join(extra)) if extra else "%d listed, all in the manifest" % len(listed))
289
289
  if not mcp_surface or not self.token:
290
- for rule in ("interop.tools-match", "interop.job-tools", "interop.unknown-job", "interop.trace-propagation"):
290
+ for rule in ("interop.output-schema-object", "interop.tools-match", "interop.job-tools", "interop.unknown-job", "interop.trace-propagation"):
291
291
  self.add(rule, "NOT_RUN", "no MCP surface" if not mcp_surface else "no readable token")
292
292
  else:
293
293
  try:
@@ -298,12 +298,21 @@ class Probe:
298
298
  if listing is not None:
299
299
  sent = self.sent_traceparent
300
300
  tools = {t.get("name"): t for t in (listing.get("result") or {}).get("tools", []) if isinstance(t, dict)}
301
+ self.object_root_rule(tools)
301
302
  self.tools_match_rule(capabilities, manifest_path, tools)
302
303
  self.job_tools_rule(capabilities, tools)
303
304
  self.unknown_job_rule(list(tools))
304
305
  self.trace_rule(listing, sent)
305
306
  self.events_trace_rule(self.events)
306
307
 
308
+ def object_root_rule(self, tools: Dict[str, Any]) -> None:
309
+ """FAC-SEM-023 (DEC-0018): every listed tool's outputSchema, when present, has root type object —
310
+ a client may refuse the whole tools/list otherwise, whatever the SDK in the tests accepted."""
311
+ bad = sorted(n for n, t in tools.items() if "outputSchema" in t and (t.get("outputSchema") or {}).get("type") != "object")
312
+ with_schema = sum(1 for t in tools.values() if "outputSchema" in t)
313
+ self.add("interop.output-schema-object", "FAIL" if bad else "PASS",
314
+ ("outputSchema root is not type object: " + ", ".join(bad)) if bad else "%d outputSchemas, every root type object" % with_schema)
315
+
307
316
  def tools_match_rule(self, capabilities: List[Dict[str, Any]], manifest_path: Optional[Path], tools: Dict[str, Any]) -> None:
308
317
  """FAC-SEM-017: each mcp capability is served as the tool of its name, with its schemas and derived annotations."""
309
318
  served = [c for c in capabilities if (c.get("profile") or {}).get("kind") == "mcp"]
@@ -66,10 +66,17 @@ export function expectedAnnotations(effect, idempotency) {
66
66
  }
67
67
 
68
68
  // DEC-0017: a job-backed tool serves oneOf[result envelope, job handle]; the manifest keeps the pure output schema.
69
- export const jobToolOutputSchema = (outputSchema) => ({ oneOf: [{ type: 'object', required: [...ENVELOPE_REQUIRED], properties: { output: outputSchema } }, JOB_HANDLE_SCHEMA] });
69
+ export const jobToolOutputSchema = (outputSchema) => ({ type: 'object', oneOf: [{ type: 'object', required: [...ENVELOPE_REQUIRED], properties: { output: outputSchema } }, JOB_HANDLE_SCHEMA] });
70
70
  export const isJobCapability = (capability) => capability.job === true || capability.extensions?.[EXTENSION_KEY]?.job === true;
71
71
 
72
+ // DEC-0018 (FAC-SEM-023): an outputSchema is rooted at type object; a client may reject the whole
73
+ // tools/list when one tool's outputSchema is, say, a bare oneOf.
74
+ export function requireObjectRoot(name, outputSchema) {
75
+ if (!outputSchema || typeof outputSchema !== 'object' || outputSchema.type !== 'object') throw new InteropError(`Tool ${name}: an outputSchema must have root type "object".`);
76
+ }
77
+
72
78
  export function toolForCapability(capability, inputSchema, outputSchema, title) {
79
+ requireObjectRoot(capability.name, outputSchema);
73
80
  const served = isJobCapability(capability) ? jobToolOutputSchema(outputSchema) : outputSchema;
74
81
  const tool = { name: capability.name, inputSchema, outputSchema: served, annotations: expectedAnnotations(capability.effect, capability.idempotency) };
75
82
  if (capability.description) tool.description = capability.description;
@@ -30,6 +30,10 @@ import fabric_service as _fs # noqa: E402
30
30
  PROTOCOL = "fabric-interop/0.1"
31
31
  EXTENSION_KEY = "https://fabric.passioncode.ai/agent-contract/extensions/interop/0.1"
32
32
  MCP_REVISION = "2026-07-28"
33
+ # Revisions a client may name in `initialize`. MCP 2026-07-28 needs no handshake, but clients
34
+ # built on earlier revisions (Claude Code 2.1.285 among them) still open with one, and a server
35
+ # that refuses it is marked failed before tools/list is ever called.
36
+ HANDSHAKE_REVISIONS = ("2025-03-26", "2025-06-18", "2025-11-25", "2026-07-28")
33
37
  CONTRACT_VERSION = "0.1.0"
34
38
  JOB_STATES = ("working", "input_required", "completed", "failed", "cancelled")
35
39
  OUTCOMES = ("succeeded", "partial", "failed", "cancelled", "blocked")
@@ -112,10 +116,18 @@ def expected_annotations(effect: str, idempotency: str) -> Dict[str, bool]:
112
116
  def job_tool_output_schema(output_schema: Dict[str, Any]) -> Dict[str, Any]:
113
117
  """DEC-0017: a job-backed tool's outputSchema is oneOf[result envelope, job handle], self-contained,
114
118
  so structuredContent always conforms; the manifest's capability keeps the pure output schema."""
115
- return {"oneOf": [{"type": "object", "required": list(ENVELOPE_REQUIRED), "properties": {"output": output_schema}},
119
+ return {"type": "object",
120
+ "oneOf": [{"type": "object", "required": list(ENVELOPE_REQUIRED), "properties": {"output": output_schema}},
116
121
  JOB_HANDLE_SCHEMA]}
117
122
 
118
123
 
124
+ def require_object_root(name: str, output_schema: Any) -> None:
125
+ """DEC-0018 (FAC-SEM-023): an outputSchema is rooted at type object. MCP requires it, and a client
126
+ may reject the WHOLE tools/list when one tool's outputSchema is, say, a bare oneOf."""
127
+ if not isinstance(output_schema, dict) or output_schema.get("type") != "object":
128
+ raise InteropError("Tool %s: an outputSchema must have root type \"object\"." % name)
129
+
130
+
119
131
  def is_job_capability(capability: Dict[str, Any]) -> bool:
120
132
  block = (capability.get("extensions") or {}).get(EXTENSION_KEY) or {}
121
133
  return capability.get("job") is True or block.get("job") is True
@@ -125,6 +137,7 @@ def tool_for_capability(capability: Dict[str, Any], input_schema: Dict[str, Any]
125
137
  title: Optional[str] = None) -> Dict[str, Any]:
126
138
  """The MCP tool for one manifest capability: its name, its input schema as it is, derived annotations,
127
139
  and its output schema — wrapped in the job union when the capability is a job (DEC-0017)."""
140
+ require_object_root(capability["name"], output_schema)
128
141
  tool: Dict[str, Any] = {
129
142
  "name": capability["name"],
130
143
  "inputSchema": input_schema,
@@ -391,6 +404,8 @@ class McpToolServer:
391
404
  def add_tool(self, tool: Dict[str, Any], handler: Handler) -> None:
392
405
  if tool["name"] in self.handlers:
393
406
  raise InteropError("Tool %s is served twice." % tool["name"])
407
+ if "outputSchema" in tool:
408
+ require_object_root(tool["name"], tool["outputSchema"])
394
409
  self.tools.append(tool)
395
410
  self.handlers[tool["name"]] = handler
396
411
 
@@ -423,6 +438,13 @@ class McpToolServer:
423
438
  meta = params.get("_meta") or {}
424
439
  span = child_traceparent(meta.get("traceparent"))
425
440
  method = message["method"]
441
+ if method == "initialize":
442
+ asked = params.get("protocolVersion")
443
+ return {"jsonrpc": "2.0", "id": rid, "result": {
444
+ "protocolVersion": asked if asked in HANDSHAKE_REVISIONS else MCP_REVISION,
445
+ "capabilities": {"tools": {"listChanged": False}}, "serverInfo": self.info}}
446
+ if method == "ping":
447
+ return {"jsonrpc": "2.0", "id": rid, "result": {}}
426
448
  if method == "server/discover":
427
449
  return {"jsonrpc": "2.0", "id": rid, "result": {"resultType": "complete", "capabilities": {"tools": {}},
428
450
  "serverInfo": self.info, "_meta": {"traceparent": span}}}
@@ -187,6 +187,9 @@ def make_handler(svc: Service):
187
187
  except fs.ServiceError as exc:
188
188
  return self._send(400, {"error": str(exc)})
189
189
  return self._send(200, page)
190
+ if url.path == "/mcp":
191
+ # No server-to-client stream here: Streamable HTTP says 405 for a GET.
192
+ return self._send(405, {"error": "POST JSON-RPC to /mcp."}, {"Allow": "POST"})
190
193
  if url.path == "/fabric/v1/login":
191
194
  cookie = svc.codes.redeem((query.get("code") or [None])[0])
192
195
  if not cookie:
@@ -5,9 +5,9 @@ license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
5
5
  compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned private fabric-agent-contract checkout. Works without those tools in an explicitly degraded structural-check mode. Ships in one plugin with adapting-projects-to-fabric, whose scripts it reuses.
6
6
  metadata:
7
7
  author: PassionCode.ai
8
- version: "0.5.1"
8
+ version: "0.5.2"
9
9
  contract-version: "0.1.0"
10
- contract-commit: "9cd778eb6f14b977f9a5b4930826f62dc95c5619"
10
+ contract-commit: "2ea54f70c161c8b3bf7ec3c567735c7a2d4ce12f"
11
11
  ---
12
12
 
13
13
  # Creating Fabric-compatible agents
@@ -93,7 +93,7 @@ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/adapt_project.py
93
93
  --schema-base <immutable-base-uri>
94
94
  ```
95
95
 
96
- Pin exactly contract `0.1.0` at commit `9cd778eb6f14b977f9a5b4930826f62dc95c5619` and
96
+ Pin exactly contract `0.1.0` at commit `2ea54f70c161c8b3bf7ec3c567735c7a2d4ce12f` and
97
97
  read the pinned guide before implementing protocol details. If this skill is installed
98
98
  without its sibling, the scaffolder is absent: create the bundle by hand from the pinned
99
99
  contract's `docs/guides/connecting-compatible-agents.md` and mark the structural check
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "passioncode",
4
4
  "displayName": "PassionCode.ai",
5
- "version": "0.1.10",
5
+ "version": "0.1.11",
6
6
  "description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check at session start that keeps the PassionCode.ai skill set current.",
7
7
  "author": {
8
8
  "name": "PassionCode.ai",