@passioncode-ai/passioncode 0.1.4 → 0.1.7

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 (24) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE +150 -17
  3. package/README.md +18 -3
  4. package/SECURITY.md +5 -1
  5. package/family.json +3 -5
  6. package/lib/launcher.js +12 -2
  7. package/package.json +5 -5
  8. package/payload/.claude-plugin/marketplace.json +11 -11
  9. package/payload/manifest.json +28 -23
  10. package/payload/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +4 -4
  11. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +8 -5
  12. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +1 -1
  13. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +5 -5
  14. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +16 -5
  15. package/payload/plugins/observatory-log/.claude-plugin/plugin.json +4 -4
  16. package/payload/plugins/observatory-log/skills/explaining-changes/SKILL.md +2 -2
  17. package/payload/plugins/observatory-log/skills/handling-secrets/SKILL.md +3 -3
  18. package/payload/plugins/observatory-log/skills/tracking-resources/SKILL.md +2 -2
  19. package/payload/plugins/passioncode/.claude-plugin/plugin.json +3 -3
  20. package/payload/plugins/passioncode/hooks/update-check.js +18 -2
  21. package/payload/plugins/passioncode/skills/working-in-passioncode/SKILL.md +200 -0
  22. package/payload/plugins/passioncode/skills/working-in-passioncode/references/publishing.md +76 -0
  23. package/payload/plugins/passioncode/skills/working-in-passioncode/references/releasing.md +97 -0
  24. package/payload/plugins/passioncode/trust.json +3 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,62 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.7 - 2026-09-29
4
+
5
+ - Observatory Log 0.12.3 (Observatory v0.8.2) in the set: source-available license and PassionCode.ai metadata; no behaviour change.
6
+
7
+ ## 0.1.6 - 2026-09-29
8
+
9
+ ### Fixed
10
+
11
+ - **A version published from GitHub is trusted.** npm records a trusted-publishing (OIDC)
12
+ release as `GitHub Actions <npm-oidc-no-reply@github.com>`; the hook read that as an
13
+ unreadable account and would have refused every release the workflow publishes. It is now
14
+ recognised by its email as `github-actions-oidc`, which `trust.json` lists; a look-alike
15
+ name with another email is not. Maintainers are still checked one by one.
16
+ - `vendor.mjs` reads `PASSIONCODE_VENDOR_CLONE` and `PASSIONCODE_GIT_BASE` from the
17
+ environment it is given, so a CI step's clone mode no longer leaks into the tests.
18
+ - The release job waits up to 10 minutes for npm to serve a new version (5 was too short).
19
+
20
+ 0.1.5 was tagged but its release job failed on the leak above; it was never published.
21
+
22
+ ## 0.1.5 - 2026-09-29
23
+
24
+ ### Added
25
+
26
+ - `working-in-passioncode`, a skill in the self plugin: the organisation's working rules —
27
+ the org map, landing, nightly CI and why a blocked run is not green, handoffs,
28
+ decisions, ids and leases, secrets, licensing, the privacy gate, releases and pins —
29
+ reach every contributor's agent instead of living only in org-index. It points to
30
+ org-index as the source of truth; detail is in its `references/releasing.md` and
31
+ `references/publishing.md`. Trigger and scenario evals are in
32
+ `test/evals/working-in-passioncode/`; `test/skill.test.js` holds every self-plugin skill
33
+ to the Agent Skills standard (strict front matter, description budget, references
34
+ linked, no home paths). The hub links it like any member's skill (`status` showed
35
+ `passioncode hub: 0/0` because the self plugin had no skill).
36
+ - Fabric Agent Adapter 0.4.3: source-available license, one contract pin (`a5a2709`),
37
+ neutral examples, and hand-offs to the neighbouring agent-stack and make-skill skills.
38
+
39
+ ### Changed
40
+
41
+ - **License.** The launcher is source-available under
42
+ `PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0`, with a
43
+ commercial license on request (contact@passioncode.ai). Versions up to and including
44
+ v0.1.4 were released under MIT and remain available under it. Contributions come in
45
+ under `CLA.md` (new `CONTRIBUTING.md` and PR template). The payload's marketplace
46
+ lists each member under its own manifest's license instead of a hard-coded `MIT`.
47
+ - `family.json` names no machine paths. Members are cloned from their repositories at
48
+ their tags; a maintainer's local clones are an environment override:
49
+ `PASSIONCODE_CHECKOUT_ROOT=<dir>` reads `<dir>/<repository name>`, and
50
+ `PASSIONCODE_CHECKOUT_<MEMBER>=<path>` names one clone kept under another name. A
51
+ `checkout` key in `family.json` is refused.
52
+
53
+ ### Fixed
54
+
55
+ - `passioncode status` described the payload beside the CLI — from a checkout, whatever
56
+ was last vendored there — instead of what is installed. It now reads the release
57
+ `~/.passioncode/current` points at, reports the payload version separately as
58
+ `package`, and says which it described (`source`).
59
+
3
60
  ## 0.1.4 - 2026-09-29
4
61
 
5
62
  ### Security
package/LICENSE CHANGED
@@ -1,22 +1,155 @@
1
- MIT License
1
+ Copyright (c) 2026 Siarhei Sheleh
2
2
 
3
- Copyright (c) 2026 PassionCode.ai
3
+ This software is source-available, not open source. You may use it under
4
+ either of the two licenses below, at your option:
4
5
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
6
+ 1. PolyForm Noncommercial License 1.0.0
7
+ SPDX: PolyForm-Noncommercial-1.0.0
8
+ 2. PolyForm Internal Use License 1.0.0
9
+ SPDX: LicenseRef-PolyForm-Internal-Use-1.0.0
11
10
 
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
11
+ In short: individuals and noncommercial organisations may use, change and
12
+ share it for noncommercial purposes; any company may use it, and change it,
13
+ for its own internal operations. Distributing it commercially, or building
14
+ this software or its code into a product or service you provide to others,
15
+ needs a separate commercial license: contact@passioncode.ai.
16
+ This summary is not part of either license; the texts below govern.
14
17
 
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
18
+ Versions up to and including v0.1.4 of this repository were released under the MIT
19
+ License; those releases remain available under MIT.
22
20
 
