@keit/create-base 0.1.0 → 1.0.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/dist/detect.d.ts +4 -0
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +6 -3
- package/dist/detect.js.map +1 -1
- package/dist/generator.d.ts +6 -0
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +24 -10
- package/dist/generator.js.map +1 -1
- package/dist/index.js +29 -4
- package/dist/index.js.map +1 -1
- package/dist/prompts.d.ts +6 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +166 -199
- package/dist/prompts.js.map +1 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +107 -26
- package/dist/scaffold.js.map +1 -1
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -0
- package/dist/utils.js.map +1 -1
- package/dist/validate.d.ts +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +5 -7
- package/dist/validate.js.map +1 -1
- package/package.json +4 -1
package/dist/detect.d.ts
CHANGED
|
@@ -5,5 +5,9 @@ export interface DetectedProject {
|
|
|
5
5
|
license?: string;
|
|
6
6
|
hasTypeScript?: boolean;
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Scans the target execution directory for an existing package.json.
|
|
10
|
+
* If found, extracts current project metadata to pre-fill prompts.
|
|
11
|
+
*/
|
|
8
12
|
export declare function detectExistingProject(cwd: string): DetectedProject;
|
|
9
13
|
//# sourceMappingURL=detect.d.ts.map
|
package/dist/detect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAwBlE"}
|
package/dist/detect.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Scans the target execution directory for an existing package.json.
|
|
5
|
+
* If found, extracts current project metadata to pre-fill prompts.
|
|
6
|
+
*/
|
|
3
7
|
export function detectExistingProject(cwd) {
|
|
4
8
|
const pkgPath = join(cwd, "package.json");
|
|
5
|
-
// No package.json found
|
|
9
|
+
// No package.json found - return empty, prompts will ask everything
|
|
6
10
|
if (!existsSync(pkgPath))
|
|
7
11
|
return {};
|
|
8
12
|
try {
|
|
@@ -14,14 +18,13 @@ export function detectExistingProject(cwd) {
|
|
|
14
18
|
return {
|
|
15
19
|
name: pkg.name,
|
|
16
20
|
description: pkg.description,
|
|
17
|
-
// author can be a string or { name: string }
|
|
18
21
|
author: typeof pkg.author === "string" ? pkg.author : pkg.author?.name,
|
|
19
22
|
license: pkg.license,
|
|
20
23
|
hasTypeScript: "typescript" in allDeps,
|
|
21
24
|
};
|
|
22
25
|
}
|
|
23
26
|
catch {
|
|
24
|
-
// Malformed package.json
|
|
27
|
+
// Malformed package.json - treat as empty
|
|
25
28
|
return {};
|
|
26
29
|
}
|
|
27
30
|
}
|
package/dist/detect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAE1C,oEAAoE;IACpE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG;YACd,GAAG,GAAG,CAAC,YAAY;YACnB,GAAG,GAAG,CAAC,eAAe;SACvB,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI;YACtE,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,aAAa,EAAE,YAAY,IAAI,OAAO;SACvC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/generator.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import type { Answers } from "./prompts.js";
|
|
2
|
+
/**
|
|
3
|
+
* Selectively injects configurations based on interactive prompts or CLI flags.
|
|
4
|
+
*/
|
|
2
5
|
export declare function generateExtraFiles(cwd: string, targetDir: string, answers: Answers): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Orchestrates the entire file generation pipeline sequentially.
|
|
8
|
+
*/
|
|
3
9
|
export declare function generateFiles(cwd: string, targetDir: string, answers: Answers, isToolingOnly: boolean): Promise<void>;
|
|
4
10
|
//# sourceMappingURL=generator.d.ts.map
|
package/dist/generator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAoD5C;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,iBA0DxF;AAyBD;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,OAAO,iBAKvB"}
|
package/dist/generator.js
CHANGED
|
@@ -2,17 +2,20 @@ import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync } from "node
|
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import pc from "picocolors";
|
|
4
4
|
import { isVSCodeEditor } from "./utils.js";
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Core engine utility to safely replicate file structures recursively.
|
|
7
|
+
* Reads the source array, maps the destinations, and streams the copying.
|
|
8
|
+
*/
|
|
6
9
|
async function copyFiles(items, sourceDir, targetDir) {
|
|
7
10
|
let fileCount = 0;
|
|
8
|
-
|
|
11
|
+
for (const item of items) {
|
|
9
12
|
try {
|
|
10
13
|
const sourcePath = join(sourceDir, item);
|
|
11
14
|
const destinationPath = join(targetDir, item);
|
|
12
15
|
// Only act on files, skipping directories naturally
|
|
13
16
|
if (statSync(sourcePath).isFile()) {
|
|
14
17
|
const destDirname = dirname(destinationPath);
|
|
15
|
-
// Ensure parent directory exists before writing
|
|
18
|
+
// Ensure parent directory tree exists before writing the file
|
|
16
19
|
if (!existsSync(destDirname)) {
|
|
17
20
|
mkdirSync(destDirname, { recursive: true });
|
|
18
21
|
}
|
|
@@ -25,20 +28,25 @@ async function copyFiles(items, sourceDir, targetDir) {
|
|
|
25
28
|
console.error(pc.red(`✖ Resolution error during structural asset sync: ${item}`), error);
|
|
26
29
|
process.exit(1);
|
|
27
30
|
}
|
|
28
|
-
}
|
|
31
|
+
}
|
|
29
32
|
if (fileCount > 0) {
|
|
30
|
-
console.log(pc.dim(` Synced ${fileCount} target asset files cleanly
|
|
33
|
+
console.log(pc.dim(` Synced ${fileCount} target asset files cleanly.\n`));
|
|
31
34
|
}
|
|
32
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Scaffolds the base foundation files required for all generated workspaces.
|
|
38
|
+
*/
|
|
33
39
|
async function generateBaseFiles(cwd, targetDir) {
|
|
34
40
|
console.log(pc.cyan("📁 Cloning baseline environmental layouts..."));
|
|
35
41
|
const baseDir = join(cwd, "base");
|
|
36
42
|
if (!existsSync(baseDir))
|
|
37
43
|
return;
|
|
38
44
|
const baseItems = readdirSync(baseDir, { recursive: true });
|
|
39
|
-
console.log(`BaseDir: ${baseDir}; targetDir: ${targetDir}`);
|
|
40
45
|
await copyFiles(baseItems, baseDir, targetDir);
|
|
41
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Selectively injects configurations based on interactive prompts or CLI flags.
|
|
49
|
+
*/
|
|
42
50
|
export async function generateExtraFiles(cwd, targetDir, answers) {
|
|
43
51
|
const isTypeScript = answers.language === "typescript";
|
|
44
52
|
const hasEditor = answers.editor !== "none";
|
|
@@ -48,7 +56,7 @@ export async function generateExtraFiles(cwd, targetDir, answers) {
|
|
|
48
56
|
}
|
|
49
57
|
console.log(pc.cyan("🧩 Injecting contextual development tooling variations..."));
|
|
50
58
|
const extrasDir = join(cwd, "extras");
|
|
51
|
-
//
|
|
59
|
+
// TypeScript Specific Configurations
|
|
52
60
|
if (isTypeScript) {
|
|
53
61
|
console.log(pc.dim(" Applying explicit structural TypeScript configurations..."));
|
|
54
62
|
const tsDir = answers.template === "library"
|
|
@@ -59,7 +67,7 @@ export async function generateExtraFiles(cwd, targetDir, answers) {
|
|
|
59
67
|
await copyFiles(tsItems, tsDir, targetDir);
|
|
60
68
|
}
|
|
61
69
|
}
|
|
62
|
-
//
|
|
70
|
+
// Editor Specific Profiles
|
|
63
71
|
if (hasEditor) {
|
|
64
72
|
console.log(pc.dim(` Generating workspace rulesets targeting editor environment: ${answers.editor}...`));
|
|
65
73
|
const editorsDir = join(extrasDir, "editors");
|
|
@@ -74,7 +82,7 @@ export async function generateExtraFiles(cwd, targetDir, answers) {
|
|
|
74
82
|
await copyFiles(editorItems, editorDir, targetDir);
|
|
75
83
|
}
|
|
76
84
|
}
|
|
77
|
-
//
|
|
85
|
+
// Optional Extra Ecosystem Packages
|
|
78
86
|
if (hasOptionalLibs) {
|
|
79
87
|
for (const extra of answers.extras) {
|
|
80
88
|
console.log(pc.dim(` Configuring optional runtime ecosystem plug-in: ${extra}...`));
|
|
@@ -86,8 +94,11 @@ export async function generateExtraFiles(cwd, targetDir, answers) {
|
|
|
86
94
|
}
|
|
87
95
|
}
|
|
88
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Scaffolds specific functional template files (e.g., minimal, library, rest-api)
|
|
99
|
+
*/
|
|
89
100
|
async function generateTemplateFiles(cwd, targetDir, answers, isToolingOnly) {
|
|
90
|
-
// We only scaffold source code if
|
|
101
|
+
// We only scaffold source code templates if this is not a tooling-only operation
|
|
91
102
|
if (!isToolingOnly) {
|
|
92
103
|
console.log(pc.cyan(`📦 Generating functional codebase matching template: ${answers.template}...`));
|
|
93
104
|
const templateDir = join(cwd, "templates", answers.template);
|
|
@@ -97,6 +108,9 @@ async function generateTemplateFiles(cwd, targetDir, answers, isToolingOnly) {
|
|
|
97
108
|
}
|
|
98
109
|
}
|
|
99
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Orchestrates the entire file generation pipeline sequentially.
|
|
113
|
+
*/
|
|
100
114
|
export async function generateFiles(cwd, targetDir, answers, isToolingOnly) {
|
|
101
115
|
await generateBaseFiles(cwd, targetDir);
|
|
102
116
|
await generateExtraFiles(cwd, targetDir, answers);
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,25 +9,48 @@ import { generateFiles } from "./generator.js";
|
|
|
9
9
|
import { runPrompts } from "./prompts.js";
|
|
10
10
|
import { scaffoldProjectMetadata } from "./scaffold.js";
|
|
11
11
|
import { validateArgv } from "./validate.js";
|
|
12
|
+
// Parse CLI arguments with mapping configuration
|
|
12
13
|
const argv = minimist(process.argv.slice(2), {
|
|
13
|
-
string: [
|
|
14
|
+
string: [
|
|
15
|
+
"template",
|
|
16
|
+
"t",
|
|
17
|
+
"language",
|
|
18
|
+
"l",
|
|
19
|
+
"description",
|
|
20
|
+
"d",
|
|
21
|
+
"author",
|
|
22
|
+
"a",
|
|
23
|
+
"license",
|
|
24
|
+
"git-remote",
|
|
25
|
+
"g",
|
|
26
|
+
"editor",
|
|
27
|
+
"e",
|
|
28
|
+
"extras",
|
|
29
|
+
],
|
|
14
30
|
alias: {
|
|
15
31
|
t: "template",
|
|
16
32
|
l: "language",
|
|
17
33
|
d: "description",
|
|
18
34
|
a: "author",
|
|
19
35
|
e: "editor",
|
|
36
|
+
g: "git-remote",
|
|
20
37
|
},
|
|
21
38
|
});
|
|
39
|
+
// Run validation against strictly defined enums to prevent silent errors
|
|
22
40
|
validateArgv(argv);
|
|
41
|
+
/**
|
|
42
|
+
* Main execution pipeline for the CLI tool.
|
|
43
|
+
*/
|
|
23
44
|
async function main() {
|
|
24
45
|
const projectArg = argv._[0];
|
|
25
46
|
const isCurrentFolder = !projectArg || projectArg === ".";
|
|
47
|
+
// The directory where the user executes the command
|
|
26
48
|
const executionDir = process.cwd();
|
|
49
|
+
// The directory where the compiled CLI tool itself resides
|
|
27
50
|
const cliDir = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
28
51
|
console.log();
|
|
29
52
|
console.log(pc.bold(pc.cyan("@keit/create-base")));
|
|
30
|
-
console.log(pc.dim("
|
|
53
|
+
console.log(pc.dim("Professional TypeScript and JavaScript project generator"));
|
|
31
54
|
console.log();
|
|
32
55
|
const detected = isCurrentFolder ? detectExistingProject(executionDir) : {};
|
|
33
56
|
const answers = await runPrompts(isCurrentFolder, projectArg, argv, detected);
|
|
@@ -47,9 +70,11 @@ async function main() {
|
|
|
47
70
|
console.log(pc.green(`✔ Created folder: ${answers.projectName}`));
|
|
48
71
|
console.log();
|
|
49
72
|
}
|
|
50
|
-
console.log(pc.dim("
|
|
73
|
+
console.log(pc.dim("Initializing project scaffold..."));
|
|
51
74
|
console.log();
|
|
75
|
+
// Phase 1: Clone underlying baseline folders and specific tooling templates
|
|
52
76
|
await generateFiles(cliDir, targetDir, answers, isToolingOnly);
|
|
77
|
+
// Phase 2: Create manifests, configuration files, and install dependencies
|
|
53
78
|
await scaffoldProjectMetadata(targetDir, answers, isToolingOnly);
|
|
54
79
|
console.log();
|
|
55
80
|
console.log(pc.bold(pc.green("🚀 Execution phase completed cleanly!")));
|
|
@@ -57,7 +82,7 @@ async function main() {
|
|
|
57
82
|
console.log();
|
|
58
83
|
}
|
|
59
84
|
main().catch((err) => {
|
|
60
|
-
console.error(pc.red("
|
|
85
|
+
console.error(pc.red("\n✖ Unhandled runtime error occurred:"), err);
|
|
61
86
|
process.exit(1);
|
|
62
87
|
});
|
|
63
88
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IAC3C,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts.d.ts
CHANGED
|
@@ -22,5 +22,10 @@ export declare const VALID_VALUES: {
|
|
|
22
22
|
readonly editor: readonly ["vscode", "cursor", "windsurf", "zed", "none"];
|
|
23
23
|
readonly license: readonly ["MIT", "ISC", "Apache-2.0", "UNLICENSED"];
|
|
24
24
|
};
|
|
25
|
-
|
|
25
|
+
interface ParsedArgs {
|
|
26
|
+
_?: string[];
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
export declare function runPrompts(isCurrentFolder: boolean, projectArg: string | undefined, argv: ParsedArgs, detected?: DetectedProject): Promise<Answers>;
|
|
30
|
+
export {};
|
|
26
31
|
//# sourceMappingURL=prompts.d.ts.map
|
package/dist/prompts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AACnD,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AACvE,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;AACvE,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,eAAO,MAAM,YAAY,2CAA4C,CAAC;AAEtE,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,UAAU,UAAU;IAClB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAsB,UAAU,CAC9B,eAAe,EAAE,OAAO,EACxB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE,UAAU,EAChB,QAAQ,GAAE,eAAoB,GAC7B,OAAO,CAAC,OAAO,CAAC,CA6MlB"}
|
package/dist/prompts.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import pc from "picocolors";
|
|
2
2
|
import prompts from "prompts";
|
|
3
|
-
// ── Allowed values for CLI flag validation ────────────────────────────────────
|
|
4
|
-
// Single source of truth — imported by validate.ts so the two never drift apart
|
|
5
3
|
export const vscodeFamily = ["vscode", "cursor", "windsurf"];
|
|
6
4
|
export const VALID_VALUES = {
|
|
7
5
|
template: ["minimal", "rest-api", "library", "monorepo"],
|
|
@@ -9,209 +7,179 @@ export const VALID_VALUES = {
|
|
|
9
7
|
editor: [...vscodeFamily, "zed", "none"],
|
|
10
8
|
license: ["MIT", "ISC", "Apache-2.0", "UNLICENSED"],
|
|
11
9
|
};
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
detected
|
|
18
|
-
|
|
10
|
+
export async function runPrompts(isCurrentFolder, projectArg, argv, detected = {}) {
|
|
11
|
+
const hasAllFlags = !!(argv.language && argv.template && argv.license && argv.author);
|
|
12
|
+
const projectNameFromArg = argv._?.[0];
|
|
13
|
+
if (hasAllFlags) {
|
|
14
|
+
return {
|
|
15
|
+
projectName: projectNameFromArg ?? detected.name ?? "my-project",
|
|
16
|
+
description: argv.description ?? detected.description ?? "",
|
|
17
|
+
author: argv.author ?? detected.author ?? "",
|
|
18
|
+
license: argv.license ?? detected.license ?? "MIT",
|
|
19
|
+
language: argv.language,
|
|
20
|
+
template: argv.template,
|
|
21
|
+
editor: argv.editor ?? "vscode",
|
|
22
|
+
extras: Array.isArray(argv.extras) ? argv.extras : argv.extras ? [String(argv.extras)] : [],
|
|
23
|
+
gitRemote: argv["git-remote"] ?? "",
|
|
24
|
+
folderPurpose: "new",
|
|
25
|
+
};
|
|
26
|
+
}
|
|
19
27
|
const onCancel = () => {
|
|
20
28
|
console.log();
|
|
21
|
-
console.log(pc.red("✖ Cancelled."));
|
|
29
|
+
console.log(pc.red("✖ Cancelled prompt execution."));
|
|
22
30
|
process.exit(0);
|
|
23
31
|
};
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
initial: 0,
|
|
38
|
-
},
|
|
39
|
-
// ── Project identity ───────────────────────────────────────────────────
|
|
40
|
-
{
|
|
41
|
-
// Skipped when:
|
|
42
|
-
// • a folder name was passed as a positional argument, OR
|
|
43
|
-
// • the user chose "existing" (name is read from package.json instead)
|
|
44
|
-
type: (_prev, values) => {
|
|
45
|
-
if (!isCurrentFolder && projectArg && projectArg !== ".")
|
|
46
|
-
return null;
|
|
47
|
-
if (values.folderPurpose === "existing")
|
|
48
|
-
return null;
|
|
49
|
-
return "text";
|
|
32
|
+
const hasDirectFlags = Boolean(argv.language || argv.template);
|
|
33
|
+
let answers = {};
|
|
34
|
+
if (!hasDirectFlags) {
|
|
35
|
+
answers = await prompts([
|
|
36
|
+
{
|
|
37
|
+
type: isCurrentFolder ? "select" : null,
|
|
38
|
+
name: "folderPurpose",
|
|
39
|
+
message: "The target directory is the current folder. Is this for:",
|
|
40
|
+
choices: [
|
|
41
|
+
{ title: "A new project (initialize from scratch)", value: "new" },
|
|
42
|
+
{ title: "An existing project (add tooling configurations only)", value: "existing" },
|
|
43
|
+
],
|
|
44
|
+
initial: 0,
|
|
50
45
|
},
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
// Skipped when:
|
|
59
|
-
// • --description flag was passed, OR
|
|
60
|
-
// • existing project (description read from package.json)
|
|
61
|
-
type: (_prev, values) => argv.description || values.folderPurpose === "existing" ? null : "text",
|
|
62
|
-
name: "description",
|
|
63
|
-
message: "Description:",
|
|
64
|
-
// Pre-fill from detected package.json if available
|
|
65
|
-
initial: detected.description ?? "",
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
// Skipped when:
|
|
69
|
-
// • --author flag was passed, OR
|
|
70
|
-
// • existing project (author read from package.json)
|
|
71
|
-
type: (_prev, values) => argv.author || values.folderPurpose === "existing" ? null : "text",
|
|
72
|
-
name: "author",
|
|
73
|
-
message: "Author:",
|
|
74
|
-
// Pre-fill from detected package.json if available
|
|
75
|
-
initial: detected.author ?? "",
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
// Skipped when:
|
|
79
|
-
// • --license flag was passed, OR
|
|
80
|
-
// • existing project (license read from package.json)
|
|
81
|
-
type: (_prev, values) => argv.license || values.folderPurpose === "existing" ? null : "select",
|
|
82
|
-
name: "license",
|
|
83
|
-
message: "License:",
|
|
84
|
-
choices: [
|
|
85
|
-
{ title: "MIT", value: "MIT" },
|
|
86
|
-
{ title: "ISC", value: "ISC" },
|
|
87
|
-
{ title: "Apache-2.0", value: "Apache-2.0" },
|
|
88
|
-
{ title: "Unlicensed", value: "UNLICENSED" },
|
|
89
|
-
],
|
|
90
|
-
// Pre-select the matching license if one was detected in package.json
|
|
91
|
-
initial: detected.license
|
|
92
|
-
? Math.max(0, ["MIT", "ISC", "Apache-2.0", "UNLICENSED"].indexOf(detected.license))
|
|
93
|
-
: 0,
|
|
94
|
-
},
|
|
95
|
-
// ── Project setup ──────────────────────────────────────────────────────
|
|
96
|
-
{
|
|
97
|
-
// Skipped when:
|
|
98
|
-
// • --language flag was passed, OR
|
|
99
|
-
// • existing project (language auto-detected from dependencies)
|
|
100
|
-
type: (_prev, values) => argv.language || values.folderPurpose === "existing" ? null : "select",
|
|
101
|
-
name: "language",
|
|
102
|
-
message: "Language:",
|
|
103
|
-
choices: [
|
|
104
|
-
{ title: "TypeScript", value: "typescript" },
|
|
105
|
-
{ title: "JavaScript", value: "javascript" },
|
|
106
|
-
],
|
|
107
|
-
// Pre-select TypeScript unless detect explicitly found no TypeScript dep
|
|
108
|
-
initial: detected.hasTypeScript === false ? 1 : 0,
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
// Skipped when:
|
|
112
|
-
// • --template flag was passed, OR
|
|
113
|
-
// • existing project (no template needed, only tooling is added)
|
|
114
|
-
type: (_prev, values) => argv.template || values.folderPurpose === "existing" ? null : "select",
|
|
115
|
-
name: "template",
|
|
116
|
-
message: "Template:",
|
|
117
|
-
choices: [
|
|
118
|
-
{
|
|
119
|
-
title: "Minimal",
|
|
120
|
-
value: "minimal",
|
|
121
|
-
description: "Blank Node.js app — bots, scripts, servers",
|
|
46
|
+
{
|
|
47
|
+
type: (_prev, values) => {
|
|
48
|
+
if (!isCurrentFolder && projectArg && projectArg !== ".")
|
|
49
|
+
return null;
|
|
50
|
+
if (values.folderPurpose === "existing")
|
|
51
|
+
return null;
|
|
52
|
+
return "text";
|
|
122
53
|
},
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
value: "
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
54
|
+
name: "projectName",
|
|
55
|
+
message: "Project name:",
|
|
56
|
+
initial: detected.name ?? "my-project",
|
|
57
|
+
validate: (v) => (v.trim().length > 0 ? true : "Project name cannot be empty."),
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: (_prev, values) => argv.description || values.folderPurpose === "existing" ? null : "text",
|
|
61
|
+
name: "description",
|
|
62
|
+
message: "Description:",
|
|
63
|
+
initial: detected.description ?? "",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: (_prev, values) => argv.author || values.folderPurpose === "existing" ? null : "text",
|
|
67
|
+
name: "author",
|
|
68
|
+
message: "Author:",
|
|
69
|
+
initial: detected.author ?? "",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
type: (_prev, values) => argv.license || values.folderPurpose === "existing" ? null : "select",
|
|
73
|
+
name: "license",
|
|
74
|
+
message: "License:",
|
|
75
|
+
choices: [
|
|
76
|
+
{ title: "MIT", value: "MIT" },
|
|
77
|
+
{ title: "ISC", value: "ISC" },
|
|
78
|
+
{ title: "Apache-2.0", value: "Apache-2.0" },
|
|
79
|
+
{ title: "Unlicensed", value: "UNLICENSED" },
|
|
80
|
+
],
|
|
81
|
+
initial: detected.license
|
|
82
|
+
? Math.max(0, ["MIT", "ISC", "Apache-2.0", "UNLICENSED"].indexOf(detected.license))
|
|
83
|
+
: 0,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
type: (_prev, values) => argv.language || values.folderPurpose === "existing" ? null : "select",
|
|
87
|
+
name: "language",
|
|
88
|
+
message: "Language:",
|
|
89
|
+
choices: [
|
|
90
|
+
{ title: "TypeScript", value: "typescript" },
|
|
91
|
+
{ title: "JavaScript", value: "javascript" },
|
|
92
|
+
],
|
|
93
|
+
initial: detected.hasTypeScript === false ? 1 : 0,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
type: (_prev, values) => argv.template || values.folderPurpose === "existing" ? null : "select",
|
|
97
|
+
name: "template",
|
|
98
|
+
message: "Template:",
|
|
99
|
+
choices: [
|
|
100
|
+
{
|
|
101
|
+
title: "Minimal",
|
|
102
|
+
value: "minimal",
|
|
103
|
+
description: "Blank Node.js app - bots, scripts, servers",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
title: "REST API",
|
|
107
|
+
value: "rest-api",
|
|
108
|
+
description: "Express + basic routing structure",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
title: "Library",
|
|
112
|
+
value: "library",
|
|
113
|
+
description: "npm-publishable package with exports and type declarations",
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
title: "Monorepo",
|
|
117
|
+
value: "monorepo",
|
|
118
|
+
description: "pnpm workspaces - Next.js + NestJS apps",
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
initial: 0,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: argv.editor ? null : "select",
|
|
125
|
+
name: "editor",
|
|
126
|
+
message: "Editor / IDE:",
|
|
127
|
+
choices: [
|
|
128
|
+
{
|
|
129
|
+
title: "VS Code",
|
|
130
|
+
value: "vscode",
|
|
131
|
+
description: "Creates .vscode/settings.json",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
title: "Cursor",
|
|
135
|
+
value: "cursor",
|
|
136
|
+
description: "Creates .vscode/settings.json",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
title: "Windsurf",
|
|
140
|
+
value: "windsurf",
|
|
141
|
+
description: "Creates .vscode/settings.json",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
title: "Zed",
|
|
145
|
+
value: "zed",
|
|
146
|
+
description: "Creates .zed/settings.json",
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
title: "None / Skip",
|
|
150
|
+
value: "none",
|
|
151
|
+
description: "No editor config - Biome docs link printed instead",
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
initial: 0,
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: argv.extras ? null : "multiselect",
|
|
158
|
+
name: "extras",
|
|
159
|
+
message: "Optional extras:",
|
|
160
|
+
choices: [
|
|
161
|
+
{
|
|
162
|
+
title: "changelogen",
|
|
163
|
+
value: "changelogen",
|
|
164
|
+
description: "Auto-generate CHANGELOG.md from conventional commits",
|
|
165
|
+
selected: true,
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: (_prev, values) => argv["git-remote"] || values.folderPurpose === "existing" ? null : "text",
|
|
171
|
+
name: "gitRemote",
|
|
172
|
+
message: "Git remote URL (leave blank to skip):",
|
|
173
|
+
initial: "",
|
|
174
|
+
},
|
|
175
|
+
], { onCancel });
|
|
176
|
+
}
|
|
211
177
|
const isExisting = answers.folderPurpose === "existing";
|
|
212
|
-
// Fallback project name: positional arg → detected name → "my-project"
|
|
213
178
|
const fallbackName = projectArg && projectArg !== "." ? projectArg : (detected.name ?? "my-project");
|
|
214
|
-
|
|
179
|
+
let parsedExtras = answers.extras ?? [];
|
|
180
|
+
if (argv.extras) {
|
|
181
|
+
parsedExtras = Array.isArray(argv.extras) ? argv.extras : [String(argv.extras)];
|
|
182
|
+
}
|
|
215
183
|
return {
|
|
216
184
|
projectName: answers.projectName ?? fallbackName,
|
|
217
185
|
description: argv.description ?? answers.description ?? detected.description ?? "",
|
|
@@ -219,11 +187,10 @@ detected = {}) {
|
|
|
219
187
|
license: argv.license ?? answers.license ?? detected.license ?? "MIT",
|
|
220
188
|
language: argv.language ??
|
|
221
189
|
answers.language ??
|
|
222
|
-
// For existing projects, infer language from detected deps
|
|
223
190
|
(isExisting ? (detected.hasTypeScript ? "typescript" : "javascript") : "typescript"),
|
|
224
191
|
template: argv.template ?? answers.template ?? "minimal",
|
|
225
192
|
editor: argv.editor ?? answers.editor ?? "vscode",
|
|
226
|
-
extras:
|
|
193
|
+
extras: parsedExtras,
|
|
227
194
|
gitRemote: argv["git-remote"] ?? answers.gitRemote ?? "",
|
|
228
195
|
folderPurpose: answers.folderPurpose,
|
|
229
196
|
};
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAsL5C,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CA2Df"}
|
package/dist/scaffold.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
|
-
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import pc from "picocolors";
|
|
5
5
|
function buildPackageJson(answers) {
|
|
@@ -17,6 +17,12 @@ function buildPackageJson(answers) {
|
|
|
17
17
|
prepare: "husky",
|
|
18
18
|
},
|
|
19
19
|
};
|
|
20
|
+
if (answers.gitRemote) {
|
|
21
|
+
basePkg.repository = {
|
|
22
|
+
type: "git",
|
|
23
|
+
url: answers.gitRemote,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
20
26
|
const devDependencies = {
|
|
21
27
|
"@biomejs/biome": "^2.5.0",
|
|
22
28
|
"@commitlint/cli": "^21.0.2",
|
|
@@ -28,19 +34,37 @@ function buildPackageJson(answers) {
|
|
|
28
34
|
"lint-staged": "^17.0.7",
|
|
29
35
|
secretlint: "^13.0.2",
|
|
30
36
|
};
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
const scripts = basePkg.scripts;
|
|
38
|
+
const isTs = answers.language === "typescript";
|
|
39
|
+
const ext = isTs ? "ts" : "js";
|
|
40
|
+
const runner = isTs ? "tsx" : "node";
|
|
41
|
+
if (isTs) {
|
|
42
|
+
devDependencies.typescript = "^6.0.3";
|
|
33
43
|
devDependencies["@types/node"] = "^25.9.3";
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
44
|
+
devDependencies.tsx = "^4.19.2";
|
|
45
|
+
scripts.typecheck = "tsc --noEmit";
|
|
46
|
+
}
|
|
47
|
+
if (answers.template === "library") {
|
|
48
|
+
scripts.build = isTs ? "tsc" : "echo 'No build step required for JS library'";
|
|
49
|
+
scripts.dev = isTs ? "tsc --watch" : `node --watch src/index.${ext}`;
|
|
50
|
+
scripts.start = "node dist/index.js";
|
|
51
|
+
}
|
|
52
|
+
else if (answers.template === "rest-api") {
|
|
53
|
+
scripts.dev = `${runner} --watch src/index.${ext}`;
|
|
54
|
+
scripts.start = isTs ? "node dist/index.js" : `node src/index.${ext}`;
|
|
55
|
+
if (isTs)
|
|
56
|
+
scripts.build = "tsc";
|
|
57
|
+
}
|
|
58
|
+
else if (answers.template === "minimal") {
|
|
59
|
+
scripts.start = `${runner} src/index.${ext}`;
|
|
60
|
+
}
|
|
61
|
+
else if (answers.template === "monorepo") {
|
|
62
|
+
scripts.build = "npm run build --workspaces";
|
|
63
|
+
scripts.test = "npm run test --workspaces";
|
|
40
64
|
}
|
|
41
65
|
if (answers.extras.includes("changelogen")) {
|
|
42
|
-
devDependencies
|
|
43
|
-
|
|
66
|
+
devDependencies.changelogen = "^0.6.2";
|
|
67
|
+
scripts.release = "changelogen --release";
|
|
44
68
|
}
|
|
45
69
|
basePkg.devDependencies = devDependencies;
|
|
46
70
|
return JSON.stringify(basePkg, null, 2);
|
|
@@ -75,24 +99,16 @@ function mergeExistingPackageJson(targetDir, answers) {
|
|
|
75
99
|
secretlint: "^13.0.2",
|
|
76
100
|
};
|
|
77
101
|
if (answers.language === "typescript") {
|
|
78
|
-
pkg.devDependencies
|
|
102
|
+
pkg.devDependencies.typescript = pkg.devDependencies.typescript || "^6.0.3";
|
|
79
103
|
pkg.devDependencies["@types/node"] = pkg.devDependencies["@types/node"] || "^25.9.3";
|
|
80
104
|
}
|
|
81
105
|
if (answers.extras.includes("changelogen")) {
|
|
82
|
-
pkg.devDependencies
|
|
106
|
+
pkg.devDependencies.changelogen = pkg.devDependencies.changelogen || "^0.6.2";
|
|
83
107
|
}
|
|
84
108
|
return JSON.stringify(pkg, null, 2);
|
|
85
109
|
}
|
|
86
110
|
function buildReadme(answers) {
|
|
87
|
-
return `# ${answers.projectName}
|
|
88
|
-
|
|
89
|
-
> ${answers.description || "Scaffolded with @keit/create-base"}
|
|
90
|
-
|
|
91
|
-
## Development Scripts
|
|
92
|
-
|
|
93
|
-
- \`pnpm run check\` - Run full formatting, linting, and diagnostics via Biome
|
|
94
|
-
- \`pnpm run prepare\` - Setup local Git hardware hooks via Husky
|
|
95
|
-
${answers.language === "typescript" ? "- `pnpm run typecheck` - Validate explicit structural types\n" : ""}`;
|
|
111
|
+
return `# ${answers.projectName}\n\n> ${answers.description || "Scaffolded with @keit/create-base"}\n\n## Development Scripts\n\n- \`pnpm run check\` - Run full formatting, linting, and diagnostics via Biome\n- \`pnpm run prepare\` - Setup local Git hardware hooks via Husky\n${answers.language === "typescript" ? "- `pnpm run typecheck` - Validate explicit structural types\n" : ""}`;
|
|
96
112
|
}
|
|
97
113
|
function buildLicense(answers) {
|
|
98
114
|
const year = new Date().getFullYear();
|
|
@@ -100,11 +116,48 @@ function buildLicense(answers) {
|
|
|
100
116
|
if (answers.license === "MIT") {
|
|
101
117
|
return `MIT License\n\nCopyright (c) ${year} ${authorText}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.`;
|
|
102
118
|
}
|
|
119
|
+
if (answers.license === "ISC") {
|
|
120
|
+
return `ISC License\n\nCopyright (c) ${year} ${authorText}\n\nPermission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.`;
|
|
121
|
+
}
|
|
122
|
+
if (answers.license === "Apache-2.0") {
|
|
123
|
+
return `Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nCopyright ${year} ${authorText}\n\nLicensed under the Apache License, Version 2.0 (the "License");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an "AS IS" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.`;
|
|
124
|
+
}
|
|
103
125
|
if (answers.license === "UNLICENSED") {
|
|
104
126
|
return `Copyright (c) ${year} ${authorText}. All rights reserved.\nUnauthorized copying, modification, or distribution via any medium is strictly prohibited.\nProprietary and confidential.`;
|
|
105
127
|
}
|
|
106
128
|
return `${answers.license} License\n\nCopyright (c) ${year} ${authorText}`;
|
|
107
129
|
}
|
|
130
|
+
function setupWorkspaceConfigs(targetDir, editor) {
|
|
131
|
+
if (["vscode", "cursor", "windsurf"].includes(editor)) {
|
|
132
|
+
const vscodeDir = join(targetDir, ".vscode");
|
|
133
|
+
if (!existsSync(vscodeDir)) {
|
|
134
|
+
mkdirSync(vscodeDir, { recursive: true });
|
|
135
|
+
}
|
|
136
|
+
const extensions = {
|
|
137
|
+
recommendations: ["biomejs.biome"],
|
|
138
|
+
};
|
|
139
|
+
const settings = {
|
|
140
|
+
"editor.formatOnSave": true,
|
|
141
|
+
"editor.defaultFormatter": "biomejs.biome",
|
|
142
|
+
"editor.codeActionsOnSave": {
|
|
143
|
+
"source.organizeImports.biome": "explicit",
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
writeFileSync(join(vscodeDir, "extensions.json"), JSON.stringify(extensions, null, 2), "utf-8");
|
|
147
|
+
writeFileSync(join(vscodeDir, "settings.json"), JSON.stringify(settings, null, 2), "utf-8");
|
|
148
|
+
}
|
|
149
|
+
else if (editor === "zed") {
|
|
150
|
+
const zedDir = join(targetDir, ".zed");
|
|
151
|
+
if (!existsSync(zedDir)) {
|
|
152
|
+
mkdirSync(zedDir, { recursive: true });
|
|
153
|
+
}
|
|
154
|
+
const settings = {
|
|
155
|
+
formatter: "language_server",
|
|
156
|
+
language_servers: ["biome"],
|
|
157
|
+
};
|
|
158
|
+
writeFileSync(join(zedDir, "settings.json"), JSON.stringify(settings, null, 2), "utf-8");
|
|
159
|
+
}
|
|
160
|
+
}
|
|
108
161
|
export async function scaffoldProjectMetadata(targetDir, answers, isToolingOnly) {
|
|
109
162
|
console.log(pc.cyan("⚙ Generating structural project configuration..."));
|
|
110
163
|
if (isToolingOnly && existsSync(join(targetDir, "package.json"))) {
|
|
@@ -117,14 +170,42 @@ export async function scaffoldProjectMetadata(targetDir, answers, isToolingOnly)
|
|
|
117
170
|
writeFileSync(join(targetDir, "README.md"), buildReadme(answers), "utf-8");
|
|
118
171
|
writeFileSync(join(targetDir, "LICENSE"), buildLicense(answers), "utf-8");
|
|
119
172
|
}
|
|
173
|
+
if (!isToolingOnly && answers.editor !== "none") {
|
|
174
|
+
console.log(pc.dim(` Configuring workspace settings for ${answers.editor}...`));
|
|
175
|
+
setupWorkspaceConfigs(targetDir, answers.editor);
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
writeFileSync(join(targetDir, ".npmrc"), "confirmModulesPurge=false\n", "utf-8");
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
console.log(pc.yellow(" Warning: Failed to inject local .npmrc bypass."));
|
|
182
|
+
}
|
|
183
|
+
if (answers.gitRemote) {
|
|
184
|
+
try {
|
|
185
|
+
console.log(pc.dim(" Initializing Git and configuring remote repository..."));
|
|
186
|
+
execSync("git init", { cwd: targetDir, stdio: "ignore" });
|
|
187
|
+
execSync(`git remote add origin ${answers.gitRemote}`, { cwd: targetDir, stdio: "ignore" });
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
console.log(pc.yellow(" Warning: Git initialization failed. Ensure Git is installed."));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
120
193
|
try {
|
|
121
194
|
console.log(pc.cyan("📦 Running dependency resolution step..."));
|
|
122
195
|
console.log(pc.dim(" Invoking pnpm install..."));
|
|
123
|
-
execSync("pnpm install", {
|
|
124
|
-
|
|
196
|
+
execSync("pnpm install", {
|
|
197
|
+
cwd: targetDir,
|
|
198
|
+
stdio: "inherit",
|
|
199
|
+
env: {
|
|
200
|
+
...process.env,
|
|
201
|
+
CI: "true",
|
|
202
|
+
npm_config_confirmModulesPurge: "false",
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
console.log(`\n ${pc.green("✔")} Manifest assets synced successfully.`);
|
|
125
206
|
}
|
|
126
|
-
catch
|
|
127
|
-
console.error(pc.red("✖ External subprocess resolution via pnpm failed.
|
|
207
|
+
catch {
|
|
208
|
+
console.error(pc.red("\n✖ External subprocess resolution via pnpm failed. Check the error log above."));
|
|
128
209
|
process.exit(1);
|
|
129
210
|
}
|
|
130
211
|
}
|
package/dist/scaffold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { vscodeFamily } from "./prompts.js";
|
|
2
|
+
/**
|
|
3
|
+
* Type guard to check if the selected editor belongs to the VS Code family.
|
|
4
|
+
* This allows sharing settings.json structures across compatible editors.
|
|
5
|
+
*/
|
|
2
6
|
export declare function isVSCodeEditor(editor: string): editor is (typeof vscodeFamily)[number];
|
|
3
7
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAEtF"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAEtF"}
|
package/dist/utils.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { vscodeFamily } from "./prompts.js";
|
|
2
|
+
/**
|
|
3
|
+
* Type guard to check if the selected editor belongs to the VS Code family.
|
|
4
|
+
* This allows sharing settings.json structures across compatible editors.
|
|
5
|
+
*/
|
|
2
6
|
export function isVSCodeEditor(editor) {
|
|
3
7
|
return vscodeFamily.includes(editor);
|
|
4
8
|
}
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAQ,YAAkC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC9D,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAQ,YAAkC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/validate.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function validateArgv(argv: Record<string,
|
|
1
|
+
export declare function validateArgv(argv: Record<string, unknown>): void;
|
|
2
2
|
//# sourceMappingURL=validate.d.ts.map
|
package/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAuBhE"}
|
package/dist/validate.js
CHANGED
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
import pc from "picocolors";
|
|
2
2
|
import { VALID_VALUES } from "./prompts.js";
|
|
3
|
-
// ── CLI flag validator ────────────────────────────────────────────────────────
|
|
4
|
-
// Runs before prompts so invalid flags are caught immediately with a clear
|
|
5
|
-
// error message instead of silently passing wrong values into the generator.
|
|
6
3
|
export function validateArgv(argv) {
|
|
7
4
|
let hasError = false;
|
|
8
|
-
// VALID_VALUES is the single source of truth — defined in prompts.ts and
|
|
9
|
-
// reused here so the two never drift out of sync
|
|
10
5
|
for (const [flag, allowed] of Object.entries(VALID_VALUES)) {
|
|
11
6
|
const value = argv[flag];
|
|
12
|
-
// Skip flags that weren't passed at all
|
|
13
7
|
if (!value)
|
|
14
8
|
continue;
|
|
15
9
|
if (!allowed.includes(value)) {
|
|
16
|
-
console.log(pc.red(`✖ Invalid --${flag} value: "${value}"`));
|
|
10
|
+
console.log(pc.red(`✖ Invalid --${flag} value: "${String(value)}"`));
|
|
17
11
|
console.log(pc.dim(` Allowed: ${allowed.join(", ")}`));
|
|
18
12
|
hasError = true;
|
|
19
13
|
}
|
|
20
14
|
}
|
|
15
|
+
if (argv["git-remote"] && typeof argv["git-remote"] !== "string") {
|
|
16
|
+
console.log(pc.red("✖ Invalid --git-remote format. Must be a valid repository string."));
|
|
17
|
+
hasError = true;
|
|
18
|
+
}
|
|
21
19
|
if (hasError) {
|
|
22
20
|
console.log();
|
|
23
21
|
process.exit(1);
|
package/dist/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,IAA6B;IACxD,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,IAAI,CAAE,OAA6B,CAAC,QAAQ,CAAC,KAAe,CAAC,EAAE,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,IAAI,YAAY,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,cAAe,OAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,QAAQ,EAAE,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC,CAAC;QACzF,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keit/create-base",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Interactive CLI to scaffold modern TypeScript/JavaScript projects with Biome, Husky, Commitlint, and more",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"create",
|
|
@@ -64,11 +64,14 @@
|
|
|
64
64
|
"knip": "^6.16.1",
|
|
65
65
|
"lint-staged": "^17.0.7",
|
|
66
66
|
"secretlint": "^13.0.2",
|
|
67
|
+
"ts-node": "^10.9.2",
|
|
68
|
+
"tsx": "^4.22.4",
|
|
67
69
|
"typescript": "^6.0.3"
|
|
68
70
|
},
|
|
69
71
|
"scripts": {
|
|
70
72
|
"build": "tsc",
|
|
71
73
|
"dev": "tsc --watch",
|
|
74
|
+
"test": "node --import tsx --test tests/**/*.test.ts",
|
|
72
75
|
"start": "node dist/index.js",
|
|
73
76
|
"typecheck": "tsc --noEmit",
|
|
74
77
|
"format": "biome format --write .",
|