@jaybeeuu/agent-cortex 1.42.0 → 1.43.0

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 (62) hide show
  1. package/.agents/skills/style-versioning/SKILL.md +73 -2
  2. package/.github/workflows/ci.yml +47 -27
  3. package/AGENTS.md +23 -2
  4. package/CHANGELOG.md +166 -0
  5. package/README.md +125 -73
  6. package/agents/README.md +17 -4
  7. package/bin/agent-cortex.mjs +48 -30
  8. package/bin/installers/pi.mjs +885 -237
  9. package/docs/claude-hooks.md +5 -4
  10. package/docs/commit-signing.md +231 -0
  11. package/docs/ideas/enable-signed-commit-enforcement-changesets-bot-commits-must-be-signed.md +10 -1
  12. package/docs/ideas/extension-manifests.md +5 -0
  13. package/docs/research/disable-model-invocation.md +103 -0
  14. package/docs/research/skill-design-research.md +2 -2
  15. package/docs/skills/skill-anatomy.md +5 -1
  16. package/docs/technical-direction/harness-config.md +25 -1
  17. package/docs/technical-direction/migration-execution-labels.md +17 -9
  18. package/extensions/agent-modes/discover.test.ts +19 -0
  19. package/extensions/agent-modes/discover.ts +25 -3
  20. package/extensions/session-start/README.md +38 -0
  21. package/extensions/session-start/index.test.ts +122 -0
  22. package/extensions/session-start/index.ts +27 -0
  23. package/extensions/session-start/package.json +19 -0
  24. package/extensions/session-start/tsconfig.json +12 -0
  25. package/extensions/skill-stats/pnpm-lock.yaml +329 -0
  26. package/extensions/subagent/README.md +1 -1
  27. package/extensions/subagent/agents.test.ts +176 -0
  28. package/extensions/subagent/agents.ts +102 -11
  29. package/extensions/subagent/index.ts +2 -1
  30. package/extensions/subagent/package.json +1 -1
  31. package/lib/cli.mjs +35 -9
  32. package/package.json +6 -5
  33. package/pi/settings.json +1 -7
  34. package/plugin.json +1 -1
  35. package/pnpm-workspace.yaml +6 -0
  36. package/scripts/check-changeset.mjs +42 -0
  37. package/scripts/lib/release-gates.mjs +61 -0
  38. package/scripts/lib/verify-worker-tree.mjs +107 -0
  39. package/scripts/resolve-publish-command.mjs +17 -0
  40. package/skills/planning/create-task/scripts/pnpm-lock.yaml +342 -0
  41. package/skills/productivity/validate-agent-dir/scripts/pnpm-lock.yaml +329 -0
  42. package/skills/workflow/git-workflow/SKILL.md +35 -1
  43. package/skills/workflow/ralph/REFERENCE.md +17 -1
  44. package/skills/workflow/ralph/SKILL.md +4 -1
  45. package/skills/workflow/run-pipeline-stage/SKILL.md +11 -4
  46. package/skills/workflow/run-pipeline-stage/playbooks/code.md +2 -0
  47. package/skills/workflow/run-pipeline-stage/playbooks/document.md +3 -0
  48. package/skills/workflow/run-pipeline-stage/playbooks/fix.md +2 -0
  49. package/skills/workflow/run-pipeline-stage/prompts/stage-runner.md +11 -0
  50. package/skills/workflow/run-pipeline-stage/scripts/pnpm-lock.yaml +342 -0
  51. package/test/cli.test.mjs +26 -29
  52. package/test/helpers/fake-pi.mjs +132 -0
  53. package/test/pi-installer.test.mjs +345 -286
  54. package/test/pi-register.test.mjs +342 -0
  55. package/test/pi-sweep.test.mjs +619 -0
  56. package/test/release-gates.test.mjs +190 -0
  57. package/test/verify-worker-tree.test.mjs +120 -0
  58. package/token-map.README.md +7 -6
  59. package/token-map.json +6 -5
  60. package/extensions/session-start.ts +0 -44
  61. package/lib/pi-packages.mjs +0 -169
  62. package/test/pi-packages.test.mjs +0 -295