21
+ Required Notice: Copyright (c) 2026 Siarhei Sheleh (https://passioncode.ai)
22
+
23
+ ================================================================================
24
+
25
+ # PolyForm Noncommercial License 1.0.0
26
+
27
+ <https://polyformproject.org/licenses/noncommercial/1.0.0>
28
+
29
+ ## Acceptance
30
+
31
+ In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
32
+
33
+ ## Copyright License
34
+
35
+ The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license).
36
+
37
+ ## Distribution License
38
+
39
+ The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license).
40
+
41
+ ## Notices
42
+
43
+ You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example:
44
+
45
+ > Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
46
+
47
+ ## Changes and New Works License
48
+
49
+ The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
50
+
51
+ ## Patent License
52
+
53
+ The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
54
+
55
+ ## Noncommercial Purposes
56
+
57
+ Any noncommercial purpose is a permitted purpose.
58
+
59
+ ## Personal Uses
60
+
61
+ Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
62
+
63
+ ## Noncommercial Organizations
64
+
65
+ Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
66
+
67
+ ## Fair Use
68
+
69
+ You may have "fair use" rights for the software under the law. These terms do not limit them.
70
+
71
+ ## No Other Rights
72
+
73
+ These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
74
+
75
+ ## Patent Defense
76
+
77
+ If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
78
+
79
+ ## Violations
80
+
81
+ The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
82
+
83
+ ## No Liability
84
+
85
+ ***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
86
+
87
+ ## Definitions
88
+
89
+ The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
90
+
91
+ **You** refers to the individual or entity agreeing to these terms.
92
+
93
+ **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
94
+
95
+ **Your licenses** are all the licenses granted to you for the software under these terms.
96
+
97
+ **Use** means anything you do with the software requiring one of your licenses.
98
+
99
+ ================================================================================
100
+
101
+ # PolyForm Internal Use License 1.0.0
102
+
103
+ <https://polyformproject.org/licenses/internal-use/1.0.0>
104
+
105
+ ## Acceptance
106
+
107
+ In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
108
+
109
+ ## Copyright License
110
+
111
+ The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license), and you may not distribute the software.
112
+
113
+ ## Changes and New Works License
114
+
115
+ The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
116
+
117
+ ## Patent License
118
+
119
+ The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
120
+
121
+ ## Fair Use
122
+
123
+ You may have "fair use" rights for the software under the law. These terms do not limit them.
124
+
125
+ ## Internal Business Use
126
+
127
+ Use of the software for the internal business operations of you and your company is use for a permitted purpose.
128
+
129
+ ## No Other Rights
130
+
131
+ These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
132
+
133
+ ## Patent Defense
134
+
135
+ If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
136
+
137
+ ## Violations
138
+
139
+ The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
140
+
141
+ ## No Liability
142
+
143
+ ***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
144
+
145
+ ## Definitions
146
+
147
+ The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
148
+
149
+ **You** refers to the individual or entity agreeing to these terms.
150
+
151
+ **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
152
+
153
+ **Your licenses** are all the licenses granted to you for the software under these terms.
154
+
155
+ **Use** means anything you do with the software requiring one of your licenses.
package/README.md CHANGED
@@ -13,7 +13,7 @@ npx @passioncode-ai/passioncode@latest update
13
13
  |---|---|
14
14
  | Fabric Agent Adapter | `creating-fabric-agents`, `adapting-projects-to-fabric`, `building-fabric-services` |
15
15
  | Observatory Log | `explaining-changes`, `handling-secrets`, `tracking-resources` (+ its session hooks) |
16
- | passioncode | the once-a-day update check |
16
+ | passioncode | `working-in-passioncode` (the organisation's working rules, for every contributor's agent) and the once-a-day update check |
17
17
 
18
18
  Only PassionCode.ai products are members. Agents that people build for themselves stay
19
19
  out of it, even when they implement Fabric protocols.
