macro-agent 0.1.8 → 0.1.11

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 (306) hide show
  1. package/CLAUDE.md +263 -33
  2. package/README.md +781 -131
  3. package/dist/acp/claude-code-replay.d.ts +11 -0
  4. package/dist/acp/claude-code-replay.d.ts.map +1 -0
  5. package/dist/acp/claude-code-replay.js +190 -0
  6. package/dist/acp/claude-code-replay.js.map +1 -0
  7. package/dist/acp/macro-agent.d.ts.map +1 -1
  8. package/dist/acp/macro-agent.js +192 -7
  9. package/dist/acp/macro-agent.js.map +1 -1
  10. package/dist/acp/types.d.ts +9 -0
  11. package/dist/acp/types.d.ts.map +1 -1
  12. package/dist/acp/types.js.map +1 -1
  13. package/dist/adapters/tasks-adapter.d.ts.map +1 -1
  14. package/dist/adapters/tasks-adapter.js +3 -0
  15. package/dist/adapters/tasks-adapter.js.map +1 -1
  16. package/dist/adapters/types.d.ts +1 -0
  17. package/dist/adapters/types.d.ts.map +1 -1
  18. package/dist/agent/agent-manager-v2.d.ts +21 -0
  19. package/dist/agent/agent-manager-v2.d.ts.map +1 -1
  20. package/dist/agent/agent-manager-v2.js +308 -54
  21. package/dist/agent/agent-manager-v2.js.map +1 -1
  22. package/dist/agent/agent-manager.d.ts +12 -0
  23. package/dist/agent/agent-manager.d.ts.map +1 -1
  24. package/dist/agent/agent-manager.js.map +1 -1
  25. package/dist/agent/agent-store.d.ts +10 -0
  26. package/dist/agent/agent-store.d.ts.map +1 -1
  27. package/dist/agent/agent-store.js +22 -0
  28. package/dist/agent/agent-store.js.map +1 -1
  29. package/dist/agent/types.d.ts +15 -2
  30. package/dist/agent/types.d.ts.map +1 -1
  31. package/dist/agent/types.js.map +1 -1
  32. package/dist/boot-v2.d.ts +129 -1
  33. package/dist/boot-v2.d.ts.map +1 -1
  34. package/dist/boot-v2.js +359 -8
  35. package/dist/boot-v2.js.map +1 -1
  36. package/dist/cli/acp.js +4 -0
  37. package/dist/cli/acp.js.map +1 -1
  38. package/dist/cli/index.js +56 -0
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cognitive/macro-agent-backend.d.ts.map +1 -1
  41. package/dist/cognitive/macro-agent-backend.js +40 -22
  42. package/dist/cognitive/macro-agent-backend.js.map +1 -1
  43. package/dist/integrations/skilltree.d.ts.map +1 -1
  44. package/dist/integrations/skilltree.js +1 -0
  45. package/dist/integrations/skilltree.js.map +1 -1
  46. package/dist/lifecycle/cascade.d.ts +25 -2
  47. package/dist/lifecycle/cascade.d.ts.map +1 -1
  48. package/dist/lifecycle/cascade.js +70 -2
  49. package/dist/lifecycle/cascade.js.map +1 -1
  50. package/dist/lifecycle/cleanup.d.ts +33 -2
  51. package/dist/lifecycle/cleanup.d.ts.map +1 -1
  52. package/dist/lifecycle/cleanup.js +28 -6
  53. package/dist/lifecycle/cleanup.js.map +1 -1
  54. package/dist/lifecycle/handlers-v2.d.ts +7 -0
  55. package/dist/lifecycle/handlers-v2.d.ts.map +1 -1
  56. package/dist/lifecycle/handlers-v2.js +28 -2
  57. package/dist/lifecycle/handlers-v2.js.map +1 -1
  58. package/dist/lifecycle/types.d.ts +11 -0
  59. package/dist/lifecycle/types.d.ts.map +1 -1
  60. package/dist/lifecycle/types.js.map +1 -1
  61. package/dist/map/acp-bridge.d.ts +9 -0
  62. package/dist/map/acp-bridge.d.ts.map +1 -1
  63. package/dist/map/acp-bridge.js +15 -2
  64. package/dist/map/acp-bridge.js.map +1 -1
  65. package/dist/map/cascade-action-handler.d.ts +24 -0
  66. package/dist/map/cascade-action-handler.d.ts.map +1 -0
  67. package/dist/map/cascade-action-handler.js +170 -0
  68. package/dist/map/cascade-action-handler.js.map +1 -0
  69. package/dist/map/cascade-bridge.d.ts +44 -0
  70. package/dist/map/cascade-bridge.d.ts.map +1 -0
  71. package/dist/map/cascade-bridge.js +294 -0
  72. package/dist/map/cascade-bridge.js.map +1 -0
  73. package/dist/map/coordination-handler.d.ts.map +1 -1
  74. package/dist/map/coordination-handler.js +12 -1
  75. package/dist/map/coordination-handler.js.map +1 -1
  76. package/dist/map/lifecycle-bridge.d.ts +1 -1
  77. package/dist/map/lifecycle-bridge.d.ts.map +1 -1
  78. package/dist/map/lifecycle-bridge.js +58 -23
  79. package/dist/map/lifecycle-bridge.js.map +1 -1
  80. package/dist/map/server.d.ts.map +1 -1
  81. package/dist/map/server.js +219 -7
  82. package/dist/map/server.js.map +1 -1
  83. package/dist/map/sidecar.d.ts.map +1 -1
  84. package/dist/map/sidecar.js +49 -2
  85. package/dist/map/sidecar.js.map +1 -1
  86. package/dist/map/types.d.ts +22 -0
  87. package/dist/map/types.d.ts.map +1 -1
  88. package/dist/mcp/tools/done-v2.d.ts.map +1 -1
  89. package/dist/mcp/tools/done-v2.js +8 -0
  90. package/dist/mcp/tools/done-v2.js.map +1 -1
  91. package/dist/teams/team-manager-v2.d.ts.map +1 -1
  92. package/dist/teams/team-manager-v2.js +26 -0
  93. package/dist/teams/team-manager-v2.js.map +1 -1
  94. package/dist/teams/team-runtime-v2.d.ts.map +1 -1
  95. package/dist/teams/team-runtime-v2.js +16 -3
  96. package/dist/teams/team-runtime-v2.js.map +1 -1
  97. package/dist/workspace/config.d.ts +10 -10
  98. package/dist/workspace/config.d.ts.map +1 -1
  99. package/dist/workspace/config.js +4 -4
  100. package/dist/workspace/config.js.map +1 -1
  101. package/dist/workspace/git-cascade-adapter.d.ts +510 -0
  102. package/dist/workspace/git-cascade-adapter.d.ts.map +1 -0
  103. package/dist/workspace/git-cascade-adapter.js +934 -0
  104. package/dist/workspace/git-cascade-adapter.js.map +1 -0
  105. package/dist/workspace/index.d.ts +3 -3
  106. package/dist/workspace/index.d.ts.map +1 -1
  107. package/dist/workspace/index.js +4 -4
  108. package/dist/workspace/index.js.map +1 -1
  109. package/dist/workspace/landing/direct-push.d.ts +20 -0
  110. package/dist/workspace/landing/direct-push.d.ts.map +1 -0
  111. package/dist/workspace/landing/direct-push.js +74 -0
  112. package/dist/workspace/landing/direct-push.js.map +1 -0
  113. package/dist/workspace/landing/index.d.ts +29 -0
  114. package/dist/workspace/landing/index.d.ts.map +1 -0
  115. package/dist/workspace/landing/index.js +37 -0
  116. package/dist/workspace/landing/index.js.map +1 -0
  117. package/dist/workspace/landing/merge-to-parent.d.ts +41 -0
  118. package/dist/workspace/landing/merge-to-parent.d.ts.map +1 -0
  119. package/dist/workspace/landing/merge-to-parent.js +186 -0
  120. package/dist/workspace/landing/merge-to-parent.js.map +1 -0
  121. package/dist/workspace/landing/optimistic-push.d.ts +16 -0
  122. package/dist/workspace/landing/optimistic-push.d.ts.map +1 -0
  123. package/dist/workspace/landing/optimistic-push.js +27 -0
  124. package/dist/workspace/landing/optimistic-push.js.map +1 -0
  125. package/dist/workspace/landing/queue-to-branch.d.ts +24 -0
  126. package/dist/workspace/landing/queue-to-branch.d.ts.map +1 -0
  127. package/dist/workspace/landing/queue-to-branch.js +79 -0
  128. package/dist/workspace/landing/queue-to-branch.js.map +1 -0
  129. package/dist/workspace/merge-queue/merge-queue.d.ts +10 -0
  130. package/dist/workspace/merge-queue/merge-queue.d.ts.map +1 -1
  131. package/dist/workspace/merge-queue/merge-queue.js +10 -0
  132. package/dist/workspace/merge-queue/merge-queue.js.map +1 -1
  133. package/dist/workspace/merge-queue/types.d.ts +16 -2
  134. package/dist/workspace/merge-queue/types.d.ts.map +1 -1
  135. package/dist/workspace/merge-queue/types.js +9 -0
  136. package/dist/workspace/merge-queue/types.js.map +1 -1
  137. package/dist/workspace/pool/types.d.ts +1 -0
  138. package/dist/workspace/pool/types.d.ts.map +1 -1
  139. package/dist/workspace/pool/worktree-pool.d.ts.map +1 -1
  140. package/dist/workspace/pool/worktree-pool.js +1 -0
  141. package/dist/workspace/pool/worktree-pool.js.map +1 -1
  142. package/dist/workspace/recovery/abandon.d.ts +15 -0
  143. package/dist/workspace/recovery/abandon.d.ts.map +1 -0
  144. package/dist/workspace/recovery/abandon.js +45 -0
  145. package/dist/workspace/recovery/abandon.js.map +1 -0
  146. package/dist/workspace/recovery/auto-resolve.d.ts +27 -0
  147. package/dist/workspace/recovery/auto-resolve.d.ts.map +1 -0
  148. package/dist/workspace/recovery/auto-resolve.js +99 -0
  149. package/dist/workspace/recovery/auto-resolve.js.map +1 -0
  150. package/dist/workspace/recovery/defer.d.ts +15 -0
  151. package/dist/workspace/recovery/defer.d.ts.map +1 -0
  152. package/dist/workspace/recovery/defer.js +16 -0
  153. package/dist/workspace/recovery/defer.js.map +1 -0
  154. package/dist/workspace/recovery/escalate.d.ts +16 -0
  155. package/dist/workspace/recovery/escalate.d.ts.map +1 -0
  156. package/dist/workspace/recovery/escalate.js +24 -0
  157. package/dist/workspace/recovery/escalate.js.map +1 -0
  158. package/dist/workspace/recovery/index.d.ts +32 -0
  159. package/dist/workspace/recovery/index.d.ts.map +1 -0
  160. package/dist/workspace/recovery/index.js +45 -0
  161. package/dist/workspace/recovery/index.js.map +1 -0
  162. package/dist/workspace/recovery/spawn-resolver.d.ts +45 -0
  163. package/dist/workspace/recovery/spawn-resolver.d.ts.map +1 -0
  164. package/dist/workspace/recovery/spawn-resolver.js +118 -0
  165. package/dist/workspace/recovery/spawn-resolver.js.map +1 -0
  166. package/dist/workspace/recovery/types.d.ts +63 -0
  167. package/dist/workspace/recovery/types.d.ts.map +1 -0
  168. package/dist/workspace/recovery/types.js +12 -0
  169. package/dist/workspace/recovery/types.js.map +1 -0
  170. package/dist/workspace/topology/index.d.ts +9 -0
  171. package/dist/workspace/topology/index.d.ts.map +1 -0
  172. package/dist/workspace/topology/index.js +8 -0
  173. package/dist/workspace/topology/index.js.map +1 -0
  174. package/dist/workspace/topology/no-workspace.d.ts +18 -0
  175. package/dist/workspace/topology/no-workspace.d.ts.map +1 -0
  176. package/dist/workspace/topology/no-workspace.js +25 -0
  177. package/dist/workspace/topology/no-workspace.js.map +1 -0
  178. package/dist/workspace/topology/types.d.ts +97 -0
  179. package/dist/workspace/topology/types.d.ts.map +1 -0
  180. package/dist/workspace/topology/types.js +20 -0
  181. package/dist/workspace/topology/types.js.map +1 -0
  182. package/dist/workspace/topology/yaml-driven.d.ts +69 -0
  183. package/dist/workspace/topology/yaml-driven.d.ts.map +1 -0
  184. package/dist/workspace/topology/yaml-driven.js +273 -0
  185. package/dist/workspace/topology/yaml-driven.js.map +1 -0
  186. package/dist/workspace/types-v3.d.ts +117 -0
  187. package/dist/workspace/types-v3.d.ts.map +1 -0
  188. package/dist/workspace/types-v3.js +20 -0
  189. package/dist/workspace/types-v3.js.map +1 -0
  190. package/dist/workspace/types.d.ts +162 -17
  191. package/dist/workspace/types.d.ts.map +1 -1
  192. package/dist/workspace/workspace-manager.d.ts +101 -13
  193. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  194. package/dist/workspace/workspace-manager.js +416 -13
  195. package/dist/workspace/workspace-manager.js.map +1 -1
  196. package/dist/workspace/yaml-schema.d.ts +254 -0
  197. package/dist/workspace/yaml-schema.d.ts.map +1 -0
  198. package/dist/workspace/yaml-schema.js +170 -0
  199. package/dist/workspace/yaml-schema.js.map +1 -0
  200. package/docs/conflict-recovery.md +472 -0
  201. package/docs/design/task-dispatcher.md +880 -0
  202. package/docs/git-cascade-integration-gaps.md +678 -0
  203. package/docs/workspace-interfaces.md +731 -0
  204. package/docs/workspace-redesign-plan.md +302 -0
  205. package/package.json +6 -5
  206. package/src/__tests__/boot-v2.test.ts +435 -0
  207. package/src/__tests__/e2e/acp-over-map.e2e.test.ts +92 -0
  208. package/src/__tests__/e2e/auto-sync.e2e.test.ts +257 -0
  209. package/src/__tests__/e2e/bootstrap.e2e.test.ts +319 -0
  210. package/src/__tests__/e2e/cascade-rebase.e2e.test.ts +254 -0
  211. package/src/__tests__/e2e/cli-run.e2e.test.ts +167 -0
  212. package/src/__tests__/e2e/dispatch-coordination.e2e.test.ts +495 -0
  213. package/src/__tests__/e2e/dispatch-live.e2e.test.ts +564 -0
  214. package/src/__tests__/e2e/dispatch-opentasks.e2e.test.ts +496 -0
  215. package/src/__tests__/e2e/dispatch-phase2-live.e2e.test.ts +456 -0
  216. package/src/__tests__/e2e/dispatch-phase2.e2e.test.ts +386 -0
  217. package/src/__tests__/e2e/dispatch.e2e.test.ts +376 -0
  218. package/src/__tests__/e2e/self-driving-v3.e2e.test.ts +197 -0
  219. package/src/__tests__/e2e/spawn-resolver.e2e.test.ts +200 -0
  220. package/src/__tests__/e2e/workspace-lifecycle.e2e.test.ts +30 -22
  221. package/src/__tests__/e2e/workspace-v3.e2e.test.ts +413 -0
  222. package/src/acp/__tests__/claude-code-replay.test.ts +225 -0
  223. package/src/acp/__tests__/macro-agent.test.ts +39 -1
  224. package/src/acp/claude-code-replay.ts +208 -0
  225. package/src/acp/macro-agent.ts +203 -10
  226. package/src/acp/types.ts +10 -0
  227. package/src/adapters/__tests__/tasks-adapter.test.ts +1 -0
  228. package/src/adapters/tasks-adapter.ts +3 -0
  229. package/src/adapters/types.ts +1 -0
  230. package/src/agent/__tests__/agent-manager-topology.test.ts +73 -0
  231. package/src/agent/__tests__/agent-manager-v2.test.ts +66 -0
  232. package/src/agent/__tests__/agent-store.test.ts +52 -0
  233. package/src/agent/__tests__/task-ref-resolution.test.ts +231 -0
  234. package/src/agent/agent-manager-v2.ts +372 -59
  235. package/src/agent/agent-manager.ts +14 -0
  236. package/src/agent/agent-store.ts +24 -0
  237. package/src/agent/types.ts +16 -2
  238. package/src/boot-v2.ts +589 -35
  239. package/src/cli/acp.ts +4 -0
  240. package/src/cli/index.ts +61 -0
  241. package/src/cognitive/macro-agent-backend.ts +45 -29
  242. package/src/integrations/skilltree.ts +1 -0
  243. package/src/lifecycle/__tests__/cascade-consolidation.test.ts +240 -0
  244. package/src/lifecycle/cascade.ts +77 -2
  245. package/src/lifecycle/cleanup.ts +52 -3
  246. package/src/lifecycle/handlers-v2.ts +40 -3
  247. package/src/lifecycle/types.ts +12 -0
  248. package/src/map/__tests__/cascade-bridge.test.ts +229 -0
  249. package/src/map/__tests__/emit-event.test.ts +71 -0
  250. package/src/map/__tests__/lifecycle-bridge.test.ts +86 -10
  251. package/src/map/acp-bridge.ts +26 -3
  252. package/src/map/cascade-action-handler.ts +205 -0
  253. package/src/map/cascade-bridge.ts +339 -0
  254. package/src/map/coordination-handler.ts +13 -1
  255. package/src/map/lifecycle-bridge.ts +52 -17
  256. package/src/map/server.ts +225 -7
  257. package/src/map/sidecar.ts +48 -1
  258. package/src/map/types.ts +23 -0
  259. package/src/mcp/tools/done-v2.ts +9 -0
  260. package/src/teams/team-manager-v2.ts +37 -0
  261. package/src/teams/team-runtime-v2.ts +23 -3
  262. package/src/workspace/__tests__/{dataplane-adapter.test.ts → git-cascade-adapter.test.ts} +209 -14
  263. package/src/workspace/__tests__/land-dispatch.test.ts +214 -0
  264. package/src/workspace/__tests__/self-driving-yaml.test.ts +114 -0
  265. package/src/workspace/__tests__/shared-worktree-refcount.test.ts +154 -0
  266. package/src/workspace/__tests__/standalone-mode.test.ts +118 -0
  267. package/src/workspace/__tests__/workspace-manager-v3.test.ts +245 -0
  268. package/src/workspace/__tests__/yaml-schema.test.ts +210 -0
  269. package/src/workspace/config.ts +11 -11
  270. package/src/workspace/git-cascade-adapter.ts +1213 -0
  271. package/src/workspace/index.ts +11 -11
  272. package/src/workspace/landing/__tests__/strategies.test.ts +184 -0
  273. package/src/workspace/landing/direct-push.ts +91 -0
  274. package/src/workspace/landing/index.ts +40 -0
  275. package/src/workspace/landing/merge-to-parent.ts +229 -0
  276. package/src/workspace/landing/optimistic-push.ts +36 -0
  277. package/src/workspace/landing/queue-to-branch.ts +108 -0
  278. package/src/workspace/merge-queue/merge-queue.ts +10 -0
  279. package/src/workspace/merge-queue/types.ts +16 -2
  280. package/src/workspace/pool/__tests__/worktree-pool.integration.test.ts +5 -5
  281. package/src/workspace/pool/types.ts +1 -0
  282. package/src/workspace/pool/worktree-pool.ts +1 -0
  283. package/src/workspace/recovery/__tests__/auto-resolve-integration.test.ts +127 -0
  284. package/src/workspace/recovery/__tests__/spawn-resolver.test.ts +139 -0
  285. package/src/workspace/recovery/__tests__/strategies.test.ts +145 -0
  286. package/src/workspace/recovery/abandon.ts +51 -0
  287. package/src/workspace/recovery/auto-resolve.ts +119 -0
  288. package/src/workspace/recovery/defer.ts +23 -0
  289. package/src/workspace/recovery/escalate.ts +30 -0
  290. package/src/workspace/recovery/index.ts +58 -0
  291. package/src/workspace/recovery/spawn-resolver.ts +152 -0
  292. package/src/workspace/recovery/types.ts +54 -0
  293. package/src/workspace/topology/__tests__/yaml-driven.test.ts +345 -0
  294. package/src/workspace/topology/index.ts +18 -0
  295. package/src/workspace/topology/no-workspace.ts +39 -0
  296. package/src/workspace/topology/types.ts +116 -0
  297. package/src/workspace/topology/yaml-driven.ts +316 -0
  298. package/src/workspace/types-v3.ts +162 -0
  299. package/src/workspace/types.ts +211 -20
  300. package/src/workspace/workspace-manager.ts +533 -19
  301. package/src/workspace/yaml-schema.ts +216 -0
  302. package/dist/workspace/dataplane-adapter.d.ts +0 -260
  303. package/dist/workspace/dataplane-adapter.d.ts.map +0 -1
  304. package/dist/workspace/dataplane-adapter.js +0 -416
  305. package/dist/workspace/dataplane-adapter.js.map +0 -1
  306. package/src/workspace/dataplane-adapter.ts +0 -546
