@jaybeeuu/agent-cortex 1.42.0 → 2.0.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 (83) hide show
  1. package/.agents/skills/style-versioning/SKILL.md +78 -8
  2. package/.github/workflows/ci.yml +51 -38
  3. package/AGENTS.md +32 -17
  4. package/CHANGELOG.md +182 -0
  5. package/README.md +167 -126
  6. package/agents/README.md +26 -27
  7. package/agents/ralph/agent.md +7 -10
  8. package/agents/ralph/claude/polling.md +1 -1
  9. package/bin/agent-cortex.mjs +46 -44
  10. package/bin/installers/claude.mjs +2 -2
  11. package/bin/installers/pi.mjs +885 -237
  12. package/docs/claude-hooks.md +5 -4
  13. package/docs/commit-signing.md +231 -0
  14. package/docs/ideas/enable-signed-commit-enforcement-changesets-bot-commits-must-be-signed.md +10 -1
  15. package/docs/ideas/extension-manifests.md +5 -0
  16. package/docs/research/disable-model-invocation.md +82 -0
  17. package/docs/research/skill-design-research.md +2 -2
  18. package/docs/skills/skill-anatomy.md +5 -2
  19. package/docs/technical-direction/harness-config.md +30 -14
  20. package/docs/technical-direction/migration-execution-labels.md +17 -9
  21. package/docs/user-preferences.md +2 -2
  22. package/extensions/agent-modes/README.md +3 -3
  23. package/extensions/agent-modes/discover.test.ts +19 -0
  24. package/extensions/agent-modes/discover.ts +31 -9
  25. package/extensions/session-start/README.md +38 -0
  26. package/extensions/session-start/index.test.ts +122 -0
  27. package/extensions/session-start/index.ts +27 -0
  28. package/extensions/session-start/package.json +19 -0
  29. package/extensions/session-start/tsconfig.json +12 -0
  30. package/extensions/skill-stats/pnpm-lock.yaml +329 -0
  31. package/extensions/subagent/README.md +3 -3
  32. package/extensions/subagent/agents.test.ts +176 -0
  33. package/extensions/subagent/agents.ts +101 -11
  34. package/extensions/subagent/index.ts +2 -1
  35. package/extensions/subagent/package.json +1 -1
  36. package/lib/cli.mjs +40 -16
  37. package/package.json +8 -9
  38. package/pi/settings.json +1 -7
  39. package/pnpm-workspace.yaml +6 -0
  40. package/scripts/check-changeset.mjs +42 -0
  41. package/scripts/lib/compose-agent.mjs +10 -10
  42. package/scripts/lib/release-gates.mjs +61 -0
  43. package/scripts/lib/verify-worker-tree.mjs +107 -0
  44. package/scripts/resolve-publish-command.mjs +17 -0
  45. package/skills/planning/create-task/scripts/pnpm-lock.yaml +342 -0
  46. package/skills/productivity/validate-agent-dir/scripts/pnpm-lock.yaml +329 -0
  47. package/skills/workflow/git-workflow/SKILL.md +35 -1
  48. package/skills/workflow/ralph/REFERENCE.md +20 -4
  49. package/skills/workflow/ralph/SKILL.md +9 -6
  50. package/skills/workflow/run-pipeline-stage/SKILL.md +11 -4
  51. package/skills/workflow/run-pipeline-stage/playbooks/code.md +2 -0
  52. package/skills/workflow/run-pipeline-stage/playbooks/document.md +3 -0
  53. package/skills/workflow/run-pipeline-stage/playbooks/fix.md +2 -0
  54. package/skills/workflow/run-pipeline-stage/prompts/stage-runner.md +11 -0
  55. package/skills/workflow/run-pipeline-stage/scripts/pnpm-lock.yaml +342 -0
  56. package/test/cli.test.mjs +37 -39
  57. package/test/helpers/fake-pi.mjs +132 -0
  58. package/test/pi-installer.test.mjs +345 -286
  59. package/test/pi-register.test.mjs +342 -0
  60. package/test/pi-sweep.test.mjs +619 -0
  61. package/test/release-gates.test.mjs +190 -0
  62. package/test/verify-worker-tree.test.mjs +120 -0
  63. package/token-map.README.md +16 -18
  64. package/token-map.json +29 -33
  65. package/agents/plan/copilot/frontmatter.json +0 -6
  66. package/agents/plan.agent.md +0 -59
  67. package/agents/ralph/copilot/frontmatter.json +0 -6
  68. package/agents/ralph/copilot/polling.md +0 -62
  69. package/agents/ralph-plan/copilot/frontmatter.json +0 -6
  70. package/agents/ralph-plan.agent.md +0 -126
  71. package/agents/ralph.agent.md +0 -331
  72. package/agents/strategy/copilot/frontmatter.json +0 -6
  73. package/agents/strategy.agent.md +0 -112
  74. package/bin/installers/copilot.mjs +0 -124
  75. package/extensions/session-start.ts +0 -44
  76. package/hooks.json +0 -10
  77. package/lib/pi-packages.mjs +0 -169
  78. package/plugin.json +0 -35
  79. package/scripts/build-copilot-agents.mjs +0 -30
  80. package/scripts/install-instructions.sh +0 -82
  81. package/scripts/sync-plugin-version.sh +0 -17
  82. package/test/copilot-installer.test.mjs +0 -308
  83. package/test/pi-packages.test.mjs +0 -295
