@zigrivers/scaffold 3.9.1 → 3.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -8
- package/dist/cli/commands/adopt.d.ts +2 -0
- package/dist/cli/commands/adopt.d.ts.map +1 -1
- package/dist/cli/commands/adopt.js +428 -58
- package/dist/cli/commands/adopt.js.map +1 -1
- package/dist/cli/commands/adopt.performance.test.d.ts +2 -0
- package/dist/cli/commands/adopt.performance.test.d.ts.map +1 -0
- package/dist/cli/commands/adopt.performance.test.js +30 -0
- package/dist/cli/commands/adopt.performance.test.js.map +1 -0
- package/dist/cli/commands/adopt.test.js +18 -6
- package/dist/cli/commands/adopt.test.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +70 -207
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/init.test.js +114 -3
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/init-flag-families.d.ts +86 -0
- package/dist/cli/init-flag-families.d.ts.map +1 -0
- package/dist/cli/init-flag-families.js +418 -0
- package/dist/cli/init-flag-families.js.map +1 -0
- package/dist/cli/init-flag-families.test.d.ts +2 -0
- package/dist/cli/init-flag-families.test.d.ts.map +1 -0
- package/dist/cli/init-flag-families.test.js +268 -0
- package/dist/cli/init-flag-families.test.js.map +1 -0
- package/dist/cli/utils/coerce.d.ts +8 -0
- package/dist/cli/utils/coerce.d.ts.map +1 -0
- package/dist/cli/utils/coerce.js +12 -0
- package/dist/cli/utils/coerce.js.map +1 -0
- package/dist/cli/utils/coerce.test.d.ts +2 -0
- package/dist/cli/utils/coerce.test.d.ts.map +1 -0
- package/dist/cli/utils/coerce.test.js +29 -0
- package/dist/cli/utils/coerce.test.js.map +1 -0
- package/dist/config/schema.d.ts +6 -6
- package/dist/config/schema.js +2 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/config/schema.test.js +10 -4
- package/dist/config/schema.test.js.map +1 -1
- package/dist/e2e/adopt-multi-type.test.d.ts +2 -0
- package/dist/e2e/adopt-multi-type.test.d.ts.map +1 -0
- package/dist/e2e/adopt-multi-type.test.js +35 -0
- package/dist/e2e/adopt-multi-type.test.js.map +1 -0
- package/dist/e2e/game-pipeline.test.js +1 -1
- package/dist/e2e/game-pipeline.test.js.map +1 -1
- package/dist/e2e/project-type-overlays.test.js +19 -18
- package/dist/e2e/project-type-overlays.test.js.map +1 -1
- package/dist/project/__frozen-schemas__/schema-v3.9.2.d.ts +2891 -0
- package/dist/project/__frozen-schemas__/schema-v3.9.2.d.ts.map +1 -0
- package/dist/project/__frozen-schemas__/schema-v3.9.2.js +177 -0
- package/dist/project/__frozen-schemas__/schema-v3.9.2.js.map +1 -0
- package/dist/project/adopt.d.ts +38 -2
- package/dist/project/adopt.d.ts.map +1 -1
- package/dist/project/adopt.error-messages.test.d.ts +2 -0
- package/dist/project/adopt.error-messages.test.d.ts.map +1 -0
- package/dist/project/adopt.error-messages.test.js +112 -0
- package/dist/project/adopt.error-messages.test.js.map +1 -0
- package/dist/project/adopt.forward-compat.test.d.ts +2 -0
- package/dist/project/adopt.forward-compat.test.d.ts.map +1 -0
- package/dist/project/adopt.forward-compat.test.js +71 -0
- package/dist/project/adopt.forward-compat.test.js.map +1 -0
- package/dist/project/adopt.js +218 -27
- package/dist/project/adopt.js.map +1 -1
- package/dist/project/adopt.merge.test.d.ts +2 -0
- package/dist/project/adopt.merge.test.d.ts.map +1 -0
- package/dist/project/adopt.merge.test.js +62 -0
- package/dist/project/adopt.merge.test.js.map +1 -0
- package/dist/project/adopt.re-adoption.test.d.ts +2 -0
- package/dist/project/adopt.re-adoption.test.d.ts.map +1 -0
- package/dist/project/adopt.re-adoption.test.js +222 -0
- package/dist/project/adopt.re-adoption.test.js.map +1 -0
- package/dist/project/adopt.test.js +72 -27
- package/dist/project/adopt.test.js.map +1 -1
- package/dist/project/detectors/backend.d.ts +4 -0
- package/dist/project/detectors/backend.d.ts.map +1 -0
- package/dist/project/detectors/backend.js +199 -0
- package/dist/project/detectors/backend.js.map +1 -0
- package/dist/project/detectors/backend.test.d.ts +2 -0
- package/dist/project/detectors/backend.test.d.ts.map +1 -0
- package/dist/project/detectors/backend.test.js +64 -0
- package/dist/project/detectors/backend.test.js.map +1 -0
- package/dist/project/detectors/browser-extension.d.ts +4 -0
- package/dist/project/detectors/browser-extension.d.ts.map +1 -0
- package/dist/project/detectors/browser-extension.js +61 -0
- package/dist/project/detectors/browser-extension.js.map +1 -0
- package/dist/project/detectors/browser-extension.test.d.ts +2 -0
- package/dist/project/detectors/browser-extension.test.d.ts.map +1 -0
- package/dist/project/detectors/browser-extension.test.js +64 -0
- package/dist/project/detectors/browser-extension.test.js.map +1 -0
- package/dist/project/detectors/cli.d.ts +4 -0
- package/dist/project/detectors/cli.d.ts.map +1 -0
- package/dist/project/detectors/cli.js +68 -0
- package/dist/project/detectors/cli.js.map +1 -0
- package/dist/project/detectors/cli.test.d.ts +2 -0
- package/dist/project/detectors/cli.test.d.ts.map +1 -0
- package/dist/project/detectors/cli.test.js +70 -0
- package/dist/project/detectors/cli.test.js.map +1 -0
- package/dist/project/detectors/context.d.ts +105 -0
- package/dist/project/detectors/context.d.ts.map +1 -0
- package/dist/project/detectors/context.js +652 -0
- package/dist/project/detectors/context.js.map +1 -0
- package/dist/project/detectors/context.test.d.ts +2 -0
- package/dist/project/detectors/context.test.d.ts.map +1 -0
- package/dist/project/detectors/context.test.js +240 -0
- package/dist/project/detectors/context.test.js.map +1 -0
- package/dist/project/detectors/data-pipeline.d.ts +4 -0
- package/dist/project/detectors/data-pipeline.d.ts.map +1 -0
- package/dist/project/detectors/data-pipeline.js +97 -0
- package/dist/project/detectors/data-pipeline.js.map +1 -0
- package/dist/project/detectors/data-pipeline.test.d.ts +2 -0
- package/dist/project/detectors/data-pipeline.test.d.ts.map +1 -0
- package/dist/project/detectors/data-pipeline.test.js +67 -0
- package/dist/project/detectors/data-pipeline.test.js.map +1 -0
- package/dist/project/detectors/disambiguate.d.ts +12 -0
- package/dist/project/detectors/disambiguate.d.ts.map +1 -0
- package/dist/project/detectors/disambiguate.js +87 -0
- package/dist/project/detectors/disambiguate.js.map +1 -0
- package/dist/project/detectors/disambiguate.test.d.ts +2 -0
- package/dist/project/detectors/disambiguate.test.d.ts.map +1 -0
- package/dist/project/detectors/disambiguate.test.js +114 -0
- package/dist/project/detectors/disambiguate.test.js.map +1 -0
- package/dist/project/detectors/file-text-match.d.ts +3 -0
- package/dist/project/detectors/file-text-match.d.ts.map +1 -0
- package/dist/project/detectors/file-text-match.js +60 -0
- package/dist/project/detectors/file-text-match.js.map +1 -0
- package/dist/project/detectors/file-text-match.test.d.ts +2 -0
- package/dist/project/detectors/file-text-match.test.d.ts.map +1 -0
- package/dist/project/detectors/file-text-match.test.js +81 -0
- package/dist/project/detectors/file-text-match.test.js.map +1 -0
- package/dist/project/detectors/game.d.ts +18 -0
- package/dist/project/detectors/game.d.ts.map +1 -0
- package/dist/project/detectors/game.js +83 -0
- package/dist/project/detectors/game.js.map +1 -0
- package/dist/project/detectors/game.test.d.ts +2 -0
- package/dist/project/detectors/game.test.d.ts.map +1 -0
- package/dist/project/detectors/game.test.js +87 -0
- package/dist/project/detectors/game.test.js.map +1 -0
- package/dist/project/detectors/index.d.ts +5 -0
- package/dist/project/detectors/index.d.ts.map +1 -0
- package/dist/project/detectors/index.js +29 -0
- package/dist/project/detectors/index.js.map +1 -0
- package/dist/project/detectors/library.d.ts +4 -0
- package/dist/project/detectors/library.d.ts.map +1 -0
- package/dist/project/detectors/library.js +117 -0
- package/dist/project/detectors/library.js.map +1 -0
- package/dist/project/detectors/library.test.d.ts +2 -0
- package/dist/project/detectors/library.test.d.ts.map +1 -0
- package/dist/project/detectors/library.test.js +73 -0
- package/dist/project/detectors/library.test.js.map +1 -0
- package/dist/project/detectors/ml.d.ts +4 -0
- package/dist/project/detectors/ml.d.ts.map +1 -0
- package/dist/project/detectors/ml.js +112 -0
- package/dist/project/detectors/ml.js.map +1 -0
- package/dist/project/detectors/ml.test.d.ts +2 -0
- package/dist/project/detectors/ml.test.d.ts.map +1 -0
- package/dist/project/detectors/ml.test.js +75 -0
- package/dist/project/detectors/ml.test.js.map +1 -0
- package/dist/project/detectors/mobile-app.d.ts +4 -0
- package/dist/project/detectors/mobile-app.d.ts.map +1 -0
- package/dist/project/detectors/mobile-app.js +58 -0
- package/dist/project/detectors/mobile-app.js.map +1 -0
- package/dist/project/detectors/mobile-app.test.d.ts +2 -0
- package/dist/project/detectors/mobile-app.test.d.ts.map +1 -0
- package/dist/project/detectors/mobile-app.test.js +57 -0
- package/dist/project/detectors/mobile-app.test.js.map +1 -0
- package/dist/project/detectors/required-fields.d.ts +4 -0
- package/dist/project/detectors/required-fields.d.ts.map +1 -0
- package/dist/project/detectors/required-fields.js +13 -0
- package/dist/project/detectors/required-fields.js.map +1 -0
- package/dist/project/detectors/required-fields.test.d.ts +2 -0
- package/dist/project/detectors/required-fields.test.d.ts.map +1 -0
- package/dist/project/detectors/required-fields.test.js +24 -0
- package/dist/project/detectors/required-fields.test.js.map +1 -0
- package/dist/project/detectors/resolve-detection.d.ts +18 -0
- package/dist/project/detectors/resolve-detection.d.ts.map +1 -0
- package/dist/project/detectors/resolve-detection.js +184 -0
- package/dist/project/detectors/resolve-detection.js.map +1 -0
- package/dist/project/detectors/resolve-detection.test.d.ts +2 -0
- package/dist/project/detectors/resolve-detection.test.d.ts.map +1 -0
- package/dist/project/detectors/resolve-detection.test.js +158 -0
- package/dist/project/detectors/resolve-detection.test.js.map +1 -0
- package/dist/project/detectors/types.d.ts +56 -0
- package/dist/project/detectors/types.d.ts.map +1 -0
- package/dist/project/detectors/types.js +9 -0
- package/dist/project/detectors/types.js.map +1 -0
- package/dist/project/detectors/web-app.d.ts +15 -0
- package/dist/project/detectors/web-app.d.ts.map +1 -0
- package/dist/project/detectors/web-app.js +228 -0
- package/dist/project/detectors/web-app.js.map +1 -0
- package/dist/project/detectors/web-app.test.d.ts +2 -0
- package/dist/project/detectors/web-app.test.d.ts.map +1 -0
- package/dist/project/detectors/web-app.test.js +95 -0
- package/dist/project/detectors/web-app.test.js.map +1 -0
- package/dist/types/config.d.ts +41 -17
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/enums.d.ts +2 -1
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/enums.js +1 -0
- package/dist/types/enums.js.map +1 -1
- package/dist/utils/errors.d.ts +7 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +38 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/errors.test.js +42 -1
- package/dist/utils/errors.test.js.map +1 -1
- package/dist/wizard/flags.d.ts +82 -0
- package/dist/wizard/flags.d.ts.map +1 -0
- package/dist/wizard/flags.js +19 -0
- package/dist/wizard/flags.js.map +1 -0
- package/dist/wizard/questions.d.ts +10 -45
- package/dist/wizard/questions.d.ts.map +1 -1
- package/dist/wizard/questions.js +119 -156
- package/dist/wizard/questions.js.map +1 -1
- package/dist/wizard/questions.test.js +73 -55
- package/dist/wizard/questions.test.js.map +1 -1
- package/dist/wizard/wizard.d.ts +11 -45
- package/dist/wizard/wizard.d.ts.map +1 -1
- package/dist/wizard/wizard.js +10 -46
- package/dist/wizard/wizard.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { evidence } from './types.js';
|
|
2
|
+
export function detectBrowserExtension(ctx) {
|
|
3
|
+
if (!ctx.hasFile('manifest.json'))
|
|
4
|
+
return null;
|
|
5
|
+
const text = ctx.readFileText('manifest.json', 16384);
|
|
6
|
+
if (text === undefined)
|
|
7
|
+
return null;
|
|
8
|
+
let manifest;
|
|
9
|
+
try {
|
|
10
|
+
manifest = JSON.parse(text);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// SignalContext already emits ADOPT_FILE_UNREADABLE / unparseable warnings if applicable
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
// CRITICAL: strict integer check (rejects PWA manifests + string "3")
|
|
17
|
+
const mv = manifest.manifest_version;
|
|
18
|
+
if (mv !== 2 && mv !== 3)
|
|
19
|
+
return null;
|
|
20
|
+
const ev = [evidence('manifest-version', 'manifest.json', `MV${mv}`)];
|
|
21
|
+
const partialConfig = {
|
|
22
|
+
manifestVersion: mv === 2 ? '2' : '3',
|
|
23
|
+
};
|
|
24
|
+
// CRITICAL: only set fields when positive evidence — omit otherwise so Zod defaults apply
|
|
25
|
+
if (Array.isArray(manifest.content_scripts) && manifest.content_scripts.length > 0) {
|
|
26
|
+
partialConfig.hasContentScript = true;
|
|
27
|
+
ev.push(evidence('content-scripts'));
|
|
28
|
+
}
|
|
29
|
+
const bgScripts = Array.isArray(manifest.background?.scripts) && manifest.background.scripts.length > 0;
|
|
30
|
+
if (manifest.background?.service_worker || bgScripts) {
|
|
31
|
+
partialConfig.hasBackgroundWorker = true;
|
|
32
|
+
ev.push(evidence('background-worker'));
|
|
33
|
+
}
|
|
34
|
+
const uiSurfaces = [];
|
|
35
|
+
if (manifest.action?.default_popup || manifest.browser_action?.default_popup)
|
|
36
|
+
uiSurfaces.push('popup');
|
|
37
|
+
if (manifest.options_ui || manifest.options_page)
|
|
38
|
+
uiSurfaces.push('options');
|
|
39
|
+
if (manifest.chrome_url_overrides?.newtab)
|
|
40
|
+
uiSurfaces.push('newtab');
|
|
41
|
+
if (manifest.devtools_page)
|
|
42
|
+
uiSurfaces.push('devtools');
|
|
43
|
+
if (manifest.side_panel)
|
|
44
|
+
uiSurfaces.push('sidepanel');
|
|
45
|
+
if (uiSurfaces.length > 0)
|
|
46
|
+
partialConfig.uiSurfaces = uiSurfaces;
|
|
47
|
+
// Minimal extension warning (e.g. theme extensions with no UI/scripts/worker)
|
|
48
|
+
if (!partialConfig.hasContentScript
|
|
49
|
+
&& !partialConfig.hasBackgroundWorker
|
|
50
|
+
&& (!partialConfig.uiSurfaces || partialConfig.uiSurfaces.length === 0)) {
|
|
51
|
+
;
|
|
52
|
+
ctx.warnings.push({
|
|
53
|
+
code: 'ADOPT_MINIMAL_EXTENSION',
|
|
54
|
+
message: 'Detected a minimal browser extension with no UI surfaces, content scripts, '
|
|
55
|
+
+ 'or background worker. Defaulting fields via Zod defaults — adjust config.yml if needed.',
|
|
56
|
+
context: { manifest_version: String(mv) },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return { projectType: 'browser-extension', confidence: 'high', partialConfig, evidence: ev };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=browser-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-extension.js","sourceRoot":"","sources":["../../../src/project/detectors/browser-extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-extension.test.d.ts","sourceRoot":"","sources":["../../../src/project/detectors/browser-extension.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 { detectBrowserExtension } from './browser-extension.js';
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const FIXTURES = path.join(__dirname, '../../../tests/fixtures/adopt/detectors/browser-extension');
|
|
8
|
+
describe('detectBrowserExtension', () => {
|
|
9
|
+
it('MV3 with popup + service_worker → high', () => {
|
|
10
|
+
const ctx = createSignalContext(path.join(FIXTURES, 'mv3-popup'));
|
|
11
|
+
const m = detectBrowserExtension(ctx);
|
|
12
|
+
expect(m?.projectType).toBe('browser-extension');
|
|
13
|
+
expect(m?.confidence).toBe('high');
|
|
14
|
+
expect(m?.partialConfig.manifestVersion).toBe('3');
|
|
15
|
+
expect(m?.partialConfig.uiSurfaces).toEqual(['popup']);
|
|
16
|
+
expect(m?.partialConfig.hasBackgroundWorker).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
it('MV2 with content_scripts + background.scripts → high', () => {
|
|
19
|
+
const ctx = createSignalContext(path.join(FIXTURES, 'mv2-content'));
|
|
20
|
+
const m = detectBrowserExtension(ctx);
|
|
21
|
+
expect(m?.partialConfig.manifestVersion).toBe('2');
|
|
22
|
+
expect(m?.partialConfig.hasContentScript).toBe(true);
|
|
23
|
+
expect(m?.partialConfig.hasBackgroundWorker).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
it('Minimal theme manifest → returns match with only manifestVersion (Zod defaults fill rest)', () => {
|
|
26
|
+
const ctx = createSignalContext(path.join(FIXTURES, 'minimal-theme'));
|
|
27
|
+
const m = detectBrowserExtension(ctx);
|
|
28
|
+
expect(m?.partialConfig.manifestVersion).toBe('3');
|
|
29
|
+
expect(m?.partialConfig.hasContentScript).toBeUndefined(); // CRITICAL: omitted
|
|
30
|
+
expect(m?.partialConfig.hasBackgroundWorker).toBeUndefined(); // CRITICAL: omitted
|
|
31
|
+
expect(m?.partialConfig.uiSurfaces).toBeUndefined(); // CRITICAL: omitted
|
|
32
|
+
expect(ctx.warnings.some(w => w.code === 'ADOPT_MINIMAL_EXTENSION')).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
it('PWA manifest (no manifest_version) → returns null', () => {
|
|
35
|
+
const ctx = createSignalContext(path.join(FIXTURES, 'malformed/manifest-json-no-version'));
|
|
36
|
+
expect(detectBrowserExtension(ctx)).toBeNull();
|
|
37
|
+
});
|
|
38
|
+
it('manifest.json with manifest_version: "3" (STRING not int) → returns null', () => {
|
|
39
|
+
const ctx = createFakeSignalContext({
|
|
40
|
+
rootEntries: ['manifest.json'],
|
|
41
|
+
files: { 'manifest.json': '{"manifest_version":"3","name":"x"}' },
|
|
42
|
+
});
|
|
43
|
+
expect(detectBrowserExtension(ctx)).toBeNull();
|
|
44
|
+
});
|
|
45
|
+
it('No manifest.json → returns null', () => {
|
|
46
|
+
const ctx = createFakeSignalContext({});
|
|
47
|
+
expect(detectBrowserExtension(ctx)).toBeNull();
|
|
48
|
+
});
|
|
49
|
+
it('manifest.json with manifest_version: 4 → returns null', () => {
|
|
50
|
+
const ctx = createFakeSignalContext({
|
|
51
|
+
rootEntries: ['manifest.json'],
|
|
52
|
+
files: { 'manifest.json': '{"manifest_version":4,"name":"x"}' },
|
|
53
|
+
});
|
|
54
|
+
expect(detectBrowserExtension(ctx)).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
it('Malformed manifest.json → returns null (unparseable JSON)', () => {
|
|
57
|
+
const ctx = createFakeSignalContext({
|
|
58
|
+
rootEntries: ['manifest.json'],
|
|
59
|
+
files: { 'manifest.json': '{ invalid json' },
|
|
60
|
+
});
|
|
61
|
+
expect(detectBrowserExtension(ctx)).toBeNull();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=browser-extension.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-extension.test.js","sourceRoot":"","sources":["../../../src/project/detectors/browser-extension.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/project/detectors/cli.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,YAAY,CAAA;AAG7D,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,GAAG,IAAI,CAqE7D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { evidence } from './types.js';
|
|
2
|
+
export function detectCli(ctx) {
|
|
3
|
+
const ev = [];
|
|
4
|
+
// High-tier signals (any of these qualifies as "shipping a CLI")
|
|
5
|
+
const pkg = ctx.packageJson();
|
|
6
|
+
const hasNodeBin = pkg?.bin !== undefined && pkg.bin !== null;
|
|
7
|
+
if (hasNodeBin)
|
|
8
|
+
ev.push(evidence('pkg-bin-field', 'package.json'));
|
|
9
|
+
const cargo = ctx.cargoToml();
|
|
10
|
+
const hasCargoBin = !!cargo?.bin && cargo.bin.length > 0;
|
|
11
|
+
if (hasCargoBin)
|
|
12
|
+
ev.push(evidence('cargo-bin', 'Cargo.toml'));
|
|
13
|
+
const py = ctx.pyprojectToml();
|
|
14
|
+
const hasPyScripts = !!py?.project?.scripts && Object.keys(py.project.scripts).length > 0;
|
|
15
|
+
if (hasPyScripts)
|
|
16
|
+
ev.push(evidence('pyproject-scripts', 'pyproject.toml'));
|
|
17
|
+
const goCmdDirs = ctx.dirExists('cmd');
|
|
18
|
+
const hasGoCliFramework = ctx.hasAnyDep(['github.com/spf13/cobra', 'github.com/urfave/cli'], 'go');
|
|
19
|
+
// Go CLI requires cmd/ + go.mod + a CLI framework dep — cmd/ alone matches backend services
|
|
20
|
+
const hasGoCli = goCmdDirs && !!ctx.goMod() && hasGoCliFramework;
|
|
21
|
+
if (hasGoCli)
|
|
22
|
+
ev.push(evidence('go-cmd-dir', 'cmd/'));
|
|
23
|
+
// CLI framework deps (medium tier when no bin)
|
|
24
|
+
const hasCliFramework = ctx.hasAnyDep(['commander', 'yargs', 'clipanion', 'cac', 'oclif', '@oclif/core'], 'npm')
|
|
25
|
+
|| ctx.hasDep('clap', 'cargo')
|
|
26
|
+
|| ctx.hasDep('structopt', 'cargo')
|
|
27
|
+
|| ctx.hasAnyDep(['typer', 'click'], 'py')
|
|
28
|
+
|| hasGoCliFramework;
|
|
29
|
+
const hasHighSignal = hasNodeBin || hasCargoBin || hasPyScripts || hasGoCli;
|
|
30
|
+
if (!hasHighSignal && !hasCliFramework)
|
|
31
|
+
return null;
|
|
32
|
+
const confidence = hasHighSignal ? 'high' : 'medium';
|
|
33
|
+
// interactivity
|
|
34
|
+
const hasPrompts = ctx.hasAnyDep(['@inquirer/prompts', 'inquirer', 'enquirer', 'prompts'], 'npm')
|
|
35
|
+
|| ctx.hasAnyDep(['questionary', 'inquirerpy'], 'py')
|
|
36
|
+
|| ctx.hasAnyDep(['dialoguer', 'inquire'], 'cargo');
|
|
37
|
+
const hasArgsParser = ctx.hasAnyDep(['commander', 'yargs', 'clipanion', 'cac', 'oclif', '@oclif/core'], 'npm')
|
|
38
|
+
|| ctx.hasDep('clap', 'cargo')
|
|
39
|
+
|| ctx.hasAnyDep(['typer', 'click'], 'py')
|
|
40
|
+
|| ctx.hasAnyDep(['github.com/spf13/cobra', 'github.com/urfave/cli'], 'go');
|
|
41
|
+
let interactivity;
|
|
42
|
+
if (hasPrompts && hasArgsParser)
|
|
43
|
+
interactivity = 'hybrid';
|
|
44
|
+
else if (hasPrompts)
|
|
45
|
+
interactivity = 'interactive';
|
|
46
|
+
else
|
|
47
|
+
interactivity = 'args-only';
|
|
48
|
+
// distributionChannels
|
|
49
|
+
const channels = [];
|
|
50
|
+
if (hasNodeBin || hasCargoBin || hasPyScripts)
|
|
51
|
+
channels.push('package-manager');
|
|
52
|
+
if (goCmdDirs || (cargo?.bin && cargo.bin.length > 0))
|
|
53
|
+
channels.push('standalone-binary');
|
|
54
|
+
if (ctx.hasFile('Dockerfile'))
|
|
55
|
+
channels.push('container');
|
|
56
|
+
// hasStructuredOutput
|
|
57
|
+
const hasStructuredOutput = ctx.hasAnyDep(['ink', 'listr2', 'cli-table3'], 'npm')
|
|
58
|
+
|| ctx.hasAnyDep(['rich', 'tabulate'], 'py')
|
|
59
|
+
|| ctx.hasDep('github.com/olekukonko/tablewriter', 'go');
|
|
60
|
+
const partialConfig = {
|
|
61
|
+
interactivity,
|
|
62
|
+
hasStructuredOutput,
|
|
63
|
+
};
|
|
64
|
+
if (channels.length > 0)
|
|
65
|
+
partialConfig.distributionChannels = channels;
|
|
66
|
+
return { projectType: 'cli', confidence, partialConfig, evidence: ev };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/project/detectors/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../../src/project/detectors/cli.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
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 { detectCli } from './cli.js';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
8
|
+
const FIXTURES = path.join(__dirname, '../../../tests/fixtures/adopt/detectors/cli');
|
|
9
|
+
describe('detectCli', () => {
|
|
10
|
+
it('Node bin + commander + inquirer → high, hybrid', () => {
|
|
11
|
+
const ctx = createSignalContext(path.join(FIXTURES, 'node-bin'));
|
|
12
|
+
const m = detectCli(ctx);
|
|
13
|
+
expect(m?.projectType).toBe('cli');
|
|
14
|
+
expect(m?.confidence).toBe('high');
|
|
15
|
+
expect(m?.partialConfig.interactivity).toBe('hybrid');
|
|
16
|
+
expect(m?.partialConfig.distributionChannels).toContain('package-manager');
|
|
17
|
+
});
|
|
18
|
+
it('Rust [[bin]] + clap → args-only', () => {
|
|
19
|
+
const ctx = createSignalContext(path.join(FIXTURES, 'rust-clap'));
|
|
20
|
+
const m = detectCli(ctx);
|
|
21
|
+
expect(m?.partialConfig.interactivity).toBe('args-only');
|
|
22
|
+
});
|
|
23
|
+
it('Python pyproject.scripts + typer → args-only', () => {
|
|
24
|
+
const ctx = createSignalContext(path.join(FIXTURES, 'python-typer'));
|
|
25
|
+
const m = detectCli(ctx);
|
|
26
|
+
expect(m?.confidence).toBe('high');
|
|
27
|
+
expect(m?.partialConfig.interactivity).toBe('args-only');
|
|
28
|
+
});
|
|
29
|
+
it('Go cmd/*/main.go + cobra → args-only, standalone-binary', () => {
|
|
30
|
+
const ctx = createSignalContext(path.join(FIXTURES, 'go-cobra'));
|
|
31
|
+
const m = detectCli(ctx);
|
|
32
|
+
expect(m?.partialConfig.interactivity).toBe('args-only');
|
|
33
|
+
expect(m?.partialConfig.distributionChannels).toContain('standalone-binary');
|
|
34
|
+
});
|
|
35
|
+
it('CLI framework dep without bin → medium', () => {
|
|
36
|
+
const ctx = createFakeSignalContext({
|
|
37
|
+
packageJson: { name: 'wip', dependencies: { yargs: '17' } },
|
|
38
|
+
});
|
|
39
|
+
const m = detectCli(ctx);
|
|
40
|
+
expect(m?.confidence).toBe('medium');
|
|
41
|
+
});
|
|
42
|
+
it('Inquirer dep alone → interactive', () => {
|
|
43
|
+
const ctx = createFakeSignalContext({
|
|
44
|
+
packageJson: { name: 'wip', bin: { wip: 'cli.js' }, dependencies: { '@inquirer/prompts': '7' } },
|
|
45
|
+
});
|
|
46
|
+
const m = detectCli(ctx);
|
|
47
|
+
expect(m?.partialConfig.interactivity).toBe('interactive');
|
|
48
|
+
});
|
|
49
|
+
it('No bin, no framework → null', () => {
|
|
50
|
+
const ctx = createFakeSignalContext({ packageJson: { name: 'demo' } });
|
|
51
|
+
expect(detectCli(ctx)).toBeNull();
|
|
52
|
+
});
|
|
53
|
+
it('Go cmd/ without CLI framework → null (avoids backend false positive)', () => {
|
|
54
|
+
const ctx = createFakeSignalContext({
|
|
55
|
+
dirs: ['cmd'],
|
|
56
|
+
goMod: { module: 'example.com/svc', requires: [
|
|
57
|
+
{ path: 'github.com/gin-gonic/gin', version: 'v1.9.0', indirect: false },
|
|
58
|
+
] },
|
|
59
|
+
});
|
|
60
|
+
expect(detectCli(ctx)).toBeNull();
|
|
61
|
+
});
|
|
62
|
+
it('hasStructuredOutput true when ink dep present', () => {
|
|
63
|
+
const ctx = createFakeSignalContext({
|
|
64
|
+
packageJson: { name: 'tui', bin: { tui: 'cli.js' }, dependencies: { ink: '5' } },
|
|
65
|
+
});
|
|
66
|
+
const m = detectCli(ctx);
|
|
67
|
+
expect(m?.partialConfig.hasStructuredOutput).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../../src/project/detectors/cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { ScaffoldWarning } from '../../types/index.js';
|
|
2
|
+
export type ManifestKind = 'npm' | 'py' | 'cargo' | 'go';
|
|
3
|
+
export type ManifestStatus = 'missing' | 'parsed' | 'unparseable';
|
|
4
|
+
export type NpmDepScope = 'deps' | 'dev' | 'peer' | 'optional';
|
|
5
|
+
export type DepScope = NpmDepScope | 'all';
|
|
6
|
+
export interface PackageJson {
|
|
7
|
+
readonly name?: string;
|
|
8
|
+
readonly version?: string;
|
|
9
|
+
readonly private?: boolean;
|
|
10
|
+
readonly main?: string;
|
|
11
|
+
readonly module?: string;
|
|
12
|
+
readonly types?: string;
|
|
13
|
+
readonly typings?: string;
|
|
14
|
+
readonly browser?: string | Readonly<Record<string, string>>;
|
|
15
|
+
readonly exports?: unknown;
|
|
16
|
+
readonly bin?: string | Readonly<Record<string, string>>;
|
|
17
|
+
readonly type?: 'module' | 'commonjs';
|
|
18
|
+
readonly engines?: Readonly<Record<string, string>>;
|
|
19
|
+
readonly scripts?: Readonly<Record<string, string>>;
|
|
20
|
+
readonly dependencies?: Readonly<Record<string, string>>;
|
|
21
|
+
readonly devDependencies?: Readonly<Record<string, string>>;
|
|
22
|
+
readonly peerDependencies?: Readonly<Record<string, string>>;
|
|
23
|
+
readonly optionalDependencies?: Readonly<Record<string, string>>;
|
|
24
|
+
readonly workspaces?: readonly string[] | {
|
|
25
|
+
readonly packages?: readonly string[];
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface PyprojectToml {
|
|
29
|
+
readonly project?: {
|
|
30
|
+
readonly name?: string;
|
|
31
|
+
readonly dependencies?: readonly string[];
|
|
32
|
+
readonly 'optional-dependencies'?: Readonly<Record<string, readonly string[]>>;
|
|
33
|
+
readonly scripts?: Readonly<Record<string, string>>;
|
|
34
|
+
};
|
|
35
|
+
readonly tool?: {
|
|
36
|
+
readonly poetry?: {
|
|
37
|
+
readonly dependencies?: Readonly<Record<string, unknown>>;
|
|
38
|
+
readonly 'dev-dependencies'?: Readonly<Record<string, unknown>>;
|
|
39
|
+
readonly group?: Readonly<Record<string, {
|
|
40
|
+
readonly dependencies?: Readonly<Record<string, unknown>>;
|
|
41
|
+
}>>;
|
|
42
|
+
};
|
|
43
|
+
readonly [k: string]: unknown;
|
|
44
|
+
};
|
|
45
|
+
readonly 'build-system'?: {
|
|
46
|
+
readonly requires?: readonly string[];
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export interface CargoToml {
|
|
50
|
+
readonly package?: {
|
|
51
|
+
readonly name?: string;
|
|
52
|
+
readonly version?: string;
|
|
53
|
+
};
|
|
54
|
+
readonly dependencies?: Readonly<Record<string, unknown>>;
|
|
55
|
+
readonly 'dev-dependencies'?: Readonly<Record<string, unknown>>;
|
|
56
|
+
readonly lib?: Readonly<Record<string, unknown>>;
|
|
57
|
+
readonly bin?: readonly {
|
|
58
|
+
readonly name: string;
|
|
59
|
+
readonly path?: string;
|
|
60
|
+
}[];
|
|
61
|
+
}
|
|
62
|
+
export interface GoMod {
|
|
63
|
+
readonly module?: string;
|
|
64
|
+
readonly goVersion?: string;
|
|
65
|
+
readonly requires?: readonly GoModRequire[];
|
|
66
|
+
}
|
|
67
|
+
export interface GoModRequire {
|
|
68
|
+
readonly path: string;
|
|
69
|
+
readonly version: string;
|
|
70
|
+
readonly indirect: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface SignalContext {
|
|
73
|
+
readonly projectRoot: string;
|
|
74
|
+
readonly warnings: readonly ScaffoldWarning[];
|
|
75
|
+
hasFile(relPath: string): boolean;
|
|
76
|
+
dirExists(relPath: string): boolean;
|
|
77
|
+
rootEntries(): readonly string[];
|
|
78
|
+
/** List entries in a subdirectory (depth-1, sorted, includes dotfiles, returns [] on missing/unreadable). */
|
|
79
|
+
listDir(relPath: string): readonly string[];
|
|
80
|
+
readFileText(relPath: string, maxBytes?: number): string | undefined;
|
|
81
|
+
manifestStatus(kind: ManifestKind): ManifestStatus;
|
|
82
|
+
packageJson(): PackageJson | undefined;
|
|
83
|
+
pyprojectToml(): PyprojectToml | undefined;
|
|
84
|
+
cargoToml(): CargoToml | undefined;
|
|
85
|
+
goMod(): GoMod | undefined;
|
|
86
|
+
hasDep(name: string, where?: ManifestKind | readonly ManifestKind[], scope?: DepScope): boolean;
|
|
87
|
+
hasAnyDep(names: readonly string[], where?: ManifestKind | readonly ManifestKind[], scope?: DepScope): boolean;
|
|
88
|
+
}
|
|
89
|
+
export declare function createSignalContext(projectRoot: string): SignalContext;
|
|
90
|
+
export interface FakeContextInput {
|
|
91
|
+
projectRoot?: string;
|
|
92
|
+
rootEntries?: readonly string[];
|
|
93
|
+
files?: Readonly<Record<string, string>>;
|
|
94
|
+
dirs?: readonly string[];
|
|
95
|
+
/** Per-directory listing — keys are relative paths, values are sorted entry names. */
|
|
96
|
+
dirListings?: Readonly<Record<string, readonly string[]>>;
|
|
97
|
+
packageJson?: PackageJson | 'unparseable' | 'missing';
|
|
98
|
+
pyprojectToml?: PyprojectToml | 'unparseable' | 'missing';
|
|
99
|
+
cargoToml?: CargoToml | 'unparseable' | 'missing';
|
|
100
|
+
goMod?: GoMod | 'unparseable' | 'missing';
|
|
101
|
+
/** Override individual manifest statuses (e.g., to test 'unparseable' edge cases). */
|
|
102
|
+
manifestStatuses?: Partial<Record<ManifestKind, ManifestStatus>>;
|
|
103
|
+
}
|
|
104
|
+
export declare function createFakeSignalContext(input?: FakeContextInput): SignalContext;
|
|
105
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/project/detectors/context.ts"],"names":[],"mappings":"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"}
|