@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.
- package/CHANGELOG.md +57 -0
- package/LICENSE +150 -17
- package/README.md +18 -3
- package/SECURITY.md +5 -1
- package/family.json +3 -5
- package/lib/launcher.js +12 -2
- package/package.json +5 -5
- package/payload/.claude-plugin/marketplace.json +11 -11
- package/payload/manifest.json +28 -23
- package/payload/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +4 -4
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +8 -5
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +5 -5
- package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +16 -5
- package/payload/plugins/observatory-log/.claude-plugin/plugin.json +4 -4
- package/payload/plugins/observatory-log/skills/explaining-changes/SKILL.md +2 -2
- package/payload/plugins/observatory-log/skills/handling-secrets/SKILL.md +3 -3
- package/payload/plugins/observatory-log/skills/tracking-resources/SKILL.md +2 -2
- package/payload/plugins/passioncode/.claude-plugin/plugin.json +3 -3
- package/payload/plugins/passioncode/hooks/update-check.js +18 -2
- package/payload/plugins/passioncode/skills/working-in-passioncode/SKILL.md +200 -0
- package/payload/plugins/passioncode/skills/working-in-passioncode/references/publishing.md +76 -0
- package/payload/plugins/passioncode/skills/working-in-passioncode/references/releasing.md +97 -0
- 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
|
-
|
|
1
|
+
Copyright (c) 2026 Siarhei Sheleh
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
13
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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": "
|
|
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 = (
|
|
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 {
|
|
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
|
-
"description": "Every PassionCode.ai agent skill — Fabric Agent Adapter
|
|
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": "
|
|
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.
|
|
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": "
|
|
18
|
-
"url": "https://
|
|
17
|
+
"name": "PassionCode.ai",
|
|
18
|
+
"url": "https://passioncode.ai/"
|
|
19
19
|
},
|
|
20
|
-
"license": "
|
|
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.
|
|
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": "
|
|
30
|
-
"url": "https://
|
|
29
|
+
"name": "PassionCode.ai",
|
|
30
|
+
"url": "https://passioncode.ai/"
|
|
31
31
|
},
|
|
32
|
-
"license": "
|
|
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.
|
|
39
|
-
"description": "
|
|
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": "
|
|
44
|
+
"license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0"
|
|
45
45
|
}
|
|
46
46
|
]
|
|
47
47
|
}
|
package/payload/manifest.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"family": "passioncode",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
11
|
-
"commit": "
|
|
12
|
-
"version": "0.4.
|
|
13
|
-
"via": "clone of
|
|
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:
|
|
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": "
|
|
29
|
-
"url": "https://
|
|
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.
|
|
37
|
-
"commit": "
|
|
38
|
-
"version": "0.12.
|
|
39
|
-
"via": "clone of
|
|
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:
|
|
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": "
|
|
55
|
-
"url": "https://
|
|
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.
|
|
64
|
+
"ref": "v0.1.7",
|
|
63
65
|
"commit": null,
|
|
64
|
-
"version": "0.1.
|
|
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:
|
|
70
|
-
"description": "
|
|
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.
|
|
6
|
+
"version": "0.4.3",
|
|
7
7
|
"author": {
|
|
8
|
-
"name": "
|
|
9
|
-
"url": "https://
|
|
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": "
|
|
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:
|
|
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:
|
|
8
|
-
version: "0.4.
|
|
7
|
+
author: PassionCode.ai
|
|
8
|
+
version: "0.4.3"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
|
-
contract-commit: "
|
|
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 `
|
|
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 = "
|
|
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
|
|
5
|
-
|
|
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:
|
|
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:
|
|
18
|
-
version: "0.4.
|
|
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:
|
|
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:
|
|
8
|
-
version: "0.4.
|
|
7
|
+
author: PassionCode.ai
|
|
8
|
+
version: "0.4.3"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
|
-
contract-commit: "
|
|
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 `
|
|
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.
|
|
7
|
-
"license": "
|
|
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": "
|
|
10
|
-
"url": "https://
|
|
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:
|
|
16
|
+
license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
|
|
17
17
|
metadata:
|
|
18
|
-
version: "0.12.
|
|
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:
|
|
10
|
+
license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
|
|
11
11
|
metadata:
|
|
12
|
-
version: "0.12.
|
|
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.
|
|
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:
|
|
16
|
+
license: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0
|
|
17
17
|
metadata:
|
|
18
|
-
version: "0.12.
|
|
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.
|
|
6
|
-
"description": "
|
|
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": "
|
|
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 ?
|
|
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": "
|
|
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
|
}
|