@@ -0,0 +1,210 @@
1
+ /**
2
+ * YAML schema validation tests (Phase 2).
3
+ */
4
+
5
+ import { describe, it, expect } from 'vitest';
6
+ import {
7
+ parseTeamWorkspaceConfig,
8
+ extractWorkspaceConfig,
9
+ TeamWorkspaceConfigSchema,
10
+ RoleWorkspaceConfigSchema,
11
+ } from '../yaml-schema.js';
12
+
13
+ describe('YAML schema', () => {
14
+ describe('parseTeamWorkspaceConfig', () => {
15
+ it('returns null when input is undefined', () => {
16
+ expect(parseTeamWorkspaceConfig(undefined)).toBeNull();
17
+ expect(parseTeamWorkspaceConfig(null)).toBeNull();
18
+ });
19
+
20
+ it('accepts a minimal peer-swarm-style config', () => {
21
+ const config = parseTeamWorkspaceConfig({
22
+ roles: {
23
+ peer: {
24
+ workspace: 'new_stream',
25
+ stream_lineage: 'fork_from_team_root',
26
+ landing: 'merge_to_parent_stream',
27
+ },
28
+ },
29
+ });
30
+ expect(config).not.toBeNull();
31
+ expect(config!.on_team_complete).toBe('keep'); // default
32
+ expect(config!.roles.peer.workspace).toBe('new_stream');
33
+ });
34
+
35
+ it('applies defaults for default_stream', () => {
36
+ const config = parseTeamWorkspaceConfig({
37
+ default_stream: {},
38
+ roles: { x: { workspace: 'none' } },
39
+ });
40
+ expect(config!.default_stream?.fork_from).toBe('main');
41
+ expect(config!.default_stream?.change_id_tracking).toBe(true);
42
+ });
43
+
44
+ it('requires share_with when workspace is share_with_agent', () => {
45
+ expect(() =>
46
+ parseTeamWorkspaceConfig({
47
+ roles: {
48
+ reviewer: { workspace: 'share_with_agent' },
49
+ },
50
+ })
51
+ ).toThrow(/share_with is required/);
52
+ });
53
+
54
+ it('requires track_branch when stream_lineage is track_existing_branch', () => {
55
+ expect(() =>
56
+ parseTeamWorkspaceConfig({
57
+ roles: {
58
+ resolver: {
59
+ workspace: 'new_stream',
60
+ stream_lineage: 'track_existing_branch',
61
+ },
62
+ },
63
+ })
64
+ ).toThrow(/track_branch is required/);
65
+ });
66
+
67
+ it('requires stream_lineage when workspace is new_stream', () => {
68
+ expect(() =>
69
+ parseTeamWorkspaceConfig({
70
+ roles: {
71
+ x: { workspace: 'new_stream' },
72
+ },
73
+ })
74
+ ).toThrow(/stream_lineage is required/);
75
+ });
76
+
77
+ it('accepts triad shape with queue_to_branch + merge_queue.drain', () => {
78
+ const config = parseTeamWorkspaceConfig({
79
+ on_team_complete: 'keep',
80
+ roles: {
81
+ coordinator: { workspace: 'attach_to_team_root' },
82
+ worker: {
83
+ workspace: 'new_stream',
84
+ stream_lineage: 'fork_from_parent',
85
+ landing: 'queue_to_branch',
86
+ landing_config: { target: 'team_root' },
87
+ capabilities: ['workspace.commit', 'workspace.land'],
88
+ },
89
+ integrator: {
90
+ workspace: 'attach_to_team_root',
91
+ capabilities: ['workspace.merge', 'merge_queue.drain'],
92
+ },
93
+ },
94
+ });
95
+ expect(config).not.toBeNull();
96
+ expect(config!.roles.worker.landing).toBe('queue_to_branch');
97
+ expect(config!.roles.integrator.capabilities).toContain('merge_queue.drain');
98
+ });
99
+
100
+ it('accepts pipeline shape with share_with_agent', () => {
101
+ const config = parseTeamWorkspaceConfig({
102
+ roles: {
103
+ planner: { workspace: 'none' },
104
+ coder: {
105
+ workspace: 'new_stream',
106
+ stream_lineage: 'fork_from_team_root',
107
+ landing: 'queue_to_branch',
108
+ },
109
+ reviewer: {
110
+ workspace: 'share_with_agent',
111
+ share_with: 'coder',
112
+ capabilities: ['workspace.read'],
113
+ },
114
+ },
115
+ });
116
+ expect(config!.roles.reviewer.share_with).toBe('coder');
117
+ });
118
+
119
+ it('accepts long-lived feature config with cascade + auto-sync', () => {
120
+ const config = parseTeamWorkspaceConfig({
121
+ roles: {
122
+ feature_owner: {
123
+ workspace: 'new_stream',
124
+ stream_lineage: 'fork_from_team_root',
125
+ landing: 'merge_to_parent_stream',
126
+ cascade_on_parent_update: true,
127
+ on_parent_advanced: 'sync_with_parent',
128
+ },
129
+ subtask: {
130
+ workspace: 'new_stream',
131
+ stream_lineage: 'fork_from_parent',
132
+ landing: 'merge_to_parent_stream',
133
+ },
134
+ },
135
+ });
136
+ expect(config!.roles.feature_owner.cascade_on_parent_update).toBe(true);
137
+ expect(config!.roles.feature_owner.on_parent_advanced).toBe('sync_with_parent');
138
+ });
139
+
140
+ it('accepts conflict_recovery team defaults', () => {
141
+ const config = parseTeamWorkspaceConfig({
142
+ roles: { peer: { workspace: 'none' } },
143
+ conflict_recovery: {
144
+ default_strategy: 'spawn-resolver',
145
+ default_config: { role: 'resolver', timeout_ms: 1200000 },
146
+ max_recovery_depth: 5,
147
+ },
148
+ });
149
+ expect(config!.conflict_recovery?.default_strategy).toBe('spawn-resolver');
150
+ expect(config!.conflict_recovery?.max_recovery_depth).toBe(5);
151
+ });
152
+
153
+ it('rejects unknown workspace kinds', () => {
154
+ expect(() =>
155
+ parseTeamWorkspaceConfig({
156
+ roles: { x: { workspace: 'made-up' } },
157
+ })
158
+ ).toThrow();
159
+ });
160
+
161
+ it('rejects unknown landing strategy names', () => {
162
+ expect(() =>
163
+ parseTeamWorkspaceConfig({
164
+ roles: {
165
+ x: {
166
+ workspace: 'new_stream',
167
+ stream_lineage: 'fork_from_team_root',
168
+ landing: 'unknown-strategy',
169
+ },
170
+ },
171
+ })
172
+ ).toThrow();
173
+ });
174
+ });
175
+
176
+ describe('extractWorkspaceConfig', () => {
177
+ it('extracts workspace block from a manifest with macro_agent.workspace', () => {
178
+ const manifest = {
179
+ macro_agent: {
180
+ workspace: {
181
+ roles: { x: { workspace: 'none' } },
182
+ },
183
+ },
184
+ };
185
+ const config = extractWorkspaceConfig(manifest);
186
+ expect(config).not.toBeNull();
187
+ });
188
+
189
+ it('returns null when macro_agent.workspace is absent', () => {
190
+ const manifest = { macro_agent: { integration: { strategy: 'trunk' } } };
191
+ expect(extractWorkspaceConfig(manifest)).toBeNull();
192
+ });
193
+
194
+ it('returns null when macro_agent is absent', () => {
195
+ expect(extractWorkspaceConfig({})).toBeNull();
196
+ });
197
+ });
198
+
199
+ describe('schema shape', () => {
200
+ it('TeamWorkspaceConfigSchema is a zod object', () => {
201
+ expect(TeamWorkspaceConfigSchema).toBeDefined();
202
+ expect(typeof TeamWorkspaceConfigSchema.safeParse).toBe('function');
203
+ });
204
+
205
+ it('RoleWorkspaceConfigSchema is a zod schema', () => {
206
+ expect(RoleWorkspaceConfigSchema).toBeDefined();
207
+ expect(typeof RoleWorkspaceConfigSchema.safeParse).toBe('function');
208
+ });
209
+ });
210
+ });
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Workspace Configuration Types
3
3
  *
