beth-copilot 1.0.17 → 1.1.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 (265) hide show
  1. package/CHANGELOG.md +41 -28
  2. package/README.md +87 -247
  3. package/bin/cli.js +115 -7
  4. package/dist/__tests__/smoke.test.d.ts +8 -0
  5. package/dist/__tests__/smoke.test.d.ts.map +1 -0
  6. package/dist/__tests__/smoke.test.js +49 -0
  7. package/dist/__tests__/smoke.test.js.map +1 -0
  8. package/dist/cli/commands/beads.e2e.test.d.ts +13 -0
  9. package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
  10. package/dist/cli/commands/beads.e2e.test.js +526 -0
  11. package/dist/cli/commands/beads.e2e.test.js.map +1 -0
  12. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
  13. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
  14. package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
  15. package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
  16. package/dist/cli/commands/close.d.ts +89 -0
  17. package/dist/cli/commands/close.d.ts.map +1 -0
  18. package/dist/cli/commands/close.e2e.test.d.ts +27 -0
  19. package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
  20. package/dist/cli/commands/close.e2e.test.js +252 -0
  21. package/dist/cli/commands/close.e2e.test.js.map +1 -0
  22. package/dist/cli/commands/close.js +309 -0
  23. package/dist/cli/commands/close.js.map +1 -0
  24. package/dist/cli/commands/close.test.d.ts +15 -0
  25. package/dist/cli/commands/close.test.d.ts.map +1 -0
  26. package/dist/cli/commands/close.test.js +634 -0
  27. package/dist/cli/commands/close.test.js.map +1 -0
  28. package/dist/cli/commands/doctor.d.ts +23 -0
  29. package/dist/cli/commands/doctor.d.ts.map +1 -1
  30. package/dist/cli/commands/doctor.js +93 -0
  31. package/dist/cli/commands/doctor.js.map +1 -1
  32. package/dist/cli/commands/doctor.test.js +209 -0
  33. package/dist/cli/commands/doctor.test.js.map +1 -1
  34. package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
  35. package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
  36. package/dist/cli/commands/framework-isolation.test.js +119 -0
  37. package/dist/cli/commands/framework-isolation.test.js.map +1 -0
  38. package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
  39. package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
  40. package/dist/cli/commands/init-logic.e2e.test.js +305 -0
  41. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
  42. package/dist/cli/commands/land.d.ts +142 -0
  43. package/dist/cli/commands/land.d.ts.map +1 -0
  44. package/dist/cli/commands/land.js +647 -0
  45. package/dist/cli/commands/land.js.map +1 -0
  46. package/dist/cli/commands/land.test.d.ts +20 -0
  47. package/dist/cli/commands/land.test.d.ts.map +1 -0
  48. package/dist/cli/commands/land.test.js +622 -0
  49. package/dist/cli/commands/land.test.js.map +1 -0
  50. package/dist/cli/commands/pipeline.e2e.test.js +1 -1
  51. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  52. package/dist/cli/commands/pre-push-guard.d.ts +84 -0
  53. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
  54. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
  55. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
  56. package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
  57. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
  58. package/dist/cli/commands/pre-push-guard.js +257 -0
  59. package/dist/cli/commands/pre-push-guard.js.map +1 -0
  60. package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
  61. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
  62. package/dist/cli/commands/pre-push-guard.test.js +397 -0
  63. package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
  64. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
  65. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
  66. package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
  67. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
  68. package/dist/cli/commands/quickstart.test.js +40 -2
  69. package/dist/cli/commands/quickstart.test.js.map +1 -1
  70. package/dist/core/agents/suite.test.js +4 -2
  71. package/dist/core/agents/suite.test.js.map +1 -1
  72. package/dist/core/agents/tools.test.js +5 -1
  73. package/dist/core/agents/tools.test.js.map +1 -1
  74. package/dist/index.d.ts +3 -10
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +5 -10
  77. package/dist/index.js.map +1 -1
  78. package/package.json +15 -9
  79. package/sbom.json +2011 -819
  80. package/templates/.github/agents/beth.agent.md +222 -45
  81. package/templates/.github/agents/developer.agent.md +37 -67
  82. package/templates/.github/agents/product-manager.agent.md +15 -57
  83. package/templates/.github/agents/researcher.agent.md +20 -60
  84. package/templates/.github/agents/security-reviewer.agent.md +29 -70
  85. package/templates/.github/agents/tester.agent.md +40 -58
  86. package/templates/.github/agents/ux-designer.agent.md +20 -63
  87. package/templates/.github/copilot-instructions.md +217 -204
  88. package/templates/AGENTS.md +108 -20
  89. package/dist/core/context.d.ts +0 -171
  90. package/dist/core/context.d.ts.map +0 -1
  91. package/dist/core/context.js +0 -353
  92. package/dist/core/context.js.map +0 -1
  93. package/dist/core/context.test.d.ts +0 -8
  94. package/dist/core/context.test.d.ts.map +0 -1
  95. package/dist/core/context.test.js +0 -253
  96. package/dist/core/context.test.js.map +0 -1
  97. package/dist/core/handoffs.d.ts +0 -151
  98. package/dist/core/handoffs.d.ts.map +0 -1
  99. package/dist/core/handoffs.js +0 -220
  100. package/dist/core/handoffs.js.map +0 -1
  101. package/dist/core/handoffs.test.d.ts +0 -8
  102. package/dist/core/handoffs.test.d.ts.map +0 -1
  103. package/dist/core/handoffs.test.js +0 -231
  104. package/dist/core/handoffs.test.js.map +0 -1
  105. package/dist/core/orchestrator.d.ts +0 -246
  106. package/dist/core/orchestrator.d.ts.map +0 -1
  107. package/dist/core/orchestrator.js +0 -514
  108. package/dist/core/orchestrator.js.map +0 -1
  109. package/dist/core/orchestrator.test.d.ts +0 -8
  110. package/dist/core/orchestrator.test.d.ts.map +0 -1
  111. package/dist/core/orchestrator.test.js +0 -517
  112. package/dist/core/orchestrator.test.js.map +0 -1
  113. package/dist/core/router.d.ts +0 -102
  114. package/dist/core/router.d.ts.map +0 -1
  115. package/dist/core/router.js +0 -178
  116. package/dist/core/router.js.map +0 -1
  117. package/dist/core/router.test.d.ts +0 -8
  118. package/dist/core/router.test.d.ts.map +0 -1
  119. package/dist/core/router.test.js +0 -215
  120. package/dist/core/router.test.js.map +0 -1
  121. package/dist/init.test.js +0 -288
  122. package/dist/providers/azure.d.ts +0 -147
  123. package/dist/providers/azure.d.ts.map +0 -1
  124. package/dist/providers/azure.js +0 -491
  125. package/dist/providers/azure.js.map +0 -1
  126. package/dist/providers/azure.test.d.ts +0 -11
  127. package/dist/providers/azure.test.d.ts.map +0 -1
  128. package/dist/providers/azure.test.js +0 -330
  129. package/dist/providers/azure.test.js.map +0 -1
  130. package/dist/providers/config.d.ts +0 -87
  131. package/dist/providers/config.d.ts.map +0 -1
  132. package/dist/providers/config.js +0 -193
  133. package/dist/providers/config.js.map +0 -1
  134. package/dist/providers/config.test.d.ts +0 -7
  135. package/dist/providers/config.test.d.ts.map +0 -1
  136. package/dist/providers/config.test.js +0 -370
  137. package/dist/providers/config.test.js.map +0 -1
  138. package/dist/providers/index.d.ts +0 -18
  139. package/dist/providers/index.d.ts.map +0 -1
  140. package/dist/providers/index.js +0 -14
  141. package/dist/providers/index.js.map +0 -1
  142. package/dist/providers/interface.d.ts +0 -191
  143. package/dist/providers/interface.d.ts.map +0 -1
  144. package/dist/providers/interface.js +0 -94
  145. package/dist/providers/interface.js.map +0 -1
  146. package/dist/providers/retry.d.ts +0 -128
  147. package/dist/providers/retry.d.ts.map +0 -1
  148. package/dist/providers/retry.js +0 -205
  149. package/dist/providers/retry.js.map +0 -1
  150. package/dist/providers/retry.test.d.ts +0 -7
  151. package/dist/providers/retry.test.d.ts.map +0 -1
  152. package/dist/providers/retry.test.js +0 -439
  153. package/dist/providers/retry.test.js.map +0 -1
  154. package/dist/providers/streaming.d.ts +0 -157
  155. package/dist/providers/streaming.d.ts.map +0 -1
  156. package/dist/providers/streaming.js +0 -233
  157. package/dist/providers/streaming.js.map +0 -1
  158. package/dist/providers/streaming.test.d.ts +0 -7
  159. package/dist/providers/streaming.test.d.ts.map +0 -1
  160. package/dist/providers/streaming.test.js +0 -372
  161. package/dist/providers/streaming.test.js.map +0 -1
  162. package/dist/providers/types.d.ts +0 -209
  163. package/dist/providers/types.d.ts.map +0 -1
  164. package/dist/providers/types.js +0 -53
  165. package/dist/providers/types.js.map +0 -1
  166. package/dist/providers/types.test.d.ts +0 -7
  167. package/dist/providers/types.test.d.ts.map +0 -1
  168. package/dist/providers/types.test.js +0 -141
  169. package/dist/providers/types.test.js.map +0 -1
  170. package/dist/tools/cli/beads.d.ts +0 -27
  171. package/dist/tools/cli/beads.d.ts.map +0 -1
  172. package/dist/tools/cli/beads.js +0 -172
  173. package/dist/tools/cli/beads.js.map +0 -1
  174. package/dist/tools/cli/beads.test.d.ts +0 -8
  175. package/dist/tools/cli/beads.test.d.ts.map +0 -1
  176. package/dist/tools/cli/beads.test.js +0 -264
  177. package/dist/tools/cli/beads.test.js.map +0 -1
  178. package/dist/tools/cli/editFile.d.ts +0 -17
  179. package/dist/tools/cli/editFile.d.ts.map +0 -1
  180. package/dist/tools/cli/editFile.js +0 -125
  181. package/dist/tools/cli/editFile.js.map +0 -1
  182. package/dist/tools/cli/editFile.test.d.ts +0 -8
  183. package/dist/tools/cli/editFile.test.d.ts.map +0 -1
  184. package/dist/tools/cli/editFile.test.js +0 -177
  185. package/dist/tools/cli/editFile.test.js.map +0 -1
  186. package/dist/tools/cli/readFile.d.ts +0 -25
  187. package/dist/tools/cli/readFile.d.ts.map +0 -1
  188. package/dist/tools/cli/readFile.js +0 -118
  189. package/dist/tools/cli/readFile.js.map +0 -1
  190. package/dist/tools/cli/readFile.test.d.ts +0 -8
  191. package/dist/tools/cli/readFile.test.d.ts.map +0 -1
  192. package/dist/tools/cli/readFile.test.js +0 -194
  193. package/dist/tools/cli/readFile.test.js.map +0 -1
  194. package/dist/tools/cli/search.d.ts +0 -16
  195. package/dist/tools/cli/search.d.ts.map +0 -1
  196. package/dist/tools/cli/search.js +0 -261
  197. package/dist/tools/cli/search.js.map +0 -1
  198. package/dist/tools/cli/search.test.d.ts +0 -8
  199. package/dist/tools/cli/search.test.d.ts.map +0 -1
  200. package/dist/tools/cli/search.test.js +0 -172
  201. package/dist/tools/cli/search.test.js.map +0 -1
  202. package/dist/tools/cli/subagent.d.ts +0 -43
  203. package/dist/tools/cli/subagent.d.ts.map +0 -1
  204. package/dist/tools/cli/subagent.js +0 -99
  205. package/dist/tools/cli/subagent.js.map +0 -1
  206. package/dist/tools/cli/subagent.test.d.ts +0 -8
  207. package/dist/tools/cli/subagent.test.d.ts.map +0 -1
  208. package/dist/tools/cli/subagent.test.js +0 -190
  209. package/dist/tools/cli/subagent.test.js.map +0 -1
  210. package/dist/tools/cli/terminal.d.ts +0 -19
  211. package/dist/tools/cli/terminal.d.ts.map +0 -1
  212. package/dist/tools/cli/terminal.js +0 -164
  213. package/dist/tools/cli/terminal.js.map +0 -1
  214. package/dist/tools/cli/terminal.test.d.ts +0 -8
  215. package/dist/tools/cli/terminal.test.d.ts.map +0 -1
  216. package/dist/tools/cli/terminal.test.js +0 -161
  217. package/dist/tools/cli/terminal.test.js.map +0 -1
  218. package/dist/tools/index.d.ts +0 -25
  219. package/dist/tools/index.d.ts.map +0 -1
  220. package/dist/tools/index.js +0 -41
  221. package/dist/tools/index.js.map +0 -1
  222. package/dist/tools/interface.d.ts +0 -64
  223. package/dist/tools/interface.d.ts.map +0 -1
  224. package/dist/tools/interface.js +0 -37
  225. package/dist/tools/interface.js.map +0 -1
  226. package/dist/tools/interface.test.d.ts +0 -7
  227. package/dist/tools/interface.test.d.ts.map +0 -1
  228. package/dist/tools/interface.test.js +0 -179
  229. package/dist/tools/interface.test.js.map +0 -1
  230. package/dist/tools/mcp/bridge.d.ts +0 -48
  231. package/dist/tools/mcp/bridge.d.ts.map +0 -1
  232. package/dist/tools/mcp/bridge.js +0 -128
  233. package/dist/tools/mcp/bridge.js.map +0 -1
  234. package/dist/tools/mcp/bridge.test.d.ts +0 -8
  235. package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
  236. package/dist/tools/mcp/bridge.test.js +0 -300
  237. package/dist/tools/mcp/bridge.test.js.map +0 -1
  238. package/dist/tools/mcp/client.d.ts +0 -135
  239. package/dist/tools/mcp/client.d.ts.map +0 -1
  240. package/dist/tools/mcp/client.js +0 -263
  241. package/dist/tools/mcp/client.js.map +0 -1
  242. package/dist/tools/mcp/client.test.d.ts +0 -8
  243. package/dist/tools/mcp/client.test.d.ts.map +0 -1
  244. package/dist/tools/mcp/client.test.js +0 -390
  245. package/dist/tools/mcp/client.test.js.map +0 -1
  246. package/dist/tools/registry.d.ts +0 -82
  247. package/dist/tools/registry.d.ts.map +0 -1
  248. package/dist/tools/registry.js +0 -99
  249. package/dist/tools/registry.js.map +0 -1
  250. package/dist/tools/registry.test.d.ts +0 -7
  251. package/dist/tools/registry.test.d.ts.map +0 -1
  252. package/dist/tools/registry.test.js +0 -199
  253. package/dist/tools/registry.test.js.map +0 -1
  254. package/dist/tools/suite.test.d.ts +0 -11
  255. package/dist/tools/suite.test.d.ts.map +0 -1
  256. package/dist/tools/suite.test.js +0 -119
  257. package/dist/tools/suite.test.js.map +0 -1
  258. package/dist/tools/types.d.ts +0 -75
  259. package/dist/tools/types.d.ts.map +0 -1
  260. package/dist/tools/types.js +0 -30
  261. package/dist/tools/types.js.map +0 -1
  262. package/dist/tools/types.test.d.ts +0 -7
  263. package/dist/tools/types.test.d.ts.map +0 -1
  264. package/dist/tools/types.test.js +0 -178
  265. package/dist/tools/types.test.js.map +0 -1
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Dual-framework isolation audit tests.
3
+ *
4
+ * beth-ywg.6: beads.e2e.test.ts and quickstart.test.ts mix node:test and vitest
5
+ * imports. This file validates that the vitest config alias ('node:test' → 'vitest')
6
+ * works correctly and that lifecycle hooks fire in the expected order.
7
+ *
8
+ * Repro steps:
9
+ * 1. Run: npx vitest run src/cli/commands/framework-isolation.test.ts
10
+ *
11
+ * Background:
12
+ * The vitest.config.ts has: resolve.alias['node:test'] = 'vitest'
13
+ * This means `import { describe, it } from 'node:test'` actually imports from vitest.
14
+ * But `import { beforeAll } from 'vitest'` is a direct vitest import.
15
+ * Mixing both in the same file is risky — lifecycle hooks from different
16
+ * module identities might not share state.
17
+ *
18
+ * Test cases:
19
+ * - Verify the vitest alias resolves correctly
20
+ * - Verify describe/it from 'node:test' work under vitest
21
+ * - Verify beforeEach/afterEach from 'node:test' fire in order
22
+ * - Verify beforeAll from 'vitest' runs before all tests
23
+ * - Verify mixed imports don't create duplicate hook registrations
24
+ * - Verify assert from 'node:assert' works alongside vitest expect
25
+ * - Document which files currently mix frameworks
26
+ *
27
+ * Expected outcomes documented inline per test case.
28
+ */
29
+ import { describe, it, beforeEach, afterEach } from 'node:test';
30
+ import { beforeAll } from 'vitest';
31
+ import assert from 'node:assert';
32
+ // Track execution order to detect lifecycle issues
33
+ const executionLog = [];
34
+ describe('framework isolation: node:test under vitest alias', () => {
35
+ beforeAll(() => {
36
+ executionLog.push('beforeAll');
37
+ });
38
+ beforeEach(() => {
39
+ executionLog.push('beforeEach');
40
+ });
41
+ afterEach(() => {
42
+ executionLog.push('afterEach');
43
+ });
44
+ describe('basic describe/it from node:test', () => {
45
+ it('should run it() blocks', () => {
46
+ executionLog.push('test:basic');
47
+ assert.ok(true, 'it() from node:test should execute');
48
+ });
49
+ it('should support assert from node:assert', () => {
50
+ assert.strictEqual(1 + 1, 2);
51
+ assert.deepStrictEqual([1, 2, 3], [1, 2, 3]);
52
+ assert.throws(() => { throw new Error('test'); }, /test/);
53
+ });
54
+ it('should support assert.match for regex', () => {
55
+ assert.match('hello world', /world/);
56
+ });
57
+ });
58
+ describe('lifecycle hook ordering', () => {
59
+ it('should have beforeAll fired before any test', () => {
60
+ assert.ok(executionLog.includes('beforeAll'), 'beforeAll should have fired before this test');
61
+ });
62
+ it('should have beforeEach fire before each test', () => {
63
+ // Count the beforeEach entries — should increase with each test
64
+ const beforeEachCount = executionLog.filter(e => e === 'beforeEach').length;
65
+ assert.ok(beforeEachCount > 0, 'beforeEach should have fired at least once');
66
+ });
67
+ it('should have afterEach fire after previous tests', () => {
68
+ // afterEach from previous tests should be in the log
69
+ // (won't see the afterEach for THIS test until after it completes)
70
+ const afterEachCount = executionLog.filter(e => e === 'afterEach').length;
71
+ assert.ok(afterEachCount > 0, 'afterEach from previous tests should have fired');
72
+ });
73
+ });
74
+ });
75
+ describe('framework isolation: direct vitest imports', () => {
76
+ // This tests that importing directly from 'vitest' alongside 'node:test'
77
+ // doesn't cause conflicts (since the alias maps them to the same module).
78
+ it('should coexist with node:test imports without conflict', () => {
79
+ // If this test runs at all, it means both import paths resolved
80
+ // to the same vitest module without errors.
81
+ assert.ok(true, 'Both import paths coexist');
82
+ });
83
+ it('should share the same describe/it registry', () => {
84
+ // If this test shows up in the same test report as the node:test tests above,
85
+ // they share the same registry. The test runner handles this correctly.
86
+ assert.ok(true, 'Test is visible in the same suite');
87
+ });
88
+ });
89
+ describe('framework isolation: audit of mixed-import files', () => {
90
+ /**
91
+ * These files currently import from both 'node:test' AND 'vitest' directly.
92
+ * The vitest alias makes this work, but it's fragile. Document for awareness.
93
+ */
94
+ const MIXED_FILES = [
95
+ 'src/cli/commands/beads.e2e.test.ts',
96
+ 'src/cli/commands/quickstart.test.ts',
97
+ ];
98
+ it('should document which files use mixed imports', () => {
99
+ // This is a documentation test — it asserts the known mixed files exist.
100
+ // If someone adds more mixed files, they should add them here too.
101
+ assert.ok(MIXED_FILES.length === 2, `Expected 2 mixed-import files, found ${MIXED_FILES.length}. ` +
102
+ 'Update this test if new mixed-import files are added.');
103
+ });
104
+ it('should note the vitest config alias that makes this work', () => {
105
+ // vitest.config.ts and vitest.e2e.config.ts both have:
106
+ // resolve.alias['node:test'] = 'vitest'
107
+ // Without this alias, importing from 'node:test' would use the real
108
+ // node:test runner, which has different lifecycle semantics.
109
+ assert.ok(true, 'Alias documented: node:test → vitest in vitest configs');
110
+ });
111
+ it('should note the risk: if alias is removed, mixed files break', () => {
112
+ // Risk: Removing the alias from vitest config would cause:
113
+ // - describe/it from 'node:test' to use Node's built-in test runner
114
+ // - beforeAll from 'vitest' to use vitest's lifecycle
115
+ // - These would NOT interact, causing hooks to not fire for some tests
116
+ assert.ok(true, 'Risk documented: removing alias breaks mixed-import files');
117
+ });
118
+ });
119
+ //# sourceMappingURL=framework-isolation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework-isolation.test.js","sourceRoot":"","sources":["../../../src/cli/commands/framework-isolation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Init logic unit-style E2E tests — exercises internal init behaviors.
3
+ *
4
+ * beth-ywg.7: bin/cli.js init logic is ~1200 lines inline with zero unit tests.
5
+ * Since the functions aren't exportable (inline CJS), these tests exercise
6
+ * specific behaviors through CLI invocations with controlled filesystem state.
7
+ *
8
+ * Repro steps:
9
+ * 1. Run: npx vitest run src/cli/commands/init-logic.e2e.test.ts
10
+ *
11
+ * Test cases — copyDirRecursive behavior:
12
+ * - Fresh directory → all files created
13
+ * - Existing files without --force → skipped (not overwritten)
14
+ * - Existing files with --force → overwritten
15
+ * - File exists where directory expected → UserError without --force
16
+ * - File exists where directory expected + --force → converted to directory
17
+ *
18
+ * Test cases — validateArgs behavior:
19
+ * - Arguments > 50 chars → exit 1, "input too long"
20
+ * - Arguments with special chars → exit 1, "unexpected characters"
21
+ * - Normal arguments → accepted
22
+ *
23
+ * Test cases — Template integrity:
24
+ * - All 7 agent files copied from templates/
25
+ * - All 6 skill directories copied
26
+ * - AGENTS.md copied
27
+ * - copilot-instructions.md generated/copied
28
+ * - .vscode/settings.json created
29
+ *
30
+ * Test cases — UserError display:
31
+ * - Path conflict shows problem/fix/command
32
+ * - --verbose adds stack trace
33
+ *
34
+ * Expected outcomes documented inline per test case.
35
+ */
36
+ export {};
37
+ //# sourceMappingURL=init-logic.e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-logic.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init-logic.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG"}
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Init logic unit-style E2E tests — exercises internal init behaviors.
3
+ *
4
+ * beth-ywg.7: bin/cli.js init logic is ~1200 lines inline with zero unit tests.
5
+ * Since the functions aren't exportable (inline CJS), these tests exercise
6
+ * specific behaviors through CLI invocations with controlled filesystem state.
7
+ *
8
+ * Repro steps:
9
+ * 1. Run: npx vitest run src/cli/commands/init-logic.e2e.test.ts
10
+ *
11
+ * Test cases — copyDirRecursive behavior:
12
+ * - Fresh directory → all files created
13
+ * - Existing files without --force → skipped (not overwritten)
14
+ * - Existing files with --force → overwritten
15
+ * - File exists where directory expected → UserError without --force
16
+ * - File exists where directory expected + --force → converted to directory
17
+ *
18
+ * Test cases — validateArgs behavior:
19
+ * - Arguments > 50 chars → exit 1, "input too long"
20
+ * - Arguments with special chars → exit 1, "unexpected characters"
21
+ * - Normal arguments → accepted
22
+ *
23
+ * Test cases — Template integrity:
24
+ * - All 7 agent files copied from templates/
25
+ * - All 6 skill directories copied
26
+ * - AGENTS.md copied
27
+ * - copilot-instructions.md generated/copied
28
+ * - .vscode/settings.json created
29
+ *
30
+ * Test cases — UserError display:
31
+ * - Path conflict shows problem/fix/command
32
+ * - --verbose adds stack trace
33
+ *
34
+ * Expected outcomes documented inline per test case.
35
+ */
36
+ import { describe, it, beforeEach, afterEach } from 'node:test';
37
+ import assert from 'node:assert';
38
+ import { execSync } from 'child_process';
39
+ import { existsSync, mkdirSync, writeFileSync, rmSync, readFileSync, readdirSync, statSync, } from 'fs';
40
+ import { join, resolve } from 'path';
41
+ import { tmpdir } from 'os';
42
+ const CLI_PATH = resolve(join(import.meta.dirname, '..', '..', '..', 'bin', 'cli.js'));
43
+ // Expected files that init should create
44
+ const EXPECTED_AGENTS = [
45
+ 'beth.agent.md',
46
+ 'developer.agent.md',
47
+ 'product-manager.agent.md',
48
+ 'researcher.agent.md',
49
+ 'security-reviewer.agent.md',
50
+ 'tester.agent.md',
51
+ 'ux-designer.agent.md',
52
+ ];
53
+ const EXPECTED_SKILLS = [
54
+ 'framer-components',
55
+ 'prd',
56
+ 'security-analysis',
57
+ 'shadcn-ui',
58
+ 'vercel-react-best-practices',
59
+ 'web-design-guidelines',
60
+ ];
61
+ function runInit(cwd, flags = []) {
62
+ const allFlags = ['--skip-beads', ...flags];
63
+ try {
64
+ const stdout = execSync(`node "${CLI_PATH}" init ${allFlags.join(' ')}`, {
65
+ cwd,
66
+ encoding: 'utf-8',
67
+ env: { ...process.env, NO_COLOR: '1' },
68
+ stdio: ['pipe', 'pipe', 'pipe'],
69
+ timeout: 30000,
70
+ });
71
+ return { stdout, stderr: '', code: 0 };
72
+ }
73
+ catch (error) {
74
+ const e = error;
75
+ return { stdout: e.stdout || '', stderr: e.stderr || '', code: e.status || 1 };
76
+ }
77
+ }
78
+ describe('init logic: copyDirRecursive behavior', () => {
79
+ let testDir;
80
+ beforeEach(() => {
81
+ testDir = join(tmpdir(), `beth-init-logic-${Date.now()}-${Math.random().toString(36).slice(2)}`);
82
+ mkdirSync(testDir, { recursive: true });
83
+ });
84
+ afterEach(() => {
85
+ if (existsSync(testDir)) {
86
+ rmSync(testDir, { recursive: true, force: true });
87
+ }
88
+ });
89
+ describe('fresh directory (first install)', () => {
90
+ // Expected: all files created, exit 0
91
+ it('should create all agent files', () => {
92
+ const result = runInit(testDir);
93
+ assert.strictEqual(result.code, 0, 'Init should succeed in fresh directory');
94
+ const agentsDir = join(testDir, '.github', 'agents');
95
+ assert.ok(existsSync(agentsDir), '.github/agents should exist');
96
+ for (const agent of EXPECTED_AGENTS) {
97
+ assert.ok(existsSync(join(agentsDir, agent)), `Agent file ${agent} should be created`);
98
+ }
99
+ });
100
+ it('should create all skill directories', () => {
101
+ runInit(testDir);
102
+ const skillsDir = join(testDir, '.github', 'skills');
103
+ assert.ok(existsSync(skillsDir), '.github/skills should exist');
104
+ for (const skill of EXPECTED_SKILLS) {
105
+ const skillPath = join(skillsDir, skill);
106
+ assert.ok(existsSync(skillPath), `Skill directory ${skill} should exist`);
107
+ assert.ok(existsSync(join(skillPath, 'SKILL.md')), `${skill}/SKILL.md should exist`);
108
+ }
109
+ });
110
+ it('should create AGENTS.md at root', () => {
111
+ runInit(testDir);
112
+ assert.ok(existsSync(join(testDir, 'AGENTS.md')), 'AGENTS.md should be created at project root');
113
+ });
114
+ it('should create copilot-instructions.md', () => {
115
+ runInit(testDir);
116
+ const instrPath = join(testDir, '.github', 'copilot-instructions.md');
117
+ assert.ok(existsSync(instrPath), 'copilot-instructions.md should be created');
118
+ const content = readFileSync(instrPath, 'utf-8');
119
+ assert.ok(content.includes('Beth') || content.includes('beth'), 'copilot-instructions.md should reference Beth');
120
+ });
121
+ });
122
+ describe('overwrite protection (no --force)', () => {
123
+ // Expected: existing files preserved, new files created
124
+ it('should not overwrite existing agent files', () => {
125
+ // First init
126
+ runInit(testDir);
127
+ // Modify an agent file
128
+ const bethPath = join(testDir, '.github', 'agents', 'beth.agent.md');
129
+ writeFileSync(bethPath, 'CUSTOM CONTENT');
130
+ // Second init without --force
131
+ const result = runInit(testDir);
132
+ assert.strictEqual(result.code, 0, 'Second init should succeed');
133
+ // Verify custom content preserved
134
+ const content = readFileSync(bethPath, 'utf-8');
135
+ assert.strictEqual(content, 'CUSTOM CONTENT', 'Existing agent file should not be overwritten');
136
+ });
137
+ it('should report skipped files', () => {
138
+ runInit(testDir);
139
+ const result = runInit(testDir);
140
+ const combined = result.stdout + result.stderr;
141
+ assert.ok(combined.includes('Skipped') || combined.includes('exists') || combined.includes('skip'), 'Should report that files were skipped');
142
+ });
143
+ });
144
+ describe('--force overwrite', () => {
145
+ // Expected: all files overwritten with template versions
146
+ it('should overwrite existing files with --force', () => {
147
+ // First init
148
+ runInit(testDir);
149
+ // Modify an agent file
150
+ const bethPath = join(testDir, '.github', 'agents', 'beth.agent.md');
151
+ writeFileSync(bethPath, 'CUSTOM CONTENT');
152
+ // Second init with --force
153
+ const result = runInit(testDir, ['--force']);
154
+ assert.strictEqual(result.code, 0, 'Force init should succeed');
155
+ // Verify content was replaced
156
+ const content = readFileSync(bethPath, 'utf-8');
157
+ assert.notStrictEqual(content, 'CUSTOM CONTENT', 'File should be overwritten with --force');
158
+ assert.ok(content.includes('Beth') || content.includes('name:'), 'Overwritten content should be the template');
159
+ });
160
+ });
161
+ describe('path conflict: file exists where directory expected', () => {
162
+ // Expected: UserError without --force, handled with --force
163
+ it('should error when .github is a file not a directory', () => {
164
+ // Create .github as a file
165
+ writeFileSync(join(testDir, '.github'), 'not a directory');
166
+ const result = runInit(testDir);
167
+ assert.strictEqual(result.code, 1, 'Should exit 1 for path conflict');
168
+ const combined = result.stdout + result.stderr;
169
+ assert.ok(combined.includes('conflict') || combined.includes('exists as a file') || combined.includes('Error'), 'Should indicate path conflict');
170
+ });
171
+ it('should handle path conflict with --force', () => {
172
+ // Create .github as a file
173
+ writeFileSync(join(testDir, '.github'), 'not a directory');
174
+ const result = runInit(testDir, ['--force']);
175
+ assert.strictEqual(result.code, 0, 'Should succeed with --force converting file to directory');
176
+ assert.ok(statSync(join(testDir, '.github')).isDirectory(), '.github should be a directory after --force');
177
+ });
178
+ });
179
+ describe('--skip-backlog flag', () => {
180
+ // Expected: Backlog.md not created
181
+ it('should skip Backlog.md creation', () => {
182
+ const result = runInit(testDir, ['--skip-backlog']);
183
+ assert.strictEqual(result.code, 0);
184
+ assert.ok(!existsSync(join(testDir, 'Backlog.md')), 'Backlog.md should not be created with --skip-backlog');
185
+ });
186
+ });
187
+ describe('--skip-mcp flag', () => {
188
+ // Expected: mcp.json.example not created
189
+ it('should skip MCP config creation', () => {
190
+ const result = runInit(testDir, ['--skip-mcp']);
191
+ assert.strictEqual(result.code, 0);
192
+ assert.ok(!existsSync(join(testDir, 'mcp.json.example')), 'mcp.json.example should not be created with --skip-mcp');
193
+ });
194
+ });
195
+ });
196
+ describe('init logic: validateArgs behavior', () => {
197
+ // These test the input validation that runs before command dispatch
198
+ it('should reject arguments over 50 characters', () => {
199
+ const longArg = 'a'.repeat(51);
200
+ try {
201
+ execSync(`node "${CLI_PATH}" ${longArg}`, {
202
+ encoding: 'utf-8',
203
+ env: { ...process.env, NO_COLOR: '1' },
204
+ stdio: ['pipe', 'pipe', 'pipe'],
205
+ timeout: 15000,
206
+ });
207
+ assert.fail('Should have exited non-zero');
208
+ }
209
+ catch (error) {
210
+ const e = error;
211
+ assert.strictEqual(e.status, 1, 'Should exit 1 for oversized argument');
212
+ // logError uses console.log (stdout), not console.error
213
+ const combined = (e.stdout || '') + (e.stderr || '');
214
+ assert.ok(combined.includes('too long') || combined.includes('Invalid'), 'Should indicate input too long');
215
+ }
216
+ });
217
+ it('should reject arguments with special characters', () => {
218
+ try {
219
+ execSync(`node "${CLI_PATH}" "init;whoami"`, {
220
+ encoding: 'utf-8',
221
+ env: { ...process.env, NO_COLOR: '1' },
222
+ stdio: ['pipe', 'pipe', 'pipe'],
223
+ timeout: 15000,
224
+ });
225
+ assert.fail('Should have exited non-zero');
226
+ }
227
+ catch (error) {
228
+ const e = error;
229
+ assert.strictEqual(e.status, 1, 'Should exit 1 for special characters');
230
+ }
231
+ });
232
+ it('should accept normal alphanumeric arguments', () => {
233
+ // 'help' is clean — should pass validation
234
+ const stdout = execSync(`node "${CLI_PATH}" help`, {
235
+ encoding: 'utf-8',
236
+ env: { ...process.env, NO_COLOR: '1' },
237
+ stdio: ['pipe', 'pipe', 'pipe'],
238
+ timeout: 15000,
239
+ });
240
+ assert.ok(stdout.length > 0, 'help should produce output');
241
+ });
242
+ });
243
+ describe('init logic: template integrity', () => {
244
+ let testDir;
245
+ beforeEach(() => {
246
+ testDir = join(tmpdir(), `beth-init-integrity-${Date.now()}-${Math.random().toString(36).slice(2)}`);
247
+ mkdirSync(testDir, { recursive: true });
248
+ });
249
+ afterEach(() => {
250
+ if (existsSync(testDir)) {
251
+ rmSync(testDir, { recursive: true, force: true });
252
+ }
253
+ });
254
+ it('should install exactly 7 agent files', () => {
255
+ runInit(testDir);
256
+ const agentsDir = join(testDir, '.github', 'agents');
257
+ if (!existsSync(agentsDir)) {
258
+ assert.fail('.github/agents directory should exist');
259
+ return;
260
+ }
261
+ const agents = readdirSync(agentsDir).filter((f) => f.endsWith('.agent.md'));
262
+ assert.strictEqual(agents.length, 7, `Expected 7 agents, got ${agents.length}: ${agents.join(', ')}`);
263
+ });
264
+ it('should install exactly 6 skill directories', () => {
265
+ runInit(testDir);
266
+ const skillsDir = join(testDir, '.github', 'skills');
267
+ if (!existsSync(skillsDir)) {
268
+ assert.fail('.github/skills directory should exist');
269
+ return;
270
+ }
271
+ const skills = readdirSync(skillsDir).filter((f) => statSync(join(skillsDir, f)).isDirectory());
272
+ assert.strictEqual(skills.length, 6, `Expected 6 skills, got ${skills.length}: ${skills.join(', ')}`);
273
+ });
274
+ it('should create .vscode/settings.json', () => {
275
+ runInit(testDir);
276
+ const settingsPath = join(testDir, '.vscode', 'settings.json');
277
+ assert.ok(existsSync(settingsPath), '.vscode/settings.json should be created');
278
+ // settings.json is JSONC (has comments) — verify it exists and has content
279
+ const content = readFileSync(settingsPath, 'utf-8');
280
+ assert.ok(content.length > 10, 'settings.json should have meaningful content');
281
+ assert.ok(content.includes('{'), 'settings.json should contain JSON structure');
282
+ });
283
+ it('should create agent files with valid YAML frontmatter', () => {
284
+ runInit(testDir);
285
+ const agentsDir = join(testDir, '.github', 'agents');
286
+ for (const agent of EXPECTED_AGENTS) {
287
+ const content = readFileSync(join(agentsDir, agent), 'utf-8');
288
+ assert.ok(content.startsWith('---'), `${agent} should start with YAML frontmatter delimiter`);
289
+ // Should have closing delimiter
290
+ const secondDelimiter = content.indexOf('---', 3);
291
+ assert.ok(secondDelimiter > 3, `${agent} should have closing YAML frontmatter delimiter`);
292
+ }
293
+ });
294
+ it('should create skill SKILL.md files with content', () => {
295
+ runInit(testDir);
296
+ const skillsDir = join(testDir, '.github', 'skills');
297
+ for (const skill of EXPECTED_SKILLS) {
298
+ const skillMd = join(skillsDir, skill, 'SKILL.md');
299
+ assert.ok(existsSync(skillMd), `${skill}/SKILL.md should exist`);
300
+ const content = readFileSync(skillMd, 'utf-8');
301
+ assert.ok(content.length > 10, `${skill}/SKILL.md should have meaningful content`);
302
+ }
303
+ });
304
+ });
305
+ //# sourceMappingURL=init-logic.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-logic.e2e.test.js","sourceRoot":"","sources":["../../../src/cli/commands/init-logic.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Land Command — Partial session completion automation
3
+ *
4
+ * `npx beth-copilot land` automates the **git-mechanical** portion of the
5
+ * "Landing the Plane" checklist defined in AGENTS.md. It does NOT replace
6
+ * the full checklist — several steps require agent judgment and are left
7
+ * to the caller.
8
+ *
9
+ * What this command handles:
10
+ * 1. Verify we're on an epic branch (not main/master)
11
+ * 2. Run quality gates (npm test)
12
+ * 3. Backup beads data (bd backup)
13
+ * 4. Stage, commit, and push to origin
14
+ * 5. Report final status
15
+ *
16
+ * What this command does NOT handle (manual / agent responsibility):
17
+ * - Closing beads issues (`npx beth-copilot close <id>`)
18
+ * - Creating follow-up issues (`bd create`)
19
+ * - Updating Backlog.md (human-readable completed-work archive)
20
+ * - Generating test gate report (`npm run test:gate`)
21
+ * - Creating a PR to main (`gh pr create` or GitHub MCP)
22
+ *
23
+ * See AGENTS.md → "Landing the Plane (Session Completion)" for the full
24
+ * checklist. Agents should complete the manual steps before or after
25
+ * invoking this command.
26
+ *
27
+ * Options:
28
+ * --skip-tests Skip test execution (not recommended)
29
+ * --skip-backup Skip beads backup
30
+ * --message, -m Custom commit message (default: "<epic-id>: session work")
31
+ * --force Push even if tests fail (DANGEROUS)
32
+ * --dry-run Show what would happen without executing
33
+ */
34
+ export interface LandOptions {
35
+ skipTests?: boolean;
36
+ skipBackup?: boolean;
37
+ message?: string;
38
+ force?: boolean;
39
+ dryRun?: boolean;
40
+ }
41
+ export interface LandStepResult {
42
+ step: string;
43
+ status: 'pass' | 'fail' | 'skip' | 'warn';
44
+ message: string;
45
+ details?: string;
46
+ }
47
+ export interface LandResult {
48
+ success: boolean;
49
+ steps: LandStepResult[];
50
+ branch?: string;
51
+ epicId?: string;
52
+ }
53
+ /**
54
+ * Parse land command arguments.
55
+ */
56
+ export declare function parseLandArgs(rawArgs: string[]): LandOptions;
57
+ /**
58
+ * Get the current git branch name.
59
+ * Returns null if not in a git repo or detached HEAD.
60
+ */
61
+ export declare function getCurrentBranch(): string | null;
62
+ /**
63
+ * Extract the epic ID from a branch name.
64
+ * e.g. "epic/beth-z9n" → "beth-z9n"
65
+ * Returns null if branch doesn't follow epic convention.
66
+ */
67
+ export declare function extractEpicId(branch: string): string | null;
68
+ /**
69
+ * Check if a branch is a protected branch (main/master).
70
+ */
71
+ export declare function isProtectedBranch(branch: string): boolean;
72
+ /**
73
+ * Check if there are uncommitted changes in the working tree.
74
+ */
75
+ export declare function hasUncommittedChanges(): boolean;
76
+ /**
77
+ * Check if there are staged changes ready to commit.
78
+ */
79
+ export declare function hasStagedChanges(): boolean;
80
+ /**
81
+ * Check if there are unpushed commits on the current branch.
82
+ */
83
+ export declare function hasUnpushedCommits(branch: string): boolean;
84
+ /**
85
+ * Run npm test and return pass/fail with output.
86
+ */
87
+ export declare function runTests(): {
88
+ passed: boolean;
89
+ output: string;
90
+ };
91
+ /**
92
+ * Run beads backup (bd backup).
93
+ */
94
+ export declare function runBeadsBackup(): {
95
+ success: boolean;
96
+ output: string;
97
+ };
98
+ /**
99
+ * Stage all changes (git add -A).
100
+ */
101
+ export declare function gitAddAll(): boolean;
102
+ /**
103
+ * Commit staged changes.
104
+ */
105
+ export declare function gitCommit(message: string): boolean;
106
+ /**
107
+ * Check if a remote tracking branch exists for the given branch.
108
+ */
109
+ export declare function remoteBranchExists(branch: string): boolean;
110
+ /**
111
+ * Abort an in-progress rebase.
112
+ */
113
+ export declare function gitRebaseAbort(): void;
114
+ /**
115
+ * Pull with rebase from origin.
116
+ */
117
+ export declare function gitPullRebase(branch: string): {
118
+ success: boolean;
119
+ output: string;
120
+ };
121
+ /**
122
+ * Push to origin.
123
+ */
124
+ export declare function gitPush(branch: string): {
125
+ success: boolean;
126
+ output: string;
127
+ };
128
+ /**
129
+ * Verify the current branch is up to date with origin.
130
+ */
131
+ export declare function isUpToDateWithOrigin(branch: string): boolean;
132
+ /**
133
+ * Execute the full landing sequence.
134
+ * Returns structured result for programmatic use.
135
+ */
136
+ export declare function executeLanding(options?: LandOptions): LandResult;
137
+ /**
138
+ * Main land command entry point.
139
+ * Called from CLI routing with raw args after 'land'.
140
+ */
141
+ export declare function land(rawArgs: string[]): Promise<void>;
142
+ //# sourceMappingURL=land.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"land.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/land.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAcH,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,CAsB5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAYhD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAW/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAe1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAmB1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAc9D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAarE;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAWnC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAWlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAW1D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAUrC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAalF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAa5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAwB5D;AA6CD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU,CA8RpE;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3D"}