@@ -44,7 +44,7 @@ installed ([SECURITY.md](SECURITY.md#the-self-update-and-who-it-trusts)).
44
44
  `npx passioncode config set update.auto off` makes it only say so.
45
45
 
46
46
  ```bash
47
- npx passioncode status # installed version, per-member channels, shadows
47
+ npx passioncode status # the installed release: its members, their channels, shadows
48
48
  npx passioncode update --dry-run
49
49
  npx passioncode uninstall
50
50
  ```
@@ -66,4 +66,19 @@ npx passioncode uninstall
66
66
  (OIDC) or the `NPM_TOKEN` secret; a private member needs `MEMBERS_READ_TOKEN`.
67
67
  By hand, `npm publish` still works: `prepublishOnly` vendors from tags only (`--release`),
68
68
  refuses credential-shaped strings and runs the tests.
69
- 5. `npx @passioncode-ai/passioncode@<version> update` on this machine; restart the agents.
69
+ 5. `npx @passioncode-ai/passioncode@<version> update` on each machine; restart the agents.
70
+
71
+ Vendoring clones every member from its own repository at its tag. A maintainer with
72
+ local clones can point the vendor at them instead — `PASSIONCODE_CHECKOUT_ROOT=<dir>`
73
+ reads a member from `<dir>/<repository name>`, and `PASSIONCODE_CHECKOUT_<MEMBER>=<path>`
74
+ (the member's name upper-cased, `-` as `_`) names one clone kept under another name.
75
+ `PASSIONCODE_VENDOR_CLONE=1` ignores both. `family.json` names no machine paths.
76
+
77
+ ## License
78
+
79
+ Source-available under PolyForm Noncommercial or Internal Use; commercial license on
80
+ request (contact@passioncode.ai). SPDX:
81
+ `PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0` — see
82
+ [LICENSE](LICENSE). Versions up to and including v0.1.4 were released under the MIT
83
+ License and remain available under it. Contributions are accepted under [CLA.md](CLA.md)
84
+ ([CONTRIBUTING.md](CONTRIBUTING.md)).
package/SECURITY.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Security
2
2
 
3
- Report vulnerabilities privately to the maintainers of the `passioncode-ai` organization.
3
+ Report vulnerabilities privately to contact@passioncode.ai. Do not open an issue that
4
+ carries credentials or a working exploit.
4
5
 
5
6
  What `passioncode update` touches: `~/.passioncode/` (releases, state, quarantine,
6
7
  logs); Claude Code's plugin registry through the `claude plugin` CLI only;
@@ -25,6 +26,9 @@ The hook installs a newer version on its own only when all of these hold:
25
26
  - `update.auto` is on (the default);
26
27
  - the recorded maintainers are not empty, and every maintainer **and** the publishing
27
28
  account is listed in `trust.json` inside the plugin (`npmPublishers`);
29
+ a release published by this repository's `release.yml` through npm trusted publishing
30
+ appears as `github-actions-oidc` (npm's `npm-oidc-no-reply@github.com` identity, matched
31
+ by email, never by display name), and only a maintainer can register that workflow;
28
32
  - the version is a plain `x.y.z`.
29
33
 
30
34
  It then runs `npx --yes @passioncode-ai/passioncode@<that exact version> update --quiet`, detached, so
package/family.json CHANGED
@@ -8,8 +8,7 @@
8
8
  "name": "fabric-agent-adapter",
9
9
  "displayName": "Fabric Agent Adapter",
10
10
  "repo": "passioncode-ai/fabric-agent-adapter",
11
- "checkout": "~/DATA/fabric-agent-adapter",
12
- "ref": "v0.4.2",
11
+ "ref": "v0.4.3",
13
12
  "kind": "plugin",
14
13
  "path": "plugins/fabric-agent-adapter",
15
14
  "legacyPluginIds": [
@@ -23,8 +22,7 @@
23
22
  "name": "observatory-log",
24
23
  "displayName": "Observatory Log",
25
24
  "repo": "passioncode-ai/project-observatory-dashboard",
26
- "checkout": "~/DATA/project-observatory-open-source",
27
- "ref": "v0.8.1",
25
+ "ref": "v0.8.2",
28
26
  "kind": "plugin",
29
27
  "path": "observatory/engine/skill/plugins/observatory-log",
30
28
  "legacyPluginIds": [
@@ -39,7 +37,7 @@
39
37
  "displayName": "PassionCode.ai",
40
38
  "kind": "self",
41
39
  "path": "plugin/passioncode",
42
- "description": "Keeps the PassionCode.ai set current: a once-a-day check at session start and a background update."
40
+ "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."
43
41
  }
44
42
  ]
45
43
  }
package/lib/launcher.js CHANGED
@@ -311,11 +311,17 @@ function status({ home, claude = claudeRunner() } = {}) {
311
311
  const state = readJson(p.stateFile, {});
312
312
  let payload = null;
313
313
  try { payload = payloadManifest(); } catch (_) { /* reported as unknown */ }
314
+ // What is installed is the release `current` points at. The payload beside this CLI is
315
+ // only what an update would install — from a checkout it is whatever was last vendored
316
+ // there, so reading members from it described a set that is not on the machine.
317
+ let release = null;
318
+ try { release = payloadManifest(p.current); } catch (_) { /* nothing installed yet */ }
319
+ const described = release || payload;
314
320
  const installed = Object.keys(readJson(path.join(p.claudePlugins, 'installed_plugins.json'), { plugins: {} }).plugins || {});
315
321
  const known = readJson(path.join(p.claudePlugins, 'known_marketplaces.json'), {});
316
322
  let declared = {};
317
323
  try { declared = readSettings(p.claudeSettings).doc.extraKnownMarketplaces || {}; } catch (_) { /* reported by update */ }
318
- const members = (payload ? payload.members : []).map((m) => ({
324
+ const members = (described ? described.members : []).map((m) => ({
319
325
  name: m.name, version: m.version,
320
326
  claude: installed.includes(`${m.name}@${MARKETPLACE}`) ? 'plugin' : (claude.available() ? 'missing' : 'no Claude Code'),
321
327
  legacy: (m.legacyPluginIds || []).filter((id) => installed.includes(id)),
@@ -323,7 +329,11 @@ function status({ home, claude = claudeRunner() } = {}) {
323
329
  hub: m.skills.map((s) => ({ skill: s, ok: linkTarget(path.join(p.hub, s)) === path.join(p.current, 'plugins', m.name, 'skills', s) })),
324
330
  shadows: m.skills.filter((s) => lstat(path.join(p.claudeSkills, s))),
325
331
  }));
326
- return { installed: state.installed || null, latest: state.latest || null, checkedAt: state.checkedAt || null, package: payload ? payload.version : null, auto: (state.config || {}).auto !== false, members };
332
+ return {
333
+ installed: state.installed || (release ? release.version : null), latest: state.latest || null, checkedAt: state.checkedAt || null,
334
+ package: payload ? payload.version : null, source: release ? 'installed' : (payload ? 'package' : null),
335
+ auto: (state.config || {}).auto !== false, members,
336
+ };
327
337
  }
328
338
 
329
339
  function setConfig({ home, key, value }) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@passioncode-ai/passioncode",
3
- "version": "0.1.4",
4
- "description": "Every PassionCode.ai agent skill — Fabric Agent Adapter and Observatory Log — for Claude Code and every other agent on the machine, updated as one set.",
3
+ "version": "0.1.7",
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"
7
7
  },
@@ -21,8 +21,8 @@
21
21
  "scripts": {
22
22
  "vendor": "node scripts/vendor.mjs",
23
23
  "vendor:release": "node scripts/vendor.mjs --release",
24
- "test": "node --test test/",
25
- "prepublishOnly": "node scripts/vendor.mjs --release && node --test test/"
24
+ "test": "node --test 'test/*.test.js'",
25
+ "prepublishOnly": "node scripts/vendor.mjs --release && node --test 'test/*.test.js'"
26
26
  },
27
27
  "engines": {
28
28
  "node": ">=18"
@@ -32,7 +32,7 @@
32
32
  "url": "git+https://github.com/passioncode-ai/passioncode.git"
33
33
  },
34
34
  "homepage": "https://github.com/passioncode-ai/passioncode",
35
- "license": "MIT",
35
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0",
36
36
  "author": {
37
37
  "name": "PassionCode.ai",
38
38
  "url": "https://passioncode.ai/"
@@ -11,37 +11,37 @@
11
11
  "name": "fabric-agent-adapter",
12
12
  "displayName": "Fabric Agent Adapter",
13
13
  "source": "./plugins/fabric-agent-adapter",
14
- "version": "0.4.2",
14
+ "version": "0.4.3",
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
- "name": "passioncode-ai",
18
- "url": "https://github.com/passioncode-ai"
17
+ "name": "PassionCode.ai",
18
+ "url": "https://passioncode.ai/"
19
19
  },
20
- "license": "MIT"
20
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0"
21
21
  },
22
22
  {
23
23
  "name": "observatory-log",
24
24
  "displayName": "Observatory Log",
25
25
  "source": "./plugins/observatory-log",
26
- "version": "0.12.2",
26
+ "version": "0.12.3",
27
27
  "description": "Records what changed in a watched project at the end of every turn, and asks for the one thing a diff cannot contain: why.",
28
28
  "author": {
29
- "name": "Sergey Sheleg",
30
- "url": "https://sshlg.me/"
29
+ "name": "PassionCode.ai",
30
+ "url": "https://passioncode.ai/"
31
31
  },
32
- "license": "MIT"
32
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0"
33
33
  },
34
34
  {
35
35
  "name": "passioncode",
36
36
  "displayName": "PassionCode.ai",
37
37
  "source": "./plugins/passioncode",
38
- "version": "0.1.4",
39
- "description": "Keeps the PassionCode.ai set current: a once-a-day check at session start and a background update.",
38
+ "version": "0.1.7",
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",
42
42
  "url": "https://passioncode.ai/"
43
43
  },
44
- "license": "MIT"
44
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0"
45
45
  }
46
46
  ]
47
47
  }
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "family": "passioncode",
3
- "version": "0.1.4",
3
+ "version": "0.1.7",
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.4.2",
11
- "commit": "e09551f20ed7f1f31179f04d78f04a7bafe46f40",
12
- "version": "0.4.2",
13
- "via": "clone of git@github.com:passioncode-ai/fabric-agent-adapter.git",
10
+ "ref": "v0.4.3",
11
+ "commit": "c1a57abd7889c3aed1b0e97b00d4e089cc53036e",
12
+ "version": "0.4.3",
13
+ "via": "clone of https://***@github.com/passioncode-ai/fabric-agent-adapter.git",
14
14
  "skills": [
15
15
  "adapting-projects-to-fabric",
16
16
  "building-fabric-services",
@@ -22,21 +22,22 @@
22
22
  "legacyMarketplaces": [
23
23
  "fabric-agent-adapter"
24
24
  ],
25
- "contentHash": "sha256:3c231e211672694236563046e90087ec867c562bd82810541d43b9e395198a14",
25
+ "contentHash": "sha256:7074066a0046ac055a6545f44bf2729d316047710e39846ce666b254620aff34",
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
- "name": "passioncode-ai",
29
- "url": "https://github.com/passioncode-ai"
30
- }
28
+ "name": "PassionCode.ai",
29
+ "url": "https://passioncode.ai/"
30
+ },
31
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0"
31
32
  },
32
33
  {
33
34
  "name": "observatory-log",
34
35
  "displayName": "Observatory Log",
35
36
  "repo": "passioncode-ai/project-observatory-dashboard",
36
- "ref": "v0.8.1",
37
- "commit": "c6410a2706e6f2e3fc1e2b7b929bf8c5e116c71b",
38
- "version": "0.12.2",
39
- "via": "clone of git@github.com:passioncode-ai/project-observatory-dashboard.git",
37
+ "ref": "v0.8.2",
38
+ "commit": "4f3591de65cd9a28de18212d53da966405f46f22",
39
+ "version": "0.12.3",
40
+ "via": "clone of https://***@github.com/passioncode-ai/project-observatory-dashboard.git",
40
41
  "skills": [
41
42
  "explaining-changes",
42
43
  "handling-secrets",
@@ -48,30 +49,34 @@
48
49
  "legacyMarketplaces": [
49
50
  "observatory-log"
50
51
  ],
51
- "contentHash": "sha256:6884e0c97f0c5da4030c5104905d8d42fed113981f8b9d4254f96000597c2159",
52
+ "contentHash": "sha256:0ddb7efdfd9977c55d65e58a3cd8dc9cb9da3b8eb9ab02c83e3a159ea233017b",
52
53
  "description": "Records what changed in a watched project at the end of every turn, and asks for the one thing a diff cannot contain: why.",
53
54
  "author": {
54
- "name": "Sergey Sheleg",
55
- "url": "https://sshlg.me/"
56
- }
55
+ "name": "PassionCode.ai",
56
+ "url": "https://passioncode.ai/"
57
+ },
58
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0"
57
59
  },
