@leing2021/super-pi 0.22.0 → 0.23.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 (101) hide show
  1. package/README.md +38 -209
  2. package/extensions/ce-core/index.ts +190 -7
  3. package/extensions/ce-core/tools/parallel-subagent.ts +3 -3
  4. package/extensions/ce-core/tools/subagent.ts +2 -2
  5. package/package.json +4 -18
  6. package/rules/common/naming.md +154 -0
  7. package/skills/02-plan/SKILL.md +3 -2
  8. package/skills/03-work/SKILL.md +9 -6
  9. package/skills/04-review/SKILL.md +3 -2
  10. package/skills/06-next/SKILL.md +38 -10
  11. package/skills/06-next/references/recommendation-logic.md +2 -2
  12. package/skills/07-worktree/SKILL.md +9 -8
  13. package/skills/{09-help → 08-help}/SKILL.md +3 -3
  14. package/skills/{09-help → 08-help}/references/workflow-sequence.md +2 -1
  15. package/skills/references/language-detection.md +44 -0
  16. package/extensions/subagent/agent-management.ts +0 -595
  17. package/extensions/subagent/agent-manager-chain-detail.ts +0 -162
  18. package/extensions/subagent/agent-manager-detail.ts +0 -231
  19. package/extensions/subagent/agent-manager-edit.ts +0 -390
  20. package/extensions/subagent/agent-manager-list.ts +0 -278
  21. package/extensions/subagent/agent-manager-parallel.ts +0 -304
  22. package/extensions/subagent/agent-manager.ts +0 -705
  23. package/extensions/subagent/agent-scope.ts +0 -8
  24. package/extensions/subagent/agent-selection.ts +0 -25
  25. package/extensions/subagent/agent-serializer.ts +0 -123
  26. package/extensions/subagent/agent-templates.ts +0 -62
  27. package/extensions/subagent/agents/context-builder.md +0 -37
  28. package/extensions/subagent/agents/delegate.md +0 -9
  29. package/extensions/subagent/agents/oracle.md +0 -73
  30. package/extensions/subagent/agents/planner.md +0 -52
  31. package/extensions/subagent/agents/researcher.md +0 -50
  32. package/extensions/subagent/agents/reviewer.md +0 -38
  33. package/extensions/subagent/agents/scout.md +0 -48
  34. package/extensions/subagent/agents/worker.md +0 -52
  35. package/extensions/subagent/agents.ts +0 -761
  36. package/extensions/subagent/artifacts.ts +0 -100
  37. package/extensions/subagent/async-execution.ts +0 -520
  38. package/extensions/subagent/async-job-tracker.ts +0 -216
  39. package/extensions/subagent/async-status.ts +0 -241
  40. package/extensions/subagent/chain-clarify.ts +0 -1364
  41. package/extensions/subagent/chain-execution.ts +0 -853
  42. package/extensions/subagent/chain-serializer.ts +0 -126
  43. package/extensions/subagent/completion-dedupe.ts +0 -65
  44. package/extensions/subagent/doctor.ts +0 -200
  45. package/extensions/subagent/execution.ts +0 -738
  46. package/extensions/subagent/file-coalescer.ts +0 -42
  47. package/extensions/subagent/fork-context.ts +0 -63
  48. package/extensions/subagent/formatters.ts +0 -122
  49. package/extensions/subagent/frontmatter.ts +0 -31
  50. package/extensions/subagent/index.ts +0 -585
  51. package/extensions/subagent/intercom-bridge.ts +0 -240
  52. package/extensions/subagent/jsonl-writer.ts +0 -83
  53. package/extensions/subagent/model-fallback.ts +0 -108
  54. package/extensions/subagent/notify.ts +0 -110
  55. package/extensions/subagent/parallel-utils.ts +0 -108
  56. package/extensions/subagent/pi-args.ts +0 -138
  57. package/extensions/subagent/pi-spawn.ts +0 -100
  58. package/extensions/subagent/post-exit-stdio-guard.ts +0 -87
  59. package/extensions/subagent/prompt-template-bridge.ts +0 -399
  60. package/extensions/subagent/prompts/gather-context-and-clarify.md +0 -13
  61. package/extensions/subagent/prompts/parallel-cleanup.md +0 -42
  62. package/extensions/subagent/prompts/parallel-research.md +0 -50
  63. package/extensions/subagent/prompts/parallel-review.md +0 -40
  64. package/extensions/subagent/render-helpers.ts +0 -82
  65. package/extensions/subagent/render.ts +0 -836
  66. package/extensions/subagent/result-intercom.ts +0 -237
  67. package/extensions/subagent/result-watcher.ts +0 -171
  68. package/extensions/subagent/run-history.ts +0 -57
  69. package/extensions/subagent/run-status.ts +0 -136
  70. package/extensions/subagent/schemas.ts +0 -164
  71. package/extensions/subagent/session-tokens.ts +0 -50
  72. package/extensions/subagent/settings.ts +0 -367
  73. package/extensions/subagent/single-output.ts +0 -97
  74. package/extensions/subagent/skills.ts +0 -626
  75. package/extensions/subagent/slash-bridge.ts +0 -176
  76. package/extensions/subagent/slash-commands.ts +0 -303
  77. package/extensions/subagent/slash-live-state.ts +0 -294
  78. package/extensions/subagent/subagent-control.ts +0 -150
  79. package/extensions/subagent/subagent-executor.ts +0 -1899
  80. package/extensions/subagent/subagent-prompt-runtime.ts +0 -75
  81. package/extensions/subagent/subagent-runner.ts +0 -1470
  82. package/extensions/subagent/subagents-status.ts +0 -472
  83. package/extensions/subagent/text-editor.ts +0 -272
  84. package/extensions/subagent/top-level-async.ts +0 -15
  85. package/extensions/subagent/types.ts +0 -623
  86. package/extensions/subagent/utils.ts +0 -456
  87. package/extensions/subagent/worktree.ts +0 -579
  88. package/extensions/super-pi-extension/agents/ce-oracle.md +0 -109
  89. package/extensions/super-pi-extension/agents/ce-planner.md +0 -116
  90. package/extensions/super-pi-extension/agents/ce-reviewer.md +0 -99
  91. package/extensions/super-pi-extension/agents/ce-scout.md +0 -80
  92. package/extensions/super-pi-extension/agents/ce-worker.md +0 -78
  93. package/extensions/super-pi-extension/chains/ce-parallel-review.chain.md +0 -34
  94. package/extensions/super-pi-extension/chains/ce-review-only.chain.md +0 -12
  95. package/extensions/super-pi-extension/chains/ce-standard.chain.md +0 -28
  96. package/extensions/super-pi-extension/index.ts +0 -129
  97. package/extensions/super-pi-extension/model-sync.ts +0 -204
  98. package/skills/08-status/SKILL.md +0 -41
  99. package/skills/08-status/references/artifact-locations.md +0 -10
  100. package/skills/10-rules/SKILL.md +0 -76
  101. package/skills/pi-subagents/SKILL.md +0 -566
