@the-open-engine/zeroshot 5.4.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 (295) hide show
  1. package/CHANGELOG.md +539 -0
  2. package/LICENSE +21 -0
  3. package/README.md +508 -0
  4. package/cli/commands/inspect-render.js +135 -0
  5. package/cli/commands/inspect.js +294 -0
  6. package/cli/commands/providers.js +149 -0
  7. package/cli/index.js +5431 -0
  8. package/cli/lib/first-run.js +211 -0
  9. package/cli/lib/update-checker.js +281 -0
  10. package/cli/message-formatter-utils.js +75 -0
  11. package/cli/message-formatters-normal.js +275 -0
  12. package/cli/message-formatters-watch.js +185 -0
  13. package/cluster-templates/base-templates/debug-workflow.json +422 -0
  14. package/cluster-templates/base-templates/full-workflow.json +727 -0
  15. package/cluster-templates/base-templates/heavy-validation.json +272 -0
  16. package/cluster-templates/base-templates/quick-validation.json +285 -0
  17. package/cluster-templates/base-templates/single-worker.json +71 -0
  18. package/cluster-templates/base-templates/worker-validator.json +230 -0
  19. package/cluster-templates/conductor-bootstrap.json +130 -0
  20. package/docker/zeroshot-cluster/Dockerfile +153 -0
  21. package/docker/zeroshot-cluster/pre-baked-deps.json +28 -0
  22. package/lib/agent-cli-provider/adapters/claude-parser.d.ts +3 -0
  23. package/lib/agent-cli-provider/adapters/claude-parser.d.ts.map +1 -0
  24. package/lib/agent-cli-provider/adapters/claude-parser.js +122 -0
  25. package/lib/agent-cli-provider/adapters/claude-parser.js.map +1 -0
  26. package/lib/agent-cli-provider/adapters/claude-recovery.d.ts +15 -0
  27. package/lib/agent-cli-provider/adapters/claude-recovery.d.ts.map +1 -0
  28. package/lib/agent-cli-provider/adapters/claude-recovery.js +165 -0
  29. package/lib/agent-cli-provider/adapters/claude-recovery.js.map +1 -0
  30. package/lib/agent-cli-provider/adapters/claude.d.ts +3 -0
  31. package/lib/agent-cli-provider/adapters/claude.d.ts.map +1 -0
  32. package/lib/agent-cli-provider/adapters/claude.js +181 -0
  33. package/lib/agent-cli-provider/adapters/claude.js.map +1 -0
  34. package/lib/agent-cli-provider/adapters/codex-parser.d.ts +3 -0
  35. package/lib/agent-cli-provider/adapters/codex-parser.d.ts.map +1 -0
  36. package/lib/agent-cli-provider/adapters/codex-parser.js +192 -0
  37. package/lib/agent-cli-provider/adapters/codex-parser.js.map +1 -0
  38. package/lib/agent-cli-provider/adapters/codex.d.ts +3 -0
  39. package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -0
  40. package/lib/agent-cli-provider/adapters/codex.js +151 -0
  41. package/lib/agent-cli-provider/adapters/codex.js.map +1 -0
  42. package/lib/agent-cli-provider/adapters/common.d.ts +28 -0
  43. package/lib/agent-cli-provider/adapters/common.d.ts.map +1 -0
  44. package/lib/agent-cli-provider/adapters/common.js +71 -0
  45. package/lib/agent-cli-provider/adapters/common.js.map +1 -0
  46. package/lib/agent-cli-provider/adapters/gemini.d.ts +3 -0
  47. package/lib/agent-cli-provider/adapters/gemini.d.ts.map +1 -0
  48. package/lib/agent-cli-provider/adapters/gemini.js +176 -0
  49. package/lib/agent-cli-provider/adapters/gemini.js.map +1 -0
  50. package/lib/agent-cli-provider/adapters/index.d.ts +9 -0
  51. package/lib/agent-cli-provider/adapters/index.d.ts.map +1 -0
  52. package/lib/agent-cli-provider/adapters/index.js +95 -0
  53. package/lib/agent-cli-provider/adapters/index.js.map +1 -0
  54. package/lib/agent-cli-provider/adapters/opencode.d.ts +3 -0
  55. package/lib/agent-cli-provider/adapters/opencode.d.ts.map +1 -0
  56. package/lib/agent-cli-provider/adapters/opencode.js +228 -0
  57. package/lib/agent-cli-provider/adapters/opencode.js.map +1 -0
  58. package/lib/agent-cli-provider/contract-actions.d.ts +5 -0
  59. package/lib/agent-cli-provider/contract-actions.d.ts.map +1 -0
  60. package/lib/agent-cli-provider/contract-actions.js +140 -0
  61. package/lib/agent-cli-provider/contract-actions.js.map +1 -0
  62. package/lib/agent-cli-provider/contract-env.d.ts +11 -0
  63. package/lib/agent-cli-provider/contract-env.d.ts.map +1 -0
  64. package/lib/agent-cli-provider/contract-env.js +113 -0
  65. package/lib/agent-cli-provider/contract-env.js.map +1 -0
  66. package/lib/agent-cli-provider/contract-envelope.d.ts +49 -0
  67. package/lib/agent-cli-provider/contract-envelope.d.ts.map +1 -0
  68. package/lib/agent-cli-provider/contract-envelope.js +52 -0
  69. package/lib/agent-cli-provider/contract-envelope.js.map +1 -0
  70. package/lib/agent-cli-provider/contract-errors.d.ts +22 -0
  71. package/lib/agent-cli-provider/contract-errors.d.ts.map +1 -0
  72. package/lib/agent-cli-provider/contract-errors.js +71 -0
  73. package/lib/agent-cli-provider/contract-errors.js.map +1 -0
  74. package/lib/agent-cli-provider/contract-fallback.d.ts +7 -0
  75. package/lib/agent-cli-provider/contract-fallback.d.ts.map +1 -0
  76. package/lib/agent-cli-provider/contract-fallback.js +102 -0
  77. package/lib/agent-cli-provider/contract-fallback.js.map +1 -0
  78. package/lib/agent-cli-provider/contract-invoke.d.ts +5 -0
  79. package/lib/agent-cli-provider/contract-invoke.d.ts.map +1 -0
  80. package/lib/agent-cli-provider/contract-invoke.js +89 -0
  81. package/lib/agent-cli-provider/contract-invoke.js.map +1 -0
  82. package/lib/agent-cli-provider/contract-options.d.ts +3 -0
  83. package/lib/agent-cli-provider/contract-options.d.ts.map +1 -0
  84. package/lib/agent-cli-provider/contract-options.js +140 -0
  85. package/lib/agent-cli-provider/contract-options.js.map +1 -0
  86. package/lib/agent-cli-provider/contract-parse.d.ts +15 -0
  87. package/lib/agent-cli-provider/contract-parse.d.ts.map +1 -0
  88. package/lib/agent-cli-provider/contract-parse.js +81 -0
  89. package/lib/agent-cli-provider/contract-parse.js.map +1 -0
  90. package/lib/agent-cli-provider/contract-support.d.ts +18 -0
  91. package/lib/agent-cli-provider/contract-support.d.ts.map +1 -0
  92. package/lib/agent-cli-provider/contract-support.js +154 -0
  93. package/lib/agent-cli-provider/contract-support.js.map +1 -0
  94. package/lib/agent-cli-provider/contract.d.ts +13 -0
  95. package/lib/agent-cli-provider/contract.d.ts.map +1 -0
  96. package/lib/agent-cli-provider/contract.js +30 -0
  97. package/lib/agent-cli-provider/contract.js.map +1 -0
  98. package/lib/agent-cli-provider/env-safety.d.ts +11 -0
  99. package/lib/agent-cli-provider/env-safety.d.ts.map +1 -0
  100. package/lib/agent-cli-provider/env-safety.js +83 -0
  101. package/lib/agent-cli-provider/env-safety.js.map +1 -0
  102. package/lib/agent-cli-provider/errors.d.ts +5 -0
  103. package/lib/agent-cli-provider/errors.d.ts.map +1 -0
  104. package/lib/agent-cli-provider/errors.js +115 -0
  105. package/lib/agent-cli-provider/errors.js.map +1 -0
  106. package/lib/agent-cli-provider/executable.d.ts +3 -0
  107. package/lib/agent-cli-provider/executable.d.ts.map +1 -0
  108. package/lib/agent-cli-provider/executable.js +24 -0
  109. package/lib/agent-cli-provider/executable.js.map +1 -0
  110. package/lib/agent-cli-provider/index.d.ts +8 -0
  111. package/lib/agent-cli-provider/index.d.ts.map +1 -0
  112. package/lib/agent-cli-provider/index.js +31 -0
  113. package/lib/agent-cli-provider/index.js.map +1 -0
  114. package/lib/agent-cli-provider/invoke-evidence.d.ts +4 -0
  115. package/lib/agent-cli-provider/invoke-evidence.d.ts.map +1 -0
  116. package/lib/agent-cli-provider/invoke-evidence.js +17 -0
  117. package/lib/agent-cli-provider/invoke-evidence.js.map +1 -0
  118. package/lib/agent-cli-provider/json.d.ts +16 -0
  119. package/lib/agent-cli-provider/json.d.ts.map +1 -0
  120. package/lib/agent-cli-provider/json.js +110 -0
  121. package/lib/agent-cli-provider/json.js.map +1 -0
  122. package/lib/agent-cli-provider/log-prefix.d.ts +2 -0
  123. package/lib/agent-cli-provider/log-prefix.d.ts.map +1 -0
  124. package/lib/agent-cli-provider/log-prefix.js +22 -0
  125. package/lib/agent-cli-provider/log-prefix.js.map +1 -0
  126. package/lib/agent-cli-provider/process-runner.d.ts +17 -0
  127. package/lib/agent-cli-provider/process-runner.d.ts.map +1 -0
  128. package/lib/agent-cli-provider/process-runner.js +89 -0
  129. package/lib/agent-cli-provider/process-runner.js.map +1 -0
  130. package/lib/agent-cli-provider/redaction.d.ts +9 -0
  131. package/lib/agent-cli-provider/redaction.d.ts.map +1 -0
  132. package/lib/agent-cli-provider/redaction.js +227 -0
  133. package/lib/agent-cli-provider/redaction.js.map +1 -0
  134. package/lib/agent-cli-provider/schema.d.ts +5 -0
  135. package/lib/agent-cli-provider/schema.d.ts.map +1 -0
  136. package/lib/agent-cli-provider/schema.js +136 -0
  137. package/lib/agent-cli-provider/schema.js.map +1 -0
  138. package/lib/agent-cli-provider/single-agent-runtime.d.ts +15 -0
  139. package/lib/agent-cli-provider/single-agent-runtime.d.ts.map +1 -0
  140. package/lib/agent-cli-provider/single-agent-runtime.js +228 -0
  141. package/lib/agent-cli-provider/single-agent-runtime.js.map +1 -0
  142. package/lib/agent-cli-provider/types.d.ts +194 -0
  143. package/lib/agent-cli-provider/types.d.ts.map +1 -0
  144. package/lib/agent-cli-provider/types.js +12 -0
  145. package/lib/agent-cli-provider/types.js.map +1 -0
  146. package/lib/completion.js +174 -0
  147. package/lib/detached-startup.js +220 -0
  148. package/lib/docker-config.js +220 -0
  149. package/lib/git-remote-utils.js +165 -0
  150. package/lib/id-detector.js +55 -0
  151. package/lib/provider-defaults.js +62 -0
  152. package/lib/provider-detection.js +59 -0
  153. package/lib/provider-names.js +57 -0
  154. package/lib/repo-settings.js +69 -0
  155. package/lib/settings/claude-auth.js +78 -0
  156. package/lib/settings.js +542 -0
  157. package/lib/start-cluster.js +321 -0
  158. package/lib/stream-json-parser.js +67 -0
  159. package/package.json +162 -0
  160. package/scripts/fix-node-pty-permissions.js +75 -0
  161. package/scripts/record-demo.sh +279 -0
  162. package/scripts/setup-merge-queue.sh +170 -0
  163. package/scripts/test-install.sh +40 -0
  164. package/scripts/validate-templates.js +107 -0
  165. package/src/agent/agent-config.js +266 -0
  166. package/src/agent/agent-context-builder.js +189 -0
  167. package/src/agent/agent-context-sections.js +338 -0
  168. package/src/agent/agent-context-sources.js +147 -0
  169. package/src/agent/agent-hook-executor.js +721 -0
  170. package/src/agent/agent-input-injector.js +141 -0
  171. package/src/agent/agent-lifecycle.js +982 -0
  172. package/src/agent/agent-quality-gate-schema.js +93 -0
  173. package/src/agent/agent-quality-gates-context.js +51 -0
  174. package/src/agent/agent-stuck-detector.js +256 -0
  175. package/src/agent/agent-task-executor.js +2028 -0
  176. package/src/agent/agent-trigger-evaluator.js +67 -0
  177. package/src/agent/context-metrics.js +160 -0
  178. package/src/agent/context-pack-builder.js +367 -0
  179. package/src/agent/context-replay-policy.js +51 -0
  180. package/src/agent/guidance-queue.js +77 -0
  181. package/src/agent/output-extraction.js +367 -0
  182. package/src/agent/output-reformatter.js +175 -0
  183. package/src/agent/pr-verification.js +653 -0
  184. package/src/agent/rate-limit-backoff.js +82 -0
  185. package/src/agent/schema-utils.js +146 -0
  186. package/src/agent/validation-platform.js +35 -0
  187. package/src/agent-cli-provider/adapters/claude-parser.ts +133 -0
  188. package/src/agent-cli-provider/adapters/claude-recovery.ts +203 -0
  189. package/src/agent-cli-provider/adapters/claude.ts +247 -0
  190. package/src/agent-cli-provider/adapters/codex-parser.ts +211 -0
  191. package/src/agent-cli-provider/adapters/codex.ts +217 -0
  192. package/src/agent-cli-provider/adapters/common.ts +124 -0
  193. package/src/agent-cli-provider/adapters/gemini.ts +243 -0
  194. package/src/agent-cli-provider/adapters/index.ts +126 -0
  195. package/src/agent-cli-provider/adapters/opencode.ts +286 -0
  196. package/src/agent-cli-provider/contract-actions.ts +150 -0
  197. package/src/agent-cli-provider/contract-env.ts +111 -0
  198. package/src/agent-cli-provider/contract-envelope.ts +110 -0
  199. package/src/agent-cli-provider/contract-errors.ts +66 -0
  200. package/src/agent-cli-provider/contract-fallback.ts +121 -0
  201. package/src/agent-cli-provider/contract-invoke.ts +104 -0
  202. package/src/agent-cli-provider/contract-options.ts +173 -0
  203. package/src/agent-cli-provider/contract-parse.ts +94 -0
  204. package/src/agent-cli-provider/contract-support.ts +167 -0
  205. package/src/agent-cli-provider/contract.ts +56 -0
  206. package/src/agent-cli-provider/env-safety.ts +82 -0
  207. package/src/agent-cli-provider/errors.ts +122 -0
  208. package/src/agent-cli-provider/executable.ts +24 -0
  209. package/src/agent-cli-provider/index.ts +83 -0
  210. package/src/agent-cli-provider/invoke-evidence.ts +18 -0
  211. package/src/agent-cli-provider/json.ts +114 -0
  212. package/src/agent-cli-provider/log-prefix.ts +20 -0
  213. package/src/agent-cli-provider/process-runner.ts +145 -0
  214. package/src/agent-cli-provider/redaction.ts +282 -0
  215. package/src/agent-cli-provider/schema.ts +115 -0
  216. package/src/agent-cli-provider/single-agent-runtime.ts +311 -0
  217. package/src/agent-cli-provider/types.ts +237 -0
  218. package/src/agent-wrapper.js +615 -0
  219. package/src/agents/git-pusher-template.js +705 -0
  220. package/src/attach/attach-client.js +438 -0
  221. package/src/attach/attach-server.js +543 -0
  222. package/src/attach/index.js +37 -0
  223. package/src/attach/protocol.js +220 -0
  224. package/src/attach/ring-buffer.js +121 -0
  225. package/src/attach/send-input.js +88 -0
  226. package/src/attach/socket-discovery.js +267 -0
  227. package/src/claude-task-runner.js +661 -0
  228. package/src/config-router.js +89 -0
  229. package/src/config-validator.js +2202 -0
  230. package/src/copy-worker.js +43 -0
  231. package/src/guidance-topics.js +10 -0
  232. package/src/input-helpers.js +65 -0
  233. package/src/isolation-manager.js +1734 -0
  234. package/src/issue-providers/README.md +305 -0
  235. package/src/issue-providers/azure-devops-provider.js +307 -0
  236. package/src/issue-providers/base-provider.js +232 -0
  237. package/src/issue-providers/github-provider.js +210 -0
  238. package/src/issue-providers/gitlab-provider.js +262 -0
  239. package/src/issue-providers/index.js +196 -0
  240. package/src/issue-providers/jira-provider.js +260 -0
  241. package/src/ledger.js +692 -0
  242. package/src/lib/gc.js +232 -0
  243. package/src/lib/safe-exec.js +88 -0
  244. package/src/logic-engine.js +201 -0
  245. package/src/message-buffer.js +81 -0
  246. package/src/message-bus-bridge.js +144 -0
  247. package/src/message-bus.js +256 -0
  248. package/src/name-generator.js +232 -0
  249. package/src/orchestrator.js +3924 -0
  250. package/src/preflight.js +712 -0
  251. package/src/process-metrics.js +608 -0
  252. package/src/providers/anthropic/index.js +3 -0
  253. package/src/providers/base-provider.js +355 -0
  254. package/src/providers/capabilities.js +60 -0
  255. package/src/providers/google/index.js +3 -0
  256. package/src/providers/index.js +293 -0
  257. package/src/providers/openai/index.js +3 -0
  258. package/src/providers/opencode/index.js +3 -0
  259. package/src/quality-gates.js +143 -0
  260. package/src/schemas/sub-cluster.js +208 -0
  261. package/src/state-snapshot.js +398 -0
  262. package/src/state-snapshotter.js +142 -0
  263. package/src/status-footer.js +1026 -0
  264. package/src/sub-cluster-wrapper.js +693 -0
  265. package/src/task-runner.js +30 -0
  266. package/src/template-resolver.js +425 -0
  267. package/src/template-validation/index.js +338 -0
  268. package/src/template-validation/simulate-consensus-gates.js +324 -0
  269. package/src/template-validation/simulate-random-topology.js +541 -0
  270. package/src/template-validation/simulate-two-stage-validation.js +270 -0
  271. package/src/worktree-claude-config.js +135 -0
  272. package/src/worktree-tooling-env.js +150 -0
  273. package/task-lib/attachable-watcher.js +381 -0
  274. package/task-lib/commands/clean.js +50 -0
  275. package/task-lib/commands/episodes.js +105 -0
  276. package/task-lib/commands/get-log-path.js +23 -0
  277. package/task-lib/commands/kill.js +32 -0
  278. package/task-lib/commands/list.js +105 -0
  279. package/task-lib/commands/logs.js +439 -0
  280. package/task-lib/commands/resume.js +42 -0
  281. package/task-lib/commands/run.js +57 -0
  282. package/task-lib/commands/schedule.js +105 -0
  283. package/task-lib/commands/scheduler-cmd.js +96 -0
  284. package/task-lib/commands/schedules.js +148 -0
  285. package/task-lib/commands/status.js +44 -0
  286. package/task-lib/commands/unschedule.js +16 -0
  287. package/task-lib/completion.js +9 -0
  288. package/task-lib/config.js +11 -0
  289. package/task-lib/name-generator.js +230 -0
  290. package/task-lib/package.json +3 -0
  291. package/task-lib/provider-helper-runtime.js +29 -0
  292. package/task-lib/runner.js +190 -0
  293. package/task-lib/scheduler.js +252 -0
  294. package/task-lib/store.js +529 -0
  295. package/task-lib/watcher.js +305 -0
