agent-bober 0.15.0 → 0.17.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 (301) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/CHANGELOG.md +30 -0
  4. package/README.md +127 -3
  5. package/agents/bober-architect.md +34 -0
  6. package/agents/bober-code-reviewer.md +2 -0
  7. package/agents/bober-curator.md +12 -0
  8. package/agents/bober-documenter.md +129 -0
  9. package/agents/bober-evaluator.md +46 -0
  10. package/agents/bober-generator.md +12 -0
  11. package/agents/bober-planner.md +8 -1
  12. package/dist/cli/commands/graph.js +3 -3
  13. package/dist/cli/commands/graph.js.map +1 -1
  14. package/dist/cli/commands/init.js +4 -0
  15. package/dist/cli/commands/init.js.map +1 -1
  16. package/dist/cli/commands/memory.d.ts +14 -0
  17. package/dist/cli/commands/memory.d.ts.map +1 -0
  18. package/dist/cli/commands/memory.js +132 -0
  19. package/dist/cli/commands/memory.js.map +1 -0
  20. package/dist/cli/index.js +6 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/config/defaults.d.ts.map +1 -1
  23. package/dist/config/defaults.js +14 -3
  24. package/dist/config/defaults.js.map +1 -1
  25. package/dist/config/loader.d.ts.map +1 -1
  26. package/dist/config/loader.js +7 -0
  27. package/dist/config/loader.js.map +1 -1
  28. package/dist/config/role-providers.d.ts +29 -0
  29. package/dist/config/role-providers.d.ts.map +1 -0
  30. package/dist/config/role-providers.js +115 -0
  31. package/dist/config/role-providers.js.map +1 -0
  32. package/dist/config/schema.d.ts +383 -14
  33. package/dist/config/schema.d.ts.map +1 -1
  34. package/dist/config/schema.js +42 -0
  35. package/dist/config/schema.js.map +1 -1
  36. package/dist/contracts/eval-result.d.ts +112 -56
  37. package/dist/contracts/eval-result.d.ts.map +1 -1
  38. package/dist/contracts/eval-result.js +3 -0
  39. package/dist/contracts/eval-result.js.map +1 -1
  40. package/dist/contracts/sprint-contract.d.ts +30 -30
  41. package/dist/fleet/aggregator.d.ts +5 -0
  42. package/dist/fleet/aggregator.d.ts.map +1 -0
  43. package/dist/fleet/aggregator.js +39 -0
  44. package/dist/fleet/aggregator.js.map +1 -0
  45. package/dist/fleet/child-config.d.ts +12 -0
  46. package/dist/fleet/child-config.d.ts.map +1 -0
  47. package/dist/fleet/child-config.js +38 -0
  48. package/dist/fleet/child-config.js.map +1 -0
  49. package/dist/fleet/coordinator.d.ts +25 -0
  50. package/dist/fleet/coordinator.d.ts.map +1 -0
  51. package/dist/fleet/coordinator.js +40 -0
  52. package/dist/fleet/coordinator.js.map +1 -0
  53. package/dist/fleet/index.d.ts +40 -0
  54. package/dist/fleet/index.d.ts.map +1 -0
  55. package/dist/fleet/index.js +117 -0
  56. package/dist/fleet/index.js.map +1 -0
  57. package/dist/fleet/manifest.d.ts +51 -0
  58. package/dist/fleet/manifest.d.ts.map +1 -0
  59. package/dist/fleet/manifest.js +32 -0
  60. package/dist/fleet/manifest.js.map +1 -0
  61. package/dist/fleet/reporter.d.ts +32 -0
  62. package/dist/fleet/reporter.d.ts.map +1 -0
  63. package/dist/fleet/reporter.js +71 -0
  64. package/dist/fleet/reporter.js.map +1 -0
  65. package/dist/fleet/runner.d.ts +48 -0
  66. package/dist/fleet/runner.d.ts.map +1 -0
  67. package/dist/fleet/runner.js +104 -0
  68. package/dist/fleet/runner.js.map +1 -0
  69. package/dist/fleet/scaffolder.d.ts +12 -0
  70. package/dist/fleet/scaffolder.d.ts.map +1 -0
  71. package/dist/fleet/scaffolder.js +82 -0
  72. package/dist/fleet/scaffolder.js.map +1 -0
  73. package/dist/fleet/types.d.ts +21 -0
  74. package/dist/fleet/types.d.ts.map +1 -0
  75. package/dist/fleet/types.js +2 -0
  76. package/dist/fleet/types.js.map +1 -0
  77. package/dist/graph/cli.d.ts +6 -2
  78. package/dist/graph/cli.d.ts.map +1 -1
  79. package/dist/graph/cli.js +53 -12
  80. package/dist/graph/cli.js.map +1 -1
  81. package/dist/graph/pipeline-lifecycle.d.ts +9 -0
  82. package/dist/graph/pipeline-lifecycle.d.ts.map +1 -1
  83. package/dist/graph/pipeline-lifecycle.js +12 -0
  84. package/dist/graph/pipeline-lifecycle.js.map +1 -1
  85. package/dist/graph/preflight-injector.d.ts +14 -0
  86. package/dist/graph/preflight-injector.d.ts.map +1 -1
  87. package/dist/graph/preflight-injector.js +84 -4
  88. package/dist/graph/preflight-injector.js.map +1 -1
  89. package/dist/incident/types.d.ts +24 -24
  90. package/dist/mcp/tools/graph-schemas.d.ts +7 -7
  91. package/dist/mcp/tools/init.d.ts.map +1 -1
  92. package/dist/mcp/tools/init.js +2 -0
  93. package/dist/mcp/tools/init.js.map +1 -1
  94. package/dist/orchestrator/agent-loader.d.ts.map +1 -1
  95. package/dist/orchestrator/agent-loader.js +15 -1
  96. package/dist/orchestrator/agent-loader.js.map +1 -1
  97. package/dist/orchestrator/agentic-loop.d.ts +51 -0
  98. package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
  99. package/dist/orchestrator/agentic-loop.js +123 -4
  100. package/dist/orchestrator/agentic-loop.js.map +1 -1
  101. package/dist/orchestrator/arch-lenses.d.ts +7 -0
  102. package/dist/orchestrator/arch-lenses.d.ts.map +1 -0
  103. package/dist/orchestrator/arch-lenses.js +22 -0
  104. package/dist/orchestrator/arch-lenses.js.map +1 -0
  105. package/dist/orchestrator/architect-agent.d.ts +16 -0
  106. package/dist/orchestrator/architect-agent.d.ts.map +1 -1
  107. package/dist/orchestrator/architect-agent.js +509 -1
  108. package/dist/orchestrator/architect-agent.js.map +1 -1
  109. package/dist/orchestrator/curator-agent.js +1 -1
  110. package/dist/orchestrator/curator-agent.js.map +1 -1
  111. package/dist/orchestrator/deploy/types.d.ts +2 -2
  112. package/dist/orchestrator/documenter-agent.d.ts +57 -0
  113. package/dist/orchestrator/documenter-agent.d.ts.map +1 -0
  114. package/dist/orchestrator/documenter-agent.js +195 -0
  115. package/dist/orchestrator/documenter-agent.js.map +1 -0
  116. package/dist/orchestrator/environment.d.ts +45 -0
  117. package/dist/orchestrator/environment.d.ts.map +1 -0
  118. package/dist/orchestrator/environment.js +151 -0
  119. package/dist/orchestrator/environment.js.map +1 -0
  120. package/dist/orchestrator/eval-lenses.d.ts +7 -0
  121. package/dist/orchestrator/eval-lenses.d.ts.map +1 -0
  122. package/dist/orchestrator/eval-lenses.js +19 -0
  123. package/dist/orchestrator/eval-lenses.js.map +1 -0
  124. package/dist/orchestrator/eval-persist.d.ts +25 -0
  125. package/dist/orchestrator/eval-persist.d.ts.map +1 -0
  126. package/dist/orchestrator/eval-persist.js +74 -0
  127. package/dist/orchestrator/eval-persist.js.map +1 -0
  128. package/dist/orchestrator/evaluator-agent.d.ts +23 -0
  129. package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
  130. package/dist/orchestrator/evaluator-agent.js +60 -3
  131. package/dist/orchestrator/evaluator-agent.js.map +1 -1
  132. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  133. package/dist/orchestrator/generator-agent.js +32 -0
  134. package/dist/orchestrator/generator-agent.js.map +1 -1
  135. package/dist/orchestrator/memory/distill.d.ts +60 -0
  136. package/dist/orchestrator/memory/distill.d.ts.map +1 -0
  137. package/dist/orchestrator/memory/distill.js +177 -0
  138. package/dist/orchestrator/memory/distill.js.map +1 -0
  139. package/dist/orchestrator/memory/eval-source.d.ts +20 -0
  140. package/dist/orchestrator/memory/eval-source.d.ts.map +1 -0
  141. package/dist/orchestrator/memory/eval-source.js +88 -0
  142. package/dist/orchestrator/memory/eval-source.js.map +1 -0
  143. package/dist/orchestrator/memory/retrieve.d.ts +45 -0
  144. package/dist/orchestrator/memory/retrieve.d.ts.map +1 -0
  145. package/dist/orchestrator/memory/retrieve.js +102 -0
  146. package/dist/orchestrator/memory/retrieve.js.map +1 -0
  147. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  148. package/dist/orchestrator/model-resolver.js +12 -0
  149. package/dist/orchestrator/model-resolver.js.map +1 -1
  150. package/dist/orchestrator/pipeline.d.ts +10 -0
  151. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  152. package/dist/orchestrator/pipeline.js +111 -3
  153. package/dist/orchestrator/pipeline.js.map +1 -1
  154. package/dist/orchestrator/planner-agent.d.ts +22 -1
  155. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  156. package/dist/orchestrator/planner-agent.js +160 -4
  157. package/dist/orchestrator/planner-agent.js.map +1 -1
  158. package/dist/orchestrator/research-agent.js +2 -2
  159. package/dist/orchestrator/research-agent.js.map +1 -1
  160. package/dist/orchestrator/tools/handlers.d.ts +14 -0
  161. package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
  162. package/dist/orchestrator/tools/handlers.js +29 -4
  163. package/dist/orchestrator/tools/handlers.js.map +1 -1
  164. package/dist/orchestrator/tools/schemas.js +5 -5
  165. package/dist/orchestrator/tools/schemas.js.map +1 -1
  166. package/dist/orchestrator/workflow/args-builder.d.ts +35 -0
  167. package/dist/orchestrator/workflow/args-builder.d.ts.map +1 -0
  168. package/dist/orchestrator/workflow/args-builder.js +142 -0
  169. package/dist/orchestrator/workflow/args-builder.js.map +1 -0
  170. package/dist/orchestrator/workflow/budget.d.ts +57 -0
  171. package/dist/orchestrator/workflow/budget.d.ts.map +1 -0
  172. package/dist/orchestrator/workflow/budget.js +80 -0
  173. package/dist/orchestrator/workflow/budget.js.map +1 -0
  174. package/dist/orchestrator/workflow/conformance.d.ts +27 -0
  175. package/dist/orchestrator/workflow/conformance.d.ts.map +1 -0
  176. package/dist/orchestrator/workflow/conformance.js +111 -0
  177. package/dist/orchestrator/workflow/conformance.js.map +1 -0
  178. package/dist/orchestrator/workflow/eligibility.d.ts +8 -0
  179. package/dist/orchestrator/workflow/eligibility.d.ts.map +1 -0
  180. package/dist/orchestrator/workflow/eligibility.js +10 -0
  181. package/dist/orchestrator/workflow/eligibility.js.map +1 -0
  182. package/dist/orchestrator/workflow/engine.d.ts +10 -0
  183. package/dist/orchestrator/workflow/engine.d.ts.map +1 -0
  184. package/dist/orchestrator/workflow/engine.js +2 -0
  185. package/dist/orchestrator/workflow/engine.js.map +1 -0
  186. package/dist/orchestrator/workflow/errors.d.ts +13 -0
  187. package/dist/orchestrator/workflow/errors.d.ts.map +1 -0
  188. package/dist/orchestrator/workflow/errors.js +26 -0
  189. package/dist/orchestrator/workflow/errors.js.map +1 -0
  190. package/dist/orchestrator/workflow/flusher.d.ts +19 -0
  191. package/dist/orchestrator/workflow/flusher.d.ts.map +1 -0
  192. package/dist/orchestrator/workflow/flusher.js +81 -0
  193. package/dist/orchestrator/workflow/flusher.js.map +1 -0
  194. package/dist/orchestrator/workflow/interpreter.d.ts +48 -0
  195. package/dist/orchestrator/workflow/interpreter.d.ts.map +1 -0
  196. package/dist/orchestrator/workflow/interpreter.js +92 -0
  197. package/dist/orchestrator/workflow/interpreter.js.map +1 -0
  198. package/dist/orchestrator/workflow/pure-sprint.d.ts +65 -0
  199. package/dist/orchestrator/workflow/pure-sprint.d.ts.map +1 -0
  200. package/dist/orchestrator/workflow/pure-sprint.js +82 -0
  201. package/dist/orchestrator/workflow/pure-sprint.js.map +1 -0
  202. package/dist/orchestrator/workflow/reconciler.d.ts +15 -0
  203. package/dist/orchestrator/workflow/reconciler.d.ts.map +1 -0
  204. package/dist/orchestrator/workflow/reconciler.js +65 -0
  205. package/dist/orchestrator/workflow/reconciler.js.map +1 -0
  206. package/dist/orchestrator/workflow/resume-cursor.d.ts +10 -0
  207. package/dist/orchestrator/workflow/resume-cursor.d.ts.map +1 -0
  208. package/dist/orchestrator/workflow/resume-cursor.js +25 -0
  209. package/dist/orchestrator/workflow/resume-cursor.js.map +1 -0
  210. package/dist/orchestrator/workflow/retry.d.ts +50 -0
  211. package/dist/orchestrator/workflow/retry.d.ts.map +1 -0
  212. package/dist/orchestrator/workflow/retry.js +100 -0
  213. package/dist/orchestrator/workflow/retry.js.map +1 -0
  214. package/dist/orchestrator/workflow/scheduler.d.ts +87 -0
  215. package/dist/orchestrator/workflow/scheduler.d.ts.map +1 -0
  216. package/dist/orchestrator/workflow/scheduler.js +158 -0
  217. package/dist/orchestrator/workflow/scheduler.js.map +1 -0
  218. package/dist/orchestrator/workflow/selector.d.ts +26 -0
  219. package/dist/orchestrator/workflow/selector.d.ts.map +1 -0
  220. package/dist/orchestrator/workflow/selector.js +54 -0
  221. package/dist/orchestrator/workflow/selector.js.map +1 -0
  222. package/dist/orchestrator/workflow/synthesizer.d.ts +52 -0
  223. package/dist/orchestrator/workflow/synthesizer.d.ts.map +1 -0
  224. package/dist/orchestrator/workflow/synthesizer.js +75 -0
  225. package/dist/orchestrator/workflow/synthesizer.js.map +1 -0
  226. package/dist/orchestrator/workflow/ts-engine.d.ts +13 -0
  227. package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -0
  228. package/dist/orchestrator/workflow/ts-engine.js +14 -0
  229. package/dist/orchestrator/workflow/ts-engine.js.map +1 -0
  230. package/dist/orchestrator/workflow/types.d.ts +55 -0
  231. package/dist/orchestrator/workflow/types.d.ts.map +1 -0
  232. package/dist/orchestrator/workflow/types.js +3 -0
  233. package/dist/orchestrator/workflow/types.js.map +1 -0
  234. package/dist/orchestrator/workflow/workflow-engine.d.ts +31 -0
  235. package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -0
  236. package/dist/orchestrator/workflow/workflow-engine.js +70 -0
  237. package/dist/orchestrator/workflow/workflow-engine.js.map +1 -0
  238. package/dist/providers/anthropic.d.ts.map +1 -1
  239. package/dist/providers/anthropic.js +49 -6
  240. package/dist/providers/anthropic.js.map +1 -1
  241. package/dist/providers/claude-code.d.ts +44 -0
  242. package/dist/providers/claude-code.d.ts.map +1 -0
  243. package/dist/providers/claude-code.js +143 -0
  244. package/dist/providers/claude-code.js.map +1 -0
  245. package/dist/providers/factory.d.ts +16 -2
  246. package/dist/providers/factory.d.ts.map +1 -1
  247. package/dist/providers/factory.js +66 -12
  248. package/dist/providers/factory.js.map +1 -1
  249. package/dist/providers/google.d.ts.map +1 -1
  250. package/dist/providers/google.js +27 -3
  251. package/dist/providers/google.js.map +1 -1
  252. package/dist/providers/index.d.ts +3 -1
  253. package/dist/providers/index.d.ts.map +1 -1
  254. package/dist/providers/index.js +3 -1
  255. package/dist/providers/index.js.map +1 -1
  256. package/dist/providers/openai.d.ts.map +1 -1
  257. package/dist/providers/openai.js +24 -3
  258. package/dist/providers/openai.js.map +1 -1
  259. package/dist/providers/preflight.d.ts +22 -0
  260. package/dist/providers/preflight.d.ts.map +1 -0
  261. package/dist/providers/preflight.js +54 -0
  262. package/dist/providers/preflight.js.map +1 -0
  263. package/dist/providers/structured.d.ts +130 -0
  264. package/dist/providers/structured.d.ts.map +1 -0
  265. package/dist/providers/structured.js +205 -0
  266. package/dist/providers/structured.js.map +1 -0
  267. package/dist/providers/types.d.ts +28 -0
  268. package/dist/providers/types.d.ts.map +1 -1
  269. package/dist/state/history-rotation.d.ts +17 -0
  270. package/dist/state/history-rotation.d.ts.map +1 -0
  271. package/dist/state/history-rotation.js +84 -0
  272. package/dist/state/history-rotation.js.map +1 -0
  273. package/dist/state/history.d.ts +16 -4
  274. package/dist/state/history.d.ts.map +1 -1
  275. package/dist/state/history.js +62 -20
  276. package/dist/state/history.js.map +1 -1
  277. package/dist/state/index.d.ts +1 -1
  278. package/dist/state/index.d.ts.map +1 -1
  279. package/dist/state/index.js +1 -1
  280. package/dist/state/index.js.map +1 -1
  281. package/dist/state/memory.d.ts +60 -0
  282. package/dist/state/memory.d.ts.map +1 -0
  283. package/dist/state/memory.js +242 -0
  284. package/dist/state/memory.js.map +1 -0
  285. package/hooks/hooks.json +12 -2
  286. package/package.json +9 -5
  287. package/scripts/spike-claude-code-provider.mjs +66 -0
  288. package/scripts/spike-deepseek.mjs +63 -0
  289. package/scripts/sync-targets.json +12 -0
  290. package/scripts/update-all.mjs +255 -0
  291. package/skills/bober.architect/SKILL.md +13 -0
  292. package/skills/bober.architect/references/arch-lens-panel.md +126 -0
  293. package/skills/bober.eval/SKILL.md +9 -0
  294. package/skills/bober.eval/references/lens-panel.md +115 -0
  295. package/skills/bober.plan/SKILL.md +6 -0
  296. package/skills/bober.run/SKILL.md +23 -4
  297. package/skills/bober.run/references/lens-panel.md +115 -0
  298. package/skills/bober.sprint/SKILL.md +44 -2
  299. package/skills/bober.sprint/references/lens-panel.md +115 -0
  300. package/skills/shared/arch-lens-panel.md +126 -0
  301. package/skills/shared/lens-panel.md +115 -0
