@zigrivers/scaffold 3.9.2 → 3.10.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 (214) hide show
  1. package/README.md +39 -8
  2. package/dist/cli/commands/adopt.cli-flags.test.d.ts +2 -0
  3. package/dist/cli/commands/adopt.cli-flags.test.d.ts.map +1 -0
  4. package/dist/cli/commands/adopt.cli-flags.test.js +165 -0
  5. package/dist/cli/commands/adopt.cli-flags.test.js.map +1 -0
  6. package/dist/cli/commands/adopt.config-resolution.test.d.ts +2 -0
  7. package/dist/cli/commands/adopt.config-resolution.test.d.ts.map +1 -0
  8. package/dist/cli/commands/adopt.config-resolution.test.js +217 -0
  9. package/dist/cli/commands/adopt.config-resolution.test.js.map +1 -0
  10. package/dist/cli/commands/adopt.config-write-integration.test.d.ts +2 -0
  11. package/dist/cli/commands/adopt.config-write-integration.test.d.ts.map +1 -0
  12. package/dist/cli/commands/adopt.config-write-integration.test.js +138 -0
  13. package/dist/cli/commands/adopt.config-write-integration.test.js.map +1 -0
  14. package/dist/cli/commands/adopt.d.ts +4 -0
  15. package/dist/cli/commands/adopt.d.ts.map +1 -1
  16. package/dist/cli/commands/adopt.js +432 -61
  17. package/dist/cli/commands/adopt.js.map +1 -1
  18. package/dist/cli/commands/adopt.performance.test.d.ts +2 -0
  19. package/dist/cli/commands/adopt.performance.test.d.ts.map +1 -0
  20. package/dist/cli/commands/adopt.performance.test.js +30 -0
  21. package/dist/cli/commands/adopt.performance.test.js.map +1 -0
  22. package/dist/cli/commands/adopt.result-shape.test.d.ts +2 -0
  23. package/dist/cli/commands/adopt.result-shape.test.d.ts.map +1 -0
  24. package/dist/cli/commands/adopt.result-shape.test.js +166 -0
  25. package/dist/cli/commands/adopt.result-shape.test.js.map +1 -0
  26. package/dist/cli/commands/adopt.serialization.test.d.ts +2 -0
  27. package/dist/cli/commands/adopt.serialization.test.d.ts.map +1 -0
  28. package/dist/cli/commands/adopt.serialization.test.js +228 -0
  29. package/dist/cli/commands/adopt.serialization.test.js.map +1 -0
  30. package/dist/cli/commands/adopt.test.js +26 -15
  31. package/dist/cli/commands/adopt.test.js.map +1 -1
  32. package/dist/cli/commands/adopt.windows-crlf.test.d.ts +2 -0
  33. package/dist/cli/commands/adopt.windows-crlf.test.d.ts.map +1 -0
  34. package/dist/cli/commands/adopt.windows-crlf.test.js +102 -0
  35. package/dist/cli/commands/adopt.windows-crlf.test.js.map +1 -0
  36. package/dist/cli/commands/init.d.ts.map +1 -1
  37. package/dist/cli/commands/init.js +4 -157
  38. package/dist/cli/commands/init.js.map +1 -1
  39. package/dist/cli/init-flag-families.d.ts +86 -0
  40. package/dist/cli/init-flag-families.d.ts.map +1 -0
  41. package/dist/cli/init-flag-families.js +418 -0
  42. package/dist/cli/init-flag-families.js.map +1 -0
  43. package/dist/cli/init-flag-families.test.d.ts +2 -0
  44. package/dist/cli/init-flag-families.test.d.ts.map +1 -0
  45. package/dist/cli/init-flag-families.test.js +268 -0
  46. package/dist/cli/init-flag-families.test.js.map +1 -0
  47. package/dist/config/schema.d.ts +6 -6
  48. package/dist/config/schema.js +2 -2
  49. package/dist/config/schema.js.map +1 -1
  50. package/dist/config/schema.test.js +10 -4
  51. package/dist/config/schema.test.js.map +1 -1
  52. package/dist/e2e/adopt-multi-type.test.d.ts +2 -0
  53. package/dist/e2e/adopt-multi-type.test.d.ts.map +1 -0
  54. package/dist/e2e/adopt-multi-type.test.js +35 -0
  55. package/dist/e2e/adopt-multi-type.test.js.map +1 -0
  56. package/dist/project/__frozen-schemas__/schema-v3.9.2.d.ts +2891 -0
  57. package/dist/project/__frozen-schemas__/schema-v3.9.2.d.ts.map +1 -0
  58. package/dist/project/__frozen-schemas__/schema-v3.9.2.js +177 -0
  59. package/dist/project/__frozen-schemas__/schema-v3.9.2.js.map +1 -0
  60. package/dist/project/adopt.d.ts +38 -2
  61. package/dist/project/adopt.d.ts.map +1 -1
  62. package/dist/project/adopt.error-messages.test.d.ts +2 -0
  63. package/dist/project/adopt.error-messages.test.d.ts.map +1 -0
  64. package/dist/project/adopt.error-messages.test.js +112 -0
  65. package/dist/project/adopt.error-messages.test.js.map +1 -0
  66. package/dist/project/adopt.forward-compat.test.d.ts +2 -0
  67. package/dist/project/adopt.forward-compat.test.d.ts.map +1 -0
  68. package/dist/project/adopt.forward-compat.test.js +71 -0
  69. package/dist/project/adopt.forward-compat.test.js.map +1 -0
  70. package/dist/project/adopt.js +218 -27
  71. package/dist/project/adopt.js.map +1 -1
  72. package/dist/project/adopt.merge.test.d.ts +2 -0
  73. package/dist/project/adopt.merge.test.d.ts.map +1 -0
  74. package/dist/project/adopt.merge.test.js +62 -0
  75. package/dist/project/adopt.merge.test.js.map +1 -0
  76. package/dist/project/adopt.re-adoption.test.d.ts +2 -0
  77. package/dist/project/adopt.re-adoption.test.d.ts.map +1 -0
  78. package/dist/project/adopt.re-adoption.test.js +222 -0
  79. package/dist/project/adopt.re-adoption.test.js.map +1 -0
  80. package/dist/project/adopt.test.js +72 -27
  81. package/dist/project/adopt.test.js.map +1 -1
  82. package/dist/project/detectors/backend.d.ts +4 -0
  83. package/dist/project/detectors/backend.d.ts.map +1 -0
  84. package/dist/project/detectors/backend.js +199 -0
  85. package/dist/project/detectors/backend.js.map +1 -0
  86. package/dist/project/detectors/backend.test.d.ts +2 -0
  87. package/dist/project/detectors/backend.test.d.ts.map +1 -0
  88. package/dist/project/detectors/backend.test.js +64 -0
  89. package/dist/project/detectors/backend.test.js.map +1 -0
  90. package/dist/project/detectors/browser-extension.d.ts +4 -0
  91. package/dist/project/detectors/browser-extension.d.ts.map +1 -0
  92. package/dist/project/detectors/browser-extension.js +61 -0
  93. package/dist/project/detectors/browser-extension.js.map +1 -0
  94. package/dist/project/detectors/browser-extension.test.d.ts +2 -0
  95. package/dist/project/detectors/browser-extension.test.d.ts.map +1 -0
  96. package/dist/project/detectors/browser-extension.test.js +64 -0
  97. package/dist/project/detectors/browser-extension.test.js.map +1 -0
  98. package/dist/project/detectors/cli.d.ts +4 -0
  99. package/dist/project/detectors/cli.d.ts.map +1 -0
  100. package/dist/project/detectors/cli.js +68 -0
  101. package/dist/project/detectors/cli.js.map +1 -0
  102. package/dist/project/detectors/cli.test.d.ts +2 -0
  103. package/dist/project/detectors/cli.test.d.ts.map +1 -0
  104. package/dist/project/detectors/cli.test.js +70 -0
  105. package/dist/project/detectors/cli.test.js.map +1 -0
  106. package/dist/project/detectors/context.d.ts +105 -0
  107. package/dist/project/detectors/context.d.ts.map +1 -0
  108. package/dist/project/detectors/context.js +652 -0
  109. package/dist/project/detectors/context.js.map +1 -0
  110. package/dist/project/detectors/context.test.d.ts +2 -0
  111. package/dist/project/detectors/context.test.d.ts.map +1 -0
  112. package/dist/project/detectors/context.test.js +240 -0
  113. package/dist/project/detectors/context.test.js.map +1 -0
  114. package/dist/project/detectors/data-pipeline.d.ts +4 -0
  115. package/dist/project/detectors/data-pipeline.d.ts.map +1 -0
  116. package/dist/project/detectors/data-pipeline.js +97 -0
  117. package/dist/project/detectors/data-pipeline.js.map +1 -0
  118. package/dist/project/detectors/data-pipeline.test.d.ts +2 -0
  119. package/dist/project/detectors/data-pipeline.test.d.ts.map +1 -0
  120. package/dist/project/detectors/data-pipeline.test.js +67 -0
  121. package/dist/project/detectors/data-pipeline.test.js.map +1 -0
  122. package/dist/project/detectors/disambiguate.d.ts +12 -0
  123. package/dist/project/detectors/disambiguate.d.ts.map +1 -0
  124. package/dist/project/detectors/disambiguate.js +87 -0
  125. package/dist/project/detectors/disambiguate.js.map +1 -0
  126. package/dist/project/detectors/disambiguate.test.d.ts +2 -0
  127. package/dist/project/detectors/disambiguate.test.d.ts.map +1 -0
  128. package/dist/project/detectors/disambiguate.test.js +114 -0
  129. package/dist/project/detectors/disambiguate.test.js.map +1 -0
  130. package/dist/project/detectors/file-text-match.d.ts +3 -0
  131. package/dist/project/detectors/file-text-match.d.ts.map +1 -0
  132. package/dist/project/detectors/file-text-match.js +60 -0
  133. package/dist/project/detectors/file-text-match.js.map +1 -0
  134. package/dist/project/detectors/file-text-match.test.d.ts +2 -0
  135. package/dist/project/detectors/file-text-match.test.d.ts.map +1 -0
  136. package/dist/project/detectors/file-text-match.test.js +81 -0
  137. package/dist/project/detectors/file-text-match.test.js.map +1 -0
  138. package/dist/project/detectors/game.d.ts +18 -0
  139. package/dist/project/detectors/game.d.ts.map +1 -0
  140. package/dist/project/detectors/game.js +83 -0
  141. package/dist/project/detectors/game.js.map +1 -0
  142. package/dist/project/detectors/game.test.d.ts +2 -0
  143. package/dist/project/detectors/game.test.d.ts.map +1 -0
  144. package/dist/project/detectors/game.test.js +87 -0
  145. package/dist/project/detectors/game.test.js.map +1 -0
  146. package/dist/project/detectors/index.d.ts +5 -0
  147. package/dist/project/detectors/index.d.ts.map +1 -0
  148. package/dist/project/detectors/index.js +29 -0
  149. package/dist/project/detectors/index.js.map +1 -0
  150. package/dist/project/detectors/library.d.ts +4 -0
  151. package/dist/project/detectors/library.d.ts.map +1 -0
  152. package/dist/project/detectors/library.js +122 -0
  153. package/dist/project/detectors/library.js.map +1 -0
  154. package/dist/project/detectors/library.test.d.ts +2 -0
  155. package/dist/project/detectors/library.test.d.ts.map +1 -0
  156. package/dist/project/detectors/library.test.js +95 -0
  157. package/dist/project/detectors/library.test.js.map +1 -0
  158. package/dist/project/detectors/ml.d.ts +4 -0
  159. package/dist/project/detectors/ml.d.ts.map +1 -0
  160. package/dist/project/detectors/ml.js +112 -0
  161. package/dist/project/detectors/ml.js.map +1 -0
  162. package/dist/project/detectors/ml.test.d.ts +2 -0
  163. package/dist/project/detectors/ml.test.d.ts.map +1 -0
  164. package/dist/project/detectors/ml.test.js +75 -0
  165. package/dist/project/detectors/ml.test.js.map +1 -0
  166. package/dist/project/detectors/mobile-app.d.ts +4 -0
  167. package/dist/project/detectors/mobile-app.d.ts.map +1 -0
  168. package/dist/project/detectors/mobile-app.js +58 -0
  169. package/dist/project/detectors/mobile-app.js.map +1 -0
  170. package/dist/project/detectors/mobile-app.test.d.ts +2 -0
  171. package/dist/project/detectors/mobile-app.test.d.ts.map +1 -0
  172. package/dist/project/detectors/mobile-app.test.js +57 -0
  173. package/dist/project/detectors/mobile-app.test.js.map +1 -0
  174. package/dist/project/detectors/required-fields.d.ts +4 -0
  175. package/dist/project/detectors/required-fields.d.ts.map +1 -0
  176. package/dist/project/detectors/required-fields.js +13 -0
  177. package/dist/project/detectors/required-fields.js.map +1 -0
  178. package/dist/project/detectors/required-fields.test.d.ts +2 -0
  179. package/dist/project/detectors/required-fields.test.d.ts.map +1 -0
  180. package/dist/project/detectors/required-fields.test.js +24 -0
  181. package/dist/project/detectors/required-fields.test.js.map +1 -0
  182. package/dist/project/detectors/resolve-detection.d.ts +18 -0
  183. package/dist/project/detectors/resolve-detection.d.ts.map +1 -0
  184. package/dist/project/detectors/resolve-detection.js +184 -0
  185. package/dist/project/detectors/resolve-detection.js.map +1 -0
  186. package/dist/project/detectors/resolve-detection.test.d.ts +2 -0
  187. package/dist/project/detectors/resolve-detection.test.d.ts.map +1 -0
  188. package/dist/project/detectors/resolve-detection.test.js +158 -0
  189. package/dist/project/detectors/resolve-detection.test.js.map +1 -0
  190. package/dist/project/detectors/types.d.ts +56 -0
  191. package/dist/project/detectors/types.d.ts.map +1 -0
  192. package/dist/project/detectors/types.js +9 -0
  193. package/dist/project/detectors/types.js.map +1 -0
  194. package/dist/project/detectors/web-app.d.ts +15 -0
  195. package/dist/project/detectors/web-app.d.ts.map +1 -0
  196. package/dist/project/detectors/web-app.js +228 -0
  197. package/dist/project/detectors/web-app.js.map +1 -0
  198. package/dist/project/detectors/web-app.test.d.ts +2 -0
  199. package/dist/project/detectors/web-app.test.d.ts.map +1 -0
  200. package/dist/project/detectors/web-app.test.js +95 -0
  201. package/dist/project/detectors/web-app.test.js.map +1 -0
  202. package/dist/types/config.d.ts +33 -0
  203. package/dist/types/config.d.ts.map +1 -1
  204. package/dist/types/enums.d.ts +2 -1
  205. package/dist/types/enums.d.ts.map +1 -1
  206. package/dist/types/enums.js +1 -0
  207. package/dist/types/enums.js.map +1 -1
  208. package/dist/utils/errors.d.ts +7 -0
  209. package/dist/utils/errors.d.ts.map +1 -1
  210. package/dist/utils/errors.js +38 -0
  211. package/dist/utils/errors.js.map +1 -1
  212. package/dist/utils/errors.test.js +42 -1
  213. package/dist/utils/errors.test.js.map +1 -1
  214. package/package.json +6 -2