@@ -1,138 +0,0 @@
1
- // Based on pi-subagents by Nico Bailon (https://github.com/nicobailon/pi-subagents)
2
- // MIT License
3
- import * as fs from "node:fs";
4
- import * as os from "node:os";
5
- import * as path from "node:path";
6
- import { fileURLToPath } from "node:url";
7
-
8
- const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
9
- const TASK_ARG_LIMIT = 8000;
10
- const PROMPT_RUNTIME_EXTENSION_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-prompt-runtime.ts");
11
-
12
- export interface BuildPiArgsInput {
13
- baseArgs: string[];
14
- task: string;
15
- sessionEnabled: boolean;
16
- sessionDir?: string;
17
- sessionFile?: string;
18
- model?: string;
19
- thinking?: string;
20
- systemPromptMode?: "append" | "replace";
21
- inheritProjectContext: boolean;
22
- inheritSkills: boolean;
23
- tools?: string[];
24
- extensions?: string[];
25
- systemPrompt?: string | null;
26
- mcpDirectTools?: string[];
27
- promptFileStem?: string;
28
- intercomSessionName?: string;
29
- }
30
-
31
- export interface BuildPiArgsResult {
32
- args: string[];
33
- env: Record<string, string | undefined>;
34
- tempDir?: string;
35
- }
36
-
37
- export function applyThinkingSuffix(model: string | undefined, thinking: string | undefined): string | undefined {
38
- if (!model || !thinking || thinking === "off") return model;
39
- const colonIdx = model.lastIndexOf(":");
40
- if (colonIdx !== -1 && THINKING_LEVELS.includes(model.substring(colonIdx + 1))) return model;
41
- return `${model}:${thinking}`;
42
- }
43
-
44
- export function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {
45
- const args = [...input.baseArgs];
46
-
47
- if (input.sessionFile) {
48
- fs.mkdirSync(path.dirname(input.sessionFile), { recursive: true });
49
- args.push("--session", input.sessionFile);
50
- } else {
51
- if (!input.sessionEnabled) {
52
- args.push("--no-session");
53
- }
54
- if (input.sessionDir) {
55
- fs.mkdirSync(input.sessionDir, { recursive: true });
56
- args.push("--session-dir", input.sessionDir);
57
- }
58
- }
59
-
60
- const modelArg = applyThinkingSuffix(input.model, input.thinking);
61
- if (modelArg) {
62
- args.push("--model", modelArg);
63
- }
64
-
65
- const toolExtensionPaths: string[] = [];
66
- if (input.tools?.length) {
67
- const builtinTools: string[] = [];
68
- for (const tool of input.tools) {
69
- if (tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js")) {
70
- toolExtensionPaths.push(tool);
71
- } else {
72
- builtinTools.push(tool);
73
- }
74
- }
75
- if (builtinTools.length > 0) {
76
- args.push("--tools", builtinTools.join(","));
77
- }
78
- }
79
-
80
- const runtimeExtensions = [PROMPT_RUNTIME_EXTENSION_PATH];
81
- if (input.extensions !== undefined) {
82
- args.push("--no-extensions");
83
- for (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions])]) {
84
- args.push("--extension", extPath);
85
- }
86
- } else {
87
- for (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths])]) {
88
- args.push("--extension", extPath);
89
- }
90
- }
91
-
92
- if (!input.inheritSkills) {
93
- args.push("--no-skills");
94
- }
95
-
96
- let tempDir: string | undefined;
97
- if (input.systemPrompt !== undefined && input.systemPrompt !== null) {
98
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagent-"));
99
- const stem = (input.promptFileStem ?? "prompt").replace(/[^\w.-]/g, "_");
100
- const promptPath = path.join(tempDir, `${stem}.md`);
101
- fs.writeFileSync(promptPath, input.systemPrompt, { mode: 0o600 });
102
- args.push(input.systemPromptMode === "replace" ? "--system-prompt" : "--append-system-prompt", promptPath);
103
- }
104
-
105
- if (input.task.length > TASK_ARG_LIMIT) {
106
- if (!tempDir) {
107
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagent-"));
108
- }
109
- const taskFilePath = path.join(tempDir, "task.md");
110
- fs.writeFileSync(taskFilePath, `Task: ${input.task}`, { mode: 0o600 });
111
- args.push(`@${taskFilePath}`);
112
- } else {
113
- args.push(`Task: ${input.task}`);
114
- }
115
-
116
- const env: Record<string, string | undefined> = {};
117
- env.PI_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? "1" : "0";
118
- env.PI_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? "1" : "0";
119
- if (input.intercomSessionName) {
120
- env.PI_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;
121
- }
122
- if (input.mcpDirectTools?.length) {
123
- env.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(",");
124
- } else {
125
- env.MCP_DIRECT_TOOLS = "__none__";
126
- }
127
-
128
- return { args, env, tempDir };
129
- }
130
-
131
- export function cleanupTempDir(tempDir: string | null | undefined): void {
132
- if (!tempDir) return;
133
- try {
134
- fs.rmSync(tempDir, { recursive: true, force: true });
135
- } catch {
136
- // Temp cleanup is best effort.
137
- }
138
- }
@@ -1,100 +0,0 @@
1
- // Based on pi-subagents by Nico Bailon (https://github.com/nicobailon/pi-subagents)
2
- // MIT License
3
- import * as fs from "node:fs";
4
- import { createRequire } from "node:module";
5
- import * as path from "node:path";
6
-
7
- const require = createRequire(import.meta.url);
8
-
9
- export function resolvePiPackageRoot(): string | undefined {
10
- try {
11
- const entry = process.argv[1];
12
- if (!entry) return undefined;
13
- let dir = path.dirname(fs.realpathSync(entry));
14
- while (dir !== path.dirname(dir)) {
15
- try {
16
- const pkg = JSON.parse(fs.readFileSync(path.join(dir, "package.json"), "utf-8"));
17
- if (pkg.name === "@mariozechner/pi-coding-agent") return dir;
18
- } catch {}
19
- dir = path.dirname(dir);
20
- }
21
- } catch {}
22
- return undefined;
23
- }
24
-
25
- export interface PiSpawnDeps {
26
- platform?: NodeJS.Platform;
27
- execPath?: string;
28
- argv1?: string;
29
- existsSync?: (filePath: string) => boolean;
30
- readFileSync?: (filePath: string, encoding: "utf-8") => string;
31
- resolvePackageJson?: () => string;
32
- piPackageRoot?: string;
33
- }
34
-
35
- export interface PiSpawnCommand {
36
- command: string;
37
- args: string[];
38
- }
39
-
40
- function isRunnableNodeScript(filePath: string, existsSync: (filePath: string) => boolean): boolean {
41
- if (!existsSync(filePath)) return false;
42
- return /\.(?:mjs|cjs|js)$/i.test(filePath);
43
- }
44
-
45
- function normalizePath(filePath: string): string {
46
- return path.isAbsolute(filePath) ? filePath : path.resolve(filePath);
47
- }
48
-
49
- export function resolveWindowsPiCliScript(deps: PiSpawnDeps = {}): string | undefined {
50
- const existsSync = deps.existsSync ?? fs.existsSync;
51
- const readFileSync = deps.readFileSync ?? ((filePath, encoding) => fs.readFileSync(filePath, encoding));
52
- const argv1 = deps.argv1 ?? process.argv[1];
53
-
54
- if (argv1) {
55
- const argvPath = normalizePath(argv1);
56
- if (isRunnableNodeScript(argvPath, existsSync)) {
57
- return argvPath;
58
- }
59
- }
60
-
61
- try {
62
- const resolvePackageJson = deps.resolvePackageJson ?? (() => {
63
- const root = deps.piPackageRoot ?? resolvePiPackageRoot();
64
- if (root) return path.join(root, "package.json");
65
- return require.resolve("@mariozechner/pi-coding-agent/package.json");
66
- });
67
- const packageJsonPath = resolvePackageJson();
68
- const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")) as {
69
- bin?: string | Record<string, string>;
70
- };
71
- const binField = packageJson.bin;
72
- const binPath = typeof binField === "string"
73
- ? binField
74
- : binField?.pi ?? Object.values(binField ?? {})[0];
75
- if (!binPath) return undefined;
76
- const candidate = normalizePath(path.resolve(path.dirname(packageJsonPath), binPath));
77
- if (isRunnableNodeScript(candidate, existsSync)) {
78
- return candidate;
79
- }
80
- } catch {
81
- return undefined;
82
- }
83
-
84
- return undefined;
85
- }
86
-
87
- export function getPiSpawnCommand(args: string[], deps: PiSpawnDeps = {}): PiSpawnCommand {
88
- const platform = deps.platform ?? process.platform;
89
- if (platform === "win32") {
90
- const piCliPath = resolveWindowsPiCliScript(deps);
91
- if (piCliPath) {
92
- return {
93
- command: deps.execPath ?? process.execPath,
94
- args: [piCliPath, ...args],
95
- };
96
- }
97
- }
98
-
99
- return { command: "pi", args };
100
- }
@@ -1,87 +0,0 @@
1
- // Based on pi-subagents by Nico Bailon (https://github.com/nicobailon/pi-subagents)
2
- // MIT License
3
- import type { ChildProcess } from "node:child_process";
4
-
5
- interface PostExitStdioGuardOptions {
6
- idleMs: number;
7
- hardMs: number;
8
- }
9
-
10
- interface ChildWithPipedStdio {
11
- stdout: ChildProcess["stdout"];
12
- stderr: ChildProcess["stderr"];
13
- on: ChildProcess["on"];
14
- }
15
-
16
- interface ChildWithKill {
17
- kill(signal?: NodeJS.Signals | number): boolean;
18
- }
19
-
20
- export function trySignalChild(child: ChildWithKill, signal: NodeJS.Signals): boolean {
21
- try {
22
- return child.kill(signal);
23
- } catch {
24
- return false;
25
- }
26
- }
27
-
28
- export function attachPostExitStdioGuard(
29
- child: ChildWithPipedStdio,
30
- options: PostExitStdioGuardOptions,
31
- ): () => void {
32
- const { idleMs, hardMs } = options;
33
- let exited = false;
34
- let stdoutEnded = false;
35
- let stderrEnded = false;
36
- let idleTimer: NodeJS.Timeout | undefined;
37
- let hardTimer: NodeJS.Timeout | undefined;
38
-
39
- const destroyUnendedStdio = () => {
40
- if (!stdoutEnded) {
41
- try { child.stdout?.destroy(); } catch {}
42
- }
43
- if (!stderrEnded) {
44
- try { child.stderr?.destroy(); } catch {}
45
- }
46
- };
47
-
48
- const clearTimers = () => {
49
- if (idleTimer) {
50
- clearTimeout(idleTimer);
51
- idleTimer = undefined;
52
- }
53
- if (hardTimer) {
54
- clearTimeout(hardTimer);
55
- hardTimer = undefined;
56
- }
57
- };
58
-
59
- const armIdleTimer = () => {
60
- if (!exited) return;
61
- if (idleTimer) clearTimeout(idleTimer);
62
- idleTimer = setTimeout(destroyUnendedStdio, idleMs);
63
- idleTimer.unref?.();
64
- };
65
-
66
- child.stdout?.on("data", armIdleTimer);
67
- child.stderr?.on("data", armIdleTimer);
68
- child.stdout?.on("end", () => {
69
- stdoutEnded = true;
70
- if (stdoutEnded && stderrEnded) clearTimers();
71
- });
72
- child.stderr?.on("end", () => {
73
- stderrEnded = true;
74
- if (stdoutEnded && stderrEnded) clearTimers();
75
- });
76
- child.on("exit", () => {
77
- exited = true;
78
- armIdleTimer();
79
- if (hardTimer) return;
80
- hardTimer = setTimeout(destroyUnendedStdio, hardMs);
81
- hardTimer.unref?.();
82
- });
83
- child.on("close", clearTimers);
84
- child.on("error", clearTimers);
85
-
86
- return clearTimers;
87
- }