58
60
  {
59
61
  "name": "passioncode",
60
62
  "displayName": "PassionCode.ai",
61
63
  "repo": "passioncode-ai/passioncode",
62
- "ref": "v0.1.4",
64
+ "ref": "v0.1.7",
63
65
  "commit": null,
64
- "version": "0.1.4",
66
+ "version": "0.1.7",
65
67
  "via": "this repository",
66
- "skills": [],
68
+ "skills": [
69
+ "working-in-passioncode"
70
+ ],
67
71
  "legacyPluginIds": [],
68
72
  "legacyMarketplaces": [],
69
- "contentHash": "sha256:89449784f0e3917e29c3641b8d40ecedc956b4296111d2680290b9daca9218f5",
70
- "description": "Keeps the PassionCode.ai set current: a once-a-day check at session start and a background update.",
73
+ "contentHash": "sha256:9c7431ba81678924da9764acfb828c1f6714c24facfc5aed69cb31eee413e7d1",
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.",
71
75
  "author": {
72
76
  "name": "PassionCode.ai",
73
77
  "url": "https://passioncode.ai/"
74
- }
78
+ },
79
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0"
75
80
  }
76
81
  ]
77
82
  }
@@ -3,14 +3,14 @@
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.4.2",
6
+ "version": "0.4.3",
7
7
  "author": {
8
- "name": "passioncode-ai",
9
- "url": "https://github.com/passioncode-ai"
8
+ "name": "PassionCode.ai",
9
+ "url": "https://passioncode.ai/"
10
10
  },
11
11
  "homepage": "https://github.com/passioncode-ai/fabric-agent-adapter",
12
12
  "repository": "https://github.com/passioncode-ai/fabric-agent-adapter",
13
- "license": "MIT",
13
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0",
14
14
  "keywords": [
15
15
  "fabric",
16
16
  "agent",
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: adapting-projects-to-fabric
3
3
  description: Use when adapting an existing agent, MCP server, A2A peer, HTTP service, or terminal CLI to the Fabric Agent Contract—choosing MCP/A2A/local-runner, scaffolding a provider bundle, or checking Fabric compatibility; also for «подключить проект к Fabric» or «сделать агента совместимым с Fabric». NOT for building the Fabric host/orchestrator, configuring an MCP client, or a brand-new agent — that is creating-fabric-agents.
4
- license: MIT
4
+ 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
- author: passioncode-ai
8
- version: "0.4.2"
7
+ author: PassionCode.ai
8
+ version: "0.4.3"
9
9
  contract-version: "0.1.0"
10
- contract-commit: "20a818e648a4c09a60df0126d11626922e8b9094"
10
+ contract-commit: "a5a27092ba0dcc5facfbeae8b359146dfb403e9a"
11
11
  ---
12
12
 
13
13
  # Adapting projects to Fabric
@@ -22,6 +22,9 @@ Use this skill to adapt or assess a provider project. Do not use it to:
22
22
 
23
23
  - design the Fabric host, registry, scheduler, admission service, or project binding runtime;
24
24
  - add an MCP server to Claude Code, Codex, or an agent gateway;
25
+ - answer wire-level MCP or A2A questions (transports, sessions, auth handshakes, task
26
+ states on the wire) — that is `agent-interop` (agent-stack); the pinned contract stays
27
+ normative for what Fabric requires;
25
28
  - design a new agent from scratch — that is the sibling skill creating-fabric-agents;
26
29
  - claim admission merely because generated files or a valid manifest exist.
27
30
 
@@ -67,7 +70,7 @@ Use exactly:
67
70
 
68
71
  - contract version `0.1.0`;
69
72
  - repository `https://github.com/passioncode-ai/fabric-agent-contract`;
70
- - commit `20a818e648a4c09a60df0126d11626922e8b9094`.
73
+ - commit `a5a27092ba0dcc5facfbeae8b359146dfb403e9a`.
71
74
 
72
75
  Read the pinned contract's guide
73
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 = "20a818e648a4c09a60df0126d11626922e8b9094"
19
+ CONTRACT_COMMIT = "a5a27092ba0dcc5facfbeae8b359146dfb403e9a"
20
20
  MCP_REVISION = "2026-07-28"
21
21
  A2A_VERSION = "1.0"
22
22
  LOCAL_VERSION = "fabric-local-runner/0.1"
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: building-fabric-services
3
3
  description: >-
4
- Use when building or running an agent as a long-lived local service with a dashboard on the
5
- operator's Mac — «сделай агенту дашборд», «локальный сервис агента», «дашборд должен всегда
4
+ Use when building or running an agent as a long-lived local service with a dashboard on
5
+ a macOS machine — «сделай агенту дашборд», «локальный сервис агента», «дашборд должен всегда
6
6
  работать и не плодить копии», «где агенту хранить настройки», «подключи агента к Fabric
7
7
  Dashboards», "make this agent a local service", "always-on dashboard", "fabric-service
8
8
  protocol", "add the well-known endpoint", "migrate a service to fabric-service". Covers the
@@ -11,11 +11,11 @@ description: >-
11
11
  descriptor, the well-known document, the events feed and notifications; ships Python and Node
12
12
  reference kits and a live conformance probe. NOT for a one-off script or cron job, a hosted
13
13
  SaaS, the provider manifest itself (adapting-projects-to-fabric), or building Fabric Dashboards.
14
- license: MIT
14
+ 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
- author: passioncode-ai
18
- version: "0.4.2"
17
+ author: PassionCode.ai
18
+ version: "0.4.3"
19
19
  contract-version: "0.1.0"
20
20
  extension: "fabric-service/0.1"
21
21
  extension-commit: "a5a27092ba0dcc5facfbeae8b359146dfb403e9a"
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: creating-fabric-agents
3
3
  description: Use when designing and building a NEW agent or provider that must be Fabric-compatible from its first commit — «создай агента, совместимого с фабрикой Passion Code», «новый агент под Fabric», "create a fabric-compatible agent", "build a new Fabric provider", "fabric-ready agent from scratch". Runs the intake grill (capability, named consumer, workflow-or-agent, MCP/A2A/local-runner profile, effect declarations), distils source projects into a knowledge pack whose recorded failures become planted eval fixtures, scaffolds the pinned contract bundle, and sets the two-clock eval expectation with the conformance report. NOT for adapting an existing project (use adapting-projects-to-fabric), building the Fabric host or orchestrator, or generic agent design where Fabric compatibility is not part of the request.
4
- license: MIT
4
+ 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
- author: passioncode-ai
8
- version: "0.4.2"
7
+ author: PassionCode.ai
8
+ version: "0.4.3"
9
9
  contract-version: "0.1.0"
10
- contract-commit: "20a818e648a4c09a60df0126d11626922e8b9094"
10
+ contract-commit: "a5a27092ba0dcc5facfbeae8b359146dfb403e9a"
11
11
  ---
12
12
 
13
13
  # Creating Fabric-compatible agents
@@ -30,6 +30,17 @@ Use this skill to design and build a new provider. Do not use it to:
30
30
  - claim admission: the deliverable is an admission-ready provider bundle, never a
31
31
  connected provider.
32
32
 
33
+ ## Handing off to neighbouring skills
34
+
35
+ - The agent's own loop — tool calls, routing and fallback, memory, sub-agents — is
36
+ designed with `agent-orchestrator` (agent-stack).
37
+ - Its eval suite beyond the step-2 observables — trajectories, judges, regression
38
+ fixtures from traces — is built with `agent-evals` (agent-stack).
39
+ - Packaging the agent as an Agent Skill or Claude Code plugin goes through `make-skill`.
40
+
41
+ When one of them is not installed, do that part by hand against its own documentation
42
+ and say in the report which skill was missing.
43
+
33
44
  ## Step 0 — the intake grill
34
45
 
35
46
  No file is created until every row has an answer. An answer of "later" fails the grill.
@@ -82,7 +93,7 @@ python3 <plugin-dir>/skills/adapting-projects-to-fabric/scripts/adapt_project.py
82
93
  --schema-base <immutable-base-uri>
83
94
  ```
84
95
 
85
- Pin exactly contract `0.1.0` at commit `20a818e648a4c09a60df0126d11626922e8b9094` and
96
+ Pin exactly contract `0.1.0` at commit `a5a27092ba0dcc5facfbeae8b359146dfb403e9a` and
86
97
  read the pinned guide before implementing protocol details. If this skill is installed
87
98
  without its sibling, the scaffolder is absent: create the bundle by hand from the pinned
88
99
  contract's `docs/guides/connecting-compatible-agents.md` and mark the structural check
@@ -3,11 +3,11 @@
3
3
  "name": "observatory-log",
4
4
  "displayName": "Observatory Log",
5
5
  "description": "Records what changed in a watched project at the end of every turn, and asks for the one thing a diff cannot contain: why.",
6
- "version": "0.12.2",
7
- "license": "MIT",
6
+ "version": "0.12.3",
7
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0",
8
8
  "author": {
9
- "name": "Sergey Sheleg",
10
- "url": "https://sshlg.me/"
9
+ "name": "PassionCode.ai",
10
+ "url": "https://passioncode.ai/"
11
11
  },
12
12
  "homepage": "https://github.com/passioncode-ai/project-observatory-dashboard",
13
13
  "keywords": [
@@ -13,9 +13,9 @@ description: >-
13
13
  message, a PR description or a changelog, and NOT for changing the typed
14
14
  registry — a registry change is `observatory_propose`, which is a different
15
15
  decision with different evidence.
16
- license: MIT
16
+ license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
17
17
  metadata:
18
- version: "0.12.2"
18
+ version: "0.12.3"
19
19
  compatibility: >-
20
20
  Requires an initialized full Project Observatory installation to persist
21
21
  records. Uses its MCP server when available in the current host; the bundled
@@ -7,9 +7,9 @@ description: >-
7
7
  Keeps credential values out of prompts and command arguments, uses named slots,
8
8
  and records changes without copying values into reports. NOT for granting
9
9
  provider permissions or choosing a project's authentication architecture.
10
- license: MIT
10
+ license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
11
11
  metadata:
12
- version: "0.12.2"
12
+ version: "0.12.3"
13
13
  compatibility: >-
14
14
  Requires an initialized full Project Observatory installation, Python 3.11+
15
15
  and local shell access on macOS or Linux. Provider operations additionally
@@ -29,7 +29,7 @@ names. Never ask the user to paste a credential into the conversation.
29
29
  2. Select the user's initialized `OBSERVATORY_HOME`. Run
30
30
  `python3 "$OBSERVATORY_ROOT/observatory.py" doctor`. A missing workspace
31
31
  needs the documented onboarding before secret operations.
32
- 3. Run `python3 "$OBSERVATORY_ROOT/tools/skill_check.py" handling-secrets 0.12.2`.
32
+ 3. Run `python3 "$OBSERVATORY_ROOT/tools/skill_check.py" handling-secrets 0.12.3`.
33
33
  If stale, read the installed skill once and follow its compatible commands.
34
34
  Do not turn an unavailable version check into a retry loop.
35
35
  4. Inspect names using `tools/use_secret.py names PROJECT` or `tools/vault.py
@@ -13,9 +13,9 @@ description: >-
13
13
  figma-use), wiring analytics or pixels (ad-tracking), provisioning the resource
