@passioncode-ai/passioncode 0.1.24 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.26 - 2026-10-04
4
+
5
+ ### Changed
6
+
7
+ - **Observatory Log is pinned at `v0.15.0`** (plugin 0.15.0; it was `v0.13.0`, plugin 0.14.0),
8
+ the Project Observatory 0.15.0 skills. `handling-secrets` gains the header door: `use_secret.py
9
+ header` hands one HTTP MCP server's bearer to Claude Code's `headersHelper`, from the vault only
10
+ and only to the server the slot is bound to with `vault.py bind --header-for`. Agents and
11
+ services take every credential from Observatory by name (`use_secret.py run --vault-only`).
12
+
13
+ ## 0.1.25 - 2026-10-03
14
+
15
+ ### Changed
16
+
17
+ - **`working-in-passioncode` follows the amended release-approval rule** (knowledge rules §11,
18
+ operator decision 2026-10-03): any member of `release-approvers` may approve a release run,
19
+ including the person who pushed the tag. Unchanged: approval is a person's act and an agent
20
+ never approves a release run, signing happens only in CI, admins cannot bypass, `v*` tags
21
+ only, and a published release is never rewritten.
22
+
3
23
  ## 0.1.24 - 2026-10-03
4
24
 
5
25
  ### Changed
package/family.json CHANGED
@@ -22,7 +22,7 @@
22
22
  "name": "observatory-log",
23
23
  "displayName": "Observatory Log",
24
24
  "repo": "passioncode-ai/project-observatory-dashboard",
25
- "ref": "v0.13.0",
25
+ "ref": "v0.15.0",
26
26
  "kind": "plugin",
27
27
  "path": "observatory/engine/skill/plugins/observatory-log",
28
28
  "legacyPluginIds": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@passioncode-ai/passioncode",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
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"
@@ -23,7 +23,7 @@
23
23
  "name": "observatory-log",
24
24
  "displayName": "Observatory Log",
25
25
  "source": "./plugins/observatory-log",
26
- "version": "0.14.0",
26
+ "version": "0.15.0",
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
29
  "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.24",
38
+ "version": "0.1.26",
39
39
  "description": "The organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