@@ -0,0 +1,321 @@
1
+ const path = require('path');
2
+ const { spawnSync } = require('child_process');
3
+ const chalk = require('chalk');
4
+ const { normalizeProviderName } = require('./provider-names');
5
+ const { getProvider } = require('../src/providers');
6
+ const TemplateResolver = require('../src/template-resolver');
7
+
8
+ const PACKAGE_ROOT = path.resolve(__dirname, '..');
9
+
10
+ function firstTruthy(...values) {
11
+ return values.find(Boolean);
12
+ }
13
+ function anyTruthy(...values) {
14
+ return values.some(Boolean);
15
+ }
16
+ function optionalValue(value) {
17
+ return value || undefined;
18
+ }
19
+ function resolveTargetCwd() {
20
+ return firstTruthy(process.env.ZEROSHOT_CWD, detectGitRepoRoot());
21
+ }
22
+
23
+ function detectGitRepoRoot() {
24
+ try {
25
+ const result = spawnSync('git', ['rev-parse', '--show-toplevel'], {
26
+ encoding: 'utf8',
27
+ stdio: ['pipe', 'pipe', 'pipe'],
28
+ });
29
+ if (result.status !== 0) {
30
+ return process.cwd();
31
+ }
32
+ return result.stdout.trim();
33
+ } catch {
34
+ return process.cwd();
35
+ }
36
+ }
37
+
38
+ function resolveOptionalString(value) {
39
+ if (typeof value !== 'string') return undefined;
40
+ const trimmed = value.trim();
41
+ return trimmed.length > 0 ? trimmed : undefined;
42
+ }
43
+
44
+ function resolveEnvBool(value) {
45
+ if (typeof value !== 'string') return undefined;
46
+ const trimmed = value.trim().toLowerCase();
47
+ if (trimmed === '1' || trimmed === 'true' || trimmed === 'yes') return true;
48
+ if (trimmed === '0' || trimmed === 'false' || trimmed === 'no') return false;
49
+ return undefined;
50
+ }
51
+
52
+ function resolveCloseIssueMode(value) {
53
+ const trimmed = resolveOptionalString(value);
54
+ if (!trimmed) return undefined;
55
+ const normalized = trimmed.toLowerCase();
56
+ if (normalized === 'auto' || normalized === 'always' || normalized === 'never') {
57
+ return normalized;
58
+ }
59
+ return undefined;
60
+ }
61
+
62
+ function parseRunOptionsEnv() {
63
+ const raw = resolveOptionalString(process.env.ZEROSHOT_RUN_OPTIONS);
64
+ if (!raw) return null;
65
+ try {
66
+ const parsed = JSON.parse(raw);
67
+ if (!parsed || typeof parsed !== 'object') {
68
+ return null;
69
+ }
70
+ return parsed;
71
+ } catch {
72
+ return null;
73
+ }
74
+ }
75
+
76
+ function parseMountSpecs(specs) {
77
+ return specs.map((spec) => {
78
+ const parts = spec.split(':');
79
+ if (parts.length < 2) {
80
+ throw new Error(`Invalid mount spec: "${spec}". Format: host:container[:ro]`);
81
+ }
82
+ const host = parts[0];
83
+ const container = parts[1];
84
+ const readonly = parts[2] === 'ro';
85
+ return { host, container, readonly };
86
+ });
87
+ }
88
+
89
+ function buildTextInput(text) {
90
+ return { text };
91
+ }
92
+ function buildIssueInput(issue) {
93
+ return { issue };
94
+ }
95
+ function buildFileInput(file) {
96
+ return { file };
97
+ }
98
+
99
+ function detectRunInput(inputArg) {
100
+ const isGitHubUrl = /^https?:\/\/github\.com\/[\w-]+\/[\w-]+\/issues\/\d+/.test(inputArg);
101
+ const isGitLabUrl = /gitlab\.(com|[\w.-]+)\/[\w-]+\/[\w-]+\/-\/issues\/\d+/.test(inputArg);
102
+ const isJiraUrl = /(atlassian\.net|jira\.[\w.-]+)\/browse\/[A-Z][A-Z0-9]+-\d+/.test(inputArg);
103
+ const isAzureUrl =
104
+ /dev\.azure\.com\/.*\/_workitems\/edit\/\d+/.test(inputArg) ||
105
+ /visualstudio\.com\/.*\/_workitems\/edit\/\d+/.test(inputArg);
106
+ const isJiraKey = /^[A-Z][A-Z0-9]+-\d+$/.test(inputArg);
107
+ const isIssueNumber = /^\d+$/.test(inputArg);
108
+ const isRepoIssue = /^[\w-]+\/[\w-]+#\d+$/.test(inputArg);
109
+ const isMarkdownFile = /\.(md|markdown)$/i.test(inputArg);
110
+
111
+ if (
112
+ isGitHubUrl ||
113
+ isGitLabUrl ||
114
+ isJiraUrl ||
115
+ isAzureUrl ||
116
+ isJiraKey ||
117
+ isIssueNumber ||
118
+ isRepoIssue
119
+ ) {
120
+ return buildIssueInput(inputArg);
121
+ }
122
+ if (isMarkdownFile) {
123
+ return buildFileInput(inputArg);
124
+ }
125
+ return buildTextInput(inputArg);
126
+ }
127
+
128
+ function resolveProviderOverride(options = {}) {
129
+ const override = options.provider || options.envProvider || process.env.ZEROSHOT_PROVIDER;
130
+ if (!override || (typeof override === 'string' && !override.trim())) {
131
+ return null;
132
+ }
133
+ const normalized = normalizeProviderName(override);
134
+ if (options.validateProvider) {
135
+ getProvider(normalized);
136
+ }
137
+ return normalized;
138
+ }
139
+
140
+ function resolveConfigPath(configName) {
141
+ if (path.isAbsolute(configName) || configName.startsWith('./') || configName.startsWith('../')) {
142
+ return path.resolve(process.cwd(), configName);
143
+ }
144
+ if (configName.endsWith('.json')) {
145
+ return path.join(PACKAGE_ROOT, 'cluster-templates', configName);
146
+ }
147
+ return path.join(PACKAGE_ROOT, 'cluster-templates', `${configName}.json`);
148
+ }
149
+
150
+ function ensureConfigProviderDefaults(config, settings) {
151
+ if (!config.defaultProvider) {
152
+ config.defaultProvider = settings.defaultProvider || 'claude';
153
+ }
154
+ config.defaultProvider = normalizeProviderName(config.defaultProvider) || 'claude';
155
+ }
156
+
157
+ function applyProviderOverrideToConfig(config, providerOverride, settings) {
158
+ const provider = getProvider(providerOverride);
159
+ const providerSettings = settings.providerSettings?.[providerOverride] || {};
160
+ config.forceProvider = providerOverride;
161
+ config.defaultProvider = providerOverride;
162
+ config.forceLevel = providerSettings.defaultLevel || provider.getDefaultLevel();
163
+ config.defaultLevel = config.forceLevel;
164
+ console.log(chalk.dim(`Provider override: ${providerOverride} (all agents)`));
165
+ }
166
+
167
+ function resolveParameterizedConfigFile(config) {
168
+ if (!config?.params || Object.keys(config.params).length === 0) {
169
+ return config;
170
+ }
171
+
172
+ const resolver = new TemplateResolver(path.join(PACKAGE_ROOT, 'cluster-templates'));
173
+ return resolver.resolveTemplate(config, {});
174
+ }
175
+
176
+ function loadClusterConfig(orchestrator, configPath, settings = {}, providerOverride) {
177
+ const config = resolveParameterizedConfigFile(orchestrator.loadConfig(configPath));
178
+ ensureConfigProviderDefaults(config, settings);
179
+ if (providerOverride) {
180
+ applyProviderOverrideToConfig(config, providerOverride, settings);
181
+ }
182
+ return config;
183
+ }
184
+
185
+ function mergeRunOptions(options) {
186
+ const envRunOptions = parseRunOptionsEnv();
187
+ return envRunOptions ? { ...envRunOptions, ...options } : options;
188
+ }
189
+
190
+ function resolveIsolation(mergedOptions, settings) {
191
+ return mergedOptions.docker || process.env.ZEROSHOT_DOCKER === '1' || settings.defaultDocker;
192
+ }
193
+
194
+ function resolveMergeQueue(mergedOptions) {
195
+ if (typeof mergedOptions.mergeQueue === 'boolean') {
196
+ return mergedOptions.mergeQueue;
197
+ }
198
+ return resolveEnvBool(process.env.ZEROSHOT_MERGE_QUEUE);
199
+ }
200
+
201
+ function resolvePrBase(mergedOptions) {
202
+ return (
203
+ resolveOptionalString(mergedOptions.prBase) ||
204
+ resolveOptionalString(process.env.ZEROSHOT_PR_BASE) ||
205
+ undefined
206
+ );
207
+ }
208
+
209
+ function resolveCloseIssue(mergedOptions) {
210
+ return (
211
+ resolveCloseIssueMode(mergedOptions.closeIssue) ||
212
+ resolveCloseIssueMode(process.env.ZEROSHOT_CLOSE_ISSUE) ||
213
+ undefined
214
+ );
215
+ }
216
+
217
+ function resolveMounts(mergedOptions) {
218
+ return mergedOptions.mount ? parseMountSpecs(mergedOptions.mount) : undefined;
219
+ }
220
+
221
+ function buildStartOptions({
222
+ clusterId,
223
+ options = {},
224
+ settings = {},
225
+ providerOverride,
226
+ modelOverride,
227
+ forceProvider,
228
+ }) {
229
+ const mergedOptions = mergeRunOptions(options);
230
+ return {
231
+ clusterId,
232
+ cwd: resolveTargetCwd(),
233
+ isolation: resolveIsolation(mergedOptions, settings),
234
+ isolationImage: firstTruthy(mergedOptions.dockerImage, process.env.ZEROSHOT_DOCKER_IMAGE),
235
+ worktree: anyTruthy(mergedOptions.worktree, process.env.ZEROSHOT_WORKTREE === '1'),
236
+ autoPr: anyTruthy(mergedOptions.pr, process.env.ZEROSHOT_PR === '1'),
237
+ autoMerge: process.env.ZEROSHOT_MERGE === '1',
238
+ autoPush: process.env.ZEROSHOT_PUSH === '1',
239
+ modelOverride: optionalValue(modelOverride),
240
+ providerOverride: optionalValue(providerOverride),
241
+ noMounts: anyTruthy(mergedOptions.mounts === false, mergedOptions.noMounts === true),
242
+ mounts: resolveMounts(mergedOptions),
243
+ containerHome: optionalValue(mergedOptions.containerHome),
244
+ forceProvider: optionalValue(forceProvider),
245
+ prBase: resolvePrBase(mergedOptions),
246
+ mergeQueue: resolveMergeQueue(mergedOptions),
247
+ closeIssue: resolveCloseIssue(mergedOptions),
248
+ ship: mergedOptions.ship,
249
+ requiredQualityGates: mergedOptions.requiredQualityGates,
250
+ settings,
251
+ };
252
+ }
253
+
254
+ function resolveConfigOrThrow({
255
+ orchestrator,
256
+ config,
257
+ configPath,
258
+ configName,
259
+ settings,
260
+ providerOverride,
261
+ }) {
262
+ if (config) {
263
+ return config;
264
+ }
265
+ const resolvedPath = configPath || (configName ? resolveConfigPath(configName) : null);
266
+ if (!resolvedPath) {
267
+ throw new Error('configPath or configName is required when config is not provided');
268
+ }
269
+ return loadClusterConfig(orchestrator, resolvedPath, settings, providerOverride);
270
+ }
271
+
272
+ function startClusterWithInput(args, input) {
273
+ const { orchestrator, config, configPath, configName, settings, providerOverride } = args;
274
+ if (!orchestrator) {
275
+ throw new Error('orchestrator is required');
276
+ }
277
+ const resolvedConfig = resolveConfigOrThrow({
278
+ orchestrator,
279
+ config,
280
+ configPath,
281
+ configName,
282
+ settings,
283
+ providerOverride,
284
+ });
285
+ const startOptions = buildStartOptions({
286
+ clusterId: args.clusterId,
287
+ options: args.options || {},
288
+ settings,
289
+ providerOverride,
290
+ modelOverride: args.modelOverride,
291
+ forceProvider: args.forceProvider,
292
+ });
293
+ return orchestrator.start(resolvedConfig, input, startOptions);
294
+ }
295
+
296
+ function startClusterFromText(args) {
297
+ return startClusterWithInput(args, buildTextInput(args.text));
298
+ }
299
+
300
+ function startClusterFromIssue(args) {
301
+ return startClusterWithInput(args, buildIssueInput(args.issue));
302
+ }
303
+
304
+ function startClusterFromFile(args) {
305
+ return startClusterWithInput(args, buildFileInput(args.file));
306
+ }
307
+
308
+ module.exports = {
309
+ buildTextInput,
310
+ buildIssueInput,
311
+ buildFileInput,
312
+ detectRunInput,
313
+ resolveProviderOverride,
314
+ resolveConfigPath,
315
+ loadClusterConfig,
316
+ buildStartOptions,
317
+ startClusterFromText,
318
+ startClusterFromIssue,
319
+ startClusterFromFile,
320
+ detectGitRepoRoot,
321
+ };
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Provider-agnostic stream-json parser for `zeroshot logs`.
3
+ *
4
+ * Provider parsing is delegated to the helper-backed runtime provider facade.
5
+ */
6
+
7
+ const { getProvider } = require('../src/providers');
8
+
9
+ const providerOrder = ['claude', 'codex', 'opencode', 'gemini'];
10
+ const providerParsers = providerOrder.map((name) => getProvider(name));
11
+
12
+ function stripTimestampPrefix(line) {
13
+ if (!line || typeof line !== 'string') return '';
14
+ let trimmed = line.trim().replace(/\r$/, '');
15
+ if (!trimmed) return '';
16
+
17
+ const tsMatch = trimmed.match(/^\[(\d{13})\](.*)$/);
18
+ if (tsMatch) trimmed = (tsMatch[2] || '').trimStart();
19
+
20
+ if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {
21
+ const pipeMatch = trimmed.match(/^[^|]{1,40}\|\s*(.*)$/);
22
+ if (pipeMatch) {
23
+ const afterPipe = (pipeMatch[1] || '').trimStart();
24
+ if (afterPipe.startsWith('{') || afterPipe.startsWith('[')) return afterPipe;
25
+ }
26
+ }
27
+
28
+ return trimmed;
29
+ }
30
+
31
+ function parseEvent(line) {
32
+ const content = stripTimestampPrefix(line);
33
+ if (!content) return null;
34
+
35
+ for (const provider of providerParsers) {
36
+ const event = provider.parseEvent(content);
37
+ if (event) return event;
38
+ }
39
+
40
+ return null;
41
+ }
42
+
43
+ function collectEvent(events, event) {
44
+ if (!event) return;
45
+ if (Array.isArray(event)) {
46
+ events.push(...event);
47
+ return;
48
+ }
49
+ events.push(event);
50
+ }
51
+
52
+ function parseChunk(chunk) {
53
+ const events = [];
54
+ const lines = String(chunk || '').split('\n');
55
+
56
+ for (const line of lines) {
57
+ if (!line.trim()) continue;
58
+ collectEvent(events, parseEvent(line));
59
+ }
60
+
61
+ return events;
62
+ }
63
+
64
+ module.exports = {
65
+ parseEvent,
66
+ parseChunk,
67
+ };
package/package.json ADDED
@@ -0,0 +1,162 @@
1
+ {
2
+ "name": "@the-open-engine/zeroshot",
3
+ "version": "5.4.0",
4
+ "description": "Multi-agent orchestration engine for Claude, Codex, and Gemini",
5
+ "main": "src/orchestrator.js",
6
+ "bin": {
7
+ "zeroshot": "./cli/index.js",
8
+ "zeroshot-agent-provider": "./lib/agent-cli-provider/executable.js"
9
+ },
10
+ "directories": {
11
+ "example": "examples",
12
+ "test": "tests"
13
+ },
14
+ "scripts": {
15
+ "pretest": "npm run build:agent-cli-provider",
16
+ "test": "node tests/run-tests.js",
17
+ "test:unit": "node tests/run-tests.js",
18
+ "test:slow": "mocha 'tests/integration/**/*.test.js' --timeout 180000",
19
+ "test:all": "npm run test && npm run test:slow",
20
+ "test:coverage": "c8 npm run test:unit",
21
+ "test:coverage:report": "c8 --reporter=html npm run test:unit && echo 'Coverage report generated at coverage/index.html'",
22
+ "postinstall": "node scripts/fix-node-pty-permissions.js",
23
+ "start": "node cli/index.js",
24
+ "typecheck": "tsc --noEmit",
25
+ "typecheck:agent-cli-provider": "tsc --project tsconfig.agent-cli-provider.json",
26
+ "lint:agent-cli-provider": "eslint \"src/agent-cli-provider/**/*.ts\" \"tests/agent-cli-provider/**/*.ts\"",
27
+ "build:agent-cli-provider": "tsc --project tsconfig.agent-cli-provider.build.json",
28
+ "test:agent-cli-provider": "node --test tests/agent-cli-provider/*.test.js",
29
+ "check:agent-cli-provider:ci": "npm run typecheck:agent-cli-provider && npm run lint:agent-cli-provider && npm run build:agent-cli-provider && npm run test:agent-cli-provider",
30
+ "dev:link": "npm link",
31
+ "lint": "eslint .",
32
+ "lint:fix": "eslint . --fix",
33
+ "validate:templates": "node scripts/validate-templates.js",
34
+ "format": "prettier --write .",
35
+ "format:check": "prettier --check .",
36
+ "deadcode": "ts-prune --skip node_modules",
37
+ "deadcode:files": "unimported",
38
+ "deadcode:deps": "depcheck",
39
+ "deadcode:all": "npm run deadcode && npm run deadcode:files && npm run deadcode:deps",
40
+ "dupcheck": "jscpd src/ --min-lines 5 --min-tokens 50 --threshold 5",
41
+ "check": "npm run typecheck && npm run lint",
42
+ "check:all": "npm run check && npm run deadcode:all",
43
+ "release": "semantic-release",
44
+ "prepublishOnly": "npm run lint && npm run typecheck && npm run check:agent-cli-provider:ci",
45
+ "prepare": "npm run build:agent-cli-provider && husky"
46
+ },
47
+ "c8": {
48
+ "reporter": [
49
+ "text",
50
+ "lcov",
51
+ "html"
52
+ ],
53
+ "include": [
54
+ "src/**/*.js",
55
+ "lib/**/*.js",
56
+ "cli/**/*.js"
57
+ ],
58
+ "exclude": [
59
+ "**/*.test.js",
60
+ "**/tests/**"
61
+ ],
62
+ "all": true
63
+ },
64
+ "keywords": [
65
+ "ai",
66
+ "agents",
67
+ "multi-agent",
68
+ "orchestration",
69
+ "claude",
70
+ "codex",
71
+ "gemini",
72
+ "automation"
73
+ ],
74
+ "author": "Covibes",
75
+ "license": "MIT",
76
+ "homepage": "https://github.com/the-open-engine/zeroshot",
77
+ "repository": {
78
+ "type": "git",
79
+ "url": "git+https://github.com/the-open-engine/zeroshot.git"
80
+ },
81
+ "bugs": {
82
+ "url": "https://github.com/the-open-engine/zeroshot/issues"
83
+ },
84
+ "engines": {
85
+ "node": ">=18.0.0"
86
+ },
87
+ "publishConfig": {
88
+ "access": "public",
89
+ "registry": "https://registry.npmjs.org/"
90
+ },
91
+ "files": [
92
+ "src/",
93
+ "lib/",
94
+ "cli/",
95
+ "task-lib/",
96
+ "cluster-templates/",
97
+ "hooks/",
98
+ "docker/",
99
+ "scripts/",
100
+ "README.md",
101
+ "LICENSE",
102
+ "CHANGELOG.md"
103
+ ],
104
+ "dependencies": {
105
+ "ajv": "^8.18.0",
106
+ "ansi-to-html": "^0.7.2",
107
+ "better-sqlite3": "^12.6.2",
108
+ "chalk": "^4.1.2",
109
+ "commander": "^14.0.2",
110
+ "node-pty": "^1.1.0",
111
+ "omelette": "^0.4.17",
112
+ "pidusage": "^4.0.1",
113
+ "puppeteer": "^24.34.0",
114
+ "proper-lockfile": "^4.1.2"
115
+ },
116
+ "devDependencies": {
117
+ "@semantic-release/changelog": "^6.0.3",
118
+ "@semantic-release/git": "^10.0.1",
119
+ "@semantic-release/github": "^11.0.6",
120
+ "@types/better-sqlite3": "^7.6.13",
121
+ "@types/node": "^25.0.3",
122
+ "c8": "^10.1.3",
123
+ "chai": "^6.2.1",
124
+ "depcheck": "^1.4.7",
125
+ "eslint": "^9.39.1",
126
+ "eslint-config-prettier": "^10.1.8",
127
+ "eslint-plugin-security": "^3.0.1",
128
+ "eslint-plugin-sonarjs": "^3.0.5",
129
+ "eslint-plugin-unused-imports": "^4.3.0",
130
+ "husky": "^9.1.7",
131
+ "jscpd": "^3.5.10",
132
+ "lint-staged": "^16.2.7",
133
+ "mocha": "^11.7.5",
134
+ "prettier": "^3.7.4",
135
+ "semantic-release": "^25.0.2",
136
+ "sinon": "^21.0.0",
137
+ "ts-prune": "^0.10.3",
138
+ "typescript": "^5.9.3",
139
+ "typescript-eslint": "^8.59.4",
140
+ "unimported": "^1.31.0"
141
+ },
142
+ "overrides": {
143
+ "cosmiconfig": {
144
+ "js-yaml": "4.2.0"
145
+ },
146
+ "xml2js": "^0.5.0",
147
+ "diff": ">=8.0.3",
148
+ "tar": ">=7.5.8",
149
+ "undici": ">=7.18.2",
150
+ "minimatch": ">=10.2.1",
151
+ "lodash": ">=4.17.24",
152
+ "marked": ">=15.0.7"
153
+ },
154
+ "lint-staged": {
155
+ "*.{js,mjs,cjs}": [
156
+ "eslint --fix"
157
+ ],
158
+ "*.{js,mjs,cjs,json,md}": [
159
+ "prettier --write"
160
+ ]
161
+ }
162
+ }
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fix node-pty spawn-helper permissions.
4
+ *
5
+ * node-pty prebuilds ship with spawn-helper lacking execute permission (mode 644).
6
+ * This causes "posix_spawnp failed" errors on macOS/Linux.
7
+ *
8
+ * Upstream bug: https://github.com/microsoft/node-pty/issues/XXX
9
+ * (File issue if not already reported)
10
+ *
11
+ * This script runs as postinstall to fix it automatically.
12
+ */
13
+
14
+ const fs = require('fs');
15
+ const path = require('path');
16
+
17
+ // Skip on Windows - chmod doesn't apply
18
+ if (process.platform === 'win32') {
19
+ process.exit(0);
20
+ }
21
+
22
+ const prebuildsDir = path.join(__dirname, '..', 'node_modules', 'node-pty', 'prebuilds');
23
+
24
+ if (!fs.existsSync(prebuildsDir)) {
25
+ // node-pty not installed yet or using compiled version
26
+ process.exit(0);
27
+ }
28
+
29
+ let fixed = 0;
30
+ let errors = 0;
31
+
32
+ try {
33
+ const platforms = fs.readdirSync(prebuildsDir).filter((f) => {
34
+ try {
35
+ return fs.statSync(path.join(prebuildsDir, f)).isDirectory();
36
+ } catch {
37
+ return false;
38
+ }
39
+ });
40
+
41
+ for (const platform of platforms) {
42
+ // Only fix Unix platforms (darwin, linux)
43
+ if (!platform.startsWith('darwin') && !platform.startsWith('linux')) {
44
+ continue;
45
+ }
46
+
47
+ const helper = path.join(prebuildsDir, platform, 'spawn-helper');
48
+ try {
49
+ if (!fs.existsSync(helper)) continue;
50
+
51
+ const stat = fs.statSync(helper);
52
+ // Check if not executable (missing user execute bit)
53
+ if (!(stat.mode & 0o100)) {
54
+ fs.chmodSync(helper, 0o755);
55
+ fixed++;
56
+ }
57
+ } catch (err) {
58
+ // Log but don't fail install - permission fix is best-effort
59
+ console.warn(`[postinstall] Warning: Could not fix ${helper}: ${err.message}`);
60
+ errors++;
61
+ }
62
+ }
63
+ } catch (err) {
64
+ // Don't fail install on unexpected errors
65
+ console.warn(`[postinstall] Warning: node-pty permission fix failed: ${err.message}`);
66
+ process.exit(0);
67
+ }
68
+
69
+ if (fixed > 0) {
70
+ console.log(`[postinstall] Fixed node-pty spawn-helper permissions (${fixed} platform(s))`);
71
+ }
72
+
73
+ if (errors > 0) {
74
+ console.warn(`[postinstall] ${errors} platform(s) could not be fixed - may need manual chmod`);
75
+ }