@leing2021/super-pi 0.22.1 → 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 (110) hide show
  1. package/README.md +253 -211
  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 -20
  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/LICENSE +0 -21
  17. package/THIRD-PARTY-NOTICES.md +0 -35
  18. package/extensions/subagent/__tests__/async-job-tracker.test.ts +0 -21
  19. package/extensions/subagent/__tests__/execution-activity.test.ts +0 -15
  20. package/extensions/subagent/__tests__/parallel-render-stress.test.ts +0 -82
  21. package/extensions/subagent/__tests__/render-dedup.test.ts +0 -98
  22. package/extensions/subagent/__tests__/render-widget.test.ts +0 -28
  23. package/extensions/subagent/__tests__/throttle.test.ts +0 -90
  24. package/extensions/subagent/agent-management.ts +0 -596
  25. package/extensions/subagent/agent-manager-chain-detail.ts +0 -163
  26. package/extensions/subagent/agent-manager-detail.ts +0 -232
  27. package/extensions/subagent/agent-manager-edit.ts +0 -391
  28. package/extensions/subagent/agent-manager-list.ts +0 -279
  29. package/extensions/subagent/agent-manager-parallel.ts +0 -305
  30. package/extensions/subagent/agent-manager.ts +0 -706
  31. package/extensions/subagent/agent-scope.ts +0 -9
  32. package/extensions/subagent/agent-selection.ts +0 -26
  33. package/extensions/subagent/agent-serializer.ts +0 -124
  34. package/extensions/subagent/agent-templates.ts +0 -63
  35. package/extensions/subagent/agents/context-builder.md +0 -37
  36. package/extensions/subagent/agents/delegate.md +0 -9
  37. package/extensions/subagent/agents/oracle.md +0 -73
  38. package/extensions/subagent/agents/planner.md +0 -52
  39. package/extensions/subagent/agents/researcher.md +0 -50
  40. package/extensions/subagent/agents/reviewer.md +0 -38
  41. package/extensions/subagent/agents/scout.md +0 -48
  42. package/extensions/subagent/agents/worker.md +0 -52
  43. package/extensions/subagent/agents.ts +0 -762
  44. package/extensions/subagent/artifacts.ts +0 -101
  45. package/extensions/subagent/async-execution.ts +0 -521
  46. package/extensions/subagent/async-job-tracker.ts +0 -240
  47. package/extensions/subagent/async-status.ts +0 -242
  48. package/extensions/subagent/chain-clarify.ts +0 -1365
  49. package/extensions/subagent/chain-execution.ts +0 -854
  50. package/extensions/subagent/chain-serializer.ts +0 -127
  51. package/extensions/subagent/completion-dedupe.ts +0 -66
  52. package/extensions/subagent/doctor.ts +0 -201
  53. package/extensions/subagent/execution.ts +0 -748
  54. package/extensions/subagent/file-coalescer.ts +0 -43
  55. package/extensions/subagent/fork-context.ts +0 -64
  56. package/extensions/subagent/formatters.ts +0 -123
  57. package/extensions/subagent/frontmatter.ts +0 -32
  58. package/extensions/subagent/index.ts +0 -586
  59. package/extensions/subagent/intercom-bridge.ts +0 -241
  60. package/extensions/subagent/jsonl-writer.ts +0 -84
  61. package/extensions/subagent/model-fallback.ts +0 -109
  62. package/extensions/subagent/notify.ts +0 -111
  63. package/extensions/subagent/parallel-utils.ts +0 -109
  64. package/extensions/subagent/pi-args.ts +0 -139
  65. package/extensions/subagent/pi-spawn.ts +0 -101
  66. package/extensions/subagent/post-exit-stdio-guard.ts +0 -88
  67. package/extensions/subagent/prompt-template-bridge.ts +0 -400
  68. package/extensions/subagent/prompts/gather-context-and-clarify.md +0 -13
  69. package/extensions/subagent/prompts/parallel-cleanup.md +0 -42
  70. package/extensions/subagent/prompts/parallel-research.md +0 -50
  71. package/extensions/subagent/prompts/parallel-review.md +0 -40
  72. package/extensions/subagent/render-helpers.ts +0 -83
  73. package/extensions/subagent/render.ts +0 -908
  74. package/extensions/subagent/result-intercom.ts +0 -238
  75. package/extensions/subagent/result-watcher.ts +0 -172
  76. package/extensions/subagent/run-history.ts +0 -58
  77. package/extensions/subagent/run-status.ts +0 -137
  78. package/extensions/subagent/schemas.ts +0 -165
  79. package/extensions/subagent/session-tokens.ts +0 -51
  80. package/extensions/subagent/settings.ts +0 -368
  81. package/extensions/subagent/single-output.ts +0 -98
  82. package/extensions/subagent/skills.ts +0 -627
  83. package/extensions/subagent/slash-bridge.ts +0 -177
  84. package/extensions/subagent/slash-commands.ts +0 -304
  85. package/extensions/subagent/slash-live-state.ts +0 -295
  86. package/extensions/subagent/subagent-control.ts +0 -151
  87. package/extensions/subagent/subagent-executor.ts +0 -1915
  88. package/extensions/subagent/subagent-prompt-runtime.ts +0 -76
  89. package/extensions/subagent/subagent-runner.ts +0 -1471
  90. package/extensions/subagent/subagents-status.ts +0 -473
  91. package/extensions/subagent/text-editor.ts +0 -273
  92. package/extensions/subagent/throttle.ts +0 -77
  93. package/extensions/subagent/top-level-async.ts +0 -16
  94. package/extensions/subagent/types.ts +0 -624
  95. package/extensions/subagent/utils.ts +0 -457
  96. package/extensions/subagent/worktree.ts +0 -580
  97. package/extensions/super-pi-extension/agents/ce-oracle.md +0 -109
  98. package/extensions/super-pi-extension/agents/ce-planner.md +0 -116
  99. package/extensions/super-pi-extension/agents/ce-reviewer.md +0 -99
  100. package/extensions/super-pi-extension/agents/ce-scout.md +0 -80
  101. package/extensions/super-pi-extension/agents/ce-worker.md +0 -78
  102. package/extensions/super-pi-extension/chains/ce-parallel-review.chain.md +0 -34
  103. package/extensions/super-pi-extension/chains/ce-review-only.chain.md +0 -12
  104. package/extensions/super-pi-extension/chains/ce-standard.chain.md +0 -28
  105. package/extensions/super-pi-extension/index.ts +0 -129
  106. package/extensions/super-pi-extension/model-sync.ts +0 -204
  107. package/skills/08-status/SKILL.md +0 -41
  108. package/skills/08-status/references/artifact-locations.md +0 -10
  109. package/skills/10-rules/SKILL.md +0 -76
  110. 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
- }