@passioncode-ai/passioncode 0.1.17 → 0.1.19
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 +19 -0
- package/CLA.md +1 -1
- package/family.json +1 -1
- package/package.json +1 -1
- package/payload/.claude-plugin/marketplace.json +2 -2
- package/payload/manifest.json +8 -8
- package/payload/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +9 -4
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/events-and-notifications.md +26 -5
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md +1 -1
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service.py +35 -12
- package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_service.py +4 -1
- package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +1 -1
- package/payload/plugins/passioncode/.claude-plugin/plugin.json +1 -1
- package/payload/plugins/passioncode/skills/working-in-passioncode/SKILL.md +2 -2
- package/payload/plugins/passioncode/skills/working-in-passioncode/references/publishing.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.19 - 2026-10-02
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- `working-in-passioncode`: contributions are accepted under `CLA.md` by opening a pull request;
|
|
8
|
+
a PR template never carries a CLA checkbox. `CLA.md` is the knowledge-base template changed the
|
|
9
|
+
same day ("ticking the CLA box" is gone), and the publishing reference asks for one sentence in
|
|
10
|
+
the PR template instead of a box.
|
|
11
|
+
|
|
12
|
+
## 0.1.18 - 2026-10-01
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- Pin Fabric Agent Adapter v0.5.7: services are scheduled as standard processes (`ProcessType
|
|
17
|
+
Standard`; the probe's `lifecycle.priority` rule fails `Background`), `notify: true` is reserved
|
|
18
|
+
for a decision, a failure or a blocking warning once per episode, a service raises no banners of
|
|
19
|
+
its own, and a preview instance is uninstalled once checked
|
|
20
|
+
([adapter changelog](https://github.com/passioncode-ai/fabric-agent-adapter/blob/v0.5.7/CHANGELOG.md)).
|
|
21
|
+
|
|
3
22
|
## 0.1.17 - 2026-10-01
|
|
4
23
|
|
|
5
24
|
### Changed
|
package/CLA.md
CHANGED
|
@@ -5,7 +5,7 @@ software under the GNU AGPL-3.0 and under separate commercial licenses.
|
|
|
5
5
|
It is between you and Siarhei Sheleh (the "Maintainer").
|
|
6
6
|
|
|
7
7
|
By opening a pull request or otherwise submitting a contribution to a PassionCode.ai
|
|
8
|
-
repository,
|
|
8
|
+
repository, you agree to the
|
|
9
9
|
following for every contribution you submit:
|
|
10
10
|
|
|
11
11
|
1. **Copyright license.** You grant the Maintainer a perpetual, worldwide,
|
package/family.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@passioncode-ai/passioncode",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"description": "The PassionCode.ai agent skill set \u2014 Fabric Agent Adapter, Observatory Log and the organisation's working rules \u2014 for Claude Code and every other agent on the machine, updated as one set.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"passioncode": "bin/passioncode.js"
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"name": "fabric-agent-adapter",
|
|
12
12
|
"displayName": "Fabric Agent Adapter",
|
|
13
13
|
"source": "./plugins/fabric-agent-adapter",
|
|
14
|
-
"version": "0.5.
|
|
14
|
+
"version": "0.5.7",
|
|
15
15
|
"description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles.",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "PassionCode.ai",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"name": "passioncode",
|
|
36
36
|
"displayName": "PassionCode.ai",
|
|
37
37
|
"source": "./plugins/passioncode",
|
|
38
|
-
"version": "0.1.
|
|
38
|
+
"version": "0.1.19",
|
|
39
39
|
"description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
|
|
40
40
|
"author": {
|
|
41
41
|
"name": "PassionCode.ai",
|
package/payload/manifest.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"family": "passioncode",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"release": true,
|
|
5
5
|
"members": [
|
|
6
6
|
{
|
|
7
7
|
"name": "fabric-agent-adapter",
|
|
8
8
|
"displayName": "Fabric Agent Adapter",
|
|
9
9
|
"repo": "passioncode-ai/fabric-agent-adapter",
|
|
10
|
-
"ref": "v0.5.
|
|
11
|
-
"commit": "
|
|
12
|
-
"version": "0.5.
|
|
10
|
+
"ref": "v0.5.7",
|
|
11
|
+
"commit": "de21d9548bc836fe09ca6049afb647b11450dda8",
|
|
12
|
+
"version": "0.5.7",
|
|
13
13
|
"via": "clone of https://***@github.com/passioncode-ai/fabric-agent-adapter.git",
|
|
14
14
|
"skills": [
|
|
15
15
|
"adapting-projects-to-fabric",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"legacyMarketplaces": [
|
|
23
23
|
"fabric-agent-adapter"
|
|
24
24
|
],
|
|
25
|
-
"contentHash": "sha256:
|
|
25
|
+
"contentHash": "sha256:bebf6fe75b96b059558f0ad4f771db6784b07f429f88db2b5e285f3420284d5a",
|
|
26
26
|
"description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles.",
|
|
27
27
|
"author": {
|
|
28
28
|
"name": "PassionCode.ai",
|
|
@@ -61,16 +61,16 @@
|
|
|
61
61
|
"name": "passioncode",
|
|
62
62
|
"displayName": "PassionCode.ai",
|
|
63
63
|
"repo": "passioncode-ai/passioncode",
|
|
64
|
-
"ref": "v0.1.
|
|
64
|
+
"ref": "v0.1.19",
|
|
65
65
|
"commit": null,
|
|
66
|
-
"version": "0.1.
|
|
66
|
+
"version": "0.1.19",
|
|
67
67
|
"via": "this repository",
|
|
68
68
|
"skills": [
|
|
69
69
|
"working-in-passioncode"
|
|
70
70
|
],
|
|
71
71
|
"legacyPluginIds": [],
|
|
72
72
|
"legacyMarketplaces": [],
|
|
73
|
-
"contentHash": "sha256:
|
|
73
|
+
"contentHash": "sha256:1ae5a6355e3e3692bc95172ba297cbb7ed1d048dae8410c6766f376e6336f320",
|
|
74
74
|
"description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
|
|
75
75
|
"author": {
|
|
76
76
|
"name": "PassionCode.ai",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "fabric-agent-adapter",
|
|
4
4
|
"displayName": "Fabric Agent Adapter",
|
|
5
5
|
"description": "Create new Fabric-compatible agents, build them as always-alive local services with dashboards (fabric-service/0.1), and adapt existing projects to the Fabric Agent Contract through evidence-backed MCP, A2A, or local-runner provider bundles.",
|
|
6
|
-
"version": "0.5.
|
|
6
|
+
"version": "0.5.7",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "PassionCode.ai",
|
|
9
9
|
"url": "https://passioncode.ai/"
|
|
@@ -5,7 +5,7 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
5
5
|
compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned fabric-agent-contract checkout (a public repository). Works without those tools in an explicitly degraded structural-check mode.
|
|
6
6
|
metadata:
|
|
7
7
|
author: PassionCode.ai
|
|
8
|
-
version: "0.5.
|
|
8
|
+
version: "0.5.7"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
10
|
contract-commit: "74d3852f122f5ca5cbc4138a201483531dfa5006"
|
|
11
11
|
---
|
|
@@ -15,7 +15,7 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
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). Dashboard handoff optionally uses Fabric Dashboards MCP link/host_status/open; without it, report unresolved host capability. The contract checkout is optional.
|
|
16
16
|
metadata:
|
|
17
17
|
author: PassionCode.ai
|
|
18
|
-
version: "0.5.
|
|
18
|
+
version: "0.5.7"
|
|
19
19
|
contract-version: "0.1.0"
|
|
20
20
|
extension: "fabric-service/0.1"
|
|
21
21
|
extension-commit: "74d3852f122f5ca5cbc4138a201483531dfa5006"
|
|
@@ -163,7 +163,10 @@ descriptor's `fabricManifest` at a manifest whose service key names this
|
|
|
163
163
|
The installer, not the service, owns the plist and the descriptor. Sequence:
|
|
164
164
|
|
|
165
165
|
1. `write_descriptor(descriptor)` — refuses a port or `id.instance` another descriptor
|
|
166
|
-
claims. A preview or branch copy is a second **instance**, never a second id
|
|
166
|
+
claims. A preview or branch copy is a second **instance**, never a second id — and it is
|
|
167
|
+
one more service the operator sees, probes and gets notified by. Verify a release with its
|
|
168
|
+
own doctor or self-check before it replaces `default`; a temporary instance is uninstalled
|
|
169
|
+
(`launchd_uninstall`, `remove_descriptor`) as soon as its check is done, not left running.
|
|
167
170
|
2. `launchd_plist(...)` then `launchd_install(...)` — writes and lints the plist,
|
|
168
171
|
`bootout` and waits for the unload, `bootstrap` with retries on the transient I/O
|
|
169
172
|
error, then polls the well-known document until it answers with **this** identity.
|
|
@@ -183,8 +186,10 @@ others, and every error is a sentence with the next action. Read
|
|
|
183
186
|
|
|
184
187
|
The events feed is a **view over the log you already keep** — a jobs table, a JSONL
|
|
185
188
|
journal — not a second store. Each event is one sentence a person reads; set
|
|
186
|
-
`notify: true` only
|
|
187
|
-
|
|
189
|
+
`notify: true` only when the operator must decide, or something failed or degrades their
|
|
190
|
+
work — once per episode, with a `subject` and a `link` to the page that resolves it. A
|
|
191
|
+
question's kind says so (`*.awaiting_*`, `*.approval_*`, `human_step.opened`). The service
|
|
192
|
+
raises no banners of its own: the host is the one channel. Read
|
|
188
193
|
[the events reference](references/events-and-notifications.md) for mapping an existing
|
|
189
194
|
log, retention and notification policy.
|
|
190
195
|
|
|
@@ -26,11 +26,32 @@ The feed is a view: never copy rows into a second store that can drift from the
|
|
|
26
26
|
|
|
27
27
|
## When to set `notify: true`
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
`notify: true` asks the host to interrupt the operator. Hosts treat it as a request, not an
|
|
30
|
+
order: Fabric Dashboards shows a banner only for a **decision**, a **failure** or a **warning**,
|
|
31
|
+
once per episode, and puts everything else in Activity (its ADR-0010). Write events so that rule
|
|
32
|
+
lands on what matters:
|
|
33
|
+
|
|
34
|
+
| The operator… | Event | `notify` |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| must decide or act — a choice, an approval, a key to enter | kind says it: `job.awaiting_choice`, `plan.awaiting_approval`, `human_step.opened`; level `notice` | `true` |
|
|
37
|
+
| lost work — a job failed after its retries, a key expired | level `error`; kind `*.failed`, `*.expired` | `true` |
|
|
38
|
+
| will lose work soon — a degraded source that blocks orders | level `warning`, `service.degraded`, **once when it starts** | `true` |
|
|
39
|
+
| asked to be told when a long job finishes | `job.delivered`, level `notice` | `true` only if that person asked; a host may still keep it in Activity |
|
|
40
|
+
| only needs the record — progress, retries, recoveries, syncs | `job.started`, `service.recovered`, `*.cleared`, level `info` or `notice` | `false` |
|
|
41
|
+
|
|
42
|
+
- **One episode, one request.** Notify on the transition, never on each poll: a source that
|
|
43
|
+
flaps between degraded and healthy sends `service.degraded` with `notify: true` once, and later
|
|
44
|
+
repeats with `notify: false` until it has stayed healthy for a while. Asking the same question
|
|
45
|
+
about the same subject again is not news.
|
|
46
|
+
- **Say who wants what.** `subject` names the thing (`{type: "job", id: "…", label: "Q3 report"}`)
|
|
47
|
+
so a host can tell episodes apart and group; `text` names the object and what the operator
|
|
48
|
+
should do ("The storyboard of the Q3 launch video waits for your decision."); `link` opens the
|
|
49
|
+
page where they do it. The host adds the agent's name and instance.
|
|
50
|
+
- **One channel.** A service with a descriptor raises no banners of its own (AppleScript
|
|
51
|
+
`display notification`, a notifier binary, its own notification-centre entries): the operator
|
|
52
|
+
would get each one twice, from a sender that is not the host. Publish the event; the host
|
|
53
|
+
delivers it, honouring quiet hours and per-service settings.
|
|
54
|
+
- Anything that would fire more than a few times an hour is not a notification.
|
|
34
55
|
|
|
35
56
|
## Lifecycle events every service emits
|
|
36
57
|
|
package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
| `KeepAlive` | `true` | `{SuccessfulExit:false}` leaves a cleanly exited service down |
|
|
11
11
|
| `ThrottleInterval` | `10` | bounds a crash loop |
|
|
12
12
|
| `ExitTimeOut` | drain time + margin (40 s default) | SIGKILL arrives after it |
|
|
13
|
-
| `ProcessType` | `Background` |
|
|
13
|
+
| `ProcessType` | `Standard` — never `Background`, and no `Nice` > 0 or `LowPriorityIO` | a host probes the service and agents call it while the Mac is busy; a background job is starved for tens of seconds under load and every host reports an outage that never happened (the probe's `lifecycle.priority` rule fails it) |
|
|
14
14
|
| `EnvironmentVariables` | `PATH` set explicitly; `*_FILE` paths to secrets | never a secret value — the plist is world-readable in backups |
|
|
15
15
|
| `StandardOutPath`/`StandardErrorPath` | `~/Library/Logs/<id>/service.log` | one place the host tails |
|
|
16
16
|
|
|
@@ -39,6 +39,36 @@ import fabric_interop as fi # noqa: E402
|
|
|
39
39
|
Result = Dict[str, str]
|
|
40
40
|
|
|
41
41
|
|
|
42
|
+
|
|
43
|
+
def plist_problems(plist: dict, label: object, token: object = None) -> list:
|
|
44
|
+
"""What makes a service's launchd job unfit to stay up: identity, restart, secrets."""
|
|
45
|
+
problems = []
|
|
46
|
+
if plist.get("Label") != label:
|
|
47
|
+
problems.append("Label %r" % plist.get("Label"))
|
|
48
|
+
if plist.get("RunAtLoad") is not True:
|
|
49
|
+
problems.append("RunAtLoad is not true")
|
|
50
|
+
if plist.get("KeepAlive") is not True:
|
|
51
|
+
problems.append("KeepAlive is %r, not true" % plist.get("KeepAlive"))
|
|
52
|
+
for key, value in (plist.get("EnvironmentVariables") or {}).items():
|
|
53
|
+
if re.search(r"(TOKEN|SECRET|PASSWORD|KEY)$", key) and not key.endswith("_FILE"):
|
|
54
|
+
problems.append("secret-like variable %s in the plist" % key)
|
|
55
|
+
if token and token in str(value):
|
|
56
|
+
problems.append("the service token itself is in the plist")
|
|
57
|
+
return problems
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def priority_problems(plist: dict) -> list:
|
|
61
|
+
"""A service that answers hosts and agents must not be scheduled as background work."""
|
|
62
|
+
out = []
|
|
63
|
+
if plist.get("ProcessType", "Standard") in ("Background", "Adaptive"):
|
|
64
|
+
out.append("ProcessType is %s" % plist.get("ProcessType"))
|
|
65
|
+
if isinstance(plist.get("Nice"), int) and plist["Nice"] > 0:
|
|
66
|
+
out.append("Nice is %d" % plist["Nice"])
|
|
67
|
+
if plist.get("LowPriorityIO") is True or plist.get("LowPriorityBackgroundIO") is True:
|
|
68
|
+
out.append("low-priority I/O")
|
|
69
|
+
return out
|
|
70
|
+
|
|
71
|
+
|
|
42
72
|
class Probe:
|
|
43
73
|
def __init__(self, descriptor_path: Path, descriptor: Dict[str, Any], services_dir: Path, skip_login: bool):
|
|
44
74
|
self.path = descriptor_path
|
|
@@ -416,19 +446,12 @@ class Probe:
|
|
|
416
446
|
except (OSError, ValueError) as exc:
|
|
417
447
|
self.add("lifecycle.plist", "FAIL", "cannot read %s: %s" % (plist_path, exc))
|
|
418
448
|
return
|
|
419
|
-
problems =
|
|
420
|
-
if plist.get("Label") != life.get("label"):
|
|
421
|
-
problems.append("Label %r" % plist.get("Label"))
|
|
422
|
-
if plist.get("RunAtLoad") is not True:
|
|
423
|
-
problems.append("RunAtLoad is not true")
|
|
424
|
-
if plist.get("KeepAlive") is not True:
|
|
425
|
-
problems.append("KeepAlive is %r, not true" % plist.get("KeepAlive"))
|
|
426
|
-
for key, value in (plist.get("EnvironmentVariables") or {}).items():
|
|
427
|
-
if re.search(r"(TOKEN|SECRET|PASSWORD|KEY)$", key) and not key.endswith("_FILE"):
|
|
428
|
-
problems.append("secret-like variable %s in the plist" % key)
|
|
429
|
-
if self.token and self.token in str(value):
|
|
430
|
-
problems.append("the service token itself is in the plist")
|
|
449
|
+
problems = plist_problems(plist, life.get("label"), self.token)
|
|
431
450
|
self.add("lifecycle.plist", "FAIL" if problems else "PASS", "; ".join(problems) or "%s: RunAtLoad, KeepAlive, no secrets" % plist_path.name)
|
|
451
|
+
slow = priority_problems(plist)
|
|
452
|
+
self.add("lifecycle.priority", "FAIL" if slow else "PASS",
|
|
453
|
+
"; ".join(slow) + " — macOS may starve the service under load and hosts then see an outage; use ProcessType Standard"
|
|
454
|
+
if slow else "%s: scheduled as a standard process" % plist_path.name)
|
|
432
455
|
if not shutil.which("launchctl"):
|
|
433
456
|
self.add("lifecycle.one-copy", "NOT_RUN", "launchctl is not available")
|
|
434
457
|
return
|
|
@@ -596,7 +596,10 @@ def launchd_plist(label: str, program_arguments: Sequence[str], *, working_direc
|
|
|
596
596
|
"KeepAlive": True,
|
|
597
597
|
"ThrottleInterval": 10,
|
|
598
598
|
"ExitTimeOut": exit_timeout,
|
|
599
|
-
|
|
599
|
+
# Standard, never Background: a host probes the service and agents call it while the Mac
|
|
600
|
+
# is busy; Background (and Nice/LowPriorityIO) lets macOS starve it for tens of seconds
|
|
601
|
+
# under load, and every host then reports an outage that never happened.
|
|
602
|
+
"ProcessType": "Standard",
|
|
600
603
|
"StandardOutPath": str(stdout_path),
|
|
601
604
|
"StandardErrorPath": str(stdout_path),
|
|
602
605
|
"EnvironmentVariables": env,
|
|
@@ -5,7 +5,7 @@ license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
|
|
|
5
5
|
compatibility: Requires filesystem access and Python 3.9+. Exact schema checks additionally need git, Node.js, pnpm, and the pinned fabric-agent-contract checkout (a public repository). Works without those tools in an explicitly degraded structural-check mode. Ships in one plugin with adapting-projects-to-fabric, whose scripts it reuses.
|
|
6
6
|
metadata:
|
|
7
7
|
author: PassionCode.ai
|
|
8
|
-
version: "0.5.
|
|
8
|
+
version: "0.5.7"
|
|
9
9
|
contract-version: "0.1.0"
|
|
10
10
|
contract-commit: "74d3852f122f5ca5cbc4138a201483531dfa5006"
|
|
11
11
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "passioncode",
|
|
4
4
|
"displayName": "PassionCode.ai",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.19",
|
|
6
6
|
"description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check at session start that keeps the PassionCode.ai skill set current.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "PassionCode.ai",
|
|
@@ -162,8 +162,8 @@ Fabric's workspace sync, and check the published source commit before calling it
|
|
|
162
162
|
- The README's `## License` section uses the knowledge base wording and names the earlier
|
|
163
163
|
licences: "Open source under the GNU AGPL-3.0. A commercial license is available for use that
|
|
164
164
|
does not meet the AGPL's terms — contact@passioncode.ai."
|
|
165
|
-
- Contributions are accepted under the repository's `CLA.md`;
|
|
166
|
-
|
|
165
|
+
- Contributions are accepted under the repository's `CLA.md`; opening a pull request is the
|
|
166
|
+
agreement, so a PR template never carries a CLA checkbox.
|
|
167
167
|
- **The repository standard** (the knowledge base `repository-standard.md`): README first heading
|
|
168
168
|
`# <Full name>`, `## Quick start for a new teammate` (Install, Configure, MCP — the registration
|
|
169
169
|
command and one proving call verified with a real client in a temporary config — and Develop)
|
|
@@ -27,7 +27,7 @@ for byte** from the knowledge base's `templates/` — never retyped, reflowed or
|
|
|
27
27
|
| `CLA.md` | `templates/CLA.md`, in every repository, private ones included |
|
|
28
28
|
| `SECURITY.md` | every public repository: report privately to contact@passioncode.ai |
|
|
29
29
|
| `CONTRIBUTING.md` | only when the repository adds rules; says contributions are accepted under `CLA.md` |
|
|
30
|
-
| `.github/pull_request_template.md` |
|
|
30
|
+
| `.github/pull_request_template.md` | one sentence that opening the pull request means agreeing to `CLA.md` — no checkbox; any existing template content is kept |
|
|
31
31
|
| `package.json` | `"license"` set to the SPDX expression; `files` ships `LICENSE` and `COMMERCIAL-LICENSE.md` |
|
|
32
32
|
| `.claude-plugin/plugin.json`, marketplace entries | `"license"` set to the SPDX expression |
|
|
33
33
|
| SKILL.md front matter | `license:` set to the SPDX expression |
|