@elhu/pit 0.1.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 (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +380 -0
  3. package/dist/adapters/claude-code.d.ts +70 -0
  4. package/dist/adapters/claude-code.d.ts.map +1 -0
  5. package/dist/adapters/claude-code.js +166 -0
  6. package/dist/adapters/claude-code.js.map +1 -0
  7. package/dist/adapters/index.d.ts +16 -0
  8. package/dist/adapters/index.d.ts.map +1 -0
  9. package/dist/adapters/index.js +49 -0
  10. package/dist/adapters/index.js.map +1 -0
  11. package/dist/adapters/opencode.d.ts +53 -0
  12. package/dist/adapters/opencode.d.ts.map +1 -0
  13. package/dist/adapters/opencode.js +120 -0
  14. package/dist/adapters/opencode.js.map +1 -0
  15. package/dist/adapters/process-utils.d.ts +29 -0
  16. package/dist/adapters/process-utils.d.ts.map +1 -0
  17. package/dist/adapters/process-utils.js +96 -0
  18. package/dist/adapters/process-utils.js.map +1 -0
  19. package/dist/adapters/types.d.ts +41 -0
  20. package/dist/adapters/types.d.ts.map +1 -0
  21. package/dist/adapters/types.js +6 -0
  22. package/dist/adapters/types.js.map +1 -0
  23. package/dist/assets.generated.d.ts +13 -0
  24. package/dist/assets.generated.d.ts.map +1 -0
  25. package/dist/assets.generated.js +162 -0
  26. package/dist/assets.generated.js.map +1 -0
  27. package/dist/beads.d.ts +85 -0
  28. package/dist/beads.d.ts.map +1 -0
  29. package/dist/beads.js +120 -0
  30. package/dist/beads.js.map +1 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +39 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/commands/add.d.ts +10 -0
  36. package/dist/commands/add.d.ts.map +1 -0
  37. package/dist/commands/add.js +58 -0
  38. package/dist/commands/add.js.map +1 -0
  39. package/dist/commands/cleanup.d.ts +13 -0
  40. package/dist/commands/cleanup.d.ts.map +1 -0
  41. package/dist/commands/cleanup.js +174 -0
  42. package/dist/commands/cleanup.js.map +1 -0
  43. package/dist/commands/daemon.d.ts +3 -0
  44. package/dist/commands/daemon.d.ts.map +1 -0
  45. package/dist/commands/daemon.js +162 -0
  46. package/dist/commands/daemon.js.map +1 -0
  47. package/dist/commands/init.d.ts +20 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +125 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/install-keybinding.d.ts +61 -0
  52. package/dist/commands/install-keybinding.d.ts.map +1 -0
  53. package/dist/commands/install-keybinding.js +138 -0
  54. package/dist/commands/install-keybinding.js.map +1 -0
  55. package/dist/commands/install-status.d.ts +35 -0
  56. package/dist/commands/install-status.d.ts.map +1 -0
  57. package/dist/commands/install-status.js +115 -0
  58. package/dist/commands/install-status.js.map +1 -0
  59. package/dist/commands/log.d.ts +7 -0
  60. package/dist/commands/log.d.ts.map +1 -0
  61. package/dist/commands/log.js +60 -0
  62. package/dist/commands/log.js.map +1 -0
  63. package/dist/commands/pause.d.ts +12 -0
  64. package/dist/commands/pause.d.ts.map +1 -0
  65. package/dist/commands/pause.js +47 -0
  66. package/dist/commands/pause.js.map +1 -0
  67. package/dist/commands/resume.d.ts +12 -0
  68. package/dist/commands/resume.d.ts.map +1 -0
  69. package/dist/commands/resume.js +59 -0
  70. package/dist/commands/resume.js.map +1 -0
  71. package/dist/commands/shared.d.ts +7 -0
  72. package/dist/commands/shared.d.ts.map +1 -0
  73. package/dist/commands/shared.js +56 -0
  74. package/dist/commands/shared.js.map +1 -0
  75. package/dist/commands/start.d.ts +12 -0
  76. package/dist/commands/start.d.ts.map +1 -0
  77. package/dist/commands/start.js +274 -0
  78. package/dist/commands/start.js.map +1 -0
  79. package/dist/commands/status.d.ts +24 -0
  80. package/dist/commands/status.d.ts.map +1 -0
  81. package/dist/commands/status.js +101 -0
  82. package/dist/commands/status.js.map +1 -0
  83. package/dist/commands/stop.d.ts +11 -0
  84. package/dist/commands/stop.d.ts.map +1 -0
  85. package/dist/commands/stop.js +52 -0
  86. package/dist/commands/stop.js.map +1 -0
  87. package/dist/commands/teardown.d.ts +15 -0
  88. package/dist/commands/teardown.d.ts.map +1 -0
  89. package/dist/commands/teardown.js +72 -0
  90. package/dist/commands/teardown.js.map +1 -0
  91. package/dist/config.d.ts +58 -0
  92. package/dist/config.d.ts.map +1 -0
  93. package/dist/config.js +129 -0
  94. package/dist/config.js.map +1 -0
  95. package/dist/daemon/client.d.ts +38 -0
  96. package/dist/daemon/client.d.ts.map +1 -0
  97. package/dist/daemon/client.js +254 -0
  98. package/dist/daemon/client.js.map +1 -0
  99. package/dist/daemon/context.d.ts +63 -0
  100. package/dist/daemon/context.d.ts.map +1 -0
  101. package/dist/daemon/context.js +14 -0
  102. package/dist/daemon/context.js.map +1 -0
  103. package/dist/daemon/handlers.d.ts +79 -0
  104. package/dist/daemon/handlers.d.ts.map +1 -0
  105. package/dist/daemon/handlers.js +1260 -0
  106. package/dist/daemon/handlers.js.map +1 -0
  107. package/dist/daemon/index.d.ts +6 -0
  108. package/dist/daemon/index.d.ts.map +1 -0
  109. package/dist/daemon/index.js +7 -0
  110. package/dist/daemon/index.js.map +1 -0
  111. package/dist/daemon/lifecycle.d.ts +56 -0
  112. package/dist/daemon/lifecycle.d.ts.map +1 -0
  113. package/dist/daemon/lifecycle.js +341 -0
  114. package/dist/daemon/lifecycle.js.map +1 -0
  115. package/dist/daemon/protocol.d.ts +174 -0
  116. package/dist/daemon/protocol.d.ts.map +1 -0
  117. package/dist/daemon/protocol.js +3 -0
  118. package/dist/daemon/protocol.js.map +1 -0
  119. package/dist/daemon/recovery.d.ts +37 -0
  120. package/dist/daemon/recovery.d.ts.map +1 -0
  121. package/dist/daemon/recovery.js +197 -0
  122. package/dist/daemon/recovery.js.map +1 -0
  123. package/dist/daemon/server.d.ts +31 -0
  124. package/dist/daemon/server.d.ts.map +1 -0
  125. package/dist/daemon/server.js +294 -0
  126. package/dist/daemon/server.js.map +1 -0
  127. package/dist/daemon/socket.d.ts +18 -0
  128. package/dist/daemon/socket.d.ts.map +1 -0
  129. package/dist/daemon/socket.js +36 -0
  130. package/dist/daemon/socket.js.map +1 -0
  131. package/dist/daemon/state.d.ts +60 -0
  132. package/dist/daemon/state.d.ts.map +1 -0
  133. package/dist/daemon/state.js +156 -0
  134. package/dist/daemon/state.js.map +1 -0
  135. package/dist/daemon/systemd.d.ts +19 -0
  136. package/dist/daemon/systemd.d.ts.map +1 -0
  137. package/dist/daemon/systemd.js +131 -0
  138. package/dist/daemon/systemd.js.map +1 -0
  139. package/dist/hooks/claude-code-hook.d.ts +32 -0
  140. package/dist/hooks/claude-code-hook.d.ts.map +1 -0
  141. package/dist/hooks/claude-code-hook.js +112 -0
  142. package/dist/hooks/claude-code-hook.js.map +1 -0
  143. package/dist/instructions-template.d.ts +9 -0
  144. package/dist/instructions-template.d.ts.map +1 -0
  145. package/dist/instructions-template.js +123 -0
  146. package/dist/instructions-template.js.map +1 -0
  147. package/dist/logger.d.ts +25 -0
  148. package/dist/logger.d.ts.map +1 -0
  149. package/dist/logger.js +44 -0
  150. package/dist/logger.js.map +1 -0
  151. package/dist/loop.d.ts +88 -0
  152. package/dist/loop.d.ts.map +1 -0
  153. package/dist/loop.js +161 -0
  154. package/dist/loop.js.map +1 -0
  155. package/dist/orchestrator-instructions-template.d.ts +13 -0
  156. package/dist/orchestrator-instructions-template.d.ts.map +1 -0
  157. package/dist/orchestrator-instructions-template.js +147 -0
  158. package/dist/orchestrator-instructions-template.js.map +1 -0
  159. package/dist/output.d.ts +12 -0
  160. package/dist/output.d.ts.map +1 -0
  161. package/dist/output.js +25 -0
  162. package/dist/output.js.map +1 -0
  163. package/dist/plugin/pit.js +57 -0
  164. package/dist/session.d.ts +55 -0
  165. package/dist/session.d.ts.map +1 -0
  166. package/dist/session.js +135 -0
  167. package/dist/session.js.map +1 -0
  168. package/dist/setup.d.ts +92 -0
  169. package/dist/setup.d.ts.map +1 -0
  170. package/dist/setup.js +382 -0
  171. package/dist/setup.js.map +1 -0
  172. package/dist/shell-quote.d.ts +16 -0
  173. package/dist/shell-quote.d.ts.map +1 -0
  174. package/dist/shell-quote.js +18 -0
  175. package/dist/shell-quote.js.map +1 -0
  176. package/dist/signals.d.ts +17 -0
  177. package/dist/signals.d.ts.map +1 -0
  178. package/dist/signals.js +26 -0
  179. package/dist/signals.js.map +1 -0
  180. package/dist/state-machine.d.ts +74 -0
  181. package/dist/state-machine.d.ts.map +1 -0
  182. package/dist/state-machine.js +153 -0
  183. package/dist/state-machine.js.map +1 -0
  184. package/dist/tmux.d.ts +101 -0
  185. package/dist/tmux.d.ts.map +1 -0
  186. package/dist/tmux.js +208 -0
  187. package/dist/tmux.js.map +1 -0
  188. package/dist/worktree.d.ts +33 -0
  189. package/dist/worktree.d.ts.map +1 -0
  190. package/dist/worktree.js +116 -0
  191. package/dist/worktree.js.map +1 -0
  192. package/package.json +66 -0
@@ -0,0 +1,116 @@
1
+ import { execFile as execFileCb } from "node:child_process";
2
+ import * as fsp from "node:fs/promises";
3
+ import * as path from "node:path";
4
+ import { promisify } from "node:util";
5
+ const execFile = promisify(execFileCb);
6
+ // ---------------------------------------------------------------------------
7
+ // createWorktree
8
+ // ---------------------------------------------------------------------------
9
+ /**
10
+ * Creates a git worktree for `epic` under `worktreeDir`.
11
+ *
12
+ * Idempotent: if the worktree already exists (directory + .git file), returns
13
+ * `{ created: false }` without running any git commands.
14
+ *
15
+ * Branch-exists fallback: if `git worktree add -b <branch>` fails because the
16
+ * branch already exists, retries with `git worktree add <path> <branch>`
17
+ * (checkout existing branch, no -b).
18
+ */
19
+ export async function createWorktree(worktreeDir, epic, baseBranch) {
20
+ const worktreePath = path.resolve(worktreeDir, epic);
21
+ const branch = `pit/${epic}`;
22
+ // Ensure parent directory exists before any git operations
23
+ await fsp.mkdir(worktreeDir, { recursive: true });
24
+ // If worktree already exists (idempotent path)
25
+ if (await worktreeExists(worktreeDir, epic)) {
26
+ return { path: worktreePath, created: false, branch };
27
+ }
28
+ // Try to create a new branch and worktree
29
+ try {
30
+ await execFile("git", ["worktree", "add", "-b", branch, worktreePath, baseBranch]);
31
+ }
32
+ catch (err) {
33
+ const message = String(err.stderr ?? err.message ?? "");
34
+ if (message.includes("already exists")) {
35
+ // Branch exists — checkout existing branch without -b
36
+ await execFile("git", ["worktree", "add", worktreePath, branch]);
37
+ }
38
+ else if (message.includes("already registered") || message.includes("already checked out")) {
39
+ // Worktree is already registered but path doesn't exist (stale registration)
40
+ try {
41
+ // Try to prune stale worktree registrations
42
+ await execFile("git", ["worktree", "prune"]);
43
+ // Retry the original command after pruning
44
+ await execFile("git", ["worktree", "add", "-b", branch, worktreePath, baseBranch]);
45
+ }
46
+ catch (retryErr) {
47
+ const retryMessage = String(retryErr.stderr ??
48
+ retryErr.message ??
49
+ "");
50
+ if (retryMessage.includes("already exists")) {
51
+ // Branch exists after prune — checkout existing branch without -b
52
+ await execFile("git", ["worktree", "add", worktreePath, branch]);
53
+ }
54
+ else {
55
+ throw retryErr;
56
+ }
57
+ }
58
+ }
59
+ else {
60
+ throw err;
61
+ }
62
+ }
63
+ return { path: worktreePath, created: true, branch };
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // worktreeExists
67
+ // ---------------------------------------------------------------------------
68
+ /**
69
+ * Returns true if `<worktreeDir>/<epic>` exists as a directory AND contains a
70
+ * `.git` file (worktrees have a .git file, not a .git directory).
71
+ */
72
+ export async function worktreeExists(worktreeDir, epic) {
73
+ const worktreePath = path.resolve(worktreeDir, epic);
74
+ try {
75
+ const dirStat = await fsp.stat(worktreePath);
76
+ if (!dirStat.isDirectory()) {
77
+ return false;
78
+ }
79
+ const gitStat = await fsp.stat(path.join(worktreePath, ".git"));
80
+ // In worktrees, .git is a file not a directory
81
+ return gitStat.isFile();
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ // ---------------------------------------------------------------------------
88
+ // removeWorktree
89
+ // ---------------------------------------------------------------------------
90
+ /**
91
+ * Removes the worktree at `<worktreeDir>/<epic>` via `git worktree remove --force`.
92
+ * Throws on failure.
93
+ */
94
+ export async function removeWorktree(worktreeDir, epic) {
95
+ const worktreePath = path.resolve(worktreeDir, epic);
96
+ await execFile("git", ["worktree", "remove", worktreePath, "--force"]);
97
+ }
98
+ // ---------------------------------------------------------------------------
99
+ // isWorktreeDirty
100
+ // ---------------------------------------------------------------------------
101
+ /**
102
+ * Returns true if the worktree at the given absolute path has uncommitted
103
+ * changes (staged, unstaged, or untracked files).
104
+ * Returns false if the path does not exist or is not a git worktree.
105
+ */
106
+ export async function isWorktreeDirty(worktreePath) {
107
+ try {
108
+ const { stdout } = await execFile("git", ["-C", worktreePath, "status", "--porcelain"]);
109
+ return stdout.trim().length > 0;
110
+ }
111
+ catch {
112
+ // Path doesn't exist, not a git repo, etc. — treat as not dirty
113
+ return false;
114
+ }
115
+ }
116
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@elhu/pit",
3
+ "version": "0.1.1",
4
+ "description": "A tmux-based orchestrator that automates parallel AI coding agent sessions",
5
+ "type": "module",
6
+ "bin": {
7
+ "pit": "./dist/cli.js"
8
+ },
9
+ "scripts": {
10
+ "build": "npm run build:plugin && npm run build:hook && npm run build:assets && tsc -p tsconfig.build.json",
11
+ "build:plugin": "esbuild src/plugin/pit.ts --bundle --format=esm --platform=node --external:@opencode-ai/plugin --outfile=dist/plugin/pit.js",
12
+ "build:hook": "esbuild src/hooks/claude-code-hook.ts --bundle --format=esm --platform=node --outfile=dist/hooks/claude-code-hook.js",
13
+ "build:assets": "node scripts/generate-assets.mjs",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
16
+ "test:e2e": "vitest run --config vitest.e2e.config.ts",
17
+ "lint": "eslint . && prettier --check .",
18
+ "lint:fix": "eslint --fix . && prettier --write .",
19
+ "format": "prettier --write .",
20
+ "format:check": "prettier --check .",
21
+ "typecheck": "tsc -p tsconfig.build.json --noEmit",
22
+ "release": "bash scripts/release.sh",
23
+ "prepare": "husky"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "README.md",
28
+ "LICENSE"
29
+ ],
30
+ "keywords": [
31
+ "tmux",
32
+ "ai",
33
+ "orchestrator",
34
+ "coding-agent",
35
+ "automation"
36
+ ],
37
+ "license": "MIT",
38
+ "engines": {
39
+ "node": ">=24"
40
+ },
41
+ "lint-staged": {
42
+ "*.ts": [
43
+ "eslint --fix",
44
+ "prettier --write"
45
+ ],
46
+ "*.{js,json,md,yml,yaml}": [
47
+ "prettier --write"
48
+ ]
49
+ },
50
+ "devDependencies": {
51
+ "@eslint/js": "^10.0.1",
52
+ "@opencode-ai/plugin": "^1.2.10",
53
+ "@types/node": "^25.3.0",
54
+ "esbuild": "^0.27.3",
55
+ "eslint": "^10.0.1",
56
+ "husky": "^9.1.7",
57
+ "lint-staged": "^16.2.7",
58
+ "prettier": "^3.8.1",
59
+ "typescript": "^5.9.3",
60
+ "typescript-eslint": "^8.56.0",
61
+ "vitest": "^4.0.18"
62
+ },
63
+ "dependencies": {
64
+ "commander": "^14.0.3"
65
+ }
66
+ }