@gjczone/pi-swarm 0.1.2 → 0.1.3
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/README.md +6 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,9 +6,9 @@ Think of it as **kimi-code's AgentSwarm + Claude Code's agent teams** — inside
|
|
|
6
6
|
|
|
7
7
|
## What It Does
|
|
8
8
|
|
|
9
|
-
**Swarm** — parallel agents. Like kimi-code's AgentSwarm: one template, many items, running simultaneously. Each agent
|
|
9
|
+
**Swarm** — parallel agents. Like kimi-code's AgentSwarm: one template, many items, running simultaneously. Each agent is an isolated `pi --print` child process with its own context window.
|
|
10
10
|
|
|
11
|
-
**Team** — collaborative agents. Like Claude Code's agent teams or pi-crew: role-based agents (explorer, planner, coder, reviewer, tester) working in sequence. Each phase agent receives context from previous phases via a shared mailbox.
|
|
11
|
+
**Team** — collaborative agents. Like Claude Code's agent teams or pi-crew: role-based agents (explorer, planner, coder, reviewer, tester) working in sequence. Each phase agent receives context from previous phases via a shared mailbox. Every agent runs as an independent child process.
|
|
12
12
|
|
|
13
13
|
All agents are created on-the-fly. No `agents/*.md` files. The main agent decides what to spawn based on the task.
|
|
14
14
|
|
|
@@ -66,18 +66,9 @@ Two of the five swarm reviews failed — retry those
|
|
|
66
66
|
|
|
67
67
|
Press `Ctrl+C` during a swarm or team run. Completed agents are preserved. In-progress agents are cancelled gracefully. For teams, completed phases are saved and returned as partial results.
|
|
68
68
|
|
|
69
|
-
## Git Worktree Isolation
|
|
70
|
-
|
|
71
|
-
Every agent runs in its own `git worktree`:
|
|
72
|
-
|
|
73
|
-
- Isolated working directory — no file conflicts between agents
|
|
74
|
-
- Main agent's working tree stays clean
|
|
75
|
-
- Worktrees are **auto-created** on spawn and **auto-cleaned** when the agent finishes
|
|
76
|
-
- Failed or cancelled agents also get their worktrees cleaned up
|
|
77
|
-
|
|
78
69
|
## Runtime Files
|
|
79
70
|
|
|
80
|
-
State is stored
|
|
71
|
+
State is stored under `.pi/swarm/state/`. The extension auto-creates `.pi/` if it doesn't exist, and auto-appends `.pi/swarm/state/` to the project's `.gitignore`.
|
|
81
72
|
|
|
82
73
|
```
|
|
83
74
|
.pi/swarm/state/runs/{runId}/
|
|
@@ -96,10 +87,10 @@ Runs auto-clean: completed runs deleted after 7 days, stale runs (30min no heart
|
|
|
96
87
|
|
|
97
88
|
## Settings
|
|
98
89
|
|
|
99
|
-
Default max concurrency is **5**. Recommended: **3-10**. Can be set to any positive integer.
|
|
90
|
+
Default max concurrency is **5**. Recommended: **3-10**. Can be set to any positive integer.
|
|
100
91
|
|
|
101
|
-
|
|
|
102
|
-
|
|
92
|
+
| Settings file | Scope |
|
|
93
|
+
|---------------|-------|
|
|
103
94
|
| `.pi/settings.json` | Project (current directory) |
|
|
104
95
|
| `~/.pi/agent/settings.json` | Global (all projects) |
|
|
105
96
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAiFpE,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CAkG/C"}
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,65 @@ import { registerSwarmCommand } from "./swarm/command.js";
|
|
|
13
13
|
import { registerAgentTeamTool } from "./team/tool.js";
|
|
14
14
|
import { registerTeamCommand } from "./team/command.js";
|
|
15
15
|
import { recoverRuns } from "./state/recovery.js";
|
|
16
|
+
import * as fs from "node:fs";
|
|
17
|
+
import * as path from "node:path";
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Auto-gitignore
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
const GITIGNORE_ENTRY = ".pi/swarm/state/";
|
|
22
|
+
/**
|
|
23
|
+
* Ensure `.pi/swarm/state/` is listed in the project's `.gitignore`.
|
|
24
|
+
* Appends the entry if the file exists but doesn't contain it.
|
|
25
|
+
* Creates `.gitignore` if neither `.gitignore` nor any `*ignore` file exists.
|
|
26
|
+
*/
|
|
27
|
+
function ensureGitignore(cwd) {
|
|
28
|
+
const gitignorePath = findGitignore(cwd);
|
|
29
|
+
if (!gitignorePath) {
|
|
30
|
+
// No gitignore file exists — create one
|
|
31
|
+
try {
|
|
32
|
+
fs.writeFileSync(path.join(cwd, ".gitignore"), `${GITIGNORE_ENTRY}\n`, "utf-8");
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Best effort
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const content = fs.readFileSync(gitignorePath, "utf-8");
|
|
41
|
+
if (content.includes(GITIGNORE_ENTRY))
|
|
42
|
+
return; // Already present
|
|
43
|
+
// Append with a leading newline if the file doesn't end with one
|
|
44
|
+
const separator = content.endsWith("\n") ? "" : "\n";
|
|
45
|
+
fs.appendFileSync(gitignorePath, `${separator}${GITIGNORE_ENTRY}\n`, "utf-8");
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Best effort
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Find the project's gitignore file.
|
|
53
|
+
* Checks `.gitignore` first, then any `*ignore` file (e.g., `.dockerignore` is skipped).
|
|
54
|
+
*/
|
|
55
|
+
function findGitignore(cwd) {
|
|
56
|
+
// Standard .gitignore
|
|
57
|
+
const standard = path.join(cwd, ".gitignore");
|
|
58
|
+
if (fs.existsSync(standard))
|
|
59
|
+
return standard;
|
|
60
|
+
// Check for any other *ignore file (but prefer .gitignore)
|
|
61
|
+
try {
|
|
62
|
+
const entries = fs.readdirSync(cwd);
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
if (entry.endsWith("ignore") && entry !== ".gitignore") {
|
|
65
|
+
// Found a non-standard ignore file — use .gitignore instead (don't pollute others)
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Can't read directory
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
16
75
|
// ---------------------------------------------------------------------------
|
|
17
76
|
// Default export — extension entry point
|
|
18
77
|
// ---------------------------------------------------------------------------
|
|
@@ -65,6 +124,8 @@ export default function (pi) {
|
|
|
65
124
|
pi.on("session_start", async () => {
|
|
66
125
|
log("Session started — swarm extension loaded.");
|
|
67
126
|
swarmActive = false;
|
|
127
|
+
// Ensure .pi/swarm/state/ is gitignored
|
|
128
|
+
ensureGitignore(process.cwd());
|
|
68
129
|
// Run recovery: detect stale/abandoned runs, clean up expired ones
|
|
69
130
|
try {
|
|
70
131
|
const result = recoverRuns(process.cwd());
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAyB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjczone/pi-swarm",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Agent Swarm for pi-coding-agent — launch multiple subagents from a prompt template with live TUI progress. Ported from MoonshotAI/kimi-code swarm with gratitude.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|