@@ -0,0 +1,32 @@
1
+ import type { ChildOutcome } from "./types.js";
2
+ export interface PortfolioReport {
3
+ total: number;
4
+ completed: number;
5
+ failed: number;
6
+ other: number;
7
+ generatedAt: string;
8
+ children: ChildOutcome[];
9
+ }
10
+ export declare class PortfolioReporter {
11
+ /**
12
+ * Tally a list of ChildOutcome records into a PortfolioReport.
13
+ *
14
+ * - completed: status === "completed"
15
+ * - failed: status === "failed"
16
+ * - other: anything else (running / aborted / unknown)
17
+ * - generatedAt: ISO-8601 timestamp at call time
18
+ */
19
+ build(outcomes: ChildOutcome[]): PortfolioReport;
20
+ /**
21
+ * Atomically write the PortfolioReport to <rootDir>/.bober/fleet-report.json.
22
+ *
23
+ * Uses temp file + rename to prevent partial-write corruption (mirrors
24
+ * writeRunState in src/state/run-state.ts).
25
+ *
26
+ * This is the ONE place in the fleet subsystem allowed to throw on IO failure.
27
+ *
28
+ * @returns The absolute path of the written file.
29
+ */
30
+ write(rootDir: string, report: PortfolioReport): Promise<string>;
31
+ }
32
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/fleet/reporter.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAID,qBAAa,iBAAiB;IAG5B;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,eAAe;IA2BhD;;;;;;;;;OASG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBvE"}
@@ -0,0 +1,71 @@
1
+ // ── reporter.ts ───────────────────────────────────────────────────────
2
+ //
3
+ // PortfolioReporter: tally ChildOutcome[] into a PortfolioReport and
4
+ // atomically write it to <rootDir>/.bober/fleet-report.json.
5
+ //
6
+ // Write strategy mirrors writeRunState in src/state/run-state.ts:
7
+ // temp file + rename to prevent partial-write corruption.
8
+ import { mkdir, rename, writeFile } from "node:fs/promises";
9
+ import { randomBytes } from "node:crypto";
10
+ import { join, resolve } from "node:path";
11
+ // ── PortfolioReporter ─────────────────────────────────────────────────
12
+ export class PortfolioReporter {
13
+ // ── build ───────────────────────────────────────────────────────────
14
+ /**
15
+ * Tally a list of ChildOutcome records into a PortfolioReport.
16
+ *
17
+ * - completed: status === "completed"
18
+ * - failed: status === "failed"
19
+ * - other: anything else (running / aborted / unknown)
20
+ * - generatedAt: ISO-8601 timestamp at call time
21
+ */
22
+ build(outcomes) {
23
+ let completed = 0;
24
+ let failed = 0;
25
+ let other = 0;
26
+ for (const o of outcomes) {
27
+ if (o.status === "completed") {
28
+ completed++;
29
+ }
30
+ else if (o.status === "failed") {
31
+ failed++;
32
+ }
33
+ else {
34
+ other++;
35
+ }
36
+ }
37
+ return {
38
+ total: outcomes.length,
39
+ completed,
40
+ failed,
41
+ other,
42
+ generatedAt: new Date().toISOString(),
43
+ children: outcomes,
44
+ };
45
+ }
46
+ // ── write ────────────────────────────────────────────────────────────
47
+ /**
48
+ * Atomically write the PortfolioReport to <rootDir>/.bober/fleet-report.json.
49
+ *
50
+ * Uses temp file + rename to prevent partial-write corruption (mirrors
51
+ * writeRunState in src/state/run-state.ts).
52
+ *
53
+ * This is the ONE place in the fleet subsystem allowed to throw on IO failure.
54
+ *
55
+ * @returns The absolute path of the written file.
56
+ */
57
+ async write(rootDir, report) {
58
+ const dir = resolve(join(rootDir, ".bober"));
59
+ await mkdir(dir, { recursive: true });
60
+ const filePath = join(dir, "fleet-report.json");
61
+ const rnd = randomBytes(4).toString("hex");
62
+ const tmp = `${filePath}.${process.pid}.${Date.now()}.${rnd}.tmp`;
63
+ await writeFile(tmp, JSON.stringify(report, null, 2) + "\n", {
64
+ encoding: "utf-8",
65
+ mode: 0o600,
66
+ });
67
+ await rename(tmp, filePath);
68
+ return filePath;
69
+ }
70
+ }
71
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/fleet/reporter.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,qEAAqE;AACrE,6DAA6D;AAC7D,EAAE;AACF,kEAAkE;AAClE,0DAA0D;AAE1D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAe1C,yEAAyE;AAEzE,MAAM,OAAO,iBAAiB;IAC5B,uEAAuE;IAEvE;;;;;;;OAOG;IACH,KAAK,CAAC,QAAwB;QAC5B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC7B,SAAS,EAAE,CAAC;YACd,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,SAAS;YACT,MAAM;YACN,KAAK;YACL,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,QAAQ,EAAE,QAAQ;SACnB,CAAC;IACJ,CAAC;IAED,wEAAwE;IAExE;;;;;;;;;OASG;IACH,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,MAAuB;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAAC;QAElE,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;YAC3D,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAE5B,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ export declare function resolveCliEntry(): string;
2
+ export interface ChildRunSpec {
3
+ cwd: string;
4
+ task: string;
5
+ timeoutMs?: number;
6
+ }
7
+ export interface ChildSpawnResult {
8
+ cwd: string;
9
+ exitCode: number | null;
10
+ stdout: string;
11
+ stderr: string;
12
+ timedOut?: boolean;
13
+ spawnError?: string;
14
+ }
15
+ /**
16
+ * Probe the CLI binary for a successful --version response.
17
+ * Returns true if the entry file responds with exitCode 0, false otherwise.
18
+ * Never throws.
19
+ */
20
+ export declare function probeCliVersion(cliEntry: string): Promise<boolean>;
21
+ export declare class ChildRunner {
22
+ /**
23
+ * Optional override for the CLI entry path.
24
+ * Production code leaves this undefined (defaults to resolveCliEntry()).
25
+ * Tests inject the stub fixture path via the constructor to avoid
26
+ * requiring a built dist/cli/index.js during unit testing.
27
+ */
28
+ private readonly _cliEntry?;
29
+ /**
30
+ * Optional override for the Node.js binary path.
31
+ * Production code leaves this undefined (defaults to process.execPath).
32
+ * Tests may inject a bad path to exercise the spawn-failure / ENOENT path.
33
+ */
34
+ private readonly _nodeBin?;
35
+ constructor(options?: {
36
+ cliEntry?: string;
37
+ nodeBin?: string;
38
+ });
39
+ /**
40
+ * Spawn one `agent-bober run <task>` child process in spec.cwd.
41
+ * Uses process.execPath (the current Node binary) + the parent's own
42
+ * dist/cli/index.js — never a bare PATH lookup.
43
+ *
44
+ * Never throws: spawn errors are captured in spawnError.
45
+ */
46
+ run(spec: ChildRunSpec): Promise<ChildSpawnResult>;
47
+ }
48
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/fleet/runner.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAID,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AASD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUxE;AAID,qBAAa,WAAW;IACtB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IAEpC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;gBAEvB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7D;;;;;;OAMG;IACG,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAmDzD"}
@@ -0,0 +1,104 @@
1
+ import { execa } from "execa";
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+ // ── Entry resolution (ADR-4) ─────────────────────────────────────────
5
+ // At runtime this file is dist/fleet/runner.js → CLI is dist/cli/index.js.
6
+ // From dirname(runner.js) = dist/fleet, go ".." to dist, then "cli/index.js".
7
+ export function resolveCliEntry() {
8
+ const here = dirname(fileURLToPath(import.meta.url)); // dist/fleet
9
+ return join(here, "..", "cli", "index.js"); // dist/cli/index.js
10
+ }
11
+ // ── Constants ────────────────────────────────────────────────────────
12
+ const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes
13
+ const MAX_BUFFER = 10 * 1024 * 1024; // 10 MiB
14
+ // ── Version probe (ADR-4) ────────────────────────────────────────────
15
+ /**
16
+ * Probe the CLI binary for a successful --version response.
17
+ * Returns true if the entry file responds with exitCode 0, false otherwise.
18
+ * Never throws.
19
+ */
20
+ export async function probeCliVersion(cliEntry) {
21
+ try {
22
+ const r = await execa(process.execPath, [cliEntry, "--version"], {
23
+ reject: false,
24
+ timeout: 5_000,
25
+ });
26
+ return r.exitCode === 0;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ // ── Runner ───────────────────────────────────────────────────────────
33
+ export class ChildRunner {
34
+ /**
35
+ * Optional override for the CLI entry path.
36
+ * Production code leaves this undefined (defaults to resolveCliEntry()).
37
+ * Tests inject the stub fixture path via the constructor to avoid
38
+ * requiring a built dist/cli/index.js during unit testing.
39
+ */
40
+ _cliEntry;
41
+ /**
42
+ * Optional override for the Node.js binary path.
43
+ * Production code leaves this undefined (defaults to process.execPath).
44
+ * Tests may inject a bad path to exercise the spawn-failure / ENOENT path.
45
+ */
46
+ _nodeBin;
47
+ constructor(options) {
48
+ this._cliEntry = options?.cliEntry;
49
+ this._nodeBin = options?.nodeBin;
50
+ }
51
+ /**
52
+ * Spawn one `agent-bober run <task>` child process in spec.cwd.
53
+ * Uses process.execPath (the current Node binary) + the parent's own
54
+ * dist/cli/index.js — never a bare PATH lookup.
55
+ *
56
+ * Never throws: spawn errors are captured in spawnError.
57
+ */
58
+ async run(spec) {
59
+ const cliEntry = this._cliEntry ?? resolveCliEntry();
60
+ const nodeBin = this._nodeBin ?? process.execPath;
61
+ const timeout = spec.timeoutMs ?? DEFAULT_TIMEOUT_MS;
62
+ try {
63
+ const result = await execa(nodeBin, [cliEntry, "run", spec.task], {
64
+ cwd: spec.cwd,
65
+ reject: false,
66
+ timeout,
67
+ maxBuffer: MAX_BUFFER,
68
+ });
69
+ // With reject:false, execa resolves even on spawn-level failures (e.g. ENOENT).
70
+ // Detect a spawn failure by checking whether exitCode is absent and the process
71
+ // did not actually start (originalMessage contains the spawn error details).
72
+ if (result.exitCode === undefined && result.failed && result.originalMessage) {
73
+ return {
74
+ cwd: spec.cwd,
75
+ exitCode: null,
76
+ stdout: result.stdout ?? "",
77
+ stderr: result.stderr ?? "",
78
+ spawnError: result.originalMessage,
79
+ };
80
+ }
81
+ const spawnResult = {
82
+ cwd: spec.cwd,
83
+ exitCode: result.exitCode ?? null,
84
+ stdout: result.stdout,
85
+ stderr: result.stderr,
86
+ };
87
+ if (result.timedOut) {
88
+ spawnResult.timedOut = true;
89
+ }
90
+ return spawnResult;
91
+ }
92
+ catch (err) {
93
+ // Fallback: if execa throws despite reject:false (older execa versions)
94
+ return {
95
+ cwd: spec.cwd,
96
+ exitCode: null,
97
+ stdout: "",
98
+ stderr: "",
99
+ spawnError: err.message,
100
+ };
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/fleet/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { FleetChild } from "./manifest.js";
2
+ export interface ScaffoldResult {
3
+ folder: string;
4
+ absPath: string;
5
+ configWritten: boolean;
6
+ gitInitialized: boolean;
7
+ error?: string;
8
+ }
9
+ export declare class ChildScaffolder {
10
+ scaffold(rootDir: string, child: FleetChild): Promise<ScaffoldResult>;
11
+ }
12
+ //# sourceMappingURL=scaffolder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../../src/fleet/scaffolder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,eAAe;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC;CA0E5E"}
@@ -0,0 +1,82 @@
1
+ import { mkdir, writeFile, readdir, stat } from "node:fs/promises";
2
+ import { resolve, join } from "node:path";
3
+ import { execa } from "execa";
4
+ import { buildChildConfig } from "./child-config.js";
5
+ // ── Scaffolder ───────────────────────────────────────────────────────
6
+ export class ChildScaffolder {
7
+ async scaffold(rootDir, child) {
8
+ const absPath = resolve(rootDir, child.folder);
9
+ // 1. Non-empty safety check — bail untouched if folder exists and has entries
10
+ try {
11
+ const statResult = await stat(absPath);
12
+ if (statResult.isDirectory()) {
13
+ const entries = await readdir(absPath);
14
+ if (entries.length > 0) {
15
+ return {
16
+ folder: child.folder,
17
+ absPath,
18
+ configWritten: false,
19
+ gitInitialized: false,
20
+ error: "folder exists and is non-empty",
21
+ };
22
+ }
23
+ }
24
+ }
25
+ catch {
26
+ // stat failed → folder does not exist, proceed to create
27
+ }
28
+ // 2. Create the directory (recursive so intermediate dirs are made)
29
+ try {
30
+ await mkdir(absPath, { recursive: true });
31
+ }
32
+ catch (err) {
33
+ return {
34
+ folder: child.folder,
35
+ absPath,
36
+ configWritten: false,
37
+ gitInitialized: false,
38
+ error: `mkdir failed: ${err.message}`,
39
+ };
40
+ }
41
+ // 3. Write bober.config.json using the Zod-valid config from buildChildConfig
42
+ try {
43
+ const configJson = JSON.stringify(buildChildConfig(child), null, 2);
44
+ await writeFile(join(absPath, "bober.config.json"), configJson, "utf-8");
45
+ }
46
+ catch (err) {
47
+ return {
48
+ folder: child.folder,
49
+ absPath,
50
+ configWritten: false,
51
+ gitInitialized: false,
52
+ error: `writeFile failed: ${err.message}`,
53
+ };
54
+ }
55
+ // 4. git init — reject:false so a non-zero exit is captured, not thrown
56
+ let gitInitialized = false;
57
+ let gitError;
58
+ try {
59
+ const gitResult = await execa("git", ["init"], {
60
+ cwd: absPath,
61
+ reject: false,
62
+ });
63
+ if (gitResult.exitCode === 0) {
64
+ gitInitialized = true;
65
+ }
66
+ else {
67
+ gitError = `git init exited ${gitResult.exitCode}: ${gitResult.stderr}`;
68
+ }
69
+ }
70
+ catch (err) {
71
+ gitError = `git init spawn error: ${err.message}`;
72
+ }
73
+ return {
74
+ folder: child.folder,
75
+ absPath,
76
+ configWritten: true,
77
+ gitInitialized,
78
+ ...(gitError !== undefined ? { error: gitError } : {}),
79
+ };
80
+ }
81
+ }
82
+ //# sourceMappingURL=scaffolder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/fleet/scaffolder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ScaffoldResult } from "./scaffolder.js";
2
+ import type { ChildSpawnResult } from "./runner.js";
3
+ import type { RunState } from "../mcp/run-manager.js";
4
+ /** Result of fanning one child through scaffold → run. Produced by FleetCoordinator. */
5
+ export interface ChildExecution {
6
+ folder: string;
7
+ scaffold: ScaffoldResult;
8
+ spawn?: ChildSpawnResult;
9
+ }
10
+ export type ChildStatus = "completed" | "failed" | "other";
11
+ export type OutcomeSource = "disk" | "exit-code";
12
+ /** Resolved status for one child, produced by OutcomeAggregator. */
13
+ export interface ChildOutcome {
14
+ folder: string;
15
+ status: ChildStatus;
16
+ source: OutcomeSource;
17
+ exitCode?: number;
18
+ runId?: string;
19
+ runState?: RunState;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fleet/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAID,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;AAEjD,oEAAoE;AACpE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/fleet/types.ts"],"names":[],"mappings":""}
@@ -21,12 +21,16 @@ export declare class TokensaveCli {
21
21
  private readonly binary;
22
22
  constructor(cwd: string, store?: GraphArtifactStore | null, binary?: string);
23
23
  /**
24
- * Run `tokensave init --tier <tier>`.
24
+ * Run `tokensave init` (full index of the project at `cwd`).
25
+ *
26
+ * NOTE: tokensave's `init` has no `--tier` flag (that was a pre-6.x API).
27
+ * `languageTier` is now a bober-level concept recorded in the manifest only,
28
+ * so it is accepted for caller convenience but NOT forwarded to the binary.
25
29
  * Resolves on exit code 0; throws a structured Error on non-zero.
26
30
  */
27
31
  init(opts: {
28
32
  cwd?: string;
29
- languageTier: string;
33
+ languageTier?: string;
30
34
  }): Promise<void>;
31
35
  /**
32
36
  * Run `tokensave sync <paths...>` with a timeout.
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/graph/cli.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAI9D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAID;;;;;;;GAOG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,kBAAkB,GAAG,IAAW,EACvC,MAAM,GAAE,MAAoB;IAG/C;;;OAGG;IACG,IAAI,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBvE;;;;;;;;OAQG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA6CnE;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAkCtC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/graph/cli.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAI9D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAID;;;;;;;GAOG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,kBAAkB,GAAG,IAAW,EACvC,MAAM,GAAE,MAAoB;IAG/C;;;;;;;OAOG;IACG,IAAI,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBxE;;;;;;;;OAQG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA+CnE;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CA+CtC"}
package/dist/graph/cli.js CHANGED
@@ -18,18 +18,28 @@ export class TokensaveCli {
18
18
  this.binary = binary;
19
19
  }
20
20
  /**
21
- * Run `tokensave init --tier <tier>`.
21
+ * Run `tokensave init` (full index of the project at `cwd`).
22
+ *
23
+ * NOTE: tokensave's `init` has no `--tier` flag (that was a pre-6.x API).
24
+ * `languageTier` is now a bober-level concept recorded in the manifest only,
25
+ * so it is accepted for caller convenience but NOT forwarded to the binary.
22
26
  * Resolves on exit code 0; throws a structured Error on non-zero.
23
27
  */
24
28
  async init(opts) {
25
29
  const effectiveCwd = opts.cwd ?? this.cwd;
26
- const result = await execa(this.binary, ["init", "--tier", opts.languageTier], {
30
+ const result = await execa(this.binary, ["init"], {
27
31
  cwd: effectiveCwd,
28
32
  reject: false,
29
33
  all: true,
34
+ // tokensave prompts to create/gitignore; with no TTY it auto-accepts.
35
+ input: "",
30
36
  });
31
37
  if (result.exitCode !== 0) {
32
38
  const output = result.all ?? result.stdout ?? result.stderr ?? "";
39
+ // `init` is idempotent from bober's perspective: an already-initialised
40
+ // project is a success, not an error (caller refreshes the manifest).
41
+ if (/already initialized/i.test(output))
42
+ return;
33
43
  throw new Error(`tokensave init failed (exit ${result.exitCode ?? -1}): ${output.slice(0, 500)}`);
34
44
  }
35
45
  }
@@ -57,8 +67,10 @@ export class TokensaveCli {
57
67
  const output = result.all ?? result.stdout ?? result.stderr ?? "";
58
68
  throw new Error(`tokensave sync failed (exit ${result.exitCode ?? -1}): ${output.slice(0, 500)}`);
59
69
  }
60
- const stdout = result.stdout ?? "";
61
- const indexed = parseSyncOutput(stdout);
70
+ // tokensave prints its summary ("N added, M modified, K removed") to
71
+ // stderr, so parse the combined `all` stream rather than stdout alone.
72
+ const combined = result.all ?? result.stdout ?? "";
73
+ const indexed = parseSyncOutput(combined);
62
74
  // Update manifest via store if injected
63
75
  if (this.store) {
64
76
  try {
@@ -101,9 +113,21 @@ export class TokensaveCli {
101
113
  }
102
114
  try {
103
115
  const parsed = JSON.parse(stdout);
116
+ // tokensave `status --json` returns {node_count, edge_count, file_count,
117
+ // nodes_by_kind, ...}. There is no `ready`/`indexedFileCount` field and no
118
+ // version, so derive `ready` from the presence of an index (file_count).
119
+ // Tolerate the legacy {ready, indexedFileCount, tokensaveVersion} shape too.
120
+ const fileCount = typeof parsed.file_count === "number"
121
+ ? parsed.file_count
122
+ : typeof parsed.indexedFileCount === "number"
123
+ ? parsed.indexedFileCount
124
+ : 0;
125
+ const ready = parsed.ready === true ||
126
+ typeof parsed.file_count === "number" ||
127
+ typeof parsed.node_count === "number";
104
128
  return {
105
- ready: parsed.ready === true,
106
- indexedFileCount: typeof parsed.indexedFileCount === "number" ? parsed.indexedFileCount : 0,
129
+ ready,
130
+ indexedFileCount: fileCount,
107
131
  tokensaveVersion: typeof parsed.tokensaveVersion === "string" ? parsed.tokensaveVersion : "",
108
132
  };
109
133
  }
@@ -115,14 +139,20 @@ export class TokensaveCli {
115
139
  }
116
140
  // ── Helpers ────────────────────────────────────────────────────────
117
141
  /**
118
- * Parse `{indexed: N}` from tokensave sync stdout.
119
- * Accepts both plain JSON and a JSON object embedded in other text.
142
+ * Parse the number of indexed files from tokensave sync output.
143
+ *
144
+ * tokensave 6.x prints a human summary like
145
+ * "✔ sync done — 3 added, 1 modified, 0 removed in 41ms"
146
+ * (with ANSI colour codes), so we sum added + modified. Legacy JSON
147
+ * (`{"indexed": N}`) and `indexed: N` key-value forms are still accepted.
120
148
  */
121
- function parseSyncOutput(stdout) {
122
- const trimmed = stdout.trim();
149
+ function parseSyncOutput(output) {
150
+ // Strip ANSI escape sequences before matching.
151
+ // eslint-disable-next-line no-control-regex
152
+ const trimmed = output.replace(/\x1b\[[0-9;?]*[a-zA-Z]/g, "").trim();
123
153
  if (!trimmed)
124
154
  return 0;
125
- // Try direct JSON parse
155
+ // Try direct JSON parse (legacy shape)
126
156
  try {
127
157
  const obj = JSON.parse(trimmed);
128
158
  if (typeof obj.indexed === "number")
@@ -131,7 +161,18 @@ function parseSyncOutput(stdout) {
131
161
  catch {
132
162
  // Fall through
133
163
  }
134
- // Try to extract a number from a key-value pattern like "indexed: 42"
164
+ // Incremental sync summary: "N added, M modified, K removed"
165
+ const added = /(\d+)\s+added/.exec(trimmed);
166
+ const modified = /(\d+)\s+modified/.exec(trimmed);
167
+ if (added || modified) {
168
+ return ((added ? parseInt(added[1], 10) : 0) +
169
+ (modified ? parseInt(modified[1], 10) : 0));
170
+ }
171
+ // Full re-index summary (--force): "indexing done — N files, ... nodes"
172
+ const files = /(\d+)\s+files\b/.exec(trimmed);
173
+ if (files)
174
+ return parseInt(files[1], 10);
175
+ // Legacy key-value pattern like "indexed: 42"
135
176
  const match = /indexed["\s:]+(\d+)/.exec(trimmed);
136
177
  if (match)
137
178
  return parseInt(match[1], 10);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/graph/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/graph/cli.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,15 @@ declare class GraphPipelineLifecycleImpl {
42
42
  */
43
43
  stop(): Promise<void>;
44
44
  engineHealth(): string;
45
+ /**
46
+ * Project root of the active pipeline, or null when not started.
47
+ *
48
+ * Used by PreflightContextInjector to resolve a telemetry sink when the
49
+ * injector was constructed without an explicit projectRoot (the common case
50
+ * at most agent call sites). Lets graph-preflight telemetry fire for every
51
+ * role with zero changes to the call sites.
52
+ */
53
+ projectRootOrNull(): string | null;
45
54
  /**
46
55
  * Lazy accessor for the GraphClient instance.
47
56
  * Returns null if the engine is not 'ready'.
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-lifecycle.d.ts","sourceRoot":"","sources":["../../src/graph/pipeline-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAc9C,cAAM,0BAA0B;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,UAAU,CAA6B;IAI/C;;;;;;OAMG;IACG,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkFpE;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC3B,YAAY,IAAI,MAAM;IAQtB;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAA4B;IAEhD,cAAc,IAAI,WAAW,GAAG,IAAI;IAuCpC;;;OAGG;IACH,YAAY,IAAI;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,aAAa,CAAA;KAAE,GAAG,IAAI;IAUvE;;;OAGG;IACH,MAAM,IAAI,IAAI;YAiBA,YAAY;YAyDZ,YAAY;YAaZ,aAAa;IAS3B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,wBAAwB;CAMjC;AAID;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,4BAAmC,CAAC;AAGvE,OAAO,EAAE,0BAA0B,EAAE,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"pipeline-lifecycle.d.ts","sourceRoot":"","sources":["../../src/graph/pipeline-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAc9C,cAAM,0BAA0B;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,UAAU,CAA6B;IAI/C;;;;;;OAMG;IACG,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkFpE;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC3B,YAAY,IAAI,MAAM;IAQtB;;;;;;;OAOG;IACH,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAMlC;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAA4B;IAEhD,cAAc,IAAI,WAAW,GAAG,IAAI;IAuCpC;;;OAGG;IACH,YAAY,IAAI;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,aAAa,CAAA;KAAE,GAAG,IAAI;IAUvE;;;OAGG;IACH,MAAM,IAAI,IAAI;YAiBA,YAAY;YAyDZ,YAAY;YAaZ,aAAa;IAS3B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,wBAAwB;CAMjC;AAID;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,4BAAmC,CAAC;AAGvE,OAAO,EAAE,0BAA0B,EAAE,CAAC;AACtC,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -140,6 +140,18 @@ class GraphPipelineLifecycleImpl {
140
140
  return "starting";
141
141
  return this.mcpClient.health();
142
142
  }
143
+ // ── projectRootOrNull ─────────────────────────────────────────────
144
+ /**
145
+ * Project root of the active pipeline, or null when not started.
146
+ *
147
+ * Used by PreflightContextInjector to resolve a telemetry sink when the
148
+ * injector was constructed without an explicit projectRoot (the common case
149
+ * at most agent call sites). Lets graph-preflight telemetry fire for every
150
+ * role with zero changes to the call sites.
151
+ */
152
+ projectRootOrNull() {
153
+ return this.projectRoot;
154
+ }
143
155
  // ── getGraphClient ────────────────────────────────────────────────
144
156
  /**
145
157
  * Lazy accessor for the GraphClient instance.