@@ -0,0 +1,122 @@
1
+ import { after, before, describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
7
+
8
+ import sessionStartExtension from "./index.ts";
9
+
10
+ // ─── Harness ─────────────────────────────────────────────────────────────────
11
+
12
+ interface InjectedMessage {
13
+ customType: string;
14
+ content: string;
15
+ display: boolean;
16
+ }
17
+
18
+ /** A handler recorded from `pi.on`, invoked via Reflect.apply so its exact
19
+ * overload signature does not leak into the fake. */
20
+ type RecordedHandler = (...args: never[]) => unknown;
21
+
22
+ interface FakePi {
23
+ pi: ExtensionAPI;
24
+ /** Simulate pi dispatching `before_agent_start` and return the injected message. */
25
+ start(cwd: string): Promise<InjectedMessage | undefined>;
26
+ }
27
+
28
+ function createFakePi(): FakePi {
29
+ const handlers = new Map<string, RecordedHandler[]>();
30
+
31
+ const pi: ExtensionAPI = {
32
+ on: (event: string, handler: RecordedHandler) => {
33
+ const list = handlers.get(event) ?? [];
34
+ list.push(handler);
35
+ handlers.set(event, list);
36
+ },
37
+ } as unknown as ExtensionAPI;
38
+
39
+ return {
40
+ pi,
41
+ async start(cwd) {
42
+ const handler = handlers.get("before_agent_start")?.[0];
43
+ assert.ok(handler, "session-start should register a before_agent_start handler");
44
+ const run = handler as unknown as (
45
+ event: unknown,
46
+ ctx: { cwd: string },
47
+ ) => Promise<{ message?: InjectedMessage } | undefined>;
48
+ const result = await run({}, { cwd });
49
+ return result?.message;
50
+ },
51
+ };
52
+ }
53
+
54
+ /** Run one simulated session start against `cwd` and return the injected text. */
55
+ async function inject(cwd: string): Promise<string | undefined> {
56
+ const fake = createFakePi();
57
+ sessionStartExtension(fake.pi);
58
+ const message = await fake.start(cwd);
59
+ return message?.content;
60
+ }
61
+
62
+ // ─── Fixtures ────────────────────────────────────────────────────────────────
63
+
64
+ const AGENTS_MD = "# AGENTS\n\nProject instructions live here.";
65
+ const PREFERENCES_MD = "# User Preferences\n\nPrefer pnpm over npm.";
66
+
67
+ describe("session-start injection", () => {
68
+ let emptyProject: string;
69
+ let fullProject: string;
70
+
71
+ before(() => {
72
+ emptyProject = mkdtempSync(join(tmpdir(), "session-start-empty-"));
73
+ fullProject = mkdtempSync(join(tmpdir(), "session-start-full-"));
74
+ writeFileSync(join(fullProject, "AGENTS.md"), AGENTS_MD, "utf-8");
75
+ mkdirSync(join(fullProject, "docs"), { recursive: true });
76
+ writeFileSync(join(fullProject, "docs", "user-preferences.md"), PREFERENCES_MD, "utf-8");
77
+ });
78
+
79
+ after(() => {
80
+ rmSync(emptyProject, { recursive: true, force: true });
81
+ rmSync(fullProject, { recursive: true, force: true });
82
+ });
83
+
84
+ it("injects AGENTS.md and docs/user-preferences.md content", async () => {
85
+ const content = await inject(fullProject);
86
+ assert.ok(content, "expected the context files to be injected");
87
+ assert.match(content, /--- AGENTS\.md ---/);
88
+ assert.match(content, /Project instructions live here\./);
89
+ assert.match(content, /--- user-preferences\.md ---/);
90
+ assert.match(content, /Prefer pnpm over npm\./);
91
+ });
92
+
93
+ it("marks the injected message as a hidden session-start message", async () => {
94
+ const fake = createFakePi();
95
+ sessionStartExtension(fake.pi);
96
+ const message = await fake.start(fullProject);
97
+
98
+ assert.ok(message);
99
+ assert.equal(message.customType, "session-start");
100
+ assert.equal(message.display, false);
101
+ });
102
+
103
+ it("injects nothing for a project without context files", async () => {
104
+ const content = await inject(emptyProject);
105
+ assert.equal(content, undefined, "no context files means no injected message");
106
+ });
107
+
108
+ it("never advertises skills with pi-unresolvable /skill: syntax", async () => {
109
+ const content = await inject(fullProject);
110
+ assert.ok(content);
111
+ assert.ok(!content.includes("/skill:"), "pi has no /skill: resolver — drop the hint blurb");
112
+ });
113
+
114
+ it("never enumerates a fixed subset of skill names", async () => {
115
+ // pi's system prompt already lists every discovered skill with its SKILL.md
116
+ // path; a hand-maintained subset here drifts from skills/ silently.
117
+ const content = (await inject(fullProject)) ?? "";
118
+ for (const skill of ["using-agent-skills", "bd-tool", "git-workflow"]) {
119
+ assert.ok(!content.includes(skill), `${skill} should not be hardcoded in session-start`);
120
+ }
121
+ });
122
+ });
@@ -0,0 +1,27 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import { loadSessionContext } from "../lib/context-loader.ts";
3
+
4
+ /**
5
+ * Session-start extension.
6
+ *
7
+ * Injects the project context files (AGENTS.md, docs/user-preferences.md) at
8
+ * the start of every PI session.
9
+ *
10
+ * It deliberately injects nothing about skills: pi's own system prompt already
11
+ * lists every discovered skill with the absolute path to its SKILL.md, so a
12
+ * local copy is incomplete by construction and drifts from `skills/` silently.
13
+ */
14
+ export default function (pi: ExtensionAPI) {
15
+ pi.on("before_agent_start", async (_event, ctx) => {
16
+ const contextFiles = loadSessionContext(ctx.cwd);
17
+ if (!contextFiles) return;
18
+
19
+ return {
20
+ message: {
21
+ customType: "session-start",
22
+ content: contextFiles,
23
+ display: false,
24
+ },
25
+ };
26
+ });
27
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@agent-cortex/session-start",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "test": "node --test --import tsx/esm index.test.ts",
8
+ "typecheck": "tsc --noEmit"
9
+ },
10
+ "devDependencies": {
11
+ "@earendil-works/pi-coding-agent": "^0.78.1",
12
+ "@types/node": "^22.0.0",
13
+ "tsx": "^4.0.0",
14
+ "typescript": "^5.0.0"
15
+ },
16
+ "peerDependencies": {
17
+ "@earendil-works/pi-coding-agent": "^0.78.1"
18
+ }
19
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "Node16",
5
+ "moduleResolution": "Node16",
6
+ "strict": true,
7
+ "noEmit": true,
8
+ "allowImportingTsExtensions": true,
9
+ "skipLibCheck": true
10
+ },
11
+ "include": ["*.ts"]
12
+ }
@@ -0,0 +1,329 @@
1
+ lockfileVersion: '9.0'
2
+
3
+ settings:
4
+ autoInstallPeers: true
5
+ excludeLinksFromLockfile: false
6
+
7
+ importers:
8
+
9
+ .:
10
+ devDependencies:
11
+ '@types/node':
12
+ specifier: ^22.0.0
13
+ version: 22.19.20
14
+ tsx:
15
+ specifier: ^4.0.0
16
+ version: 4.22.4
17
+ typescript:
18
+ specifier: ^5.0.0
19
+ version: 5.9.3
20
+
21
+ packages:
22
+
23
+ '@esbuild/aix-ppc64@0.28.0':
24
+ resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==}
25
+ engines: {node: '>=18'}
26
+ cpu: [ppc64]
27
+ os: [aix]
28
+
29
+ '@esbuild/android-arm64@0.28.0':
30
+ resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==}
31
+ engines: {node: '>=18'}
32
+ cpu: [arm64]
33
+ os: [android]
34
+
35
+ '@esbuild/android-arm@0.28.0':
36
+ resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==}
37
+ engines: {node: '>=18'}
38
+ cpu: [arm]
39
+ os: [android]
40
+
41
+ '@esbuild/android-x64@0.28.0':
42
+ resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==}
43
+ engines: {node: '>=18'}
44
+ cpu: [x64]
45
+ os: [android]
46
+
47
+ '@esbuild/darwin-arm64@0.28.0':
48
+ resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==}
49
+ engines: {node: '>=18'}
50
+ cpu: [arm64]
51
+ os: [darwin]
52
+
53
+ '@esbuild/darwin-x64@0.28.0':
54
+ resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==}
55
+ engines: {node: '>=18'}
56
+ cpu: [x64]
57
+ os: [darwin]
58
+
59
+ '@esbuild/freebsd-arm64@0.28.0':
60
+ resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==}
61
+ engines: {node: '>=18'}
62
+ cpu: [arm64]
63
+ os: [freebsd]
64
+
65
+ '@esbuild/freebsd-x64@0.28.0':
66
+ resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==}
67
+ engines: {node: '>=18'}
68
+ cpu: [x64]
69
+ os: [freebsd]
70
+
71
+ '@esbuild/linux-arm64@0.28.0':
72
+ resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==}
73
+ engines: {node: '>=18'}
74
+ cpu: [arm64]
75
+ os: [linux]
76
+
77
+ '@esbuild/linux-arm@0.28.0':
78
+ resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==}
79
+ engines: {node: '>=18'}
80
+ cpu: [arm]
81
+ os: [linux]
82
+
83
+ '@esbuild/linux-ia32@0.28.0':
84
+ resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==}
85
+ engines: {node: '>=18'}
86
+ cpu: [ia32]
87
+ os: [linux]
88
+
89
+ '@esbuild/linux-loong64@0.28.0':
90
+ resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==}
91
+ engines: {node: '>=18'}
92
+ cpu: [loong64]
93
+ os: [linux]
94
+
95
+ '@esbuild/linux-mips64el@0.28.0':
96
+ resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==}
97
+ engines: {node: '>=18'}
98
+ cpu: [mips64el]
99
+ os: [linux]
100
+
101
+ '@esbuild/linux-ppc64@0.28.0':
102
+ resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==}
103
+ engines: {node: '>=18'}
104
+ cpu: [ppc64]
105
+ os: [linux]
106
+
107
+ '@esbuild/linux-riscv64@0.28.0':
108
+ resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==}
109
+ engines: {node: '>=18'}
110
+ cpu: [riscv64]
111
+ os: [linux]
112
+
113
+ '@esbuild/linux-s390x@0.28.0':
114
+ resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==}
115
+ engines: {node: '>=18'}
116
+ cpu: [s390x]
117
+ os: [linux]
118
+
119
+ '@esbuild/linux-x64@0.28.0':
120
+ resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==}
121
+ engines: {node: '>=18'}
122
+ cpu: [x64]
123
+ os: [linux]
124
+
125
+ '@esbuild/netbsd-arm64@0.28.0':
126
+ resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==}
127
+ engines: {node: '>=18'}
128
+ cpu: [arm64]
129
+ os: [netbsd]
130
+
131
+ '@esbuild/netbsd-x64@0.28.0':
132
+ resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==}
133
+ engines: {node: '>=18'}
134
+ cpu: [x64]
135
+ os: [netbsd]
136
+
137
+ '@esbuild/openbsd-arm64@0.28.0':
138
+ resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==}
139
+ engines: {node: '>=18'}
140
+ cpu: [arm64]
141
+ os: [openbsd]
142
+
143
+ '@esbuild/openbsd-x64@0.28.0':
144
+ resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==}
145
+ engines: {node: '>=18'}
146
+ cpu: [x64]
147
+ os: [openbsd]
148
+
149
+ '@esbuild/openharmony-arm64@0.28.0':
150
+ resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==}
151
+ engines: {node: '>=18'}
152
+ cpu: [arm64]
153
+ os: [openharmony]
154
+
155
+ '@esbuild/sunos-x64@0.28.0':
156
+ resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==}
157
+ engines: {node: '>=18'}
158
+ cpu: [x64]
159
+ os: [sunos]
160
+
161
+ '@esbuild/win32-arm64@0.28.0':
162
+ resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==}
163
+ engines: {node: '>=18'}
164
+ cpu: [arm64]
165
+ os: [win32]
166
+
167
+ '@esbuild/win32-ia32@0.28.0':
168
+ resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==}
169
+ engines: {node: '>=18'}
170
+ cpu: [ia32]
171
+ os: [win32]
172
+
173
+ '@esbuild/win32-x64@0.28.0':
174
+ resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==}
175
+ engines: {node: '>=18'}
176
+ cpu: [x64]
177
+ os: [win32]
178
+
179
+ '@types/node@22.19.20':
180
+ resolution: {integrity: sha512-6tELRwSDYWW9EdZhbeZmYGZ1/7Djkt+Ah3/ScEYT9cDord7UJzasR/4D3VONg9tQI5CDp+/CZC1AXj2pCFOvpw==}
181
+
182
+ esbuild@0.28.0:
183
+ resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==}
184
+ engines: {node: '>=18'}
185
+ hasBin: true
186
+
187
+ fsevents@2.3.3:
188
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
189
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
190
+ os: [darwin]
191
+
192
+ tsx@4.22.4:
193
+ resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==}
194
+ engines: {node: '>=18.0.0'}
195
+ hasBin: true
196
+
197
+ typescript@5.9.3:
198
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
199
+ engines: {node: '>=14.17'}
200
+ hasBin: true
201
+
202
+ undici-types@6.21.0:
203
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
204
+
205
+ snapshots:
206
+
207
+ '@esbuild/aix-ppc64@0.28.0':
208
+ optional: true
209
+
210
+ '@esbuild/android-arm64@0.28.0':
211
+ optional: true
212
+
213
+ '@esbuild/android-arm@0.28.0':
214
+ optional: true
215
+
216
+ '@esbuild/android-x64@0.28.0':
217
+ optional: true
218
+
219
+ '@esbuild/darwin-arm64@0.28.0':
220
+ optional: true
221
+
222
+ '@esbuild/darwin-x64@0.28.0':
223
+ optional: true
224
+
225
+ '@esbuild/freebsd-arm64@0.28.0':
226
+ optional: true
227
+
228
+ '@esbuild/freebsd-x64@0.28.0':
229
+ optional: true
230
+
231
+ '@esbuild/linux-arm64@0.28.0':
232
+ optional: true
233
+
234
+ '@esbuild/linux-arm@0.28.0':
235
+ optional: true
236
+
237
+ '@esbuild/linux-ia32@0.28.0':
238
+ optional: true
239
+
240
+ '@esbuild/linux-loong64@0.28.0':
241
+ optional: true
242
+
243
+ '@esbuild/linux-mips64el@0.28.0':
244
+ optional: true
245
+
246
+ '@esbuild/linux-ppc64@0.28.0':
247
+ optional: true
248
+
249
+ '@esbuild/linux-riscv64@0.28.0':
250
+ optional: true
251
+
252
+ '@esbuild/linux-s390x@0.28.0':
253
+ optional: true
254
+
255
+ '@esbuild/linux-x64@0.28.0':
256
+ optional: true
257
+
258
+ '@esbuild/netbsd-arm64@0.28.0':
259
+ optional: true
260
+
261
+ '@esbuild/netbsd-x64@0.28.0':
262
+ optional: true
263
+
264
+ '@esbuild/openbsd-arm64@0.28.0':
265
+ optional: true
266
+
267
+ '@esbuild/openbsd-x64@0.28.0':
268
+ optional: true
269
+
270
+ '@esbuild/openharmony-arm64@0.28.0':
271
+ optional: true
272
+
273
+ '@esbuild/sunos-x64@0.28.0':
274
+ optional: true
275
+
276
+ '@esbuild/win32-arm64@0.28.0':
277
+ optional: true
278
+
279
+ '@esbuild/win32-ia32@0.28.0':
280
+ optional: true
281
+
282
+ '@esbuild/win32-x64@0.28.0':
283
+ optional: true
284
+
285
+ '@types/node@22.19.20':
286
+ dependencies:
287
+ undici-types: 6.21.0
288
+
289
+ esbuild@0.28.0:
290
+ optionalDependencies:
291
+ '@esbuild/aix-ppc64': 0.28.0
292
+ '@esbuild/android-arm': 0.28.0
293
+ '@esbuild/android-arm64': 0.28.0
294
+ '@esbuild/android-x64': 0.28.0
295
+ '@esbuild/darwin-arm64': 0.28.0
296
+ '@esbuild/darwin-x64': 0.28.0
297
+ '@esbuild/freebsd-arm64': 0.28.0
298
+ '@esbuild/freebsd-x64': 0.28.0
299
+ '@esbuild/linux-arm': 0.28.0
300
+ '@esbuild/linux-arm64': 0.28.0
301
+ '@esbuild/linux-ia32': 0.28.0
302
+ '@esbuild/linux-loong64': 0.28.0
303
+ '@esbuild/linux-mips64el': 0.28.0
304
+ '@esbuild/linux-ppc64': 0.28.0
305
+ '@esbuild/linux-riscv64': 0.28.0
306
+ '@esbuild/linux-s390x': 0.28.0
307
+ '@esbuild/linux-x64': 0.28.0
308
+ '@esbuild/netbsd-arm64': 0.28.0
309
+ '@esbuild/netbsd-x64': 0.28.0
310
+ '@esbuild/openbsd-arm64': 0.28.0
311
+ '@esbuild/openbsd-x64': 0.28.0
312
+ '@esbuild/openharmony-arm64': 0.28.0
313
+ '@esbuild/sunos-x64': 0.28.0
314
+ '@esbuild/win32-arm64': 0.28.0
315
+ '@esbuild/win32-ia32': 0.28.0
316
+ '@esbuild/win32-x64': 0.28.0
317
+
318
+ fsevents@2.3.3:
319
+ optional: true
320
+
321
+ tsx@4.22.4:
322
+ dependencies:
323
+ esbuild: 0.28.0
324
+ optionalDependencies:
325
+ fsevents: 2.3.3
326
+
327
+ typescript@5.9.3: {}
328
+
329
+ undici-types@6.21.0: {}
@@ -58,7 +58,7 @@ This tool executes a separate `pi` subprocess with a delegated system prompt and
58
58
 
59
59
  **Project-local agents** (`.pi/agents/*.md`) are repo-controlled prompts that can instruct the model to read files, run bash commands, etc.
60
60
 
61
- **Default behavior:** Only loads **user-level agents** from `~/.pi/agent/agents`.
61
+ **Default behavior:** Only loads **user-level agents** — pi's own `~/.pi/agent/agents`, plus the `agents/` tree of the package this extension ships inside when that is a rendered (staged) tree, e.g. `~/.agent-cortex/pi/agents` after `agent-cortex install pi`.
62
62
 
63
63
  To enable project-local agents, pass `agentScope: "both"` (or `"project"`). Only do this for repositories you trust.
64
64