14
14
  with the provider's own tools, secrets (handling-secrets) or code changes inside
15
15
  the repository.
16
- license: MIT
16
+ license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
17
17
  metadata:
18
- version: "0.12.2"
18
+ version: "0.12.3"
19
19
  compatibility: >-
20
20
  Requires a full Project Observatory installation with organizations.json
21
21
  configured; the observatory MCP server or its local CLI. Creating the resource
@@ -2,12 +2,12 @@
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.4",
6
- "description": "Keeps the PassionCode.ai skill set current: a once-a-day check at session start and a background update.",
5
+ "version": "0.1.7",
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",
9
9
  "url": "https://passioncode.ai/"
10
10
  },
11
11
  "homepage": "https://github.com/passioncode-ai/passioncode",
12
- "license": "MIT"
12
+ "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0"
13
13
  }
@@ -15,6 +15,22 @@ const PACKAGE = '@passioncode-ai/passioncode';
15
15
  const VERSION = /^\d+\.\d+\.\d+$/;
16
16
  const TRUST_FILE = path.join(__dirname, '..', 'trust.json');
17
17
 
18
+ /**
19
+ * The identity npm records for a version published by GitHub Actions through trusted
20
+ * publishing (OIDC). Recognised by its email, never by the display name, which any account
21
+ * can copy. Only a maintainer can register a trusted publisher, and maintainers are still
22
+ * checked one by one, so listing this in trust.json trusts the release workflow the
23
+ * maintainers configured, not GitHub at large.
24
+ */
25
+ const OIDC_PUBLISHER = 'github-actions-oidc';
26
+ const OIDC_EMAIL = 'npm-oidc-no-reply@github.com';
27
+
28
+ function publisherName(entry) {
29
+ const email = entry && typeof entry === 'object' ? entry.email : (String(entry || '').match(/<([^>]*)>/) || [])[1];
30
+ if (typeof email === 'string' && email.trim().toLowerCase() === OIDC_EMAIL) return OIDC_PUBLISHER;
31
+ return accountName(entry);
32
+ }
33
+
18
34
  /** `name <email>`, `{ name, email }` or `name` → the npm account name, lowercased. */
19
35
  function accountName(entry) {
20
36
  const raw = entry && typeof entry === 'object' ? entry.name : entry;
@@ -47,7 +63,7 @@ function parseView(stdout, error) {
47
63
  latest,
48
64
  // An entry that is not a readable account name poisons the list: it cannot be trusted.
49
65
  maintainers: maintainers.includes(null) ? [] : maintainers,
50
- publisher: doc._npmUser ? accountName(doc._npmUser) : null,
66
+ publisher: doc._npmUser ? publisherName(doc._npmUser) : null,
51
67
  };
52
68
  }
53
69
 
@@ -123,4 +139,4 @@ function decide(state, trust, now = Date.now()) {
123
139
  return { lines, spawn, stateChanges };
124
140
  }
125
141
 
