harness-cli-plugin-node 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,11 @@
1
+ import { Command } from '@oclif/core';
2
+ export declare class Create extends Command {
3
+ static description: string;
4
+ static flags: {
5
+ 'no-input': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
6
+ name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ description: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/node/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAmG5C,qBAAa,MAAO,SAAQ,OAAO;IACjC,MAAM,CAAC,WAAW,SAAmC;IAErD,MAAM,CAAC,KAAK;;;;MAYX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0E3B"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Create = void 0;
7
+ const core_1 = require("@oclif/core");
8
+ const prompts_1 = require("@inquirer/prompts");
9
+ const node_fs_1 = __importDefault(require("node:fs"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ // D-01: 8 scaffold files generated for the new Node project
12
+ // Template functions return file content as plain strings (no ejs/handlebars — CJS-safe)
13
+ function packageJsonContent(name, description) {
14
+ return (JSON.stringify({
15
+ name,
16
+ version: '0.1.0',
17
+ description,
18
+ type: 'commonjs',
19
+ main: './dist/index.js',
20
+ types: './dist/index.d.ts',
21
+ scripts: {
22
+ build: 'tsc',
23
+ test: 'vitest run',
24
+ lint: 'eslint src',
25
+ },
26
+ devDependencies: {
27
+ '@types/node': '^22.0.0',
28
+ eslint: '^9.0.0',
29
+ typescript: '6.0.3',
30
+ vitest: '^4.1.5',
31
+ },
32
+ }, null, 2) + '\n');
33
+ }
34
+ function tsconfigContent() {
35
+ return (JSON.stringify({
36
+ compilerOptions: {
37
+ target: 'ES2022',
38
+ module: 'commonjs',
39
+ moduleResolution: 'node',
40
+ strict: true,
41
+ esModuleInterop: true,
42
+ skipLibCheck: true,
43
+ declaration: true,
44
+ outDir: './dist',
45
+ rootDir: './src',
46
+ ignoreDeprecations: '6.0',
47
+ },
48
+ include: ['src'],
49
+ exclude: ['node_modules', 'dist'],
50
+ }, null, 2) + '\n');
51
+ }
52
+ function srcIndexContent(name) {
53
+ return `// ${name}\n// Entry point\n\nexport function main(): void {\n console.log('${name}')\n}\n`;
54
+ }
55
+ function gitignoreContent() {
56
+ return 'node_modules/\ndist/\n*.js.map\n.DS_Store\n';
57
+ }
58
+ function vitestConfigContent() {
59
+ return `import { defineConfig } from 'vitest/config'\n\nexport default defineConfig({\n test: {\n disableConsoleIntercept: true,\n },\n})\n`;
60
+ }
61
+ function srcIndexTestContent(name) {
62
+ return `import { describe, it } from 'vitest'\n\ndescribe('${name}', () => {\n it('has tests', () => {\n // TODO: add tests\n })\n})\n`;
63
+ }
64
+ function readmeContent(name, description) {
65
+ return `# ${name}\n\n${description || 'A Node.js project.'}\n\n## Setup\n\n\`\`\`bash\nnpm install\nnpm run build\nnpm test\n\`\`\`\n`;
66
+ }
67
+ function eslintrcContent() {
68
+ return (JSON.stringify({
69
+ env: { node: true, es2022: true },
70
+ parser: '@typescript-eslint/parser',
71
+ plugins: ['@typescript-eslint'],
72
+ extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
73
+ rules: {},
74
+ }, null, 2) + '\n');
75
+ }
76
+ const NAME_PATTERN = /^[a-z0-9-]+$/;
77
+ class Create extends core_1.Command {
78
+ static description = 'Scaffold a new Node.js project';
79
+ static flags = {
80
+ 'no-input': core_1.Flags.boolean({
81
+ description: 'Disable interactive prompts (use --name flag for non-interactive mode)',
82
+ default: false,
83
+ }),
84
+ name: core_1.Flags.string({
85
+ description: 'Project name (required in non-interactive mode)',
86
+ }),
87
+ description: core_1.Flags.string({
88
+ description: 'Project description',
89
+ default: '',
90
+ }),
91
+ };
92
+ async run() {
93
+ const { flags } = await this.parse(Create);
94
+ // D-04, D-07: TTY detection — same DX-01 pattern as plugin init in Phase 2
95
+ const isInteractive = process.stdin.isTTY && !flags['no-input'];
96
+ let projectName;
97
+ let projectDescription;
98
+ if (isInteractive) {
99
+ // D-02: Two prompts — name (required) and description (optional, empty default)
100
+ projectName = await (0, prompts_1.input)({
101
+ message: 'Project name:',
102
+ validate: (value) => {
103
+ if (!value.trim())
104
+ return 'Project name is required';
105
+ if (!NAME_PATTERN.test(value.trim())) {
106
+ return 'Project name must contain only lowercase letters, numbers, and hyphens';
107
+ }
108
+ return true;
109
+ },
110
+ });
111
+ projectDescription = await (0, prompts_1.input)({
112
+ message: 'Description (optional):',
113
+ default: '',
114
+ });
115
+ }
116
+ else {
117
+ // D-06: --no-input (or non-TTY) without --name → exit with exact error message
118
+ if (!flags.name) {
119
+ this.error('Error: --name is required in non-interactive mode', { exit: 1 });
120
+ }
121
+ // T-04-03: Validate name in non-interactive branch — same regex as interactive prompt
122
+ if (!flags.name.match(NAME_PATTERN)) {
123
+ this.error('Invalid project name: must contain only lowercase letters, numbers, and hyphens', { exit: 1 });
124
+ }
125
+ projectName = flags.name;
126
+ projectDescription = flags.description ?? '';
127
+ }
128
+ // D-03: Create directory named after project in process.cwd()
129
+ const outDir = node_path_1.default.resolve(process.cwd(), projectName);
130
+ if (node_fs_1.default.existsSync(outDir)) {
131
+ this.error(`Directory '${projectName}' already exists in ${process.cwd()}`, { exit: 1 });
132
+ }
133
+ this.log(`\nScaffolding ${projectName} in ${outDir}...`);
134
+ // Create directory structure
135
+ node_fs_1.default.mkdirSync(node_path_1.default.join(outDir, 'src'), { recursive: true });
136
+ // D-01: Write all 8 scaffold files
137
+ node_fs_1.default.writeFileSync(node_path_1.default.join(outDir, 'package.json'), packageJsonContent(projectName, projectDescription));
138
+ node_fs_1.default.writeFileSync(node_path_1.default.join(outDir, 'tsconfig.json'), tsconfigContent());
139
+ node_fs_1.default.writeFileSync(node_path_1.default.join(outDir, 'src', 'index.ts'), srcIndexContent(projectName));
140
+ node_fs_1.default.writeFileSync(node_path_1.default.join(outDir, '.gitignore'), gitignoreContent());
141
+ node_fs_1.default.writeFileSync(node_path_1.default.join(outDir, 'vitest.config.ts'), vitestConfigContent());
142
+ node_fs_1.default.writeFileSync(node_path_1.default.join(outDir, 'src', 'index.test.ts'), srcIndexTestContent(projectName));
143
+ node_fs_1.default.writeFileSync(node_path_1.default.join(outDir, 'README.md'), readmeContent(projectName, projectDescription));
144
+ node_fs_1.default.writeFileSync(node_path_1.default.join(outDir, '.eslintrc'), eslintrcContent());
145
+ this.log(`\nDone! Created ${projectName}/`);
146
+ this.log(` package.json`);
147
+ this.log(` tsconfig.json`);
148
+ this.log(` src/index.ts`);
149
+ this.log(` src/index.test.ts`);
150
+ this.log(` vitest.config.ts`);
151
+ this.log(` .gitignore`);
152
+ this.log(` README.md`);
153
+ this.log(` .eslintrc`);
154
+ this.log(`\nNext: cd ${projectName} && npm install`);
155
+ }
156
+ }
157
+ exports.Create = Create;
158
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/node/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * harness-cli-plugin-node
3
+ *
4
+ * Provides the `create node` command that scaffolds a new Node.js project.
5
+ *
6
+ * Plugin contract: export a named `register` function.
7
+ * Import PluginContract from 'harness-cli' (the installed package, not source paths).
8
+ */
9
+ import type { PluginContract } from 'harness-cli';
10
+ export declare const register: PluginContract['register'];
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAGjD,eAAO,MAAM,QAAQ,EAAE,cAAc,CAAC,UAAU,CAE/C,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.register = void 0;
4
+ const register = function (_cli) {
5
+ // No plugin-level setup needed. Commands are discovered from dist/commands/ via manifest.
6
+ };
7
+ exports.register = register;
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAWO,MAAM,QAAQ,GAA+B,UAAU,IAAY;IACxE,0FAA0F;AAC5F,CAAC,CAAA;AAFY,QAAA,QAAQ,YAEpB"}
@@ -0,0 +1,48 @@
1
+ {
2
+ "commands": {
3
+ "node:create": {
4
+ "aliases": [],
5
+ "args": {},
6
+ "description": "Scaffold a new Node.js project",
7
+ "flags": {
8
+ "no-input": {
9
+ "description": "Disable interactive prompts (use --name flag for non-interactive mode)",
10
+ "name": "no-input",
11
+ "allowNo": false,
12
+ "type": "boolean"
13
+ },
14
+ "name": {
15
+ "description": "Project name (required in non-interactive mode)",
16
+ "name": "name",
17
+ "hasDynamicHelp": false,
18
+ "multiple": false,
19
+ "type": "option"
20
+ },
21
+ "description": {
22
+ "description": "Project description",
23
+ "name": "description",
24
+ "default": "",
25
+ "hasDynamicHelp": false,
26
+ "multiple": false,
27
+ "type": "option"
28
+ }
29
+ },
30
+ "hasDynamicHelp": false,
31
+ "hiddenAliases": [],
32
+ "id": "node:create",
33
+ "pluginAlias": "harness-cli-plugin-node",
34
+ "pluginName": "harness-cli-plugin-node",
35
+ "pluginType": "core",
36
+ "strict": true,
37
+ "enableJsonFlag": false,
38
+ "isESM": false,
39
+ "relativePath": [
40
+ "dist",
41
+ "commands",
42
+ "node",
43
+ "create.js"
44
+ ]
45
+ }
46
+ },
47
+ "version": "0.1.0"
48
+ }
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "harness-cli-plugin-node",
3
+ "version": "0.1.0",
4
+ "description": "Node.js project scaffolding plugin for harness-cli",
5
+ "type": "commonjs",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "oclif.manifest.json"
11
+ ],
12
+ "engines": {
13
+ "node": ">=22.0.0"
14
+ },
15
+ "oclif": {
16
+ "bin": "harness-cli",
17
+ "dirname": "harness-cli",
18
+ "commands": "./dist/commands",
19
+ "topicSeparator": " "
20
+ },
21
+ "dependencies": {
22
+ "@inquirer/prompts": "^5.5.0"
23
+ },
24
+ "peerDependencies": {
25
+ "harness-cli": "*"
26
+ },
27
+ "devDependencies": {
28
+ "@oclif/core": "^4.11.0",
29
+ "@oclif/test": "^4.1.6",
30
+ "@types/node": "^22.0.0",
31
+ "oclif": "^4.23.0",
32
+ "typescript": "6.0.3",
33
+ "vitest": "^4.1.5",
34
+ "harness-cli": "0.1.0"
35
+ },
36
+ "scripts": {
37
+ "build": "tsc -p tsconfig.build.json && oclif manifest",
38
+ "test": "vitest run"
39
+ }
40
+ }