40
40
  "author": {
41
41
  "name": "PassionCode.ai",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "family": "passioncode",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "release": true,
5
5
  "members": [
6
6
  {
@@ -34,9 +34,9 @@
34
34
  "name": "observatory-log",
35
35
  "displayName": "Observatory Log",
36
36
  "repo": "passioncode-ai/project-observatory-dashboard",
37
- "ref": "v0.13.0",
38
- "commit": "c7a89125edcd5ee1a8141feb55d4aca2c828e834",
39
- "version": "0.14.0",
37
+ "ref": "v0.15.0",
38
+ "commit": "acca5c9d293a388cd53d3a2cbdbfabf574308bb4",
39
+ "version": "0.15.0",
40
40
  "via": "clone of https://***@github.com/passioncode-ai/project-observatory-dashboard.git",
41
41
  "skills": [
42
42
  "explaining-changes",
@@ -49,7 +49,7 @@
49
49
  "legacyMarketplaces": [
50
50
  "observatory-log"
51
51
  ],
52
- "contentHash": "sha256:3e1218586122889649881d94fdf892f6a51782dc748c26127a9969376ecdf1eb",
52
+ "contentHash": "sha256:523f50d6be43845f0ed2b5d497bac17752cbfd3333627a235ab457618cd86dd3",
53
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.",
54
54
  "author": {
55
55
  "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.24",
64
+ "ref": "v0.1.26",
65
65
  "commit": null,
66
- "version": "0.1.24",
66
+ "version": "0.1.26",
67
67
  "via": "this repository",
68
68
  "skills": [
69
69
  "working-in-passioncode"
70
70
  ],
71
71
  "legacyPluginIds": [],
72
72
  "legacyMarketplaces": [],
73
- "contentHash": "sha256:e754ad6eab6581d2fba7c887b903c4676239a85ceed74010ccec87b631586816",
73
+ "contentHash": "sha256:01035ebeb36b330a3eabad618a5dbd6f8b826b0d008ffc3651db1c9dca932deb",
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": "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.14.0",
6
+ "version": "0.15.0",
7
7
  "license": "AGPL-3.0-only OR LicenseRef-PassionCode-Commercial",
8
8
  "author": {
9
9
  "name": "PassionCode.ai",
@@ -15,7 +15,7 @@ description: >-
15
15
  decision with different evidence.
16
16
  license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
17
17
  metadata:
18
- version: "0.14.0"
18
+ version: "0.15.0"
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
@@ -3,13 +3,14 @@ name: handling-secrets
3
3
  description: >-
4
4
  Use when an agent needs to store, use, rotate or record exposure of a project's
5
5
  credentials through Project Observatory: "use a secret", "rotate a key",
6
- "record a leak", «используй ключ», «ротируй ключ», «запиши утечку».
6
+ "record a leak", "give an agent its keys", «используй ключ», «ротируй ключ»,
7
+ «запиши утечку», «ключи для агента».
7
8
  Keeps credential values out of prompts and command arguments, uses named slots,
8
9
  and records changes without copying values into reports. NOT for granting
9
10
  provider permissions or choosing a project's authentication architecture.
10
11
  license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
11
12
  metadata:
12
- version: "0.14.0"
13
+ version: "0.15.0"
13
14
  compatibility: >-
14
15
  Requires an initialized full Project Observatory installation, Python 3.11+
15
16
  and local shell access on macOS or Linux. Provider operations additionally
@@ -29,7 +30,7 @@ names. Never ask the user to paste a credential into the conversation.
29
30
  2. Select the user's initialized `OBSERVATORY_HOME`. Run
30
31
  `project-observatory full doctor`. A missing workspace
31
32
  needs the documented onboarding before secret operations.
32
- 3. Run `"$OBSERVATORY_PYTHON" "$OBSERVATORY_ROOT/tools/skill_check.py" handling-secrets 0.14.0`
33
+ 3. Run `"$OBSERVATORY_PYTHON" "$OBSERVATORY_ROOT/tools/skill_check.py" handling-secrets 0.15.0`
33
34
  (`full agent install` records that interpreter; the stock macOS `python3` is too old).
34
35
  If stale, read the installed skill once and follow its compatible commands.
35
36
  Do not turn an unavailable version check into a retry loop.
@@ -50,8 +51,10 @@ for it. A name or note shaped like a credential is refused, never stored.
50
51
  |---|---|
51
52
  | Store a credential supplied locally | `vault.py put PROJECT ENV NAME`, value on stdin |
52
53
  | List slots | `vault.py list PROJECT ENV` |
53
- | Run a command using a slot | `use_secret.py run [--env ENV] PROJECT NAME -- COMMAND ARGUMENTS` (flags before PROJECT) |
54
+ | Run a command using a slot | `use_secret.py run [--env ENV] [--vault-only] PROJECT NAME -- COMMAND ARGUMENTS` (flags before PROJECT) |
54
55
  | Receive a value from another local command | `use_secret.py pipe NAME -- COMMAND ARGUMENTS` |
56
+ | Bind a slot to the one MCP server allowed to receive it as a header (the operator, once) | `vault.py bind PROJECT ENV NAME --header-for https://HOST[:PORT]` (a bare host means https); `--clear` removes it; both are journalled |
57
+ | Give an HTTP MCP server its bearer through Claude Code's `headersHelper` | `use_secret.py header [--env ENV] [--name Authorization] [--scheme Bearer] PROJECT NAME`, written into the server's `headersHelper` entry, never run by hand |
55
58
  | Populate a project's ignored environment file | `vault.py inject PROJECT ENV DIRECTORY` |
56
59
  | Record an exposure | `vault.py leak PROJECT ENV NAME --where "location and evidence, no value"` |
57
60
  | Replace a stored value | `vault.py rotate PROJECT ENV NAME`, replacement on stdin |
@@ -77,10 +80,50 @@ not a sandbox: a child process can encode a value, transmit it, or write it to
77
80
  another file. Only run the command authorized by the task. Do not claim this
78
81
  filter prevents every leak.
79
82
 
83
+ **The header door prints a value, so it serves only Claude Code.** `use_secret.py
84
+ header` writes one JSON object (`{"Authorization": "Bearer …"}`) for a
85
+ `headersHelper`, which Claude Code merges into the MCP request rather than the
86
+ conversation. It reads the vault only (never an env file or the environment), and
87
+ refuses unless stdout is a program, `CLAUDE_CODE_MCP_SERVER_URL` names the scheme,
88
+ host and port the slot is bound to, and the value has no control character. Never
89
+ run it yourself, pipe it, or set `CLAUDE_CODE_MCP_SERVER_URL` to make it answer:
90
+ that prints the value into your transcript. Each call is audited. Binding is the
91
+ operator's decision; ask for it, do not run `bind` to make a call succeed.
92
+
80
93
  **Stdin carries one thing.** Never pipe a secret into `python3 -`, `node -` or
81
94
  `sh -s`, or combine a secret pipe with a heredoc program. A program goes in a
82
95
  file; the secret goes through the named runner. A parse error can echo input.
83
96
 
97
+ ## Building an agent or a service
98
+
99
+ **Every credential an agent or a service uses comes from Project Observatory, by
100
+ name.** That holds for a one-shot agent, a long-running agent service and code an
101
+ agent writes for one. Concretely:
102
+
103
+ - **Issue or store it here.** A provider door issues straight into a slot; a value
104
+ the user has goes in with `vault.py put PROJECT ENV NAME` (value on stdin).
105
+ - **Discover it by name.** `observatory_credentials` (MCP) or `use_secret.py names
106
+ PROJECT` list what exists; neither returns a value.
107
+ - **Inject it at run time, from the vault only.** A command: `use_secret.py run
108
+ --vault-only [--env ENV] PROJECT NAME -- COMMAND`. A long-running service (a launchd
109
+ job): `use_secret.py serve [--env ENV] --consumer LABEL PROJECT NAME[,NAME] -- COMMAND` in
110
+ its plist — it replaces itself with the service and records the consumer, so `vault.py
111
+ rotate` names the services to restart. Set `OBSERVATORY_VAULT_ONLY=1` in an agent's
112
+ environment so every command it runs refuses a project's `.env` fallback.
113
+ - **No copies.** No `.env` of the agent's own, no key file beside its data, no value
114
+ in code, configuration, a commit, a prompt, a log or agent memory. A remote
115
+ platform's copy is recorded with `vault.py moved PROJECT ENV NAME --at PROVIDER`.
116
+ - **Declare what a workflow needs.** A checkpoint carries `credentials: [{project,
117
+ env, name, purpose}]` — names only, a value is refused. A handoff and its
118
+ acceptance report each one as `vault`, `env-only` (works, and breaks this rule)
119
+ or `missing`, with the command to use or store it, and `credentialsMissing` stops
120
+ the next executor before the step that would fail.
121
+
122
+ A value written into agent memory by mistake is replaced on the way in by a
123
+ marker that names its slot (`[redacted:vault:PROJECT/ENV/NAME]`); treat that as an
124
+ exposure and record it with `vault.py leak`. The design is
125
+ [AGENT-SECRETS.md](https://github.com/passioncode-ai/project-observatory-dashboard/blob/main/docs/design/AGENT-SECRETS.md).
126
+
84
127
  ## Provider integrations
85
128
 
86
129
  Cloudflare and OpenRouter have separate tools, `cloudflare.py` and
@@ -15,7 +15,7 @@ description: >-
15
15
  the repository.
16
16
  license: AGPL-3.0-only OR LicenseRef-PassionCode-Commercial
17
17
  metadata:
18
- version: "0.14.0"
18
+ version: "0.15.0"
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,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.24",
5
+ "version": "0.1.26",
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",
@@ -211,10 +211,12 @@ to a public surface.
211
211
  - **Signing (knowledge rules §11).** A published build is signed only in CI, in the
212
212
  repository's protected `release` environment, through `passioncode-ai/.github@v1`
213
213
  (`apple-signing`, `notarize`, `sign-sums`, `release-publish`). A member of
214
- `release-approvers` who is not the tag's author approves it. No release key lives on a
215
- laptop, and a locally signed build is a debug build: never attach it. You act as the person
216
- whose account you use, so never approve a release you started; start it and say whose
217
- approval is pending. A published release is never rewritten. Rehearse on `vX.Y.Z-rc.N` with
214
+ `release-approvers` approves it, and that may be whoever pushed the tag (operator,
215
+ 2026-10-03; `prevent_self_review: true` in `.github` `release-signing/products.json`
216
+ restores four eyes). Admins cannot bypass, and only `v*` tags deploy. No release key lives
217
+ on a laptop, and a locally signed build is a debug build: never attach it. Approval is a
218
+ person's act: an agent never approves a release run, even when the account it uses could;
219
+ start it and say whose approval is pending. A published release is never rewritten. Rehearse on `vX.Y.Z-rc.N` with
218
220
  `publish=false`.
219
221
  - **Engine** (`project-observatory-dashboard`): contributors send PRs. A `vX.Y.Z` tag on the
220
222
  reviewed release commit runs its `release.yml`, which signs and publishes in CI. Machines then