126
- module.exports = { PACKAGE, TRUST_FILE, accountName, parseView, recordProbe, loadTrust, newer, decide };
142
+ module.exports = { PACKAGE, OIDC_PUBLISHER, TRUST_FILE, accountName, parseView, recordProbe, loadTrust, newer, decide };
@@ -0,0 +1,200 @@
1
+ ---
2
+ name: working-in-passioncode
3
+ description: >-
4
+ Use when working in any passioncode-ai repository — "work on a PassionCode repo", "open a PR
5
+ in passioncode-ai", "release", "tag a version", "which repo owns this", "bump the contract
6
+ pin", "publish this to the public repo", "what license do we use", «работаю в репозитории
7
+ PassionCode», «как тут принято», «где записать решение», «как выпустить релиз». Covers the org
8
+ map, landing (protected and unprotected main, fast-forward, never force-push shared work,
9
+ never touch another session's work), nightly CI and why a blocked run is not green,
10
+ handoffs, decisions, ids and leases, secrets, licensing (source-available, CLA, MIT
11
+ schemas), the privacy gate before anything goes public, and releases, versions and pins;
12
+ org-index stays the source of truth. NOT for product UX, visual design or copy (super-ux,
13
+ sheleg-design, copywriting), building Fabric agents or services (the fabric-agent-adapter
14
+ skills), or repositories outside passioncode-ai.
15
+ license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
16
+ compatibility: Any agent that can read files and run git. The gh CLI and a clone of passioncode-ai/org-index make the checks exact; without them follow the fallbacks in the body.
17
+ metadata:
18
+ author: PassionCode.ai
19
+ ---
20
+
21
+ # Working in PassionCode repositories
22
+
23
+ The rules of the `passioncode-ai` organisation live in one place:
24
+ [org-index](https://github.com/passioncode-ai/org-index) (private; every member can
25
+ read it) — `README.md` for the map, `RULES.md` for the rules, `ONBOARDING.md` for a new
26
+ machine. This skill is the checklist that makes those rules reach you while you work.
27
+ It summarises; it does not replace. Where it and org-index disagree, **org-index wins**;
28
+ where a repository's own `AGENTS.md` is stricter, **that file wins**.
29
+
30
+ ## 1. Before the first edit
31
+
32
+ 1. Read the repository's `AGENTS.md` (its `CLAUDE.md` imports it). It names the role,
33
+ the test command and any local rule.
34
+ 2. Find who owns what you are about to change: the table in org-index `README.md`,
35
+ generated from `repositories.json`. Do not guess an owner from a directory name.
36
+ 3. `git fetch origin`, then work in a worktree from `origin/main` on your own branch
37
+ (`<who>/<topic>`, e.g. `agent/engine-update`):
38
+ `git worktree add ../<repo>-<topic> -b <who>/<topic> origin/main`.
39
+ Checkouts are shared by several sessions; never switch, reset, stash or check out
40
+ over one.
41
+ 4. An unmerged branch or a dirty tree you did not create is someone's work in
42
+ progress. Leave it; ask before touching it.
43
+
44
+ No org-index clone: `gh repo clone passioncode-ai/org-index`. No access at all: say so,
45
+ follow the repository's `AGENTS.md`, and name that you worked from it alone.
46
+
47
+ ## 2. Landing on main
48
+
49
+ | `main` is | Land by |
50
+ |---|---|
51
+ | protected (today only `project-observatory-dashboard`) | a PR; the required checks green (three OS/Python combinations); linear history |
52
+ | unprotected (every other repository) | a PR, or a fast-forward push after the repository's local gate passes |
53
+
54
+ - Private repositories are on GitHub's free plan, which cannot protect a branch. The
55
+ rules hold there **on your word**.
56
+ - A fast-forward means `git push origin HEAD:main` succeeds without `--force`. If
57
+ `main` moved, rebase your own branch, re-run the gate, then push.
58
+ - Never force-push `main`, and never force-push a branch someone else has built on.
59
+ - Never put a merge commit on top of someone else's unpushed work.
60
+ - Release tags `vX.Y.Z` and contract tags `rev-N` never move. A mistake gets a new
61
+ version.
62
+ - Commit subjects: imperative, at most 72 characters. An agent's commit ends with a
63
+ `Co-Authored-By:` trailer naming the model.
64
+
65
+ ## 3. Tests and CI
66
+
67
+ - **The local gate is the gate.** Run the repository's test command (its `AGENTS.md`,
68
+ and the `test` field in `repositories.json`) before you push, and report each
69
+ command with its exit code.
70
+ - Hosted CI runs **nightly at 23:00 Europe/Warsaw** on the default branch, not on every
71
+ push. Dispatch a hosted run by hand only for an urgent candidate; never restore
72
+ per-push triggers.
73
+ - **No CI result is not a green result.** Actions for the organisation's private
74
+ repositories are held by the spending cap: a job that "failed in 3 s" never started.
75
+ Read the annotation (`gh api repos/<owner>/<repo>/check-runs/<job-id>/annotations`)
76
+ and report the run as blocked, never as passing.
77
+
78
+ ## 4. Handoffs, decisions, ids and leases
79
+
80
+ - **Every task leaves a tracked handoff** in the owning repository:
81
+ `docs/handoffs/<date>-<topic>.md` or `docs/runs/<date>-<topic>/README.md`. It states
82
+ the objective, what was done, what is open, the decisions taken, the checks actually
83
+ run (command and exit code) and **the exact next task**. Work across repositories
84
+ keeps one index in org-index `docs/runs/`, naming each repository, branch and commit.
85
+ - **Decisions.** Cross-repository ones go in `fabric/docs/adr/`; a repository's own in
86
+ its `docs/adr/` or `docs/DECISIONS.md`. Records are append-only; a reversal is a new
87
+ record.
88
+ - **Ids.** In a repository with `.claude/agent-sync.json`, reserve an id before writing
89
+ it: `agent_sync.py reserve <REGISTER>` (for example `ADR` in fabric). Reading the
90
+ "next free id" line is not reserving it — two agents read the same number.
91
+ - **Leases.** `fabric` and `fabric-agent-contract` guard shared files (their
92
+ `docs/AGENT_SYNC.md` lists them) under a git lease, a ref under
93
+ `refs/agent-sync/leases/` on `origin`, so both machines see it. `acquire` → edit →
94
+ `release`, on every path, failure included.
95
+ - **Receipts.** A claim that will be read as true carries `file:line`, a command and
96
+ its output, or a test name. Documentation changes in the same change as the
97
+ behaviour it describes.
98
+
99
+ agent-sync missing: `npx @ssheleg/agent-sync install`. If it cannot be installed, do
100
+ not edit a guarded file — say which file and why you stopped.
101
+
102
+ ## 5. Secrets
103
+
104
+ - Never in Git, a chat message, an issue, a command argument, a URL query string or a
105
+ log. `.env*` files are gitignored everywhere.
106
+ - Each machine keeps its own credentials; nothing is copied from one person's machine
107
+ to another's. The operator issues a scoped credential when one is shared.
108
+ - A leaked value is rotated **and** the leak is recorded; deleting the message is not
109
+ enough. With the Observatory plugin installed, its `handling-secrets` skill does this
110
+ by slot name without printing the value.
111
+
112
+ ## 6. Licensing — say it exactly
113
+
114
+ | Products | License |
115
+ |---|---|
116
+ | `fabric-switchboard`, `project-observatory-dashboard`, `fabric-dashboards`, and the contributor tools (`passioncode`, `fabric-agent-adapter`) | `PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0`; a commercial license on request (contact@passioncode.ai) |
117
+ | `project-observatory-contract` (the schemas) | MIT, so anyone can implement them |
118
+
119
+ - Call these products **source-available**, never "open source", "open-source" or
120
+ "MIT". The short line: "Source-available under PolyForm Noncommercial or Internal
121
+ Use; commercial license on request."
122
+ - Versions already released under MIT stay MIT, and each `LICENSE` names the last one.
123
+ Never claim otherwise.
124
+ - Contributions are accepted under the repository's `CLA.md`; the PR template carries
125
+ the "I agree to CLA.md" box.
126
+ - The PolyForm texts are verbatim; never edit them.
127
+
128
+ Read [publishing](references/publishing.md) when adding or changing a license, a
129
+ manifest's `license` field, `CLA.md` or a PR template.
130
+
131
+ ## 7. Before anything goes public
132
+
133
+ A public repository, the site, the organisation profile, an npm tarball or a release
134
+ note is public. Before it ships:
135
+
136
+ - Run the repository's privacy gate. The engine's is
137
+ `python3 tools/check_public_release.py`; a name published on purpose goes in
138
+ `tools/public-identifiers.json` **with a reason** — a review decision, never a way to
139
+ silence a finding.
140
+ - **The operator's personal agents never appear** on PassionCode.ai surfaces, examples,
141
+ evals, docs or families. Use neutral names such as `example-agent`. The launcher's
142
+ members are PassionCode.ai products only.
143
+ - No absolute home paths (`/Users/<name>/…`, the operator's own project root) in code,
144
+ tests or public documents. Those in existing documents are the operator's layout,
145
+ not requirements.
146
+ - Product metadata names **PassionCode.ai** (`https://passioncode.ai/`) as author, not a
147
+ person. Security reports go to contact@passioncode.ai (and GitHub private
148
+ vulnerability reporting where a public repository offers it).
149
+
150
+ Read [publishing](references/publishing.md) before a first public release or a change
151
+ to a public surface.
152
+
153
+ ## 8. Releases, versions and pins
154
+
155
+ - One version, everywhere: every manifest, the plugin and the top `CHANGELOG.md` entry
156
+ move together. Each repository's validator or test holds them in sync.
157
+ - A pushed `v*` tag can **publish to npm**: the launcher's and the adapter's
158
+ `release.yml` publish when the repository variables `RELEASE_ENABLED` and
159
+ `PUBLISH_NPMJS` are `true`. Check `gh variable list -R passioncode-ai/<repo>` before
160
+ pushing a tag; publishing is a release decision, not a side effect.
161
+ - **Engine** (`project-observatory-dashboard`): contributors send PRs; releases are cut
162
+ with the maintainer's release tooling, which is maintainer-only. Machines then run
163
+ `project-observatory full update --check` and `--apply`.
164
+ - **Launcher** (`passioncode`): members are tagged first, `family.json` refs point at
165
+ those tags, the payload is vendored from tags only.
166
+ - **Contract pins.** `fabric-agent-contract` has no tags, so consumers pin commits, and
167
+ the pins disagree (org-index `BACKLOG.md` X-4). Move a pin only in a release of the
168
+ consumer, and only when its own validation passes against the new commit.
169
+
170
+ Read [releasing](references/releasing.md) for the step-by-step of each repository's
171
+ release.
172
+
173
+ ## 9. Which skill does what here
174
+
175
+ The table in org-index `README.md` → "What an agent uses for each infrastructure
176
+ project" is the map: the Observatory plugin `observatory-log` (`explaining-changes`,
177
+ `handling-secrets`, `tracking-resources`), the `fabric-agent-adapter` plugin
178
+ (`creating-fabric-agents`, `adapting-projects-to-fabric`, `building-fabric-services`),
179
+ `agent-sync` for leases, and `maintaining-fabric-workspace` inside a fabric checkout.
180
+ What the product does for its users, how it looks and how it reads are not this
181
+ skill's: `super-ux`, `sheleg-design` and `copywriting`.
182
+
183
+ ## Gotchas
184
+
185
+ - A private repository's hosted job "failed" in seconds: that is the spending cap, not
186
+ a test failure — and not a pass either.
187
+ - With the release variables on, re-running an old release workflow once Actions is
188
+ back **publishes that old tag to npm**. Decide before re-running.
189
+ - On macOS the system `python3` is 3.9, too old for the Observatory. Use a current
190
+ Python (`ONBOARDING.md` §2).
191
+ - `gh auth status` can report an invalid token while `git` over SSH works. Attempt the
192
+ operation before calling it blocked.
193
+ - A sentence that says "on this Mac" or names `~/…` in someone's document describes
194
+ the operator's machine. Do not copy it into yours.
195
+
196
+ ## Completion format
197
+
198
+ Report: the repository and branch; the landed commit or the PR URL; each gate command
199
+ with its exit code; the hosted CI state (ran, blocked, or nightly pending); the handoff
200
+ path; and the one next task.
@@ -0,0 +1,76 @@
1
+ # Publishing and licensing in passioncode-ai
2
+
3
+ Load this before a first public release, a change to a public surface (a public
4
+ repository, the site, the organisation profile, an npm package, a release note), or any
5
+ change to a license, a manifest's `license` field, `CLA.md` or a PR template.
6
+
7
+ ## Contents
8
+
9
+ - The license, file by file
10
+ - Wording
11
+ - The privacy gate
12
+ - Names, paths and authorship
13
+
14
+ ## The license, file by file
15
+
16
+ The source-available expression is
17
+ `PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0`; a commercial
18
+ license is offered on request at contact@passioncode.ai. The schemas in
19
+ `project-observatory-contract` are MIT instead. To relicense a repository, copy the
20
+ `LICENSE` of one already relicensed (this launcher's, for instance) and change only the
21
+ MIT-history sentence — the copyright line and the Required Notice stay as they are.
22
+
23
+ | File | What it carries |
24
+ |---|---|
25
+ | `LICENSE` | the copyright line, the two licenses, a one-paragraph summary marked as not part of either license, one sentence naming which earlier releases stay MIT, the Required Notice, then both PolyForm texts verbatim |
26
+ | `CLA.md` | the contributor license agreement, at the repository root |
27
+ | `CONTRIBUTING.md` | says contributions are accepted under `CLA.md` |
28
+ | `.github/pull_request_template.md` | a checkbox "I agree to CLA.md"; any existing template content is kept |
29
+ | `package.json` | `"license"` set to the SPDX expression |
30
+ | `.claude-plugin/plugin.json`, marketplace entries | `"license"` set to the SPDX expression |
31
+ | SKILL.md front matter | `license:` set to the SPDX expression |
32
+ | `pyproject.toml` | `license` as an SPDX expression (PEP 639), which needs `setuptools>=77` in `build-system` |
33
+ | `Cargo.toml` | `license-file = "LICENSE"` instead of `license`, and `publish = false` |
34
+
35
+ - The PolyForm texts are copied verbatim. Never edit, abridge or "fix" them.
36
+ - The MIT sentence names the real last MIT release — for example "Versions up to and
37
+ including v0.8.1 of this repository were released under the MIT License; those
38
+ releases remain available under MIT." For a repository with no release: "Commits
39
+ before <sha> …".
40
+ - A published MIT release stays MIT. Never write that it changed.
41
+
42
+ ## Wording
43
+
44
+ - The products are **source-available**. Never "open source", "open-source" or "MIT"
45
+ for them — in a README, the site, the profile, a description or JSON-LD.
46
+ - The short line: "Source-available under PolyForm Noncommercial or Internal Use;
47
+ commercial license on request."
48
+ - The tagline is "The agent-agnostic operating system for AI-native teams." and "A
49
+ toolkit for AI-native teams."; the category line is "From vibe coding to passion
50
+ coding."
51
+
52
+ ## The privacy gate
53
+
54
+ - The engine's gate: `python3 tools/check_public_release.py`. It scans the tree and
55
+ the blob history and prints categories and counts, never the matched values. The
56
+ maintainer adds `--private-denylist <local file>`; that list is never committed, never
57
+ copied into a repository and never printed.
58
+ - A name that is published on purpose goes in `tools/public-identifiers.json` with a
59
+ reason. Adding one is a review decision.
60
+ - Other public repositories run the checks their own `AGENTS.md` names. Where there is
61
+ none, grep your change for home paths, host names and personal names before pushing.
62
+
63
+ ## Names, paths and authorship
64
+
65
+ - The operator's personal agents never appear on PassionCode.ai surfaces, examples,
66
+ evals, docs or the launcher's member list. Examples use neutral names:
67
+ `example-agent`, `alpha-web`, `beta-api`, `example.com`.
68
+ - No absolute home paths in code, tests or public documents. Read the ones in older
69
+ documents as the operator's layout.
70
+ - Product metadata: author and owner **PassionCode.ai**, URL `https://passioncode.ai/`.
71
+ The site names the author by first name only; do not add full names or biographies to
72
+ product surfaces.
73
+ - Public documents do not link private repositories. org-index may be linked for the
74
+ map and the rules only.
75
+ - Security and conduct contact: contact@passioncode.ai, plus GitHub private
76
+ vulnerability reporting on a public repository.
@@ -0,0 +1,97 @@
1
+ # Releasing in passioncode-ai
2
+
3
+ Load this when you cut a release, bump a version, move a pin or tag anything. Each
4
+ repository's own `README.md` and `AGENTS.md` hold the exact commands; this file is the
5
+ shape they share and the order that matters.
6
+
7
+ ## Contents
8
+
9
+ - Rules for every release
10
+ - The launcher (`passioncode`)
11
+ - The adapter (`fabric-agent-adapter`)
12
+ - The engine (`project-observatory-dashboard`)
13
+ - Contract pins
14
+ - After a release
15
+
16
+ ## Rules for every release
17
+
18
+ 1. The local gate is green **before** the tag: the repository's test command, its
19
+ validator, and `claude plugin validate <dir> --strict` for every plugin it ships.
20
+ 2. Every version field moves together: `package.json`, `.claude-plugin/plugin.json`,
21
+ `.claude-plugin/marketplace.json`, SKILL.md `metadata.version` where present, and the
22
+ top `CHANGELOG.md` entry. A validator or test in each repository holds them in sync.
23
+ 3. Land first, then tag the commit on `main`. A tag pushed without its branch is a
24
+ release that a fresh clone cannot reach.
25
+ 4. A tag never moves. If `vX.Y.Z` exists — even on a commit you would not have chosen —
26
+ the next release is `vX.Y.Z+1`. Check with `git ls-remote --tags origin`.
27
+ 5. Before pushing a `v*` tag, read `gh variable list -R passioncode-ai/<repo>`. With
28
+ `RELEASE_ENABLED` and `PUBLISH_NPMJS` both `true`, the tag publishes to npm as soon as
29
+ Actions runs — including a re-run after the spending cap is lifted.
30
+ 6. A GitHub release carries the version's CHANGELOG section:
31
+ `gh release create vX.Y.Z --title "vX.Y.Z" --notes-file <section>`.
32
+ 7. Write the handoff (objective, done, open, decisions, checks with exit codes, next
33
+ task) in the same change.
34
+
35
+ ## The launcher (`passioncode`)
36
+
37
+ 1. Tag every member at the version to ship, in its own repository.
38
+ 2. Set each member's `ref` in `family.json` to that tag. A member whose own release has
39
+ not happened yet keeps its old ref; the integrator moves it later.
40
+ 3. Bump `package.json` and `plugin/passioncode/.claude-plugin/plugin.json`, add the
41
+ CHANGELOG section.
42
+ 4. Vendor from tags only, from the member repositories rather than local checkouts:
43
+ `PASSIONCODE_VENDOR_CLONE=1 npm run vendor:release`.
44
+ 5. `claude plugin validate ./payload --strict`, then the same for each
45
+ `./payload/plugins/<member>`; `npm test`.
46
+ 6. Land on `main` (fast-forward), tag, push the tag.
47
+ 7. Installing the new set on a machine (`passioncode update`) is the integrator's step,
48
+ not the releaser's.
49
+
50
+ `payload/` is generated and never committed. A local checkout is used for a member only
51
+ when `PASSIONCODE_CHECKOUT_ROOT` (or a per-member `PASSIONCODE_CHECKOUT_<MEMBER>`)
52
+ points at one; otherwise the member is shallow-cloned at its tag.
53
+
54
+ ## The adapter (`fabric-agent-adapter`)
55
+
56
+ The README section "Validate this repository" is the gate:
57
+
58
+ ```bash
59
+ python3 -m unittest discover -s test -v
60
+ python3 test/validate.py
61
+ node --test 'test/*.test.js'
62
+ claude plugin validate ./plugins/fabric-agent-adapter --strict
63
+ claude plugin validate . --strict
64
+ ```
65
+
66
+ `test/validate.py` carries the version it expects (`VERSION`); bump it with the
67
+ manifests. Trigger and scenario evals change before the instructional prose they test.
68
+
69
+ ## The engine (`project-observatory-dashboard`)
70
+
71
+ - Contributors open PRs; `main` is protected and requires the three OS/Python checks.
72
+ - The release itself — build, sign-off, wheel, `SHA256SUMS` — is cut by the maintainer's
73
+ release tooling, which is maintainer-only. Do not reconstruct it.
74
+ - The privacy gate runs before every public release:
75
+ `python3 tools/check_public_release.py`.
76
+ - Machines move to a release with `project-observatory full update --check`, then
77
+ `--apply` (verified and reversible).
78
+
79
+ ## Contract pins
80
+
81
+ - `fabric-agent-contract` publishes no tags; consumers (fabric, the adapter, the
82
+ Observatory) pin a commit. The pins disagree today — org-index `BACKLOG.md` X-4 tracks
83
+ it.
84
+ - Moving a pin is a compatibility change of the **consumer**: run the consumer's own
85
+ validation against the new contract commit (for the adapter:
86
+ `adapt_project.py check <bundle> --contract <checkout at the new commit>` for each
87
+ profile), review what changed between the two commits, and ship it as a new consumer
88
+ release. If the validation does not pass, leave the pin and report why.
89
+ - `project-observatory-contract` publishes immutable `rev-N` tags; a schema `$id` change
90
+ needs a new `rev-N`.
91
+
92
+ ## After a release
93
+
94
+ - The org map (`org-index/repositories.json`) changes in the same change when a role,
95
+ dependency or test command changed.
96
+ - Report: the tag, the commit it points at, the GitHub release URL, the gate commands
97
+ with exit codes, and whether hosted CI ran, was blocked, or waits for the nightly run.
@@ -1,6 +1,7 @@
1
1
  {
2
- "$comment": "npm accounts allowed to publish @passioncode-ai/passioncode. The session-start hook auto-updates only to a version whose every npm maintainer and publisher is listed here; see SECURITY.md.",
2
+ "$comment": "Who may publish @passioncode-ai/passioncode. The session-start hook auto-updates only to a version whose every npm maintainer and publisher is listed here; see SECURITY.md. github-actions-oidc is this repository's release.yml publishing through npm trusted publishing (registered by a maintainer).",
3
3
  "npmPublishers": [
4
- "ssheleg"
4
+ "ssheleg",
5
+ "github-actions-oidc"
5
6
  ]
6
7
  }