@passioncode-ai/passioncode 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/LICENSE +22 -0
  3. package/README.md +69 -0
  4. package/SECURITY.md +42 -0
  5. package/bin/passioncode.js +65 -0
  6. package/family.json +45 -0
  7. package/lib/launcher.js +361 -0
  8. package/package.json +48 -0
  9. package/payload/.claude-plugin/marketplace.json +47 -0
  10. package/payload/manifest.json +77 -0
  11. package/payload/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +24 -0
  12. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +175 -0
  13. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/profile-selection.md +71 -0
  14. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/provider-bundle.md +62 -0
  15. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/verification.md +55 -0
  16. package/payload/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +537 -0
  17. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +240 -0
  18. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard.md +32 -0
  19. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/events-and-notifications.md +44 -0
  20. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md +63 -0
  21. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/migrating-a-service.md +32 -0
  22. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +83 -0
  23. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/references/surfaces-and-auth.md +58 -0
  24. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service.py +373 -0
  25. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-service.mjs +380 -0
  26. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_service.py +663 -0
  27. package/payload/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/sample_service.py +226 -0
  28. package/payload/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +126 -0
  29. package/payload/plugins/observatory-log/.claude-plugin/plugin.json +19 -0
  30. package/payload/plugins/observatory-log/hooks/ask-why.py +98 -0
  31. package/payload/plugins/observatory-log/hooks/hooks.json +31 -0
  32. package/payload/plugins/observatory-log/hooks/record-turn.sh +81 -0
  33. package/payload/plugins/observatory-log/hooks/session-start.sh +27 -0
  34. package/payload/plugins/observatory-log/skills/explaining-changes/SKILL.md +111 -0
  35. package/payload/plugins/observatory-log/skills/handling-secrets/SKILL.md +115 -0
  36. package/payload/plugins/observatory-log/skills/tracking-resources/SKILL.md +87 -0
  37. package/payload/plugins/passioncode/.claude-plugin/plugin.json +13 -0
  38. package/payload/plugins/passioncode/hooks/hooks.json +10 -0
  39. package/payload/plugins/passioncode/hooks/probe.js +23 -0
  40. package/payload/plugins/passioncode/hooks/session-start.js +45 -0
  41. package/payload/plugins/passioncode/hooks/update-check.js +126 -0
  42. package/payload/plugins/passioncode/trust.json +6 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,73 @@
