@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.
- package/.agents/skills/style-versioning/SKILL.md +78 -8
- package/.github/workflows/ci.yml +51 -38
- package/AGENTS.md +32 -17
- package/CHANGELOG.md +182 -0
- package/README.md +167 -126
- package/agents/README.md +26 -27
- package/agents/ralph/agent.md +7 -10
- package/agents/ralph/claude/polling.md +1 -1
- package/bin/agent-cortex.mjs +46 -44
- package/bin/installers/claude.mjs +2 -2
- package/bin/installers/pi.mjs +885 -237
- package/docs/claude-hooks.md +5 -4
- package/docs/commit-signing.md +231 -0
- package/docs/ideas/enable-signed-commit-enforcement-changesets-bot-commits-must-be-signed.md +10 -1
- package/docs/ideas/extension-manifests.md +5 -0
- package/docs/research/disable-model-invocation.md +82 -0
- package/docs/research/skill-design-research.md +2 -2
- package/docs/skills/skill-anatomy.md +5 -2
- package/docs/technical-direction/harness-config.md +30 -14
- package/docs/technical-direction/migration-execution-labels.md +17 -9
- package/docs/user-preferences.md +2 -2
- package/extensions/agent-modes/README.md +3 -3
- package/extensions/agent-modes/discover.test.ts +19 -0
- package/extensions/agent-modes/discover.ts +31 -9
- package/extensions/session-start/README.md +38 -0
- package/extensions/session-start/index.test.ts +122 -0
- package/extensions/session-start/index.ts +27 -0
- package/extensions/session-start/package.json +19 -0
- package/extensions/session-start/tsconfig.json +12 -0
- package/extensions/skill-stats/pnpm-lock.yaml +329 -0
- package/extensions/subagent/README.md +3 -3
- package/extensions/subagent/agents.test.ts +176 -0
- package/extensions/subagent/agents.ts +101 -11
- package/extensions/subagent/index.ts +2 -1
- package/extensions/subagent/package.json +1 -1
- package/lib/cli.mjs +40 -16
- package/package.json +8 -9
- package/pi/settings.json +1 -7
- package/pnpm-workspace.yaml +6 -0
- package/scripts/check-changeset.mjs +42 -0
- package/scripts/lib/compose-agent.mjs +10 -10
- package/scripts/lib/release-gates.mjs +61 -0
- package/scripts/lib/verify-worker-tree.mjs +107 -0
- package/scripts/resolve-publish-command.mjs +17 -0
- package/skills/planning/create-task/scripts/pnpm-lock.yaml +342 -0
- package/skills/productivity/validate-agent-dir/scripts/pnpm-lock.yaml +329 -0
- package/skills/workflow/git-workflow/SKILL.md +35 -1
- package/skills/workflow/ralph/REFERENCE.md +20 -4
- package/skills/workflow/ralph/SKILL.md +9 -6
- package/skills/workflow/run-pipeline-stage/SKILL.md +11 -4
- package/skills/workflow/run-pipeline-stage/playbooks/code.md +2 -0
- package/skills/workflow/run-pipeline-stage/playbooks/document.md +3 -0
- package/skills/workflow/run-pipeline-stage/playbooks/fix.md +2 -0
- package/skills/workflow/run-pipeline-stage/prompts/stage-runner.md +11 -0
- package/skills/workflow/run-pipeline-stage/scripts/pnpm-lock.yaml +342 -0
- package/test/cli.test.mjs +37 -39
- package/test/helpers/fake-pi.mjs +132 -0
- package/test/pi-installer.test.mjs +345 -286
- package/test/pi-register.test.mjs +342 -0
- package/test/pi-sweep.test.mjs +619 -0
- package/test/release-gates.test.mjs +190 -0
- package/test/verify-worker-tree.test.mjs +120 -0
- package/token-map.README.md +16 -18
- package/token-map.json +29 -33
- package/agents/plan/copilot/frontmatter.json +0 -6
- package/agents/plan.agent.md +0 -59
- package/agents/ralph/copilot/frontmatter.json +0 -6
- package/agents/ralph/copilot/polling.md +0 -62
- package/agents/ralph-plan/copilot/frontmatter.json +0 -6
- package/agents/ralph-plan.agent.md +0 -126
- package/agents/ralph.agent.md +0 -331
- package/agents/strategy/copilot/frontmatter.json +0 -6
- package/agents/strategy.agent.md +0 -112
- package/bin/installers/copilot.mjs +0 -124
- package/extensions/session-start.ts +0 -44
- package/hooks.json +0 -10
- package/lib/pi-packages.mjs +0 -169
- package/plugin.json +0 -35
- package/scripts/build-copilot-agents.mjs +0 -30
- package/scripts/install-instructions.sh +0 -82
- package/scripts/sync-plugin-version.sh +0 -17
- package/test/copilot-installer.test.mjs +0 -308
- 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 (
|
|
22
|
-
*
|
|
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 = "
|
|
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
|
|
331
|
-
// tools: ["bash", "view"]
|
|
332
|
-
// tools:
|
|
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 (
|
|
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,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**
|
|
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
|
|
115
|
-
blocking wait that
|
|
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
|