@@ -18,9 +18,9 @@ import type { ThemeColor } from "@earendil-works/pi-coding-agent";
18
18
  * and symlinked installs).
19
19
  *
20
20
  * Flat `agents/*.agent.md` files are parsed as a fallback for agents that have
21
- * no composable directory (they are generated output for Copilot, so they may
22
- * exist for any agent). A composable directory always wins over its flat
23
- * counterpart.
21
+ * no composable directory (a staged pi package ships flat renders, and a
22
+ * hand-written agent may be a single flat file). A composable directory always
23
+ * wins over its flat counterpart.
24
24
  */
25
25
 
26
26
  // ─── Types ───────────────────────────────────────────────────────────────────
@@ -40,7 +40,7 @@ export interface AgentDef {
40
40
  prompt: string;
41
41
  }
42
42
 
43
- export type HarnessId = "copilot" | "claude" | "pi";
43
+ export type HarnessId = "claude" | "pi";
44
44
 
45
45
  export interface PathSpec {
46
46
  base: string;
@@ -290,6 +290,21 @@ interface FlatParsed {
290
290
  prompt: string;
291
291
  }
292
292
 
293
+ /**
294
+ * Split a scalar `tools` value into tool names.
295
+ *
296
+ * Accepts the quoted string the pi installer renders (`tools: "bash, read"`)
297
+ * as well as an unquoted whitespace-separated list (`tools: bash read`).
298
+ * Commas alone are not enough: a whitespace-separated list would collapse to
299
+ * one bogus name and the agent would run with no usable tool allowlist.
300
+ */
301
+ function splitToolList(raw: string): string[] {
302
+ return raw
303
+ .replace(/^["']|["']$/g, "")
304
+ .split(/[,\s]+/)
305
+ .filter(Boolean);
306
+ }
307
+
293
308
  function parseFlatFrontmatter(raw: string): FlatParsed {
294
309
  const lines = raw.split(/\r?\n/);
295
310
  if (lines[0] !== "---") return { prompt: raw };
@@ -327,11 +342,16 @@ function parseFlatFrontmatter(raw: string): FlatParsed {
327
342
  }
328
343
 
329
344
  // Parse tools from the tools frontmatter.
330
- // Supports two formats:
331
- // tools: ["bash", "view"] (JSON array, single line)
332
- // tools: (YAML list, subsequent lines)
345
+ // Supports three formats:
346
+ // tools: ["bash", "view"] (JSON array, single line)
347
+ // tools: "bash, view" (scalar list, comma or whitespace separated)
348
+ // tools: (YAML list, subsequent lines)
333
349
  // - bash
334
350
  // - view
351
+ //
352
+ // The scalar form is what the pi installer renders for generated agents, so
353
+ // it must be read here rather than dropped to DEFAULT_TOOLS (which lifts the
354
+ // restriction instead of applying it).
335
355
  let inToolsBlock = false;
336
356
  for (const line of yamlLines) {
337
357
  const trimmed = line.trim();
@@ -354,6 +374,8 @@ function parseFlatFrontmatter(raw: string): FlatParsed {
354
374
  tools = [];
355
375
  continue;
356
376
  }
377
+ tools = splitToolList(val);
378
+ continue;
357
379
  }
358
380
  }
359
381
 
@@ -409,8 +431,8 @@ function readFlatAgent(filePath: string, tokenMap: TokenMap | null): AgentDef |
409
431
  * Discover agents from the agents directory.
410
432
  *
411
433
  * Composable directories (`<name>/agent.md` + `<name>/pi/frontmatter.json`) are
412
- * the primary source. Flat `*.agent.md` files (generated output for Copilot) are
413
- * read only when no composable directory exists for that agent id. When
434
+ * the primary source. Flat `*.agent.md` files (a staged package's renders, or a
435
+ * hand-written agent) are read only when no composable directory exists for that agent id. When
414
436
  * `tokenMap` is omitted, token-map.json is loaded from the package root;
415
437
  * missing/unreadable maps fall back to the built-in copilot→pi translation.
416
438
  */
@@ -0,0 +1,38 @@
1
+ # session-start
2
+
3
+ A PI extension that injects, at the start of every session, the project's context files:
4
+
5
+ - `AGENTS.md`
6
+ - `docs/user-preferences.md`
7
+
8
+ Paths are relative to the session working directory (`ctx.cwd`); missing or empty files are
9
+ skipped. Content is injected as a hidden `session-start` message on `before_agent_start`, so it
10
+ reaches the model without cluttering the transcript UI.
11
+
12
+ ## No skill list here — on purpose
13
+
14
+ Earlier versions of this extension appended a hand-written blurb advertising three skills with
15
+ `/skill:<name>` syntax. Both halves were wrong:
16
+
17
+ - pi has no `/skill:` resolver — nothing maps that token to a read. Skills are used by reading
18
+ the `SKILL.md` path that pi lists.
19
+ - pi's own system prompt already lists **every** discovered skill with its absolute `SKILL.md`
20
+ path, so a local three-skill list was incomplete and drifted from `skills/` silently.
21
+
22
+ The blurb is gone and `index.test.ts` pins the absence of both `/skill:` syntax and hardcoded
23
+ skill names. Keep the authoritative list in `skills/`; do not reintroduce it here.
24
+
25
+ ## Installation
26
+
27
+ Bundled with the `agent-cortex` PI package — install the package for auto-discovery:
28
+
29
+ ```bash
30
+ pi install git:https://github.com/jaybeeuu/agent-cortex
31
+ ```
32
+
33
+ ## Development
34
+
35
+ ```bash
36
+ pnpm --filter @agent-cortex/session-start test
37
+ pnpm --filter @agent-cortex/session-start typecheck
38
+ ```
@@ -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
 
@@ -111,8 +111,8 @@ fire-and-forget orchestration:
111
111
  - **`read_agent`** — fallback: read one specific agent's output once you know it has
112
112
  finished (or query its `STILL RUNNING` state directly).
113
113
 
114
- These mirror Copilot CLI's `task`/`read_agent` model; `wait_for_agents` adds the
115
- blocking wait that Copilot's poll loop does manually. Abort (Ctrl+C) propagates: a
114
+ These mirror the `task`/`read_agent` model the skills are authored against;
115
+ `wait_for_agents` adds the blocking wait that a `read_agent` poll loop does manually. Abort (Ctrl+C) propagates: a
116
116
  pending `wait_for_agents` returns immediately with whatever is known so far.
117
117
 
118
118
  ## Output Display