1
+ # Changelog
2
+
3
+ ## 0.1.4 - 2026-09-29
4
+
5
+ ### Security
6
+
7
+ - The package is `@passioncode-ai/passioncode`, in the npm organisation that PassionCode.ai
8
+ owns. The bare name `passioncode` was unclaimed, so whoever registered it would have been
9
+ what the self-update checks. The hook now watches the scoped name, and `trust.json` names
10
+ the organisation's publisher.
11
+
12
+ ### Changed
13
+
14
+ - Install and update with `npx @passioncode-ai/passioncode@latest update`.
15
+ - A `v*` tag releases and publishes from GitHub Actions (`.github/workflows/release.yml`),
16
+ the same pipeline as the adapter.
17
+
18
+ ## 0.1.3 - 2026-09-29
19
+
20
+ - Observatory Log 0.12.2 (Observatory 0.8.1): the engine's `full agent` recognises the copy this
21
+ launcher installs instead of adding a second one, and `tracking-resources` no longer triggers on
22
+ creation requests.
23
+
24
+ ### Security
25
+
26
+ - The session-start hook no longer runs whatever is published under the npm name
27
+ `passioncode`. The name was unclaimed (`npm view passioncode` answered E404), so
28
+ whoever registered it would have had code run on every machine with the plugin. The
29
+ daily probe now records the latest version together with its npm maintainers and
30
+ publishing account (`npm view passioncode version maintainers _npmUser --json`); the
31
+ hook updates only when every one of them is in `plugin/passioncode/trust.json`, and
32
+ otherwise spawns nothing and names who published it. The list ships empty: until the
33
+ maintainers add their npm account, nothing updates on its own.
34
+ - The update it runs is pinned — `npx --yes passioncode@<verified version> update` — so
35
+ what was checked is what runs, not whatever `@latest` points at a moment later.
36
+
37
+ ### Fixed
38
+
39
+ - A failed update check is shown once in the session-start line instead of never; the
40
+ same error is not repeated every session.
41
+ - A background update is recorded (`updatingSince`) when it starts, so a second session
42
+ start within ten minutes does not start a second one.
43
+ - The old single-member marketplaces (`fabric-agent-adapter`, `observatory-log`) are
44
+ retired once the member's `@passioncode` plugin is verified and nothing else installed
45
+ comes from them: the `extraKnownMarketplaces` entry leaves `~/.claude/settings.json`
46
+ (backed up in the quarantine) and `claude plugin marketplace remove` unregisters it —
47
+ otherwise Claude Code re-registered it, with autoUpdate, and installing from it would
48
+ bring a second channel back. `passioncode restore` re-adds both. `status` names any
49
+ that are left.
50
+ - Vendoring no longer needs the maintainer's own checkouts: a member whose `checkout`
51
+ is absent is shallow-cloned from `repo` at `ref` over SSH (`--clone` or
52
+ `PASSIONCODE_VENDOR_CLONE=1` forces it). The payload's marketplace entries carry
53
+ `displayName` and `author`, and the `$schema` URLs are ones that resolve.
54
+
55
+ ## 0.1.2 - 2026-09-29
56
+
57
+ - Fabric Agent Adapter 0.4.2: the kit's `LoopbackHTTPServer` binds without a reverse DNS
58
+ lookup, a garbled pid file reads as unknown, and every SKILL.md front matter parses as
59
+ strict YAML (0.4.1).
60
+
61
+ ## 0.1.1 - 2026-09-29
62
+
63
+ - `update --dry-run` says the plan changed nothing instead of reporting it as done.
64
+ 0.1.0 was tagged but never published.
65
+
66
+ ## 0.1.0 - 2026-09-28
67
+
68
+ - First release: Fabric Agent Adapter 0.4.0 and Observatory Log 0.12.1 as Claude Code
69
+ plugins from one local marketplace, and through the `~/.agents/skills` hub for every
70
+ other agent.
71
+ - Replaces the old single-member plugin installs, and moves shadowing
72
+ `~/.claude/skills` entries and working-tree hub links into a restorable quarantine.
73
+ - Once-a-day update check at session start with a background update (`update.auto`).
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PassionCode.ai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # passioncode
2
+
3
+ > **PassionCode.ai — The agent-agnostic operating system for AI-native teams.**
4
+
5
+ Every PassionCode.ai agent skill, for Claude Code and every other agent on your machine,
6
+ installed and updated as one set:
7
+
8
+ ```bash
9
+ npx @passioncode-ai/passioncode@latest update
10
+ ```
11
+
12
+ | Member | Skills |
13
+ |---|---|
14
+ | Fabric Agent Adapter | `creating-fabric-agents`, `adapting-projects-to-fabric`, `building-fabric-services` |
15
+ | Observatory Log | `explaining-changes`, `handling-secrets`, `tracking-resources` (+ its session hooks) |
16
+ | passioncode | the once-a-day update check |
17
+
18
+ Only PassionCode.ai products are members. Agents that people build for themselves stay
19
+ out of it, even when they implement Fabric protocols.
20
+
21
+ ## How it installs
22
+
23
+ - **Claude Code** gets plugins from a local marketplace named `passioncode` at
24
+ `~/.passioncode/current` — no GitHub access needed. A plugin that was installed from
25
+ its old single-member marketplace (`fabric-agent-adapter@fabric-agent-adapter`,
26
+ `observatory-log@observatory-log`) is replaced once the new one is verified, and that
27
+ marketplace is unregistered and taken out of `settings.json` once nothing installed
28
+ comes from it.
29
+ - **Every other agent** (Cursor, Codex, Gemini, OpenCode, Kiro, Windsurf, Goose, …) gets
30
+ the same skills through `~/.agents/skills`, linked from each channel that exists on
31
+ the machine.
32
+ - Nothing is written to `~/.claude/skills`: a plain copy there shadows the plugin. Such
33
+ copies, and hub entries that pointed at a repository's working tree, are moved into
34
+ `~/.passioncode/quarantine/` — `npx passioncode restore` puts them back.
35
+ - Each version is an immutable release under `~/.passioncode/releases/<version>`.
36
+
37
+ ## Staying current
38
+
39
+ At every Claude Code session start the `passioncode` plugin checks npm at most once a
40
+ day and, when a newer set is out **and every npm account that publishes it is in the
41
+ plugin's `trust.json`**, updates to that exact version in the background — it takes
42
+ effect in the next session. A version published by anyone else is named and not
43
+ installed ([SECURITY.md](SECURITY.md#the-self-update-and-who-it-trusts)).
44
+ `npx passioncode config set update.auto off` makes it only say so.
45
+
46
+ ```bash
47
+ npx passioncode status # installed version, per-member channels, shadows
48
+ npx passioncode update --dry-run
49
+ npx passioncode uninstall
50
+ ```
51
+
52
+ ## Release (maintainers)
53
+
54
+ 1. Tag every member at the version to ship; set `ref` to that tag in `family.json`.
55
+ 2. Bump `version` in `package.json` and `plugin/passioncode/.claude-plugin/plugin.json`
56
+ (a test holds them and the CHANGELOG in sync), add the CHANGELOG section.
57
+ 3. The npm account that publishes must be listed in `plugin/passioncode/trust.json`
58
+ (`npmPublishers`), and be the package's only kind of maintainer — otherwise every
59
+ installed hook refuses the update and says so.
60
+ 4. Merge, then tag the merge commit `vX.Y.Z` and push the tag. `.github/workflows/release.yml`
61
+ validates, checks the tag against both manifests, creates the GitHub release from the
62
+ CHANGELOG section, vendors every member **from its own repository** at its pinned tag,
63
+ runs the tests, installs the packed tarball from a clean `HOME`, publishes
64
+ `@passioncode-ai/passioncode` and waits until npm serves it. It runs when the repository
65
+ variables `RELEASE_ENABLED` and `PUBLISH_NPMJS` are `true`; npm auth is trusted publishing
66
+ (OIDC) or the `NPM_TOKEN` secret; a private member needs `MEMBERS_READ_TOKEN`.
67
+ By hand, `npm publish` still works: `prepublishOnly` vendors from tags only (`--release`),
68
+ refuses credential-shaped strings and runs the tests.
69
+ 5. `npx @passioncode-ai/passioncode@<version> update` on this machine; restart the agents.
package/SECURITY.md ADDED
@@ -0,0 +1,42 @@
1
+ # Security
2
+
3
+ Report vulnerabilities privately to the maintainers of the `passioncode-ai` organization.
4
+
5
+ What `passioncode update` touches: `~/.passioncode/` (releases, state, quarantine,
6
+ logs); Claude Code's plugin registry through the `claude plugin` CLI only;
7
+ `~/.agents/skills/<member skill>` and `<agent channel>/<member skill>` links; and
8
+ `~/.claude/skills/<member skill>`, which it moves into the quarantine once the plugin
9
+ that replaces it is verified. For a member's old single-member marketplace
10
+ (`legacyMarketplaces` in `family.json`), once that plugin is verified and nothing else
11
+ installed comes from it, it also moves the `extraKnownMarketplaces` entry out of
12
+ `~/.claude/settings.json` (a copy of the file is kept in the quarantine) and runs
13
+ `claude plugin marketplace remove <name>`. It never deletes: every move is listed in
14
+ `~/.passioncode/quarantine/<run>/moved.json` and undone by `passioncode restore`.
15
+
16
+ ## The self-update and who it trusts
17
+
18
+ The SessionStart hook reads `~/.passioncode/state.json` and, at most once a day, starts
19
+ `npm view @passioncode-ai/passioncode version maintainers _npmUser --json`, detached, logging to
20
+ `~/.passioncode/logs/`. It records the latest version, the package's npm maintainers
21
+ and the account that published that version.
22
+
23
+ The hook installs a newer version on its own only when all of these hold:
24
+
25
+ - `update.auto` is on (the default);
26
+ - the recorded maintainers are not empty, and every maintainer **and** the publishing
27
+ account is listed in `trust.json` inside the plugin (`npmPublishers`);
28
+ - the version is a plain `x.y.z`.
29
+
30
+ It then runs `npx --yes @passioncode-ai/passioncode@<that exact version> update --quiet`, detached, so
31
+ the version that was checked is the version that runs. In every other case it spawns
32
+ nothing: a version from an account outside the list is reported in one line naming the
33
+ account ("… not a trusted PassionCode publisher — not installing"); a name nobody has
34
+ published (npm E404) is silent; a failed check is shown once.
35
+
36
+ `trust.json` ships **empty**, so auto-update stays inert until the maintainers name the
37
+ npm account(s) that publish PassionCode. Adding an account there is a release decision:
38
+ it is reviewed like code and ships in the package. A person who wants no background
39
+ updates at all runs `npx passioncode config set update.auto off`.
40
+
41
+ The published package carries skill text only; the vendor step refuses to build when it
42
+ finds a credential-shaped string, or when the self plugin has no valid `trust.json`.
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ const L = require('../lib/launcher');
4
+
5
+ const HELP = `passioncode — every PassionCode.ai skill, for every agent on this machine
6
+
7
+ npx @passioncode-ai/passioncode@latest update [--dry-run] [--json] install or update the whole set
8
+ npx passioncode status [--json] what is installed where
9
+ npx passioncode restore put back what the last update moved aside
10
+ npx passioncode config set update.auto on|off background updates at session start
11
+ npx passioncode uninstall remove the set (quarantined items stay restorable)
12
+
13
+ Claude Code gets plugins from the local "passioncode" marketplace; other agents get
14
+ the same skills through ~/.agents/skills. Restart your agent after an update.`;
15
+
16
+ function main(argv) {
17
+ const [cmd = 'help', ...rest] = argv;
18
+ const json = rest.includes('--json');
19
+ const quiet = rest.includes('--quiet');
20
+ const out = (value, text) => process.stdout.write(json ? JSON.stringify(value, null, 2) + '\n' : text + '\n');
21
+ try {
22
+ if (cmd === 'update' || cmd === 'install') {
23
+ const r = L.update({ dryRun: rest.includes('--dry-run') });
24
+ const failed = r.steps.filter((s) => s.outcome === 'failed');
25
+ if (!quiet || failed.length) {
26
+ out(r, [
27
+ ...r.steps.map((s) => `${s.outcome.padEnd(8)} ${s.kind.padEnd(11)} ${s.detail}${s.error ? `\n ${s.error}` : ''}`),
28
+ '',
29
+ failed.length ? `${failed.length} step(s) failed — the rest were applied. Re-run after fixing, or \`passioncode restore\`.` : rest.includes('--dry-run') ? `Plan for PassionCode.ai ${r.version}: nothing was changed.` : `PassionCode.ai ${r.version}: done. Restart your agent — skills load at session start.`,
30
+ r.moved.length ? `${r.moved.length} item(s) moved aside, restorable with \`passioncode restore\`.` : '',
31
+ ].filter(Boolean).join('\n'));
32
+ }
33
+ return failed.length ? 1 : 0;
34
+ }
35
+ if (cmd === 'status') {
36
+ const s = L.status();
37
+ out(s, [
38
+ `installed ${s.installed || 'nothing'} · package ${s.package || '?'} · latest on npm ${s.latest || 'not checked'}${s.auto ? ' · auto-update on' : ' · auto-update off'}`,
39
+ ...s.members.map((m) => `${m.name.padEnd(22)} ${String(m.version).padEnd(8)} claude: ${m.claude}${m.legacy.length ? ` (+ legacy ${m.legacy.join(', ')})` : ''}${m.legacyMarketplaces.length ? ` (+ legacy marketplace ${m.legacyMarketplaces.join(', ')})` : ''} · hub: ${m.hub.filter((h) => h.ok).length}/${m.hub.length}${m.shadows.length ? ` · SHADOW: ${m.shadows.join(', ')}` : ''}`),
40
+ ].join('\n'));
41
+ return 0;
42
+ }
43
+ if (cmd === 'restore') {
44
+ const r = L.restore();
45
+ out(r, r.length ? `Restored:\n ${r.join('\n ')}` : 'Nothing to restore.');
46
+ return 0;
47
+ }
48
+ if (cmd === 'config' && rest[0] === 'set') {
49
+ out(L.setConfig({ key: rest[1], value: rest[2] }), `update.auto = ${rest[2]}`);
50
+ return 0;
51
+ }
52
+ if (cmd === 'uninstall') {
53
+ const r = L.uninstall();
54
+ out(r, r.length ? `Removed:\n ${r.join('\n ')}` : 'Nothing was installed.');
55
+ return 0;
56
+ }
57
+ process.stdout.write(HELP + '\n');
58
+ return cmd === 'help' || cmd === '--help' || cmd === '-h' ? 0 : 2;
59
+ } catch (error) {
60
+ process.stderr.write(`passioncode: ${error.message}\n`);
61
+ return 1;
62
+ }
63
+ }
64
+
65
+ process.exit(main(process.argv.slice(2)));
package/family.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "passioncode",
3
+ "owner": "passioncode-ai",
4
+ "displayName": "PassionCode.ai",
5
+ "description": "Every PassionCode.ai agent skill, for Claude Code and every other agent on the machine, updated as one set.",
6
+ "members": [
7
+ {
8
+ "name": "fabric-agent-adapter",
9
+ "displayName": "Fabric Agent Adapter",
10
+ "repo": "passioncode-ai/fabric-agent-adapter",
11
+ "checkout": "~/DATA/fabric-agent-adapter",
12
+ "ref": "v0.4.2",
13
+ "kind": "plugin",
14
+ "path": "plugins/fabric-agent-adapter",
15
+ "legacyPluginIds": [
16
+ "fabric-agent-adapter@fabric-agent-adapter"
17
+ ],
18
+ "legacyMarketplaces": [
19
+ "fabric-agent-adapter"
20
+ ]
21
+ },
22
+ {
23
+ "name": "observatory-log",
24
+ "displayName": "Observatory Log",
25
+ "repo": "passioncode-ai/project-observatory-dashboard",
26
+ "checkout": "~/DATA/project-observatory-open-source",
27
+ "ref": "v0.8.1",
28
+ "kind": "plugin",
29
+ "path": "observatory/engine/skill/plugins/observatory-log",
30
+ "legacyPluginIds": [
31
+ "observatory-log@observatory-log"
32
+ ],
33
+ "legacyMarketplaces": [
34
+ "observatory-log"
35
+ ]
36
+ },
37
+ {
38
+ "name": "passioncode",
39
+ "displayName": "PassionCode.ai",
40
+ "kind": "self",
41
+ "path": "plugin/passioncode",
42
+ "description": "Keeps the PassionCode.ai set current: a once-a-day check at session start and a background update."
43
+ }
44
+ ]
45
+ }