@@ -2,6 +2,9 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import fs from 'node:fs';
5
+ import { fileURLToPath } from 'node:url';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
5
8
  // ---------------------------------------------------------------------------
6
9
  // Hoisted mocks
7
10
  // ---------------------------------------------------------------------------
@@ -72,14 +75,14 @@ describe('runAdoption', () => {
72
75
  vi.restoreAllMocks();
73
76
  });
74
77
  // Test 1: Returns 'greenfield' mode for empty directory
75
- it('returns greenfield mode for empty directory', () => {
78
+ it('returns greenfield mode for empty directory', async () => {
76
79
  mockDetectProjectMode.mockReturnValue({
77
80
  mode: 'greenfield',
78
81
  signals: [],
79
82
  methodologySuggestion: 'deep',
80
83
  sourceFileCount: 0,
81
84
  });
82
- const result = runAdoption({
85
+ const result = await runAdoption({
83
86
  projectRoot: tmpDir,
84
87
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
85
88
  methodology: 'deep',
@@ -88,7 +91,7 @@ describe('runAdoption', () => {
88
91
  expect(result.mode).toBe('greenfield');
89
92
  });
90
93
  // Test 2: Detects artifact when produces path exists on disk
91
- it('detects artifact when output path exists on disk', () => {
94
+ it('detects artifact when output path exists on disk', async () => {
92
95
  const artifactPath = 'docs/prd.md';
93
96
  const fullPath = path.join(tmpDir, artifactPath);
94
97
  fs.mkdirSync(path.dirname(fullPath), { recursive: true });
@@ -97,7 +100,7 @@ describe('runAdoption', () => {
97
100
  ['product-requirements', makeMetaPromptEntry('product-requirements', [artifactPath])],
98
101
  ]);
99
102
  mockDiscoverMetaPrompts.mockReturnValue(metaPrompts);
100
- const result = runAdoption({
103
+ const result = await runAdoption({
101
104
  projectRoot: tmpDir,
102
105
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
103
106
  methodology: 'deep',
@@ -108,7 +111,7 @@ describe('runAdoption', () => {
108
111
  expect(result.detectedArtifacts[0].matchedStep).toBe('product-requirements');
109
112
  });
110
113
  // Test 3: Strategy is 'skip-recommended' when all outputs found
111
- it('uses skip-recommended strategy when all outputs found', () => {
114
+ it('uses skip-recommended strategy when all outputs found', async () => {
112
115
  const paths = ['docs/prd.md', 'docs/user-stories.md'];
113
116
  for (const p of paths) {
114
117
  const full = path.join(tmpDir, p);
@@ -119,7 +122,7 @@ describe('runAdoption', () => {
119
122
  ['product-requirements', makeMetaPromptEntry('product-requirements', paths)],
120
123
  ]);
121
124
  mockDiscoverMetaPrompts.mockReturnValue(metaPrompts);
122
- const result = runAdoption({
125
+ const result = await runAdoption({
123
126
  projectRoot: tmpDir,
124
127
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
125
128
  methodology: 'deep',
@@ -130,7 +133,7 @@ describe('runAdoption', () => {
130
133
  }
131
134
  });
132
135
  // Test 4: Strategy is 'context-only' when only some outputs found
133
- it('uses context-only strategy when only some outputs found', () => {
136
+ it('uses context-only strategy when only some outputs found', async () => {
134
137
  const existingPath = 'docs/prd.md';
135
138
  const missingPath = 'docs/user-stories.md';
136
139
  const full = path.join(tmpDir, existingPath);
@@ -140,7 +143,7 @@ describe('runAdoption', () => {
140
143
  ['product-requirements', makeMetaPromptEntry('product-requirements', [existingPath, missingPath])],
141
144
  ]);
142
145
  mockDiscoverMetaPrompts.mockReturnValue(metaPrompts);
143
- const result = runAdoption({
146
+ const result = await runAdoption({
144
147
  projectRoot: tmpDir,
145
148
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
146
149
  methodology: 'deep',
@@ -150,7 +153,7 @@ describe('runAdoption', () => {
150
153
  expect(result.detectedArtifacts[0].strategy).toBe('context-only');
151
154
  });
152
155
  // Test 5: stepsCompleted includes matched steps
153
- it('stepsCompleted includes matched steps', () => {
156
+ it('stepsCompleted includes matched steps', async () => {
154
157
  const artifactPath = 'docs/prd.md';
155
158
  const full = path.join(tmpDir, artifactPath);
156
159
  fs.mkdirSync(path.dirname(full), { recursive: true });
@@ -160,7 +163,7 @@ describe('runAdoption', () => {
160
163
  ['user-stories', makeMetaPromptEntry('user-stories', ['docs/user-stories.md'])],
161
164
  ]);
162
165
  mockDiscoverMetaPrompts.mockReturnValue(metaPrompts);
163
- const result = runAdoption({
166
+ const result = await runAdoption({
164
167
  projectRoot: tmpDir,
165
168
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
166
169
  methodology: 'deep',
@@ -170,13 +173,13 @@ describe('runAdoption', () => {
170
173
  expect(result.stepsCompleted).not.toContain('user-stories');
171
174
  });
172
175
  // Test 6: stepsRemaining includes unmatched steps
173
- it('stepsRemaining includes unmatched steps', () => {
176
+ it('stepsRemaining includes unmatched steps', async () => {
174
177
  const metaPrompts = new Map([
175
178
  ['product-requirements', makeMetaPromptEntry('product-requirements', ['docs/prd.md'])],
176
179
  ['user-stories', makeMetaPromptEntry('user-stories', ['docs/user-stories.md'])],
177
180
  ]);
178
181
  mockDiscoverMetaPrompts.mockReturnValue(metaPrompts);
179
- const result = runAdoption({
182
+ const result = await runAdoption({
180
183
  projectRoot: tmpDir,
181
184
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
182
185
  methodology: 'deep',
@@ -186,10 +189,10 @@ describe('runAdoption', () => {
186
189
  expect(result.stepsRemaining).toContain('user-stories');
187
190
  });
188
191
  // Test 7: dryRun mode doesn't write state.json
189
- it('dryRun mode does not write state.json', () => {
192
+ it('dryRun mode does not write state.json', async () => {
190
193
  const scaffoldDir = path.join(tmpDir, '.scaffold');
191
194
  fs.mkdirSync(scaffoldDir, { recursive: true });
192
- const result = runAdoption({
195
+ const result = await runAdoption({
193
196
  projectRoot: tmpDir,
194
197
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
195
198
  methodology: 'deep',
@@ -200,47 +203,63 @@ describe('runAdoption', () => {
200
203
  expect(result.mode).toBe('greenfield');
201
204
  });
202
205
  // Test 8: Detects Unity project (Assets/ with .meta files)
203
- it('detects Unity project when Assets/ contains .meta files', () => {
206
+ it('detects Unity project when Assets/ contains .meta files', async () => {
204
207
  const assetsDir = path.join(tmpDir, 'Assets');
205
208
  fs.mkdirSync(assetsDir, { recursive: true });
206
209
  fs.writeFileSync(path.join(assetsDir, 'foo.meta'), '');
207
- const result = runAdoption({
210
+ const result = await runAdoption({
208
211
  projectRoot: tmpDir,
209
212
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
210
213
  methodology: 'deep',
211
214
  dryRun: false,
215
+ auto: true,
212
216
  });
213
217
  expect(result.projectType).toBe('game');
214
- expect(result.gameConfig).toEqual({ engine: 'unity' });
218
+ // gameConfig now includes Zod defaults from GameConfigSchema.parse()
219
+ expect(result.gameConfig).toEqual(expect.objectContaining({ engine: 'unity' }));
220
+ expect(result.detectedConfig?.type).toBe('game');
221
+ expect(result.detectedConfig?.config).toEqual(expect.objectContaining({ engine: 'unity' }));
222
+ expect(Array.isArray(result.detectionEvidence)).toBe(true);
223
+ expect(result.detectionConfidence).toBe('high');
215
224
  });
216
225
  // Test 9: Detects Unreal project (.uproject file)
217
- it('detects Unreal project when .uproject file exists', () => {
226
+ it('detects Unreal project when .uproject file exists', async () => {
218
227
  fs.writeFileSync(path.join(tmpDir, 'MyGame.uproject'), '{}');
219
- const result = runAdoption({
228
+ const result = await runAdoption({
220
229
  projectRoot: tmpDir,
221
230
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
222
231
  methodology: 'deep',
223
232
  dryRun: false,
233
+ auto: true,
224
234
  });
225
235
  expect(result.projectType).toBe('game');
226
- expect(result.gameConfig).toEqual({ engine: 'unreal' });
236
+ expect(result.gameConfig).toEqual(expect.objectContaining({ engine: 'unreal' }));
237
+ expect(result.detectedConfig?.type).toBe('game');
238
+ expect(result.detectedConfig?.config).toEqual(expect.objectContaining({ engine: 'unreal' }));
239
+ expect(Array.isArray(result.detectionEvidence)).toBe(true);
240
+ expect(result.detectionConfidence).toBe('high');
227
241
  });
228
242
  // Test 10: Detects Godot project (project.godot file)
229
- it('detects Godot project when project.godot exists', () => {
243
+ it('detects Godot project when project.godot exists', async () => {
230
244
  fs.writeFileSync(path.join(tmpDir, 'project.godot'), '[gd_scene]');
231
- const result = runAdoption({
245
+ const result = await runAdoption({
232
246
  projectRoot: tmpDir,
233
247
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
234
248
  methodology: 'deep',
235
249
  dryRun: false,
250
+ auto: true,
236
251
  });
237
252
  expect(result.projectType).toBe('game');
238
- expect(result.gameConfig).toEqual({ engine: 'godot' });
253
+ expect(result.gameConfig).toEqual(expect.objectContaining({ engine: 'godot' }));
254
+ expect(result.detectedConfig?.type).toBe('game');
255
+ expect(result.detectedConfig?.config).toEqual(expect.objectContaining({ engine: 'godot' }));
256
+ expect(Array.isArray(result.detectionEvidence)).toBe(true);
257
+ expect(result.detectionConfidence).toBe('high');
239
258
  });
240
259
  // Test 11: Non-game project returns no projectType
241
- it('returns no projectType for non-game project', () => {
260
+ it('returns no projectType for non-game project', async () => {
242
261
  // tmpDir is empty — no game engine files
243
- const result = runAdoption({
262
+ const result = await runAdoption({
244
263
  projectRoot: tmpDir,
245
264
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
246
265
  methodology: 'deep',
@@ -248,9 +267,12 @@ describe('runAdoption', () => {
248
267
  });
249
268
  expect(result.projectType).toBeUndefined();
250
269
  expect(result.gameConfig).toBeUndefined();
270
+ expect(result.detectedConfig).toBeUndefined();
271
+ expect(result.detectionEvidence).toBeUndefined();
272
+ expect(result.detectionConfidence).toBeUndefined();
251
273
  });
252
274
  // Test 12: artifactsFound count matches detected artifacts
253
- it('artifactsFound count matches detected artifacts array length', () => {
275
+ it('artifactsFound count matches detected artifacts array length', async () => {
254
276
  const paths = ['docs/prd.md', 'docs/user-stories.md'];
255
277
  for (const p of paths) {
256
278
  const full = path.join(tmpDir, p);
@@ -262,7 +284,7 @@ describe('runAdoption', () => {
262
284
  ['step-b', makeMetaPromptEntry('step-b', ['docs/user-stories.md'])],
263
285
  ]);
264
286
  mockDiscoverMetaPrompts.mockReturnValue(metaPrompts);
265
- const result = runAdoption({
287
+ const result = await runAdoption({
266
288
  projectRoot: tmpDir,
267
289
  metaPromptDir: path.join(tmpDir, 'content', 'pipeline'),
268
290
  methodology: 'deep',
@@ -271,5 +293,28 @@ describe('runAdoption', () => {
271
293
  expect(result.artifactsFound).toBe(result.detectedArtifacts.length);
272
294
  expect(result.artifactsFound).toBe(2);
273
295
  });
296
+ // Test 13: Unity wins precedence when multi-engine signatures coexist
297
+ it('Unity wins precedence when multi-engine signatures coexist', async () => {
298
+ // Regression test for Unity > Unreal > Godot precedence.
299
+ // Fixture has Assets/*.meta + .uproject + project.godot simultaneously.
300
+ // Pins existing inline logic in src/project/adopt.ts before Task 5
301
+ // relocates detection to src/project/adopt/detectors/game.ts.
302
+ const fixturePath = path.join(__dirname, '../../tests/fixtures/adopt/detectors/game/multi-engine');
303
+ const result = await runAdoption({
304
+ projectRoot: fixturePath,
305
+ metaPromptDir: path.join(fixturePath, 'content', 'pipeline'),
306
+ methodology: 'deep',
307
+ dryRun: true,
308
+ auto: true,
309
+ });
310
+ expect(result.projectType).toBe('game');
311
+ // gameConfig now includes Zod defaults from GameConfigSchema.parse()
312
+ expect(result.gameConfig).toEqual(expect.objectContaining({ engine: 'unity' }));
313
+ expect(result.detectedConfig?.type).toBe('game');
314
+ expect(result.detectedConfig?.config).toEqual(expect.objectContaining({ engine: 'unity' }));
315
+ expect(Array.isArray(result.detectionEvidence)).toBe(true);
316
+ expect(result.detectionConfidence).toBe('high');
317
+ // Unity must win because Assets/*.meta is detected first in adopt.ts:74-82
318
+ });
274
319
  });
275
320
  //# sourceMappingURL=adopt.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adopt.test.js","sourceRoot":"","sources":["../../src/project/adopt.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adopt.test.js","sourceRoot":"","sources":["../../src/project/adopt.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SignalContext } from './context.js';
2
+ import type { BackendMatch } from './types.js';
3
+ export declare function detectBackend(ctx: SignalContext): BackendMatch | null;
4
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/project/detectors/backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAA;AAgGjE,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI,CAyGrE"}
@@ -0,0 +1,199 @@
1
+ import { evidence } from './types.js';
2
+ const FRAMEWORKS = [
3
+ // Node
4
+ {
5
+ dep: 'express', kind: 'npm',
6
+ listenPatterns: ['.listen(', 'createServer('],
7
+ entryFiles: ['src/index.ts', 'src/server.ts', 'src/main.ts', 'index.js', 'server.js'],
8
+ routesDirs: ['src/routes', 'routes', 'src/api', 'app/api'],
9
+ },
10
+ {
11
+ dep: 'fastify', kind: 'npm',
12
+ listenPatterns: ['.listen(', 'fastify.listen'],
13
+ entryFiles: ['src/index.ts', 'src/server.ts'],
14
+ routesDirs: ['src/routes', 'routes'],
15
+ },
16
+ {
17
+ dep: '@nestjs/core', kind: 'npm',
18
+ listenPatterns: ['app.listen(', 'bootstrap('],
19
+ entryFiles: ['src/main.ts'],
20
+ routesDirs: ['src/modules', 'src/controllers'],
21
+ },
22
+ {
23
+ dep: 'koa', kind: 'npm',
24
+ listenPatterns: ['.listen(', 'app.listen'],
25
+ entryFiles: ['src/index.ts', 'src/app.ts'],
26
+ routesDirs: ['src/routes'],
27
+ },
28
+ {
29
+ dep: 'hono', kind: 'npm',
30
+ listenPatterns: ['serve(', 'Hono('],
31
+ entryFiles: ['src/index.ts'],
32
+ routesDirs: ['src/routes'],
33
+ },
34
+ // Python
35
+ {
36
+ dep: 'django', kind: 'py',
37
+ listenPatterns: ['runserver', 'WSGIHandler', 'ASGIHandler'],
38
+ entryFiles: ['manage.py', 'wsgi.py', 'asgi.py'],
39
+ routesDirs: [],
40
+ },
41
+ {
42
+ dep: 'fastapi', kind: 'py',
43
+ listenPatterns: ['uvicorn.run(', 'FastAPI('],
44
+ entryFiles: ['main.py', 'app.py', 'src/main.py'],
45
+ routesDirs: ['routers', 'app/routers'],
46
+ },
47
+ {
48
+ dep: 'flask', kind: 'py',
49
+ listenPatterns: ['app.run(', 'Flask(__name__)'],
50
+ entryFiles: ['app.py', 'main.py', 'wsgi.py'],
51
+ routesDirs: ['routes', 'app/routes'],
52
+ },
53
+ // Go
54
+ {
55
+ dep: 'github.com/gin-gonic/gin', kind: 'go',
56
+ listenPatterns: ['r.Run(', 'gin.Default(', '.Run(":'],
57
+ entryFiles: ['cmd/server/main.go', 'cmd/api/main.go', 'main.go'],
58
+ routesDirs: ['internal/routes', 'internal/handlers'],
59
+ },
60
+ {
61
+ dep: 'github.com/labstack/echo', kind: 'go',
62
+ listenPatterns: ['e.Start(', 'echo.New('],
63
+ entryFiles: ['cmd/server/main.go', 'main.go'],
64
+ routesDirs: ['internal/handlers'],
65
+ },
66
+ // Rust
67
+ {
68
+ dep: 'actix-web', kind: 'cargo',
69
+ listenPatterns: ['HttpServer::new(', '.bind('],
70
+ entryFiles: ['src/main.rs'],
71
+ routesDirs: ['src/routes', 'src/handlers'],
72
+ },
73
+ {
74
+ dep: 'axum', kind: 'cargo',
75
+ listenPatterns: ['axum::serve(', 'Router::new('],
76
+ entryFiles: ['src/main.rs'],
77
+ routesDirs: ['src/routes'],
78
+ },
79
+ {
80
+ dep: 'rocket', kind: 'cargo',
81
+ listenPatterns: ['.launch()', '#[launch]'],
82
+ entryFiles: ['src/main.rs'],
83
+ routesDirs: ['src/routes'],
84
+ },
85
+ ];
86
+ export function detectBackend(ctx) {
87
+ // Find any framework dep
88
+ let matched = null;
89
+ for (const fw of FRAMEWORKS) {
90
+ if (!ctx.hasDep(fw.dep, fw.kind))
91
+ continue;
92
+ const routes = fw.routesDirs.some(d => ctx.dirExists(d));
93
+ let entry = false;
94
+ for (const ef of fw.entryFiles) {
95
+ const text = ctx.readFileText(ef);
96
+ if (text && fw.listenPatterns.some(p => text.includes(p))) {
97
+ entry = true;
98
+ break;
99
+ }
100
+ }
101
+ matched = { fw, routes, entry };
102
+ break;
103
+ }
104
+ if (!matched)
105
+ return null;
106
+ const manifestFile = matched.fw.kind === 'npm' ? 'package.json'
107
+ : matched.fw.kind === 'py' ? 'pyproject.toml'
108
+ : matched.fw.kind === 'cargo' ? 'Cargo.toml'
109
+ : 'go.mod';
110
+ const ev = [evidence(`${matched.fw.dep}-dep`, manifestFile)];
111
+ // Tier
112
+ let confidence;
113
+ if (matched.routes) {
114
+ confidence = 'high';
115
+ ev.push(evidence('routes-dir'));
116
+ }
117
+ else if (matched.entry) {
118
+ confidence = 'medium';
119
+ ev.push(evidence('listen-call'));
120
+ }
121
+ else {
122
+ confidence = 'low';
123
+ }
124
+ // apiStyle
125
+ let apiStyle;
126
+ if (ctx.hasAnyDep(['@apollo/server', 'apollo-server', 'graphql-yoga'], 'npm')
127
+ || ctx.hasDep('strawberry-graphql', 'py')) {
128
+ apiStyle = 'graphql';
129
+ }
130
+ else if (ctx.hasDep('@trpc/server', 'npm')) {
131
+ apiStyle = 'trpc';
132
+ }
133
+ else if (ctx.hasAnyDep(['@grpc/grpc-js', 'grpc'], 'npm')
134
+ || ctx.hasDep('grpcio', 'py')
135
+ || ctx.hasDep('google.golang.org/grpc', 'go')) {
136
+ apiStyle = 'grpc';
137
+ }
138
+ else {
139
+ apiStyle = 'rest';
140
+ }
141
+ // dataStore — redis is cache unless sole signal
142
+ const relDeps = [
143
+ 'pg', 'postgres', 'mysql2', 'mariadb', 'better-sqlite3',
144
+ 'sqlite3', 'prisma', 'drizzle-orm', 'typeorm', 'knex',
145
+ ];
146
+ const hasRel = ctx.hasAnyDep(relDeps, 'npm')
147
+ || ctx.hasAnyDep(['psycopg', 'psycopg2', 'sqlalchemy', 'asyncpg', 'mysqlclient'], 'py');
148
+ const hasDoc = ctx.hasAnyDep(['mongodb', 'mongoose'], 'npm')
149
+ || ctx.hasAnyDep(['pymongo', 'motor'], 'py');
150
+ const hasKv = ctx.hasAnyDep(['redis', 'ioredis'], 'npm')
151
+ || ctx.hasDep('redis', 'py');
152
+ const stores = [];
153
+ if (hasRel)
154
+ stores.push('relational');
155
+ if (hasDoc)
156
+ stores.push('document');
157
+ if (hasKv && !hasRel && !hasDoc)
158
+ stores.push('key-value');
159
+ // authMechanism
160
+ let authMechanism;
161
+ if (ctx.hasAnyDep(['jsonwebtoken', '@nestjs/jwt', 'jose'], 'npm')) {
162
+ authMechanism = 'jwt';
163
+ }
164
+ else if (ctx.hasAnyDep(['passport', 'express-session'], 'npm')) {
165
+ authMechanism = 'session';
166
+ }
167
+ else if (ctx.hasAnyDep(['passport-oauth2'], 'npm')) {
168
+ authMechanism = 'oauth';
169
+ }
170
+ // asyncMessaging
171
+ let asyncMessaging;
172
+ const hasQueue = ctx.hasAnyDep(['bullmq', 'bull', 'bee-queue'], 'npm')
173
+ || ctx.hasAnyDep(['celery', 'rq'], 'py');
174
+ const hasEvents = ctx.hasAnyDep(['kafkajs', '@confluentinc/kafka-javascript', 'amqplib', 'nats'], 'npm') || ctx.hasAnyDep(['confluent-kafka', 'pika'], 'py');
175
+ if (hasQueue)
176
+ asyncMessaging = 'queue';
177
+ else if (hasEvents)
178
+ asyncMessaging = 'event-driven';
179
+ // deployTarget
180
+ let deployTarget;
181
+ if (ctx.hasFile('Dockerfile') || ctx.hasFile('docker-compose.yml')) {
182
+ deployTarget = 'container';
183
+ }
184
+ if (ctx.hasFile('serverless.yml') || ctx.hasFile('sam.yaml')
185
+ || ctx.hasDep('mangum', 'py')) {
186
+ deployTarget = 'serverless';
187
+ }
188
+ const partialConfig = { apiStyle };
189
+ if (stores.length > 0)
190
+ partialConfig.dataStore = stores;
191
+ if (authMechanism)
192
+ partialConfig.authMechanism = authMechanism;
193
+ if (asyncMessaging)
194
+ partialConfig.asyncMessaging = asyncMessaging;
195
+ if (deployTarget)
196
+ partialConfig.deployTarget = deployTarget;
197
+ return { projectType: 'backend', confidence, partialConfig, evidence: ev };
198
+ }
199
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../../src/project/detectors/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backend.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.test.d.ts","sourceRoot":"","sources":["../../../src/project/detectors/backend.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { createSignalContext, createFakeSignalContext } from './context.js';
5
+ import { detectBackend } from './backend.js';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ const FIXTURES = path.join(__dirname, '../../../tests/fixtures/adopt/detectors/backend');
9
+ describe('detectBackend', () => {
10
+ it('detects Express + Postgres + JWT (high tier with routes dir)', () => {
11
+ const ctx = createSignalContext(path.join(FIXTURES, 'express-postgres'));
12
+ const m = detectBackend(ctx);
13
+ expect(m?.projectType).toBe('backend');
14
+ expect(m?.confidence).toBe('high');
15
+ expect(m?.partialConfig.apiStyle).toBe('rest');
16
+ expect(m?.partialConfig.dataStore).toContain('relational');
17
+ expect(m?.partialConfig.authMechanism).toBe('jwt');
18
+ });
19
+ it('Redis as cache (NOT primary): postgres + redis → dataStore is relational only', () => {
20
+ const ctx = createSignalContext(path.join(FIXTURES, 'fastapi-redis'));
21
+ const m = detectBackend(ctx);
22
+ expect(m?.partialConfig.dataStore).toEqual(['relational']); // redis omitted
23
+ expect(m?.partialConfig.apiStyle).toBe('rest');
24
+ });
25
+ it('Redis as sole datastore → key-value', () => {
26
+ const ctx = createFakeSignalContext({
27
+ packageJson: { name: 'cache-svc', dependencies: { express: '4', redis: '4' } },
28
+ files: { 'src/index.ts': 'app.listen(3000)' },
29
+ dirs: ['src/routes'],
30
+ });
31
+ const m = detectBackend(ctx);
32
+ expect(m?.partialConfig.dataStore).toEqual(['key-value']);
33
+ });
34
+ it('Gin Go: detects via .Run( pattern', () => {
35
+ const ctx = createSignalContext(path.join(FIXTURES, 'gin-go'));
36
+ const m = detectBackend(ctx);
37
+ expect(m?.partialConfig.apiStyle).toBe('rest');
38
+ });
39
+ it('NestJS + Apollo → graphql (overrides rest)', () => {
40
+ const ctx = createSignalContext(path.join(FIXTURES, 'nestjs'));
41
+ const m = detectBackend(ctx);
42
+ expect(m?.partialConfig.apiStyle).toBe('graphql');
43
+ });
44
+ it('Framework dep alone, no entry, no routes → low tier', () => {
45
+ const ctx = createFakeSignalContext({
46
+ packageJson: { name: 'demo', devDependencies: { express: '4' } },
47
+ });
48
+ const m = detectBackend(ctx);
49
+ expect(m?.confidence).toBe('low');
50
+ });
51
+ it('Framework dep + entry with .listen( + no routes → medium', () => {
52
+ const ctx = createFakeSignalContext({
53
+ packageJson: { name: 'demo', dependencies: { fastify: '4' } },
54
+ files: { 'src/index.ts': 'fastify.listen({ port: 3000 })' },
55
+ });
56
+ const m = detectBackend(ctx);
57
+ expect(m?.confidence).toBe('medium');
58
+ });
59
+ it('returns null when no framework dep present', () => {
60
+ const ctx = createFakeSignalContext({ packageJson: { name: 'demo' } });
61
+ expect(detectBackend(ctx)).toBeNull();
62
+ });
63
+ });
64
+ //# sourceMappingURL=backend.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.test.js","sourceRoot":"","sources":["../../../src/project/detectors/backend.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SignalContext } from './context.js';
2
+ import type { BrowserExtensionMatch } from './types.js';
3
+ export declare function detectBrowserExtension(ctx: SignalContext): BrowserExtensionMatch | null;
4
+ //# sourceMappingURL=browser-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-extension.d.ts","sourceRoot":"","sources":["../../../src/project/detectors/browser-extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAqB,MAAM,YAAY,CAAA;AAkB1E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,GAAG,qBAAqB,GAAG,IAAI,CAwDvF"}