@leing2021/super-pi 0.22.1 → 0.23.1

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