create-byan-agent 2.0.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/API-BYAN-V2.md +741 -0
  2. package/BMAD-QUICK-REFERENCE.md +370 -0
  3. package/CHANGELOG-v2.1.0.md +371 -0
  4. package/LICENSE +1 -1
  5. package/MIGRATION-v2.0-to-v2.1.md +430 -0
  6. package/README-BYAN-V2.md +446 -0
  7. package/README.md +264 -201
  8. package/install/.eslintrc.js +20 -0
  9. package/install/.prettierrc +7 -0
  10. package/install/BUGFIX-CHALK.md +173 -0
  11. package/install/BUGFIX-DOCUMENTATION-INDEX.md +299 -0
  12. package/install/BUGFIX-PATH-RESOLUTION.md +293 -0
  13. package/install/BUGFIX-QUICKSTART.md +184 -0
  14. package/install/BUGFIX-SUMMARY.txt +91 -0
  15. package/install/BUGFIX-VISUAL-SUMMARY.md +253 -0
  16. package/install/DEPLOYMENT-GUIDE-V2.md +431 -0
  17. package/install/DOCS-INDEX.md +261 -0
  18. package/install/GUIDE-INSTALLATION-BYAN-SIMPLE.md +1083 -0
  19. package/install/INSTALLER-V2-CHANGES.md +472 -0
  20. package/install/LICENSE +21 -0
  21. package/install/PUBLICATION-CHECKLIST.md +265 -0
  22. package/install/PUBLISH-GUIDE.md +190 -0
  23. package/install/QUICKSTART.md +311 -0
  24. package/install/README-NPM-PUBLISH.md +298 -0
  25. package/install/README-NPM-SHORT.md +298 -0
  26. package/install/README-NPM.md +433 -0
  27. package/install/README-RACHID.md +302 -0
  28. package/install/README-V2-INDEX.md +306 -0
  29. package/install/README.md +298 -0
  30. package/install/RESUME-EXECUTIF-YAN.md +408 -0
  31. package/install/UPDATE-SUMMARY.md +205 -0
  32. package/install/__tests__/integration/detection-flow.test.js +154 -0
  33. package/install/__tests__/platforms/claude-code.test.js +175 -0
  34. package/install/__tests__/platforms/codex.test.js +80 -0
  35. package/install/__tests__/platforms/copilot-cli.test.js +118 -0
  36. package/install/__tests__/platforms/vscode.test.js +67 -0
  37. package/install/__tests__/utils/file-utils.test.js +87 -0
  38. package/install/__tests__/utils/git-detector.test.js +80 -0
  39. package/install/__tests__/utils/logger.test.js +83 -0
  40. package/install/__tests__/utils/node-detector.test.js +71 -0
  41. package/install/__tests__/utils/os-detector.test.js +63 -0
  42. package/install/__tests__/utils/yaml-utils.test.js +85 -0
  43. package/install/__tests__/yanstaller/detector.test.js +210 -0
  44. package/install/coverage/clover.xml +219 -0
  45. package/install/coverage/coverage-final.json +13 -0
  46. package/install/coverage/lcov-report/base.css +224 -0
  47. package/install/coverage/lcov-report/block-navigation.js +87 -0
  48. package/install/coverage/lcov-report/favicon.png +0 -0
  49. package/install/coverage/lcov-report/index.html +146 -0
  50. package/install/coverage/lcov-report/lib/errors.js.html +268 -0
  51. package/install/coverage/lcov-report/lib/exit-codes.js.html +247 -0
  52. package/install/coverage/lcov-report/lib/index.html +131 -0
  53. package/install/coverage/lcov-report/lib/platforms/claude-code.js.html +343 -0
  54. package/install/coverage/lcov-report/lib/platforms/codex.js.html +361 -0
  55. package/install/coverage/lcov-report/lib/platforms/copilot-cli.js.html +454 -0
  56. package/install/coverage/lcov-report/lib/platforms/index.html +176 -0
  57. package/install/coverage/lcov-report/lib/platforms/index.js.html +127 -0
  58. package/install/coverage/lcov-report/lib/platforms/vscode.js.html +238 -0
  59. package/install/coverage/lcov-report/lib/utils/config-loader.js.html +322 -0
  60. package/install/coverage/lcov-report/lib/utils/file-utils.js.html +397 -0
  61. package/install/coverage/lcov-report/lib/utils/git-detector.js.html +190 -0
  62. package/install/coverage/lcov-report/lib/utils/index.html +206 -0
  63. package/install/coverage/lcov-report/lib/utils/logger.js.html +277 -0
  64. package/install/coverage/lcov-report/lib/utils/node-detector.js.html +259 -0
  65. package/install/coverage/lcov-report/lib/utils/os-detector.js.html +307 -0
  66. package/install/coverage/lcov-report/lib/utils/yaml-utils.js.html +346 -0
  67. package/install/coverage/lcov-report/lib/yanstaller/backuper.js.html +409 -0
  68. package/install/coverage/lcov-report/lib/yanstaller/detector.js.html +508 -0
  69. package/install/coverage/lcov-report/lib/yanstaller/index.html +236 -0
  70. package/install/coverage/lcov-report/lib/yanstaller/index.js.html +364 -0
  71. package/install/coverage/lcov-report/lib/yanstaller/installer.js.html +505 -0
  72. package/install/coverage/lcov-report/lib/yanstaller/interviewer.js.html +349 -0
  73. package/install/coverage/lcov-report/lib/yanstaller/recommender.js.html +379 -0
  74. package/install/coverage/lcov-report/lib/yanstaller/troubleshooter.js.html +352 -0
  75. package/install/coverage/lcov-report/lib/yanstaller/validator.js.html +679 -0
  76. package/install/coverage/lcov-report/lib/yanstaller/wizard.js.html +412 -0
  77. package/install/coverage/lcov-report/platforms/claude-code.js.html +343 -0
  78. package/install/coverage/lcov-report/platforms/codex.js.html +361 -0
  79. package/install/coverage/lcov-report/platforms/copilot-cli.js.html +454 -0
  80. package/install/coverage/lcov-report/platforms/index.html +176 -0
  81. package/install/coverage/lcov-report/platforms/index.js.html +127 -0
  82. package/install/coverage/lcov-report/platforms/vscode.js.html +238 -0
  83. package/install/coverage/lcov-report/prettify.css +1 -0
  84. package/install/coverage/lcov-report/prettify.js +2 -0
  85. package/install/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  86. package/install/coverage/lcov-report/sorter.js +210 -0
  87. package/install/coverage/lcov-report/utils/file-utils.js.html +397 -0
  88. package/install/coverage/lcov-report/utils/git-detector.js.html +190 -0
  89. package/install/coverage/lcov-report/utils/index.html +191 -0
  90. package/install/coverage/lcov-report/utils/logger.js.html +277 -0
  91. package/install/coverage/lcov-report/utils/node-detector.js.html +259 -0
  92. package/install/coverage/lcov-report/utils/os-detector.js.html +307 -0
  93. package/install/coverage/lcov-report/utils/yaml-utils.js.html +346 -0
  94. package/install/coverage/lcov-report/yanstaller/detector.js.html +508 -0
  95. package/install/coverage/lcov-report/yanstaller/index.html +116 -0
  96. package/install/coverage/lcov.info +414 -0
  97. package/install/install.sh +239 -0
  98. package/install/jest.config.js +33 -0
  99. package/install/lib/errors.js +61 -0
  100. package/install/lib/exit-codes.js +54 -0
  101. package/install/lib/platforms/claude-code.js +86 -0
  102. package/install/lib/platforms/codex.js +92 -0
  103. package/install/lib/platforms/copilot-cli.js +123 -0
  104. package/install/lib/platforms/index.js +14 -0
  105. package/install/lib/platforms/vscode.js +51 -0
  106. package/install/lib/utils/config-loader.js +79 -0
  107. package/install/lib/utils/file-utils.js +104 -0
  108. package/install/lib/utils/git-detector.js +35 -0
  109. package/install/lib/utils/logger.js +64 -0
  110. package/install/lib/utils/node-detector.js +58 -0
  111. package/install/lib/utils/os-detector.js +74 -0
  112. package/install/lib/utils/yaml-utils.js +87 -0
  113. package/install/lib/yanstaller/backuper.js +108 -0
  114. package/install/lib/yanstaller/detector.js +141 -0
  115. package/install/lib/yanstaller/index.js +93 -0
  116. package/install/lib/yanstaller/installer.js +140 -0
  117. package/install/lib/yanstaller/interviewer.js +88 -0
  118. package/install/lib/yanstaller/recommender.js +98 -0
  119. package/install/lib/yanstaller/troubleshooter.js +89 -0
  120. package/install/lib/yanstaller/validator.js +198 -0
  121. package/install/lib/yanstaller/wizard.js +109 -0
  122. package/install/package-npm.json +55 -0
  123. package/install/package.json +63 -0
  124. package/install/src/byan-v2/context/copilot-context.js +79 -0
  125. package/install/src/byan-v2/context/session-state.js +98 -0
  126. package/install/src/byan-v2/dispatcher/complexity-scorer.js +232 -0
  127. package/install/src/byan-v2/dispatcher/local-executor.js +221 -0
  128. package/install/src/byan-v2/dispatcher/task-router.js +122 -0
  129. package/install/src/byan-v2/dispatcher/task-tool-interface-mock.js +134 -0
  130. package/install/src/byan-v2/dispatcher/task-tool-interface.js +123 -0
  131. package/install/src/byan-v2/generation/agent-profile-validator.js +113 -0
  132. package/install/src/byan-v2/generation/profile-template.js +113 -0
  133. package/install/src/byan-v2/generation/templates/default-agent.md +49 -0
  134. package/install/src/byan-v2/generation/templates/test-template.md +1 -0
  135. package/install/src/byan-v2/index.js +199 -0
  136. package/install/src/byan-v2/observability/error-tracker.js +105 -0
  137. package/install/src/byan-v2/observability/logger.js +154 -0
  138. package/install/src/byan-v2/observability/metrics-collector.js +194 -0
  139. package/install/src/byan-v2/orchestrator/analysis-state.js +268 -0
  140. package/install/src/byan-v2/orchestrator/generation-state.js +340 -0
  141. package/install/src/byan-v2/orchestrator/interview-state.js +271 -0
  142. package/install/src/byan-v2/orchestrator/state-machine.js +204 -0
  143. package/install/src/core/cache/cache.js +126 -0
  144. package/install/src/core/context/context.js +86 -0
  145. package/install/src/core/dispatcher/dispatcher.js +135 -0
  146. package/install/src/core/worker-pool/worker-pool.js +194 -0
  147. package/install/src/core/workflow/workflow-executor.js +220 -0
  148. package/install/src/index.js +139 -0
  149. package/install/src/observability/dashboard/dashboard.js +191 -0
  150. package/install/src/observability/logger/structured-logger.js +254 -0
  151. package/install/src/observability/metrics/metrics-collector.js +325 -0
  152. package/install/switch-to-v2.sh +126 -0
  153. package/install/test-chalk-fix.sh +210 -0
  154. package/install/test-installer-v2.sh +204 -0
  155. package/install/test-path-resolution.sh +200 -0
  156. package/package.json +53 -33
  157. package/src/byan-v2/context/copilot-context.js +79 -0
  158. package/src/byan-v2/context/session-state.js +98 -0
  159. package/src/byan-v2/data/mantras.json +852 -0
  160. package/src/byan-v2/dispatcher/complexity-scorer.js +232 -0
  161. package/src/byan-v2/dispatcher/five-whys-analyzer.js +310 -0
  162. package/src/byan-v2/dispatcher/local-executor.js +221 -0
  163. package/src/byan-v2/dispatcher/task-router.js +122 -0
  164. package/src/byan-v2/dispatcher/task-tool-interface-mock.js +134 -0
  165. package/src/byan-v2/dispatcher/task-tool-interface.js +123 -0
  166. package/src/byan-v2/generation/agent-profile-validator.js +113 -0
  167. package/src/byan-v2/generation/mantra-validator.js +416 -0
  168. package/src/byan-v2/generation/profile-template.js +113 -0
  169. package/src/byan-v2/generation/templates/default-agent.md +49 -0
  170. package/src/byan-v2/generation/templates/test-template.md +1 -0
  171. package/src/byan-v2/index.js +652 -0
  172. package/src/byan-v2/integration/voice-integration.js +295 -0
  173. package/src/byan-v2/observability/error-tracker.js +105 -0
  174. package/src/byan-v2/observability/logger.js +154 -0
  175. package/src/byan-v2/observability/metrics-collector.js +194 -0
  176. package/src/byan-v2/orchestrator/active-listener.js +541 -0
  177. package/src/byan-v2/orchestrator/analysis-state.js +268 -0
  178. package/src/byan-v2/orchestrator/generation-state.js +340 -0
  179. package/src/byan-v2/orchestrator/glossary-builder.js +431 -0
  180. package/src/byan-v2/orchestrator/interview-state.js +353 -0
  181. package/src/byan-v2/orchestrator/state-machine.js +253 -0
  182. package/src/core/cache/cache.js +126 -0
  183. package/src/core/context/context.js +86 -0
  184. package/src/core/dispatcher/dispatcher.js +135 -0
  185. package/src/core/worker-pool/worker-pool.js +194 -0
  186. package/src/core/workflow/workflow-executor.js +220 -0
  187. package/src/index.js +139 -0
  188. package/src/observability/dashboard/dashboard.js +191 -0
  189. package/src/observability/logger/structured-logger.js +254 -0
  190. package/src/observability/metrics/metrics-collector.js +325 -0
  191. package/templates/.github/agents/bmad-agent-test-dynamic.md +0 -21
  192. package/templates/.github/agents/franck.md +0 -379
  193. /package/{CHANGELOG.md → install/CHANGELOG.md} +0 -0
  194. /package/{bin → install/bin}/create-byan-agent-backup.js +0 -0
  195. /package/{bin → install/bin}/create-byan-agent-fixed.js +0 -0
  196. /package/{bin → install/bin}/create-byan-agent-v2.js +0 -0
  197. /package/{bin → install/bin}/create-byan-agent.js +0 -0
  198. /package/{templates → install/templates}/.github/agents/bmad-agent-bmad-master.md +0 -0
  199. /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-agent-builder.md +0 -0
  200. /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-module-builder.md +0 -0
  201. /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-workflow-builder.md +0 -0
  202. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-analyst.md +0 -0
  203. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-architect.md +0 -0
  204. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-dev.md +0 -0
  205. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-pm.md +0 -0
  206. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-quick-flow-solo-dev.md +0 -0
  207. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-quinn.md +0 -0
  208. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-sm.md +0 -0
  209. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-tech-writer.md +0 -0
  210. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-ux-designer.md +0 -0
  211. /package/{templates → install/templates}/.github/agents/bmad-agent-byan-test.md +0 -0
  212. /package/{templates → install/templates}/.github/agents/bmad-agent-byan.md +0 -0
  213. /package/{templates → install/templates}/.github/agents/bmad-agent-carmack.md +0 -0
  214. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-brainstorming-coach.md +0 -0
  215. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-creative-problem-solver.md +0 -0
  216. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-design-thinking-coach.md +0 -0
  217. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-innovation-strategist.md +0 -0
  218. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-presentation-master.md +0 -0
  219. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-storyteller.md +0 -0
  220. /package/{templates → install/templates}/.github/agents/bmad-agent-marc.md +0 -0
  221. /package/{templates → install/templates}/.github/agents/bmad-agent-patnote.md +0 -0
  222. /package/{templates → install/templates}/.github/agents/bmad-agent-rachid.md +0 -0
  223. /package/{templates → install/templates}/.github/agents/bmad-agent-tea-tea.md +0 -0
  224. /package/{templates → install/templates}/_bmad/bmb/agents/agent-builder.md +0 -0
  225. /package/{templates → install/templates}/_bmad/bmb/agents/byan-test.md +0 -0
  226. /package/{templates → install/templates}/_bmad/bmb/agents/byan.md +0 -0
  227. /package/{templates → install/templates}/_bmad/bmb/agents/marc.md +0 -0
  228. /package/{templates → install/templates}/_bmad/bmb/agents/module-builder.md +0 -0
  229. /package/{templates → install/templates}/_bmad/bmb/agents/patnote.md +0 -0
  230. /package/{templates → install/templates}/_bmad/bmb/agents/rachid.md +0 -0
  231. /package/{templates → install/templates}/_bmad/bmb/agents/workflow-builder.md +0 -0
  232. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/data/mantras.yaml +0 -0
  233. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/data/templates.yaml +0 -0
  234. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/delete-agent-workflow.md +0 -0
  235. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/edit-agent-workflow.md +0 -0
  236. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/interview-workflow.md +0 -0
  237. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/quick-create-workflow.md +0 -0
  238. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/templates/base-agent-template.md +0 -0
  239. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/validate-agent-workflow.md +0 -0
  240. /package/{templates → install/templates}/_bmad/core/agents/carmack.md +0 -0
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Detector Tests
3
+ *
4
+ * Tests for install/lib/yanstaller/detector.js
5
+ */
6
+
7
+ const detector = require('../../lib/yanstaller/detector');
8
+ const osDetector = require('../../lib/utils/os-detector');
9
+ const nodeDetector = require('../../lib/utils/node-detector');
10
+ const gitDetector = require('../../lib/utils/git-detector');
11
+ const platforms = require('../../lib/platforms');
12
+ const logger = require('../../lib/utils/logger');
13
+
14
+ // Mock all dependencies
15
+ jest.mock('../../lib/utils/os-detector');
16
+ jest.mock('../../lib/utils/node-detector');
17
+ jest.mock('../../lib/utils/git-detector');
18
+ jest.mock('../../lib/platforms');
19
+ jest.mock('../../lib/utils/logger');
20
+
21
+ describe('Detector Module', () => {
22
+ beforeEach(() => {
23
+ // Setup default mocks
24
+ osDetector.detect.mockReturnValue({
25
+ name: 'linux',
26
+ version: '22.04',
27
+ platform: 'linux'
28
+ });
29
+
30
+ nodeDetector.detect.mockReturnValue('18.19.0');
31
+ nodeDetector.meetsRequirement.mockReturnValue(true);
32
+
33
+ gitDetector.detect.mockResolvedValue({
34
+ installed: true,
35
+ version: '2.43.0'
36
+ });
37
+
38
+ // Mock platforms object with all 4 platforms
39
+ platforms['copilot-cli'] = {
40
+ detect: jest.fn().mockResolvedValue(true),
41
+ getPath: jest.fn().mockReturnValue('.github/agents')
42
+ };
43
+
44
+ platforms['vscode'] = {
45
+ detect: jest.fn().mockResolvedValue(true),
46
+ getPath: jest.fn().mockReturnValue('.github/agents')
47
+ };
48
+
49
+ platforms['claude'] = {
50
+ detect: jest.fn().mockResolvedValue(false),
51
+ getPath: jest.fn().mockReturnValue('~/.config/Claude/claude_desktop_config.json')
52
+ };
53
+
54
+ platforms['codex'] = {
55
+ detect: jest.fn().mockResolvedValue(false),
56
+ getPath: jest.fn().mockReturnValue('.codex/prompts')
57
+ };
58
+ });
59
+
60
+ afterEach(() => {
61
+ jest.clearAllMocks();
62
+ });
63
+
64
+ describe('detect()', () => {
65
+ it('should detect full environment with parallel execution', async () => {
66
+ const result = await detector.detect();
67
+
68
+ expect(result).toEqual({
69
+ os: 'linux',
70
+ osVersion: '22.04',
71
+ nodeVersion: '18.19.0',
72
+ hasGit: true,
73
+ gitVersion: '2.43.0',
74
+ platforms: [
75
+ { name: 'copilot-cli', detected: true, path: '.github/agents' },
76
+ { name: 'vscode', detected: true, path: '.github/agents' },
77
+ { name: 'claude', detected: false, path: undefined },
78
+ { name: 'codex', detected: false, path: undefined }
79
+ ]
80
+ });
81
+
82
+ // Verify all detectors were called
83
+ expect(osDetector.detect).toHaveBeenCalledTimes(1);
84
+ expect(nodeDetector.detect).toHaveBeenCalledTimes(1);
85
+ expect(gitDetector.detect).toHaveBeenCalledTimes(1);
86
+ expect(platforms['copilot-cli'].detect).toHaveBeenCalledTimes(1);
87
+ });
88
+
89
+ it('should handle Git not installed', async () => {
90
+ gitDetector.detect.mockResolvedValue({
91
+ installed: false,
92
+ version: null
93
+ });
94
+
95
+ const result = await detector.detect();
96
+
97
+ expect(result.hasGit).toBe(false);
98
+ expect(result.gitVersion).toBeNull();
99
+ });
100
+
101
+ it('should log warning when all platforms fail detection', async () => {
102
+ // Mock all platforms as not detected
103
+ platforms['copilot-cli'].detect.mockResolvedValue(false);
104
+ platforms['vscode'].detect.mockResolvedValue(false);
105
+ platforms['claude'].detect.mockResolvedValue(false);
106
+ platforms['codex'].detect.mockResolvedValue(false);
107
+
108
+ await detector.detect();
109
+
110
+ // Should NOT log warning if no errors (just not detected)
111
+ expect(logger.warn).not.toHaveBeenCalled();
112
+ });
113
+
114
+ it('should log warning with error details when all platforms fail with errors', async () => {
115
+ // Mock all platforms with errors
116
+ platforms['copilot-cli'].detect.mockRejectedValue(new Error('Command not found'));
117
+ platforms['vscode'].detect.mockRejectedValue(new Error('Not installed'));
118
+ platforms['claude'].detect.mockRejectedValue(new Error('Config missing'));
119
+ platforms['codex'].detect.mockRejectedValue(new Error('Directory missing'));
120
+
121
+ const result = await detector.detect();
122
+
123
+ // Should log warning per platform AND summary
124
+ expect(logger.warn).toHaveBeenCalled();
125
+ expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('0/4 platforms detected'));
126
+
127
+ // All platforms should be marked as not detected
128
+ expect(result.platforms.every(p => !p.detected)).toBe(true);
129
+ });
130
+ });
131
+
132
+ describe('detectPlatform()', () => {
133
+ it('should detect platform successfully', async () => {
134
+ const result = await detector.detectPlatform('copilot-cli');
135
+
136
+ expect(result).toEqual({
137
+ name: 'copilot-cli',
138
+ detected: true,
139
+ path: '.github/agents'
140
+ });
141
+ });
142
+
143
+ it('should handle platform not detected', async () => {
144
+ platforms['codex'].detect.mockResolvedValue(false);
145
+
146
+ const result = await detector.detectPlatform('codex');
147
+
148
+ expect(result).toEqual({
149
+ name: 'codex',
150
+ detected: false,
151
+ path: undefined
152
+ });
153
+ });
154
+
155
+ it('should throw error for unknown platform', async () => {
156
+ await expect(detector.detectPlatform('unknown')).rejects.toThrow('Unknown platform: unknown');
157
+ });
158
+
159
+ it('should handle platform detection error gracefully', async () => {
160
+ platforms['copilot-cli'].detect.mockRejectedValue(new Error('Detection failed'));
161
+
162
+ const result = await detector.detectPlatform('copilot-cli');
163
+
164
+ expect(result).toEqual({
165
+ name: 'copilot-cli',
166
+ detected: false,
167
+ error: 'Detection failed'
168
+ });
169
+
170
+ expect(logger.warn).toHaveBeenCalledWith('Platform copilot-cli detection failed: Detection failed');
171
+ });
172
+
173
+ it('should handle timeout response format from platform detector', async () => {
174
+ // Mock timeout response
175
+ platforms['copilot-cli'].detect.mockResolvedValue({
176
+ detected: false,
177
+ error: 'Detection timeout after 10s'
178
+ });
179
+
180
+ const result = await detector.detectPlatform('copilot-cli');
181
+
182
+ expect(result).toEqual({
183
+ name: 'copilot-cli',
184
+ detected: false,
185
+ error: 'Detection timeout after 10s'
186
+ });
187
+
188
+ expect(logger.warn).toHaveBeenCalledWith('Platform copilot-cli detection failed: Detection timeout after 10s');
189
+ });
190
+ });
191
+
192
+ describe('isNodeVersionValid()', () => {
193
+ it('should delegate to nodeDetector.meetsRequirement', () => {
194
+ nodeDetector.meetsRequirement.mockReturnValue(true);
195
+
196
+ const result = detector.isNodeVersionValid('18.19.0', '18.0.0');
197
+
198
+ expect(result).toBe(true);
199
+ expect(nodeDetector.meetsRequirement).toHaveBeenCalledWith('18.19.0', '18.0.0');
200
+ });
201
+
202
+ it('should return false when version does not meet requirement', () => {
203
+ nodeDetector.meetsRequirement.mockReturnValue(false);
204
+
205
+ const result = detector.isNodeVersionValid('16.0.0', '18.0.0');
206
+
207
+ expect(result).toBe(false);
208
+ });
209
+ });
210
+ });
@@ -0,0 +1,219 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <coverage generated="1770141657845" clover="3.2.0">
3
+ <project timestamp="1770141657845" name="All files">
4
+ <metrics statements="168" coveredstatements="161" conditionals="36" coveredconditionals="33" methods="51" coveredmethods="48" elements="255" coveredelements="242" complexity="0" loc="168" ncloc="168" packages="3" files="12" classes="12"/>
5
+ <package name="platforms">
6
+ <metrics statements="71" coveredstatements="71" conditionals="10" coveredconditionals="10" methods="18" coveredmethods="17"/>
7
+ <file name="claude-code.js" path="/home/yan/conception/install/lib/platforms/claude-code.js">
8
+ <metrics statements="20" coveredstatements="20" conditionals="10" coveredconditionals="10" methods="4" coveredmethods="4"/>
9
+ <line num="9" count="2" type="stmt"/>
10
+ <line num="10" count="2" type="stmt"/>
11
+ <line num="11" count="2" type="stmt"/>
12
+ <line num="13" count="2" type="stmt"/>
13
+ <line num="21" count="13" type="stmt"/>
14
+ <line num="22" count="13" type="stmt"/>
15
+ <line num="24" count="13" type="cond" truecount="4" falsecount="0"/>
16
+ <line num="26" count="4" type="stmt"/>
17
+ <line num="28" count="3" type="stmt"/>
18
+ <line num="30" count="3" type="stmt"/>
19
+ <line num="32" count="3" type="stmt"/>
20
+ <line num="42" count="7" type="stmt"/>
21
+ <line num="43" count="7" type="cond" truecount="2" falsecount="0"/>
22
+ <line num="45" count="6" type="stmt"/>
23
+ <line num="57" count="2" type="stmt"/>
24
+ <line num="59" count="2" type="cond" truecount="2" falsecount="0"/>
25
+ <line num="60" count="1" type="stmt"/>
26
+ <line num="66" count="1" type="stmt"/>
27
+ <line num="78" count="4" type="cond" truecount="2" falsecount="0"/>
28
+ <line num="81" count="2" type="stmt"/>
29
+ </file>
30
+ <file name="codex.js" path="/home/yan/conception/install/lib/platforms/codex.js">
31
+ <metrics statements="17" coveredstatements="17" conditionals="0" coveredconditionals="0" methods="4" coveredmethods="4"/>
32
+ <line num="9" count="2" type="stmt"/>
33
+ <line num="10" count="2" type="stmt"/>
34
+ <line num="12" count="2" type="stmt"/>
35
+ <line num="13" count="2" type="stmt"/>
36
+ <line num="22" count="2" type="stmt"/>
37
+ <line num="34" count="2" type="stmt"/>
38
+ <line num="35" count="2" type="stmt"/>
39
+ <line num="37" count="2" type="stmt"/>
40
+ <line num="39" count="2" type="stmt"/>
41
+ <line num="40" count="2" type="stmt"/>
42
+ <line num="41" count="2" type="stmt"/>
43
+ <line num="44" count="2" type="stmt"/>
44
+ <line num="59" count="2" type="stmt"/>
45
+ <line num="61" count="2" type="stmt"/>
46
+ <line num="75" count="2" type="stmt"/>
47
+ <line num="84" count="1" type="stmt"/>
48
+ <line num="87" count="2" type="stmt"/>
49
+ </file>
50
+ <file name="copilot-cli.js" path="/home/yan/conception/install/lib/platforms/copilot-cli.js">
51
+ <metrics statements="27" coveredstatements="27" conditionals="0" coveredconditionals="0" methods="7" coveredmethods="6"/>
52
+ <line num="9" count="3" type="stmt"/>
53
+ <line num="10" count="3" type="stmt"/>
54
+ <line num="11" count="3" type="stmt"/>
55
+ <line num="12" count="3" type="stmt"/>
56
+ <line num="14" count="3" type="stmt"/>
57
+ <line num="15" count="3" type="stmt"/>
58
+ <line num="26" count="4" type="stmt"/>
59
+ <line num="27" count="4" type="stmt"/>
60
+ <line num="34" count="4" type="stmt"/>
61
+ <line num="35" count="4" type="stmt"/>
62
+ <line num="37" count="4" type="stmt"/>
63
+ <line num="38" count="2" type="stmt"/>
64
+ <line num="41" count="2" type="stmt"/>
65
+ <line num="46" count="4" type="stmt"/>
66
+ <line num="58" count="2" type="stmt"/>
67
+ <line num="59" count="2" type="stmt"/>
68
+ <line num="61" count="2" type="stmt"/>
69
+ <line num="63" count="2" type="stmt"/>
70
+ <line num="64" count="2" type="stmt"/>
71
+ <line num="65" count="2" type="stmt"/>
72
+ <line num="68" count="2" type="stmt"/>
73
+ <line num="83" count="2" type="stmt"/>
74
+ <line num="85" count="2" type="stmt"/>
75
+ <line num="90" count="2" type="stmt"/>
76
+ <line num="106" count="2" type="stmt"/>
77
+ <line num="115" count="1" type="stmt"/>
78
+ <line num="118" count="3" type="stmt"/>
79
+ </file>
80
+ <file name="index.js" path="/home/yan/conception/install/lib/platforms/index.js">
81
+ <metrics statements="1" coveredstatements="1" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
82
+ <line num="9" count="1" type="stmt"/>
83
+ </file>
84
+ <file name="vscode.js" path="/home/yan/conception/install/lib/platforms/vscode.js">
85
+ <metrics statements="6" coveredstatements="6" conditionals="0" coveredconditionals="0" methods="3" coveredmethods="3"/>
86
+ <line num="10" count="2" type="stmt"/>
87
+ <line num="12" count="2" type="stmt"/>
88
+ <line num="21" count="2" type="stmt"/>
89
+ <line num="34" count="1" type="stmt"/>
90
+ <line num="43" count="1" type="stmt"/>
91
+ <line num="46" count="2" type="stmt"/>
92
+ </file>
93
+ </package>
94
+ <package name="utils">
95
+ <metrics statements="67" coveredstatements="60" conditionals="14" coveredconditionals="11" methods="26" coveredmethods="24"/>
96
+ <file name="file-utils.js" path="/home/yan/conception/install/lib/utils/file-utils.js">
97
+ <metrics statements="11" coveredstatements="9" conditionals="0" coveredconditionals="0" methods="8" coveredmethods="6"/>
98
+ <line num="9" count="7" type="stmt"/>
99
+ <line num="10" count="7" type="stmt"/>
100
+ <line num="20" count="1" type="stmt"/>
101
+ <line num="30" count="2" type="stmt"/>
102
+ <line num="40" count="1" type="stmt"/>
103
+ <line num="50" count="1" type="stmt"/>
104
+ <line num="60" count="0" type="stmt"/>
105
+ <line num="71" count="0" type="stmt"/>
106
+ <line num="81" count="1" type="stmt"/>
107
+ <line num="92" count="1" type="stmt"/>
108
+ <line num="95" count="7" type="stmt"/>
109
+ </file>
110
+ <file name="git-detector.js" path="/home/yan/conception/install/lib/utils/git-detector.js">
111
+ <metrics statements="7" coveredstatements="7" conditionals="2" coveredconditionals="2" methods="1" coveredmethods="1"/>
112
+ <line num="9" count="2" type="stmt"/>
113
+ <line num="17" count="5" type="stmt"/>
114
+ <line num="18" count="5" type="stmt"/>
115
+ <line num="19" count="4" type="stmt"/>
116
+ <line num="21" count="4" type="stmt"/>
117
+ <line num="26" count="1" type="stmt"/>
118
+ <line num="33" count="2" type="stmt"/>
119
+ </file>
120
+ <file name="logger.js" path="/home/yan/conception/install/lib/utils/logger.js">
121
+ <metrics statements="8" coveredstatements="8" conditionals="2" coveredconditionals="2" methods="5" coveredmethods="5"/>
122
+ <line num="9" count="2" type="stmt"/>
123
+ <line num="17" count="1" type="stmt"/>
124
+ <line num="26" count="1" type="stmt"/>
125
+ <line num="35" count="1" type="stmt"/>
126
+ <line num="44" count="1" type="stmt"/>
127
+ <line num="53" count="2" type="cond" truecount="2" falsecount="0"/>
128
+ <line num="54" count="1" type="stmt"/>
129
+ <line num="58" count="2" type="stmt"/>
130
+ </file>
131
+ <file name="node-detector.js" path="/home/yan/conception/install/lib/utils/node-detector.js">
132
+ <metrics statements="11" coveredstatements="11" conditionals="4" coveredconditionals="4" methods="3" coveredmethods="3"/>
133
+ <line num="15" count="1" type="stmt"/>
134
+ <line num="29" count="21" type="stmt"/>
135
+ <line num="30" count="21" type="stmt"/>
136
+ <line num="32" count="21" type="stmt"/>
137
+ <line num="33" count="21" type="stmt"/>
138
+ <line num="35" count="21" type="stmt"/>
139
+ <line num="36" count="42" type="cond" truecount="2" falsecount="0"/>
140
+ <line num="37" count="35" type="cond" truecount="2" falsecount="0"/>
141
+ <line num="40" count="7" type="stmt"/>
142
+ <line num="51" count="8" type="stmt"/>
143
+ <line num="54" count="2" type="stmt"/>
144
+ </file>
145
+ <file name="os-detector.js" path="/home/yan/conception/install/lib/utils/os-detector.js">
146
+ <metrics statements="16" coveredstatements="11" conditionals="4" coveredconditionals="1" methods="4" coveredmethods="4"/>
147
+ <line num="9" count="2" type="stmt"/>
148
+ <line num="17" count="1" type="stmt"/>
149
+ <line num="18" count="1" type="stmt"/>
150
+ <line num="21" count="1" type="cond" truecount="1" falsecount="3"/>
151
+ <line num="23" count="0" type="stmt"/>
152
+ <line num="24" count="0" type="stmt"/>
153
+ <line num="26" count="0" type="stmt"/>
154
+ <line num="27" count="0" type="stmt"/>
155
+ <line num="29" count="1" type="stmt"/>
156
+ <line num="30" count="1" type="stmt"/>
157
+ <line num="32" count="0" type="stmt"/>
158
+ <line num="35" count="1" type="stmt"/>
159
+ <line num="48" count="1" type="stmt"/>
160
+ <line num="57" count="1" type="stmt"/>
161
+ <line num="66" count="1" type="stmt"/>
162
+ <line num="69" count="2" type="stmt"/>
163
+ </file>
164
+ <file name="yaml-utils.js" path="/home/yan/conception/install/lib/utils/yaml-utils.js">
165
+ <metrics statements="14" coveredstatements="14" conditionals="2" coveredconditionals="2" methods="5" coveredmethods="5"/>
166
+ <line num="9" count="4" type="stmt"/>
167
+ <line num="10" count="4" type="stmt"/>
168
+ <line num="19" count="3" type="stmt"/>
169
+ <line num="29" count="4" type="stmt"/>
170
+ <line num="42" count="1" type="stmt"/>
171
+ <line num="43" count="1" type="stmt"/>
172
+ <line num="54" count="1" type="stmt"/>
173
+ <line num="55" count="1" type="stmt"/>
174
+ <line num="65" count="2" type="stmt"/>
175
+ <line num="66" count="2" type="stmt"/>
176
+ <line num="68" count="2" type="cond" truecount="2" falsecount="0"/>
177
+ <line num="69" count="1" type="stmt"/>
178
+ <line num="75" count="1" type="stmt"/>
179
+ <line num="81" count="4" type="stmt"/>
180
+ </file>
181
+ </package>
182
+ <package name="yanstaller">
183
+ <metrics statements="30" coveredstatements="30" conditionals="12" coveredconditionals="12" methods="7" coveredmethods="7"/>
184
+ <file name="detector.js" path="/home/yan/conception/install/lib/yanstaller/detector.js">
185
+ <metrics statements="30" coveredstatements="30" conditionals="12" coveredconditionals="12" methods="7" coveredmethods="7"/>
186
+ <line num="11" count="1" type="stmt"/>
187
+ <line num="12" count="1" type="stmt"/>
188
+ <line num="13" count="1" type="stmt"/>
189
+ <line num="14" count="1" type="stmt"/>
190
+ <line num="34" count="1" type="stmt"/>
191
+ <line num="46" count="4" type="stmt"/>
192
+ <line num="53" count="4" type="stmt"/>
193
+ <line num="54" count="4" type="stmt"/>
194
+ <line num="55" count="16" type="stmt"/>
195
+ <line num="59" count="10" type="stmt"/>
196
+ <line num="60" count="4" type="cond" truecount="2" falsecount="0"/>
197
+ <line num="61" count="2" type="stmt"/>
198
+ <line num="62" count="8" type="stmt"/>
199
+ <line num="63" count="4" type="stmt"/>
200
+ <line num="65" count="2" type="cond" truecount="2" falsecount="0"/>
201
+ <line num="66" count="1" type="stmt"/>
202
+ <line num="70" count="4" type="stmt"/>
203
+ <line num="90" count="2" type="stmt"/>
204
+ <line num="102" count="21" type="stmt"/>
205
+ <line num="103" count="21" type="cond" truecount="2" falsecount="0"/>
206
+ <line num="104" count="1" type="stmt"/>
207
+ <line num="107" count="20" type="stmt"/>
208
+ <line num="108" count="20" type="stmt"/>
209
+ <line num="111" count="15" type="cond" truecount="4" falsecount="0"/>
210
+ <line num="112" count="1" type="stmt"/>
211
+ <line num="113" count="1" type="stmt"/>
212
+ <line num="120" count="14" type="stmt"/>
213
+ <line num="128" count="5" type="stmt"/>
214
+ <line num="129" count="5" type="stmt"/>
215
+ <line num="137" count="1" type="stmt"/>
216
+ </file>
217
+ </package>
218
+ </project>
219
+ </coverage>
@@ -0,0 +1,13 @@
1
+ {"/home/yan/conception/install/lib/platforms/claude-code.js": {"path":"/home/yan/conception/install/lib/platforms/claude-code.js","statementMap":{"0":{"start":{"line":9,"column":13},"end":{"line":9,"column":28}},"1":{"start":{"line":10,"column":11},"end":{"line":10,"column":24}},"2":{"start":{"line":11,"column":18},"end":{"line":11,"column":48}},"3":{"start":{"line":13,"column":22},"end":{"line":13,"column":35}},"4":{"start":{"line":21,"column":19},"end":{"line":21,"column":32}},"5":{"start":{"line":22,"column":15},"end":{"line":22,"column":27}},"6":{"start":{"line":24,"column":2},"end":{"line":33,"column":3}},"7":{"start":{"line":26,"column":6},"end":{"line":26,"column":94}},"8":{"start":{"line":28,"column":6},"end":{"line":28,"column":82}},"9":{"start":{"line":30,"column":6},"end":{"line":30,"column":74}},"10":{"start":{"line":32,"column":6},"end":{"line":32,"column":18}},"11":{"start":{"line":42,"column":21},"end":{"line":42,"column":36}},"12":{"start":{"line":43,"column":2},"end":{"line":43,"column":32}},"13":{"start":{"line":43,"column":19},"end":{"line":43,"column":32}},"14":{"start":{"line":45,"column":2},"end":{"line":45,"column":38}},"15":{"start":{"line":57,"column":21},"end":{"line":57,"column":36}},"16":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"17":{"start":{"line":60,"column":4},"end":{"line":60,"column":62}},"18":{"start":{"line":66,"column":2},"end":{"line":69,"column":4}},"19":{"start":{"line":78,"column":2},"end":{"line":78,"column":38}},"20":{"start":{"line":81,"column":0},"end":{"line":86,"column":2}}},"fnMap":{"0":{"name":"getConfigPath","decl":{"start":{"line":20,"column":9},"end":{"line":20,"column":22}},"loc":{"start":{"line":20,"column":25},"end":{"line":34,"column":1}},"line":20},"1":{"name":"detect","decl":{"start":{"line":41,"column":15},"end":{"line":41,"column":21}},"loc":{"start":{"line":41,"column":24},"end":{"line":46,"column":1}},"line":41},"2":{"name":"install","decl":{"start":{"line":56,"column":15},"end":{"line":56,"column":22}},"loc":{"start":{"line":56,"column":52},"end":{"line":70,"column":1}},"line":56},"3":{"name":"getPath","decl":{"start":{"line":77,"column":9},"end":{"line":77,"column":16}},"loc":{"start":{"line":77,"column":19},"end":{"line":79,"column":1}},"line":77}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":2},"end":{"line":33,"column":3}},"type":"switch","locations":[{"start":{"line":25,"column":4},"end":{"line":26,"column":94}},{"start":{"line":27,"column":4},"end":{"line":28,"column":82}},{"start":{"line":29,"column":4},"end":{"line":30,"column":74}},{"start":{"line":31,"column":4},"end":{"line":32,"column":18}}],"line":24},"1":{"loc":{"start":{"line":43,"column":2},"end":{"line":43,"column":32}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":43,"column":32}},{"start":{},"end":{}}],"line":43},"2":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{},"end":{}}],"line":59},"3":{"loc":{"start":{"line":78,"column":9},"end":{"line":78,"column":37}},"type":"binary-expr","locations":[{"start":{"line":78,"column":9},"end":{"line":78,"column":24}},{"start":{"line":78,"column":28},"end":{"line":78,"column":37}}],"line":78}},"s":{"0":2,"1":2,"2":2,"3":2,"4":13,"5":13,"6":13,"7":4,"8":3,"9":3,"10":3,"11":7,"12":7,"13":1,"14":6,"15":2,"16":2,"17":1,"18":1,"19":4,"20":2},"f":{"0":13,"1":7,"2":2,"3":4},"b":{"0":[4,3,3,3],"1":[1,6],"2":[1,1],"3":[4,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c2db3aade07ac59d5e0d9ae0e474964d1c70011a"}
2
+ ,"/home/yan/conception/install/lib/platforms/codex.js": {"path":"/home/yan/conception/install/lib/platforms/codex.js","statementMap":{"0":{"start":{"line":9,"column":13},"end":{"line":9,"column":28}},"1":{"start":{"line":10,"column":18},"end":{"line":10,"column":48}},"2":{"start":{"line":12,"column":22},"end":{"line":12,"column":29}},"3":{"start":{"line":13,"column":20},"end":{"line":13,"column":36}},"4":{"start":{"line":22,"column":2},"end":{"line":22,"column":39}},"5":{"start":{"line":34,"column":21},"end":{"line":34,"column":56}},"6":{"start":{"line":35,"column":2},"end":{"line":35,"column":40}},"7":{"start":{"line":37,"column":18},"end":{"line":37,"column":19}},"8":{"start":{"line":39,"column":2},"end":{"line":42,"column":3}},"9":{"start":{"line":40,"column":4},"end":{"line":40,"column":56}},"10":{"start":{"line":41,"column":4},"end":{"line":41,"column":16}},"11":{"start":{"line":44,"column":2},"end":{"line":47,"column":4}},"12":{"start":{"line":59,"column":21},"end":{"line":59,"column":61}},"13":{"start":{"line":61,"column":18},"end":{"line":73,"column":1}},"14":{"start":{"line":75,"column":2},"end":{"line":75,"column":49}},"15":{"start":{"line":84,"column":2},"end":{"line":84,"column":21}},"16":{"start":{"line":87,"column":0},"end":{"line":92,"column":2}}},"fnMap":{"0":{"name":"detect","decl":{"start":{"line":20,"column":15},"end":{"line":20,"column":21}},"loc":{"start":{"line":20,"column":24},"end":{"line":23,"column":1}},"line":20},"1":{"name":"install","decl":{"start":{"line":33,"column":15},"end":{"line":33,"column":22}},"loc":{"start":{"line":33,"column":52},"end":{"line":48,"column":1}},"line":33},"2":{"name":"generatePrompt","decl":{"start":{"line":58,"column":15},"end":{"line":58,"column":29}},"loc":{"start":{"line":58,"column":61},"end":{"line":76,"column":1}},"line":58},"3":{"name":"getPath","decl":{"start":{"line":83,"column":9},"end":{"line":83,"column":16}},"loc":{"start":{"line":83,"column":19},"end":{"line":85,"column":1}},"line":83}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":1,"16":2},"f":{"0":2,"1":2,"2":2,"3":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1f26796535634cbf1882f597fc819a3beb3b138c"}
3
+ ,"/home/yan/conception/install/lib/platforms/copilot-cli.js": {"path":"/home/yan/conception/install/lib/platforms/copilot-cli.js","statementMap":{"0":{"start":{"line":9,"column":13},"end":{"line":9,"column":28}},"1":{"start":{"line":10,"column":18},"end":{"line":10,"column":48}},"2":{"start":{"line":11,"column":18},"end":{"line":11,"column":48}},"3":{"start":{"line":12,"column":21},"end":{"line":12,"column":45}},"4":{"start":{"line":14,"column":22},"end":{"line":14,"column":42}},"5":{"start":{"line":15,"column":17},"end":{"line":15,"column":33}},"6":{"start":{"line":26,"column":25},"end":{"line":31,"column":3}},"7":{"start":{"line":27,"column":4},"end":{"line":30,"column":14}},"8":{"start":{"line":27,"column":21},"end":{"line":30,"column":6}},"9":{"start":{"line":34,"column":27},"end":{"line":43,"column":6}},"10":{"start":{"line":35,"column":4},"end":{"line":42,"column":5}},"11":{"start":{"line":37,"column":6},"end":{"line":37,"column":82}},"12":{"start":{"line":38,"column":6},"end":{"line":38,"column":18}},"13":{"start":{"line":41,"column":6},"end":{"line":41,"column":40}},"14":{"start":{"line":46,"column":2},"end":{"line":46,"column":58}},"15":{"start":{"line":58,"column":19},"end":{"line":58,"column":51}},"16":{"start":{"line":59,"column":2},"end":{"line":59,"column":38}},"17":{"start":{"line":61,"column":18},"end":{"line":61,"column":19}},"18":{"start":{"line":63,"column":2},"end":{"line":66,"column":3}},"19":{"start":{"line":64,"column":4},"end":{"line":64,"column":52}},"20":{"start":{"line":65,"column":4},"end":{"line":65,"column":16}},"21":{"start":{"line":68,"column":2},"end":{"line":71,"column":4}},"22":{"start":{"line":83,"column":19},"end":{"line":83,"column":57}},"23":{"start":{"line":85,"column":22},"end":{"line":88,"column":3}},"24":{"start":{"line":90,"column":18},"end":{"line":104,"column":1}},"25":{"start":{"line":106,"column":2},"end":{"line":106,"column":47}},"26":{"start":{"line":115,"column":2},"end":{"line":115,"column":18}},"27":{"start":{"line":118,"column":0},"end":{"line":123,"column":2}}},"fnMap":{"0":{"name":"detect","decl":{"start":{"line":24,"column":15},"end":{"line":24,"column":21}},"loc":{"start":{"line":24,"column":24},"end":{"line":47,"column":1}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":26,"column":37},"end":{"line":26,"column":38}},"loc":{"start":{"line":27,"column":4},"end":{"line":30,"column":14}},"line":27},"2":{"name":"(anonymous_2)","decl":{"start":{"line":27,"column":15},"end":{"line":27,"column":16}},"loc":{"start":{"line":27,"column":21},"end":{"line":30,"column":6}},"line":27},"3":{"name":"(anonymous_3)","decl":{"start":{"line":34,"column":28},"end":{"line":34,"column":29}},"loc":{"start":{"line":34,"column":40},"end":{"line":43,"column":3}},"line":34},"4":{"name":"install","decl":{"start":{"line":57,"column":15},"end":{"line":57,"column":22}},"loc":{"start":{"line":57,"column":52},"end":{"line":72,"column":1}},"line":57},"5":{"name":"generateStub","decl":{"start":{"line":82,"column":15},"end":{"line":82,"column":27}},"loc":{"start":{"line":82,"column":57},"end":{"line":107,"column":1}},"line":82},"6":{"name":"getPath","decl":{"start":{"line":114,"column":9},"end":{"line":114,"column":16}},"loc":{"start":{"line":114,"column":19},"end":{"line":116,"column":1}},"line":114}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":4,"7":4,"8":0,"9":4,"10":4,"11":4,"12":2,"13":2,"14":4,"15":2,"16":2,"17":2,"18":2,"19":2,"20":2,"21":2,"22":2,"23":2,"24":2,"25":2,"26":1,"27":3},"f":{"0":4,"1":4,"2":0,"3":4,"4":2,"5":2,"6":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a928e5b3fb2cede8d61911c1bfa66782747fdcbf"}
4
+ ,"/home/yan/conception/install/lib/platforms/index.js": {"path":"/home/yan/conception/install/lib/platforms/index.js","statementMap":{"0":{"start":{"line":9,"column":0},"end":{"line":14,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"24f14392c8879807602dcabae9dbbe6adb04f801"}
5
+ ,"/home/yan/conception/install/lib/platforms/vscode.js": {"path":"/home/yan/conception/install/lib/platforms/vscode.js","statementMap":{"0":{"start":{"line":10,"column":19},"end":{"line":10,"column":43}},"1":{"start":{"line":12,"column":22},"end":{"line":12,"column":48}},"2":{"start":{"line":21,"column":2},"end":{"line":21,"column":29}},"3":{"start":{"line":34,"column":2},"end":{"line":34,"column":57}},"4":{"start":{"line":43,"column":2},"end":{"line":43,"column":30}},"5":{"start":{"line":46,"column":0},"end":{"line":51,"column":2}}},"fnMap":{"0":{"name":"detect","decl":{"start":{"line":19,"column":15},"end":{"line":19,"column":21}},"loc":{"start":{"line":19,"column":24},"end":{"line":22,"column":1}},"line":19},"1":{"name":"install","decl":{"start":{"line":32,"column":15},"end":{"line":32,"column":22}},"loc":{"start":{"line":32,"column":52},"end":{"line":35,"column":1}},"line":32},"2":{"name":"getPath","decl":{"start":{"line":42,"column":9},"end":{"line":42,"column":16}},"loc":{"start":{"line":42,"column":19},"end":{"line":44,"column":1}},"line":42}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":1,"4":1,"5":2},"f":{"0":2,"1":1,"2":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d6e4fb352fcec4b7d950b5b4a364d5849b6cedce"}
6
+ ,"/home/yan/conception/install/lib/utils/file-utils.js": {"path":"/home/yan/conception/install/lib/utils/file-utils.js","statementMap":{"0":{"start":{"line":9,"column":11},"end":{"line":9,"column":30}},"1":{"start":{"line":10,"column":13},"end":{"line":10,"column":28}},"2":{"start":{"line":20,"column":2},"end":{"line":20,"column":27}},"3":{"start":{"line":30,"column":2},"end":{"line":30,"column":33}},"4":{"start":{"line":40,"column":2},"end":{"line":40,"column":30}},"5":{"start":{"line":50,"column":2},"end":{"line":50,"column":28}},"6":{"start":{"line":60,"column":2},"end":{"line":60,"column":31}},"7":{"start":{"line":71,"column":2},"end":{"line":71,"column":52}},"8":{"start":{"line":81,"column":2},"end":{"line":81,"column":39}},"9":{"start":{"line":92,"column":2},"end":{"line":92,"column":48}},"10":{"start":{"line":95,"column":0},"end":{"line":104,"column":2}}},"fnMap":{"0":{"name":"copy","decl":{"start":{"line":19,"column":15},"end":{"line":19,"column":19}},"loc":{"start":{"line":19,"column":31},"end":{"line":21,"column":1}},"line":19},"1":{"name":"exists","decl":{"start":{"line":29,"column":15},"end":{"line":29,"column":21}},"loc":{"start":{"line":29,"column":32},"end":{"line":31,"column":1}},"line":29},"2":{"name":"ensureDir","decl":{"start":{"line":39,"column":15},"end":{"line":39,"column":24}},"loc":{"start":{"line":39,"column":34},"end":{"line":41,"column":1}},"line":39},"3":{"name":"remove","decl":{"start":{"line":49,"column":15},"end":{"line":49,"column":21}},"loc":{"start":{"line":49,"column":32},"end":{"line":51,"column":1}},"line":49},"4":{"name":"readJSON","decl":{"start":{"line":59,"column":15},"end":{"line":59,"column":23}},"loc":{"start":{"line":59,"column":34},"end":{"line":61,"column":1}},"line":59},"5":{"name":"writeJSON","decl":{"start":{"line":70,"column":15},"end":{"line":70,"column":24}},"loc":{"start":{"line":70,"column":41},"end":{"line":72,"column":1}},"line":70},"6":{"name":"readFile","decl":{"start":{"line":80,"column":15},"end":{"line":80,"column":23}},"loc":{"start":{"line":80,"column":34},"end":{"line":82,"column":1}},"line":80},"7":{"name":"writeFile","decl":{"start":{"line":91,"column":15},"end":{"line":91,"column":24}},"loc":{"start":{"line":91,"column":44},"end":{"line":93,"column":1}},"line":91}},"branchMap":{},"s":{"0":7,"1":7,"2":1,"3":2,"4":1,"5":1,"6":0,"7":0,"8":1,"9":1,"10":7},"f":{"0":1,"1":2,"2":1,"3":1,"4":0,"5":0,"6":1,"7":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f03e378d231fa8127b3502c579b948741e531a13"}
7
+ ,"/home/yan/conception/install/lib/utils/git-detector.js": {"path":"/home/yan/conception/install/lib/utils/git-detector.js","statementMap":{"0":{"start":{"line":9,"column":21},"end":{"line":9,"column":45}},"1":{"start":{"line":17,"column":2},"end":{"line":30,"column":3}},"2":{"start":{"line":18,"column":20},"end":{"line":18,"column":74}},"3":{"start":{"line":19,"column":25},"end":{"line":19,"column":62}},"4":{"start":{"line":21,"column":4},"end":{"line":24,"column":6}},"5":{"start":{"line":26,"column":4},"end":{"line":29,"column":6}},"6":{"start":{"line":33,"column":0},"end":{"line":35,"column":2}}},"fnMap":{"0":{"name":"detect","decl":{"start":{"line":16,"column":15},"end":{"line":16,"column":21}},"loc":{"start":{"line":16,"column":24},"end":{"line":31,"column":1}},"line":16}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":15},"end":{"line":23,"column":52}},"type":"cond-expr","locations":[{"start":{"line":23,"column":30},"end":{"line":23,"column":45}},{"start":{"line":23,"column":48},"end":{"line":23,"column":52}}],"line":23}},"s":{"0":2,"1":5,"2":5,"3":4,"4":4,"5":1,"6":2},"f":{"0":5},"b":{"0":[2,2]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"b9ecf9e2fbc50700e49b32c1501513c17c7a3299"}
8
+ ,"/home/yan/conception/install/lib/utils/logger.js": {"path":"/home/yan/conception/install/lib/utils/logger.js","statementMap":{"0":{"start":{"line":9,"column":14},"end":{"line":9,"column":30}},"1":{"start":{"line":17,"column":2},"end":{"line":17,"column":40}},"2":{"start":{"line":26,"column":2},"end":{"line":26,"column":41}},"3":{"start":{"line":35,"column":2},"end":{"line":35,"column":42}},"4":{"start":{"line":44,"column":2},"end":{"line":44,"column":41}},"5":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"6":{"start":{"line":54,"column":4},"end":{"line":54,"column":48}},"7":{"start":{"line":58,"column":0},"end":{"line":64,"column":2}}},"fnMap":{"0":{"name":"info","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":13}},"loc":{"start":{"line":16,"column":23},"end":{"line":18,"column":1}},"line":16},"1":{"name":"success","decl":{"start":{"line":25,"column":9},"end":{"line":25,"column":16}},"loc":{"start":{"line":25,"column":26},"end":{"line":27,"column":1}},"line":25},"2":{"name":"warn","decl":{"start":{"line":34,"column":9},"end":{"line":34,"column":13}},"loc":{"start":{"line":34,"column":23},"end":{"line":36,"column":1}},"line":34},"3":{"name":"error","decl":{"start":{"line":43,"column":9},"end":{"line":43,"column":14}},"loc":{"start":{"line":43,"column":24},"end":{"line":45,"column":1}},"line":43},"4":{"name":"debug","decl":{"start":{"line":52,"column":9},"end":{"line":52,"column":14}},"loc":{"start":{"line":52,"column":24},"end":{"line":56,"column":1}},"line":52}},"branchMap":{"0":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{},"end":{}}],"line":53}},"s":{"0":2,"1":1,"2":1,"3":1,"4":1,"5":2,"6":1,"7":2},"f":{"0":1,"1":1,"2":1,"3":1,"4":2},"b":{"0":[1,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0e03537685dfba5ce43de7196002d9129126555b"}
9
+ ,"/home/yan/conception/install/lib/utils/node-detector.js": {"path":"/home/yan/conception/install/lib/utils/node-detector.js","statementMap":{"0":{"start":{"line":15,"column":2},"end":{"line":15,"column":34}},"1":{"start":{"line":29,"column":18},"end":{"line":29,"column":46}},"2":{"start":{"line":30,"column":18},"end":{"line":30,"column":46}},"3":{"start":{"line":32,"column":18},"end":{"line":32,"column":48}},"4":{"start":{"line":33,"column":18},"end":{"line":33,"column":48}},"5":{"start":{"line":35,"column":2},"end":{"line":38,"column":3}},"6":{"start":{"line":35,"column":15},"end":{"line":35,"column":16}},"7":{"start":{"line":36,"column":4},"end":{"line":36,"column":42}},"8":{"start":{"line":36,"column":33},"end":{"line":36,"column":42}},"9":{"start":{"line":37,"column":4},"end":{"line":37,"column":43}},"10":{"start":{"line":37,"column":33},"end":{"line":37,"column":43}},"11":{"start":{"line":40,"column":2},"end":{"line":40,"column":11}},"12":{"start":{"line":51,"column":2},"end":{"line":51,"column":63}},"13":{"start":{"line":54,"column":0},"end":{"line":58,"column":2}}},"fnMap":{"0":{"name":"detect","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":15}},"loc":{"start":{"line":14,"column":18},"end":{"line":16,"column":1}},"line":14},"1":{"name":"compareVersions","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":24}},"loc":{"start":{"line":27,"column":45},"end":{"line":41,"column":1}},"line":27},"2":{"name":"meetsRequirement","decl":{"start":{"line":50,"column":9},"end":{"line":50,"column":25}},"loc":{"start":{"line":50,"column":59},"end":{"line":52,"column":1}},"line":50}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":4},"end":{"line":36,"column":42}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":36,"column":42}},{"start":{},"end":{}}],"line":36},"1":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":43}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":43}},{"start":{},"end":{}}],"line":37}},"s":{"0":1,"1":21,"2":21,"3":21,"4":21,"5":21,"6":21,"7":42,"8":7,"9":35,"10":7,"11":7,"12":8,"13":2},"f":{"0":1,"1":21,"2":8},"b":{"0":[7,35],"1":[7,28]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"abfe5de7561f27a38afcac880144268a8f4bf456"}
10
+ ,"/home/yan/conception/install/lib/utils/os-detector.js": {"path":"/home/yan/conception/install/lib/utils/os-detector.js","statementMap":{"0":{"start":{"line":9,"column":11},"end":{"line":9,"column":24}},"1":{"start":{"line":17,"column":19},"end":{"line":17,"column":32}},"2":{"start":{"line":18,"column":18},"end":{"line":18,"column":30}},"3":{"start":{"line":21,"column":2},"end":{"line":33,"column":3}},"4":{"start":{"line":23,"column":6},"end":{"line":23,"column":23}},"5":{"start":{"line":24,"column":6},"end":{"line":24,"column":12}},"6":{"start":{"line":26,"column":6},"end":{"line":26,"column":21}},"7":{"start":{"line":27,"column":6},"end":{"line":27,"column":12}},"8":{"start":{"line":29,"column":6},"end":{"line":29,"column":21}},"9":{"start":{"line":30,"column":6},"end":{"line":30,"column":12}},"10":{"start":{"line":32,"column":6},"end":{"line":32,"column":23}},"11":{"start":{"line":35,"column":2},"end":{"line":39,"column":4}},"12":{"start":{"line":48,"column":2},"end":{"line":48,"column":35}},"13":{"start":{"line":57,"column":2},"end":{"line":57,"column":36}},"14":{"start":{"line":66,"column":2},"end":{"line":66,"column":35}},"15":{"start":{"line":69,"column":0},"end":{"line":74,"column":2}}},"fnMap":{"0":{"name":"detect","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":15}},"loc":{"start":{"line":16,"column":18},"end":{"line":40,"column":1}},"line":16},"1":{"name":"isWindows","decl":{"start":{"line":47,"column":9},"end":{"line":47,"column":18}},"loc":{"start":{"line":47,"column":21},"end":{"line":49,"column":1}},"line":47},"2":{"name":"isMacOS","decl":{"start":{"line":56,"column":9},"end":{"line":56,"column":16}},"loc":{"start":{"line":56,"column":19},"end":{"line":58,"column":1}},"line":56},"3":{"name":"isLinux","decl":{"start":{"line":65,"column":9},"end":{"line":65,"column":16}},"loc":{"start":{"line":65,"column":19},"end":{"line":67,"column":1}},"line":65}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":33,"column":3}},"type":"switch","locations":[{"start":{"line":22,"column":4},"end":{"line":24,"column":12}},{"start":{"line":25,"column":4},"end":{"line":27,"column":12}},{"start":{"line":28,"column":4},"end":{"line":30,"column":12}},{"start":{"line":31,"column":4},"end":{"line":32,"column":23}}],"line":21}},"s":{"0":2,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0,"8":1,"9":1,"10":0,"11":1,"12":1,"13":1,"14":1,"15":2},"f":{"0":1,"1":1,"2":1,"3":1},"b":{"0":[0,0,1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a1291f97b11d79d820927bdec3255ad74afa1ef3"}
11
+ ,"/home/yan/conception/install/lib/utils/yaml-utils.js": {"path":"/home/yan/conception/install/lib/utils/yaml-utils.js","statementMap":{"0":{"start":{"line":9,"column":13},"end":{"line":9,"column":31}},"1":{"start":{"line":10,"column":18},"end":{"line":10,"column":41}},"2":{"start":{"line":19,"column":2},"end":{"line":19,"column":31}},"3":{"start":{"line":29,"column":2},"end":{"line":32,"column":5}},"4":{"start":{"line":42,"column":18},"end":{"line":42,"column":52}},"5":{"start":{"line":43,"column":2},"end":{"line":43,"column":24}},"6":{"start":{"line":54,"column":21},"end":{"line":54,"column":31}},"7":{"start":{"line":55,"column":2},"end":{"line":55,"column":50}},"8":{"start":{"line":65,"column":27},"end":{"line":65,"column":62}},"9":{"start":{"line":66,"column":16},"end":{"line":66,"column":55}},"10":{"start":{"line":68,"column":2},"end":{"line":73,"column":3}},"11":{"start":{"line":69,"column":4},"end":{"line":72,"column":6}},"12":{"start":{"line":75,"column":2},"end":{"line":78,"column":4}},"13":{"start":{"line":81,"column":0},"end":{"line":87,"column":2}}},"fnMap":{"0":{"name":"parse","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":14}},"loc":{"start":{"line":18,"column":27},"end":{"line":20,"column":1}},"line":18},"1":{"name":"dump","decl":{"start":{"line":28,"column":9},"end":{"line":28,"column":13}},"loc":{"start":{"line":28,"column":19},"end":{"line":33,"column":1}},"line":28},"2":{"name":"readYAML","decl":{"start":{"line":41,"column":15},"end":{"line":41,"column":23}},"loc":{"start":{"line":41,"column":34},"end":{"line":44,"column":1}},"line":41},"3":{"name":"writeYAML","decl":{"start":{"line":53,"column":15},"end":{"line":53,"column":24}},"loc":{"start":{"line":53,"column":41},"end":{"line":56,"column":1}},"line":53},"4":{"name":"extractFrontmatter","decl":{"start":{"line":64,"column":9},"end":{"line":64,"column":27}},"loc":{"start":{"line":64,"column":45},"end":{"line":79,"column":1}},"line":64}},"branchMap":{"0":{"loc":{"start":{"line":68,"column":2},"end":{"line":73,"column":3}},"type":"if","locations":[{"start":{"line":68,"column":2},"end":{"line":73,"column":3}},{"start":{},"end":{}}],"line":68}},"s":{"0":4,"1":4,"2":3,"3":4,"4":1,"5":1,"6":1,"7":1,"8":2,"9":2,"10":2,"11":1,"12":1,"13":4},"f":{"0":3,"1":4,"2":1,"3":1,"4":2},"b":{"0":[1,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"208b5812651a832c0cfcaa72b9a59a6307d163a3"}
12
+ ,"/home/yan/conception/install/lib/yanstaller/detector.js": {"path":"/home/yan/conception/install/lib/yanstaller/detector.js","statementMap":{"0":{"start":{"line":11,"column":19},"end":{"line":11,"column":50}},"1":{"start":{"line":12,"column":21},"end":{"line":12,"column":54}},"2":{"start":{"line":13,"column":20},"end":{"line":13,"column":52}},"3":{"start":{"line":14,"column":18},"end":{"line":14,"column":41}},"4":{"start":{"line":34,"column":15},"end":{"line":34,"column":41}},"5":{"start":{"line":46,"column":41},"end":{"line":50,"column":4}},"6":{"start":{"line":53,"column":24},"end":{"line":53,"column":68}},"7":{"start":{"line":54,"column":24},"end":{"line":56,"column":3}},"8":{"start":{"line":55,"column":30},"end":{"line":55,"column":50}},"9":{"start":{"line":59,"column":20},"end":{"line":59,"column":57}},"10":{"start":{"line":59,"column":45},"end":{"line":59,"column":56}},"11":{"start":{"line":60,"column":2},"end":{"line":68,"column":3}},"12":{"start":{"line":61,"column":19},"end":{"line":64,"column":17}},"13":{"start":{"line":62,"column":19},"end":{"line":62,"column":26}},"14":{"start":{"line":63,"column":16},"end":{"line":63,"column":39}},"15":{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},"16":{"start":{"line":66,"column":6},"end":{"line":66,"column":65}},"17":{"start":{"line":70,"column":2},"end":{"line":77,"column":4}},"18":{"start":{"line":90,"column":2},"end":{"line":90,"column":72}},"19":{"start":{"line":102,"column":19},"end":{"line":102,"column":42}},"20":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"21":{"start":{"line":104,"column":4},"end":{"line":104,"column":57}},"22":{"start":{"line":107,"column":2},"end":{"line":134,"column":3}},"23":{"start":{"line":108,"column":21},"end":{"line":108,"column":44}},"24":{"start":{"line":111,"column":4},"end":{"line":118,"column":5}},"25":{"start":{"line":112,"column":6},"end":{"line":112,"column":82}},"26":{"start":{"line":113,"column":6},"end":{"line":117,"column":8}},"27":{"start":{"line":120,"column":4},"end":{"line":124,"column":6}},"28":{"start":{"line":128,"column":4},"end":{"line":128,"column":79}},"29":{"start":{"line":129,"column":4},"end":{"line":133,"column":6}},"30":{"start":{"line":137,"column":0},"end":{"line":141,"column":2}}},"fnMap":{"0":{"name":"detect","decl":{"start":{"line":44,"column":15},"end":{"line":44,"column":21}},"loc":{"start":{"line":44,"column":24},"end":{"line":78,"column":1}},"line":44},"1":{"name":"(anonymous_1)","decl":{"start":{"line":55,"column":22},"end":{"line":55,"column":23}},"loc":{"start":{"line":55,"column":30},"end":{"line":55,"column":50}},"line":55},"2":{"name":"(anonymous_2)","decl":{"start":{"line":59,"column":40},"end":{"line":59,"column":41}},"loc":{"start":{"line":59,"column":45},"end":{"line":59,"column":56}},"line":59},"3":{"name":"(anonymous_3)","decl":{"start":{"line":62,"column":14},"end":{"line":62,"column":15}},"loc":{"start":{"line":62,"column":19},"end":{"line":62,"column":26}},"line":62},"4":{"name":"(anonymous_4)","decl":{"start":{"line":63,"column":11},"end":{"line":63,"column":12}},"loc":{"start":{"line":63,"column":16},"end":{"line":63,"column":39}},"line":63},"5":{"name":"isNodeVersionValid","decl":{"start":{"line":89,"column":9},"end":{"line":89,"column":27}},"loc":{"start":{"line":89,"column":61},"end":{"line":91,"column":1}},"line":89},"6":{"name":"detectPlatform","decl":{"start":{"line":101,"column":15},"end":{"line":101,"column":29}},"loc":{"start":{"line":101,"column":44},"end":{"line":135,"column":1}},"line":101}},"branchMap":{"0":{"loc":{"start":{"line":60,"column":2},"end":{"line":68,"column":3}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":68,"column":3}},{"start":{},"end":{}}],"line":60},"1":{"loc":{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},"type":"if","locations":[{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},{"start":{},"end":{}}],"line":65},"2":{"loc":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},{"start":{},"end":{}}],"line":103},"3":{"loc":{"start":{"line":111,"column":4},"end":{"line":118,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":118,"column":5}},{"start":{},"end":{}}],"line":111},"4":{"loc":{"start":{"line":111,"column":8},"end":{"line":111,"column":59}},"type":"binary-expr","locations":[{"start":{"line":111,"column":8},"end":{"line":111,"column":36}},{"start":{"line":111,"column":40},"end":{"line":111,"column":59}}],"line":111},"5":{"loc":{"start":{"line":123,"column":12},"end":{"line":123,"column":53}},"type":"cond-expr","locations":[{"start":{"line":123,"column":23},"end":{"line":123,"column":41}},{"start":{"line":123,"column":44},"end":{"line":123,"column":53}}],"line":123}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":4,"6":4,"7":4,"8":16,"9":4,"10":10,"11":4,"12":2,"13":8,"14":4,"15":2,"16":1,"17":4,"18":2,"19":21,"20":21,"21":1,"22":20,"23":20,"24":15,"25":1,"26":1,"27":14,"28":5,"29":5,"30":1},"f":{"0":4,"1":16,"2":10,"3":8,"4":4,"5":2,"6":21},"b":{"0":[2,2],"1":[1,1],"2":[1,20],"3":[1,14],"4":[15,1],"5":[5,9]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"7ed3a0516d07d4d136d9103f02779b00308c0bc3"}
13
+ }