4
- * Configuration for dataplane integration and workspace management.
4
+ * Configuration for git-cascade integration and workspace management.
5
5
  *
6
6
  * @module workspace/config
7
7
  */
@@ -9,11 +9,11 @@
9
9
  import type Database from 'better-sqlite3';
10
10
 
11
11
  /**
12
- * Configuration for dataplane integration
12
+ * Configuration for git-cascade integration
13
13
  */
14
- export interface DataplaneConfig {
14
+ export interface GitCascadeConfig {
15
15
  /**
16
- * Whether dataplane is enabled.
16
+ * Whether the git-cascade adapter is enabled.
17
17
  * When disabled, workspace operations are no-ops.
18
18
  */
19
19
  enabled: boolean;
@@ -25,21 +25,21 @@ export interface DataplaneConfig {
25
25
  repoPath?: string;
26
26
 
27
27
  /**
28
- * Table prefix for dataplane tables in shared SQLite database.
29
- * Defaults to 'dataplane_'.
28
+ * Table prefix for git-cascade tables in shared SQLite database.
29
+ * Defaults to 'git_cascade_'.
30
30
  */
31
31
  tablePrefix?: string;
32
32
 
33
33
  /**
34
34
  * Path to SQLite database file.
35
35
  * If not provided and db is not provided, creates database at
36
- * `<repoPath>/.dataplane/tracker.db`.
36
+ * `<repoPath>/.git-cascade/tracker.db`.
37
37
  */
38
38
  dbPath?: string;
39
39
 
40
40
  /**
41
41
  * Existing database connection to share.
42
- * If provided, dataplane will use this connection instead of creating its own.
42
+ * If provided, the adapter will use this connection instead of creating its own.
43
43
  * The caller is responsible for closing this connection.
44
44
  */
45
45
  db?: Database.Database;
@@ -57,11 +57,11 @@ export interface DataplaneConfig {
57
57
  }
58
58
 
59
59
  /**
60
- * Default dataplane configuration
60
+ * Default git-cascade configuration
61
61
  */
62
- export const DEFAULT_DATAPLANE_CONFIG: Partial<DataplaneConfig> = {
62
+ export const DEFAULT_GIT_CASCADE_CONFIG: Partial<GitCascadeConfig> = {
63
63
  enabled: true,
64
- tablePrefix: 'dataplane_',
64
+ tablePrefix: 'git_cascade_',
65
65
  verbose: false,
66
66
  skipRecovery: false,
67
67
  };