@kyuujs/cli 0.1.0-alpha.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.
Files changed (88) hide show
  1. package/dist/bin.d.ts +3 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +13 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/commands/build.d.ts +16 -0
  6. package/dist/commands/build.d.ts.map +1 -0
  7. package/dist/commands/build.js +40 -0
  8. package/dist/commands/build.js.map +1 -0
  9. package/dist/commands/dev.d.ts +15 -0
  10. package/dist/commands/dev.d.ts.map +1 -0
  11. package/dist/commands/dev.js +53 -0
  12. package/dist/commands/dev.js.map +1 -0
  13. package/dist/commands/new.d.ts +12 -0
  14. package/dist/commands/new.d.ts.map +1 -0
  15. package/dist/commands/new.js +83 -0
  16. package/dist/commands/new.js.map +1 -0
  17. package/dist/commands/start.d.ts +22 -0
  18. package/dist/commands/start.d.ts.map +1 -0
  19. package/dist/commands/start.js +64 -0
  20. package/dist/commands/start.js.map +1 -0
  21. package/dist/dispatcher.d.ts +20 -0
  22. package/dist/dispatcher.d.ts.map +1 -0
  23. package/dist/dispatcher.js +51 -0
  24. package/dist/dispatcher.js.map +1 -0
  25. package/dist/help.d.ts +5 -0
  26. package/dist/help.d.ts.map +1 -0
  27. package/dist/help.js +24 -0
  28. package/dist/help.js.map +1 -0
  29. package/dist/index.d.ts +35 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +45 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/project/git.d.ts +12 -0
  34. package/dist/project/git.d.ts.map +1 -0
  35. package/dist/project/git.js +23 -0
  36. package/dist/project/git.js.map +1 -0
  37. package/dist/project/options.d.ts +11 -0
  38. package/dist/project/options.d.ts.map +1 -0
  39. package/dist/project/options.js +2 -0
  40. package/dist/project/options.js.map +1 -0
  41. package/dist/project/package-manager.d.ts +13 -0
  42. package/dist/project/package-manager.d.ts.map +1 -0
  43. package/dist/project/package-manager.js +25 -0
  44. package/dist/project/package-manager.js.map +1 -0
  45. package/dist/project/scaffolder.d.ts +6 -0
  46. package/dist/project/scaffolder.d.ts.map +1 -0
  47. package/dist/project/scaffolder.js +113 -0
  48. package/dist/project/scaffolder.js.map +1 -0
  49. package/dist/project/validation.d.ts +10 -0
  50. package/dist/project/validation.d.ts.map +1 -0
  51. package/dist/project/validation.js +54 -0
  52. package/dist/project/validation.js.map +1 -0
  53. package/dist/project/wizard.d.ts +17 -0
  54. package/dist/project/wizard.d.ts.map +1 -0
  55. package/dist/project/wizard.js +72 -0
  56. package/dist/project/wizard.js.map +1 -0
  57. package/dist/runner/app-runner.d.ts +2 -0
  58. package/dist/runner/app-runner.d.ts.map +1 -0
  59. package/dist/runner/app-runner.js +54 -0
  60. package/dist/runner/app-runner.js.map +1 -0
  61. package/dist/runner/dev-runner.d.ts +15 -0
  62. package/dist/runner/dev-runner.d.ts.map +1 -0
  63. package/dist/runner/dev-runner.js +209 -0
  64. package/dist/runner/dev-runner.js.map +1 -0
  65. package/dist/version.d.ts +5 -0
  66. package/dist/version.d.ts.map +1 -0
  67. package/dist/version.js +16 -0
  68. package/dist/version.js.map +1 -0
  69. package/package.json +21 -0
  70. package/src/bin.ts +13 -0
  71. package/src/commands/build.ts +59 -0
  72. package/src/commands/dev.ts +73 -0
  73. package/src/commands/new.ts +107 -0
  74. package/src/commands/start.ts +91 -0
  75. package/src/dispatcher.ts +79 -0
  76. package/src/help.ts +23 -0
  77. package/src/index.ts +90 -0
  78. package/src/project/git.ts +31 -0
  79. package/src/project/options.ts +11 -0
  80. package/src/project/package-manager.ts +37 -0
  81. package/src/project/scaffolder.ts +140 -0
  82. package/src/project/validation.ts +67 -0
  83. package/src/project/wizard.ts +89 -0
  84. package/src/runner/app-runner.ts +61 -0
  85. package/src/runner/dev-runner.ts +256 -0
  86. package/src/version.ts +15 -0
  87. package/tsconfig.json +10 -0
  88. package/tsconfig.tsbuildinfo +1 -0
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "./dispatcher.js";
3
+ runCli(process.argv.slice(2))
4
+ .then(({ exitCode }) => {
5
+ if (exitCode !== 0) {
6
+ process.exit(exitCode);
7
+ }
8
+ })
9
+ .catch((err) => {
10
+ console.error(err);
11
+ process.exit(1);
12
+ });
13
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC1B,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IACrB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type BuildResult } from "@kyuujs/core";
2
+ import type { BaseCliOptions, CliResult } from "../dispatcher.js";
3
+ export interface BuildCommandOptions extends BaseCliOptions {
4
+ /** Target project root directory */
5
+ projectRoot?: string;
6
+ /** Working directory override */
7
+ cwd?: string;
8
+ }
9
+ export interface BuildCommandResult extends CliResult {
10
+ buildResult?: BuildResult;
11
+ }
12
+ /**
13
+ * Handles the "kyuu build" command execution pipeline.
14
+ */
15
+ export declare function handleBuildCommand(args?: string[], options?: BuildCommandOptions): Promise<BuildCommandResult>;
16
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAuC,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAqC7B"}
@@ -0,0 +1,40 @@
1
+ import { resolve } from "node:path";
2
+ import { BUILD_OUTPUT_DIR, BuildOrchestrator } from "@kyuujs/core";
3
+ /**
4
+ * Handles the "kyuu build" command execution pipeline.
5
+ */
6
+ export async function handleBuildCommand(args = [], options = {}) {
7
+ void args;
8
+ const writeOut = options.stdout ?? ((msg) => process.stdout.write(msg + "\n"));
9
+ const writeErr = options.stderr ?? ((msg) => process.stderr.write(msg + "\n"));
10
+ const rawRoot = options.projectRoot ?? options.cwd ?? process.cwd();
11
+ const projectRoot = resolve(rawRoot);
12
+ try {
13
+ const orchestrator = new BuildOrchestrator({ projectRoot });
14
+ const buildResult = await orchestrator.build();
15
+ const outputLines = [
16
+ "Kyuu build complete.",
17
+ "",
18
+ ` Build output: ${BUILD_OUTPUT_DIR}`,
19
+ ` Language: ${buildResult.language}`,
20
+ ` Routes: ${buildResult.manifest.routes.length}`,
21
+ ];
22
+ const message = outputLines.join("\n");
23
+ writeOut(message);
24
+ return {
25
+ exitCode: 0,
26
+ output: message,
27
+ buildResult,
28
+ };
29
+ }
30
+ catch (err) {
31
+ const errMessage = err instanceof Error ? err.message : String(err);
32
+ const errText = `Kyuu build failed.\n\n${errMessage}`;
33
+ writeErr(errText);
34
+ return {
35
+ exitCode: 1,
36
+ output: errText,
37
+ };
38
+ }
39
+ }
40
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAoB,MAAM,cAAc,CAAC;AAcrF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAI,GAAa,EAAE,EACnB,OAAO,GAAwB,EAAE;IAEjC,KAAK,IAAI,CAAC;IACV,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;IAEvF,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAE/C,MAAM,WAAW,GAAG;YAClB,sBAAsB;YACtB,EAAE;YACF,mBAAmB,gBAAgB,EAAE;YACrC,mBAAmB,WAAW,CAAC,QAAQ,EAAE;YACzC,mBAAmB,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;SACxD,CAAC;QAEF,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAElB,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,OAAO;YACf,WAAW;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,yBAAyB,UAAU,EAAE,CAAC;QACtD,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,OAAO;SAChB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { BaseCliOptions, CliResult } from "../dispatcher.js";
2
+ import { type DevServerController } from "../runner/dev-runner.js";
3
+ export interface DevCommandOptions extends BaseCliOptions {
4
+ projectRoot?: string;
5
+ cwd?: string;
6
+ watch?: boolean;
7
+ }
8
+ export interface DevCommandResult extends CliResult {
9
+ controller?: DevServerController;
10
+ }
11
+ /**
12
+ * Handles the "kyuu dev" command execution pipeline.
13
+ */
14
+ export declare function handleDevCommand(args?: string[], options?: DevCommandOptions): Promise<DevCommandResult>;
15
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnF,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAkD3B"}
@@ -0,0 +1,53 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { findConfigFile } from "@kyuujs/core";
4
+ import { startDevServer } from "../runner/dev-runner.js";
5
+ /**
6
+ * Handles the "kyuu dev" command execution pipeline.
7
+ */
8
+ export async function handleDevCommand(args = [], options = {}) {
9
+ void args;
10
+ const writeOut = options.stdout ?? ((msg) => process.stdout.write(msg + "\n"));
11
+ const writeErr = options.stderr ?? ((msg) => process.stderr.write(msg + "\n"));
12
+ const rawRoot = options.projectRoot ?? options.cwd ?? process.cwd();
13
+ const projectRoot = resolve(rawRoot);
14
+ const configFile = findConfigFile(projectRoot);
15
+ const hasPkgJson = existsSync(join(projectRoot, "package.json"));
16
+ if (!configFile && !hasPkgJson) {
17
+ const errText = [
18
+ "Kyuu project not found.",
19
+ "",
20
+ "Could not locate kyuu.config.ts from:",
21
+ ` ${projectRoot}`,
22
+ "",
23
+ 'Run "kyuu new <name>" to create a new project.',
24
+ ].join("\n");
25
+ writeErr(errText);
26
+ return { exitCode: 3, output: errText };
27
+ }
28
+ let controller;
29
+ try {
30
+ controller = await startDevServer({
31
+ projectRoot,
32
+ watch: options.watch ?? true,
33
+ stdout: writeOut,
34
+ stderr: writeErr,
35
+ });
36
+ }
37
+ catch (err) {
38
+ const errText = `Failed to start development server: ${err instanceof Error ? err.message : String(err)}`;
39
+ writeErr(errText);
40
+ return { exitCode: 4, output: errText };
41
+ }
42
+ if (!controller.url) {
43
+ await controller.stop();
44
+ const errText = "Failed to start development server.";
45
+ return { exitCode: 4, output: errText };
46
+ }
47
+ if (options.watch === false) {
48
+ await controller.stop();
49
+ return { exitCode: 0, output: "Development server started and stopped cleanly.", controller };
50
+ }
51
+ return { exitCode: 0, output: `Development server running at ${controller.url}`, controller };
52
+ }
53
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,cAAc,EAA4B,MAAM,yBAAyB,CAAC;AAYnF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAI,GAAa,EAAE,EACnB,OAAO,GAAsB,EAAE;IAE/B,KAAK,IAAI,CAAC;IACV,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;IAEvF,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IAEjE,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG;YACd,yBAAyB;YACzB,EAAE;YACF,uCAAuC;YACvC,KAAK,WAAW,EAAE;YAClB,EAAE;YACF,gDAAgD;SACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,UAA+B,CAAC;IACpC,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,cAAc,CAAC;YAChC,WAAW;YACX,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;YAC5B,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,uCAAuC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1G,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QACpB,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,qCAAqC,CAAC;QACtD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,iDAAiD,EAAE,UAAU,EAAE,CAAC;IAChG,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,iCAAiC,UAAU,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC;AAChG,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { BaseCliOptions, CliResult } from "../dispatcher.js";
2
+ import type { ProjectCreationOptions } from "../project/options.js";
3
+ export interface NewCommandOptions extends BaseCliOptions {
4
+ cwd?: string;
5
+ defaults?: Partial<ProjectCreationOptions>;
6
+ interactive?: boolean;
7
+ }
8
+ /**
9
+ * Handles the "kyuu new <name>" command execution pipeline.
10
+ */
11
+ export declare function handleNewCommand(args?: string[], options?: NewCommandOptions): Promise<CliResult>;
12
+ //# sourceMappingURL=new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAsFpB"}
@@ -0,0 +1,83 @@
1
+ import { initializeGitRepo } from "../project/git.js";
2
+ import { installDependencies } from "../project/package-manager.js";
3
+ import { scaffoldProject } from "../project/scaffolder.js";
4
+ import { validateProjectName } from "../project/validation.js";
5
+ import { CancelledError, runWizard } from "../project/wizard.js";
6
+ /**
7
+ * Handles the "kyuu new <name>" command execution pipeline.
8
+ */
9
+ export async function handleNewCommand(args = [], options = {}) {
10
+ const writeOut = options.stdout ?? ((msg) => process.stdout.write(msg + "\n"));
11
+ const writeErr = options.stderr ?? ((msg) => process.stderr.write(msg + "\n"));
12
+ const rawName = args[0];
13
+ if (!rawName || rawName.trim().length === 0) {
14
+ const errText = "Error: Missing project name.\nUsage: kyuu new <name>";
15
+ writeErr(errText);
16
+ return { exitCode: 1, output: errText };
17
+ }
18
+ const validation = validateProjectName(rawName, options.cwd);
19
+ if (!validation.valid || !validation.targetDirectory) {
20
+ const errText = `Error: ${validation.error}`;
21
+ writeErr(errText);
22
+ return { exitCode: 3, output: errText };
23
+ }
24
+ let creationOptions;
25
+ try {
26
+ creationOptions = await runWizard({
27
+ name: rawName.trim(),
28
+ directory: validation.targetDirectory,
29
+ defaults: options.defaults,
30
+ interactive: options.interactive,
31
+ });
32
+ }
33
+ catch (err) {
34
+ if (err instanceof CancelledError) {
35
+ const cancelText = "Operation cancelled. No project was created.";
36
+ writeOut(cancelText);
37
+ return { exitCode: 0, output: cancelText };
38
+ }
39
+ const errText = `Error: ${err instanceof Error ? err.message : String(err)}`;
40
+ writeErr(errText);
41
+ return { exitCode: 1, output: errText };
42
+ }
43
+ // 1. Scaffold files
44
+ try {
45
+ await scaffoldProject(creationOptions);
46
+ }
47
+ catch (err) {
48
+ const errText = `Scaffolding failed: ${err instanceof Error ? err.message : String(err)}`;
49
+ writeErr(errText);
50
+ return { exitCode: 1, output: errText };
51
+ }
52
+ let installSuccess = true;
53
+ // 2. Install dependencies (unless skipInstall is true)
54
+ if (!creationOptions.skipInstall) {
55
+ const installResult = await installDependencies(creationOptions.directory, creationOptions.packageManager);
56
+ if (!installResult.success) {
57
+ installSuccess = false;
58
+ writeErr(`Warning: Dependency installation failed.\n${installResult.error}`);
59
+ }
60
+ }
61
+ // 3. Initialize Git if requested
62
+ if (creationOptions.initializeGit) {
63
+ const gitResult = await initializeGitRepo(creationOptions.directory);
64
+ if (!gitResult.success) {
65
+ writeErr("Warning: Git initialization failed. You can initialize Git manually.");
66
+ }
67
+ }
68
+ // 4. Report final success and next steps
69
+ const successLines = [
70
+ `✔ Kyuu project "${creationOptions.name}" created successfully.`,
71
+ "",
72
+ "Next steps:",
73
+ ` cd ${creationOptions.name}`,
74
+ ];
75
+ if (creationOptions.skipInstall || !installSuccess) {
76
+ successLines.push(` ${creationOptions.packageManager} install`);
77
+ }
78
+ successLines.push(` ${creationOptions.packageManager} run dev`);
79
+ const successText = successLines.join("\n");
80
+ writeOut(successText);
81
+ return { exitCode: 0, output: successText };
82
+ }
83
+ //# sourceMappingURL=new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AASjE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAI,GAAa,EAAE,EACnB,OAAO,GAAsB,EAAE;IAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;IAEvF,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,sDAAsD,CAAC;QACvE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,UAAU,UAAU,CAAC,KAAK,EAAE,CAAC;QAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,eAAuC,CAAC;IAC5C,IAAI,CAAC;QACH,eAAe,GAAG,MAAM,SAAS,CAAC;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;YACpB,SAAS,EAAE,UAAU,CAAC,eAAe;YACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,8CAA8C,CAAC;YAClE,QAAQ,CAAC,UAAU,CAAC,CAAC;YACrB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC7C,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7E,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1F,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,cAAc,GAAG,IAAI,CAAC;IAC1B,uDAAuD;IACvD,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAC7C,eAAe,CAAC,SAAS,EACzB,eAAe,CAAC,cAAc,CAC/B,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,cAAc,GAAG,KAAK,CAAC;YACvB,QAAQ,CAAC,6CAA6C,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,eAAe,CAAC,aAAa,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvB,QAAQ,CAAC,sEAAsE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,YAAY,GAAG;QACnB,mBAAmB,eAAe,CAAC,IAAI,yBAAyB;QAChE,EAAE;QACF,aAAa;QACb,QAAQ,eAAe,CAAC,IAAI,EAAE;KAC/B,CAAC;IAEF,IAAI,eAAe,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE,CAAC;QACnD,YAAY,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,cAAc,UAAU,CAAC,CAAC;IACnE,CAAC;IAED,YAAY,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,cAAc,UAAU,CAAC,CAAC;IAEjE,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEtB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type ProductionRunnerResult } from "@kyuujs/core";
2
+ import type { BaseCliOptions, CliResult } from "../dispatcher.js";
3
+ export interface StartCommandOptions extends BaseCliOptions {
4
+ /** Target project root directory */
5
+ projectRoot?: string;
6
+ /** Working directory override */
7
+ cwd?: string;
8
+ /** Port override for production HTTP server */
9
+ port?: number;
10
+ /** Host override for production HTTP server */
11
+ host?: string;
12
+ /** If true, attaches SIGINT/SIGTERM process signal handlers for graceful shutdown */
13
+ attachSignalHandlers?: boolean;
14
+ }
15
+ export interface StartCommandResult extends CliResult {
16
+ runnerResult?: ProductionRunnerResult;
17
+ }
18
+ /**
19
+ * Handles the "kyuu start" command execution pipeline.
20
+ */
21
+ export declare function handleStartCommand(args?: string[], options?: StartCommandOptions): Promise<StartCommandResult>;
22
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AACA,OAAO,EAA2C,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA+D7B"}
@@ -0,0 +1,64 @@
1
+ import { resolve } from "node:path";
2
+ import { BUILD_OUTPUT_DIR, startProductionServer } from "@kyuujs/core";
3
+ /**
4
+ * Handles the "kyuu start" command execution pipeline.
5
+ */
6
+ export async function handleStartCommand(args = [], options = {}) {
7
+ void args;
8
+ const writeOut = options.stdout ?? ((msg) => process.stdout.write(msg + "\n"));
9
+ const writeErr = options.stderr ?? ((msg) => process.stderr.write(msg + "\n"));
10
+ const rawRoot = options.projectRoot ?? options.cwd ?? process.cwd();
11
+ const projectRoot = resolve(rawRoot);
12
+ try {
13
+ const runnerResult = await startProductionServer({
14
+ projectRoot,
15
+ port: options.port,
16
+ host: options.host,
17
+ });
18
+ const host = runnerResult.config.server.host;
19
+ const port = runnerResult.config.server.port;
20
+ const displayHost = host === "0.0.0.0" ? "localhost" : host;
21
+ const serverUrl = `http://${displayHost}:${port}`;
22
+ const outputLines = [
23
+ `Kyuu production server running at ${serverUrl}`,
24
+ "",
25
+ ` Build output: ${BUILD_OUTPUT_DIR}`,
26
+ ` Language: ${runnerResult.manifest.metadata.language}`,
27
+ ` Routes: ${runnerResult.manifest.routes.length}`,
28
+ ];
29
+ const message = outputLines.join("\n");
30
+ writeOut(message);
31
+ if (options.attachSignalHandlers !== false) {
32
+ const shutdown = async () => {
33
+ try {
34
+ await runnerResult.app.close();
35
+ writeOut("Kyuu server shut down gracefully.");
36
+ }
37
+ catch {
38
+ // ignore shutdown errors on exit
39
+ }
40
+ };
41
+ process.once("SIGINT", () => {
42
+ void shutdown();
43
+ });
44
+ process.once("SIGTERM", () => {
45
+ void shutdown();
46
+ });
47
+ }
48
+ return {
49
+ exitCode: 0,
50
+ output: message,
51
+ runnerResult,
52
+ };
53
+ }
54
+ catch (err) {
55
+ const errMessage = err instanceof Error ? err.message : String(err);
56
+ const errText = `Kyuu production server failed to start.\n\n${errMessage}`;
57
+ writeErr(errText);
58
+ return {
59
+ exitCode: 1,
60
+ output: errText,
61
+ };
62
+ }
63
+ }
64
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type BuildCommandOptions } from "./commands/build.js";
2
+ import { type DevCommandOptions } from "./commands/dev.js";
3
+ import { type NewCommandOptions } from "./commands/new.js";
4
+ import { type StartCommandOptions } from "./commands/start.js";
5
+ export interface BaseCliOptions {
6
+ stdout?: (msg: string) => void;
7
+ stderr?: (msg: string) => void;
8
+ }
9
+ export interface RunCliOptions extends BaseCliOptions, NewCommandOptions, DevCommandOptions, BuildCommandOptions, StartCommandOptions {
10
+ }
11
+ export interface CliResult {
12
+ exitCode: number;
13
+ output: string;
14
+ }
15
+ /**
16
+ * Main command dispatcher for Kyuu CLI.
17
+ * Inspects args for flags and commands, delegating to appropriate handlers.
18
+ */
19
+ export declare function runCli(args?: string[], options?: RunCliOptions): Promise<CliResult>;
20
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAInF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,aACf,SACE,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB;CAAG;AAE1B,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAiDjG"}
@@ -0,0 +1,51 @@
1
+ import { handleBuildCommand } from "./commands/build.js";
2
+ import { handleDevCommand } from "./commands/dev.js";
3
+ import { handleNewCommand } from "./commands/new.js";
4
+ import { handleStartCommand } from "./commands/start.js";
5
+ import { getHelpText } from "./help.js";
6
+ import { getVersion } from "./version.js";
7
+ /**
8
+ * Main command dispatcher for Kyuu CLI.
9
+ * Inspects args for flags and commands, delegating to appropriate handlers.
10
+ */
11
+ export async function runCli(args = [], options = {}) {
12
+ const writeOut = options.stdout ?? ((msg) => process.stdout.write(msg + "\n"));
13
+ const writeErr = options.stderr ?? ((msg) => process.stderr.write(msg + "\n"));
14
+ const hasHelp = args.includes("--help") || args.includes("-h");
15
+ const hasVersion = args.includes("--version") || args.includes("-v");
16
+ // 1. Help flag or bare invocation
17
+ if (args.length === 0 || hasHelp) {
18
+ const text = getHelpText();
19
+ writeOut(text);
20
+ return { exitCode: 0, output: text };
21
+ }
22
+ // 2. Version flag
23
+ if (hasVersion) {
24
+ const version = getVersion();
25
+ writeOut(version);
26
+ return { exitCode: 0, output: version };
27
+ }
28
+ // 3. Command resolution
29
+ const firstArg = args[0];
30
+ if (firstArg === "dev") {
31
+ return handleDevCommand(args.slice(1), options);
32
+ }
33
+ if (firstArg === "build") {
34
+ return handleBuildCommand(args.slice(1), options);
35
+ }
36
+ if (firstArg === "start") {
37
+ return handleStartCommand(args.slice(1), options);
38
+ }
39
+ if (firstArg === "new") {
40
+ return handleNewCommand(args.slice(1), options);
41
+ }
42
+ if (firstArg.startsWith("-")) {
43
+ const errText = `Unknown option: ${firstArg}\n\nRun "kyuu --help" for available options.`;
44
+ writeErr(errText);
45
+ return { exitCode: 1, output: errText };
46
+ }
47
+ const errText = `Unknown command: ${firstArg}\n\nRun "kyuu --help" for available commands.`;
48
+ writeErr(errText);
49
+ return { exitCode: 1, output: errText };
50
+ }
51
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"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"}
package/dist/help.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Returns the concise help text for the Kyuu CLI foundation.
3
+ */
4
+ export declare function getHelpText(): string;
5
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAmBpC"}
package/dist/help.js ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Returns the concise help text for the Kyuu CLI foundation.
3
+ */
4
+ export function getHelpText() {
5
+ return [
6
+ "Kyuu CLI",
7
+ "",
8
+ "Usage:",
9
+ " kyuu <command> [options]",
10
+ "",
11
+ "Commands:",
12
+ " dev Start development server with live reload",
13
+ " build Build production application artifact",
14
+ " start Start production application server",
15
+ " new Scaffold a new Kyuu project",
16
+ "",
17
+ "Options:",
18
+ " -h, --help Show help",
19
+ " -v, --version Show version",
20
+ "",
21
+ 'Run "kyuu --help" for available commands.',
22
+ ].join("\n");
23
+ }
24
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,UAAU;QACV,EAAE;QACF,QAAQ;QACR,4BAA4B;QAC5B,EAAE;QACF,WAAW;QACX,yDAAyD;QACzD,qDAAqD;QACrD,mDAAmD;QACnD,2CAA2C;QAC3C,EAAE;QACF,UAAU;QACV,8BAA8B;QAC9B,iCAAiC;QACjC,EAAE;QACF,2CAA2C;KAC5C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { Server } from "node:http";
2
+ import { type ApplicationContext, type ResolvedKyuuConfig } from "@kyuujs/core";
3
+ export type { ResolvedKyuuConfig };
4
+ export { handleBuildCommand, type BuildCommandOptions, type BuildCommandResult, } from "./commands/build.js";
5
+ export { handleDevCommand, type DevCommandOptions, type DevCommandResult } from "./commands/dev.js";
6
+ export { handleNewCommand, type NewCommandOptions } from "./commands/new.js";
7
+ export { handleStartCommand, type StartCommandOptions, type StartCommandResult, } from "./commands/start.js";
8
+ export { runCli, type BaseCliOptions, type CliResult, type RunCliOptions } from "./dispatcher.js";
9
+ export { getHelpText } from "./help.js";
10
+ export { initializeGitRepo, type GitInitResult } from "./project/git.js";
11
+ export { type PackageManager, type ProjectCreationOptions, type ProjectLanguage, } from "./project/options.js";
12
+ export { installDependencies, type InstallResult } from "./project/package-manager.js";
13
+ export { scaffoldProject } from "./project/scaffolder.js";
14
+ export { validateProjectName, type ValidationResult } from "./project/validation.js";
15
+ export { CancelledError, runWizard, type WizardOptions } from "./project/wizard.js";
16
+ export { startDevServer, type DevServerController, type DevServerOptions, } from "./runner/dev-runner.js";
17
+ export { getVersion } from "./version.js";
18
+ export interface CliOptions {
19
+ projectRoot?: string;
20
+ mode?: "development" | "production";
21
+ }
22
+ export interface CliStartResult {
23
+ context: ApplicationContext;
24
+ server: Server;
25
+ config: ResolvedKyuuConfig;
26
+ }
27
+ /**
28
+ * Common startup pipeline for Kyuu CLI commands.
29
+ * Establishes project root, delegates to loadApplicationContext for automatic config discovery,
30
+ * and starts the HTTP server on the resolved host and port.
31
+ */
32
+ export declare function runCliCommand(mode: "development" | "production", options?: CliOptions): Promise<CliStartResult>;
33
+ export declare function runDev(options?: CliOptions): Promise<CliStartResult>;
34
+ export declare function runStart(options?: CliOptions): Promise<CliStartResult>;
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC,OAAO,EACL,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EACL,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,aAAa,GAAG,YAAY,EAClC,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,cAAc,CAAC,CAqBzB;AAED,wBAAsB,MAAM,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAE1E;AAED,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAE5E"}
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ import { resolve } from "node:path";
2
+ import { loadApplicationContext, } from "@kyuujs/core";
3
+ export { handleBuildCommand, } from "./commands/build.js";
4
+ export { handleDevCommand } from "./commands/dev.js";
5
+ export { handleNewCommand } from "./commands/new.js";
6
+ export { handleStartCommand, } from "./commands/start.js";
7
+ export { runCli } from "./dispatcher.js";
8
+ export { getHelpText } from "./help.js";
9
+ export { initializeGitRepo } from "./project/git.js";
10
+ export { installDependencies } from "./project/package-manager.js";
11
+ export { scaffoldProject } from "./project/scaffolder.js";
12
+ export { validateProjectName } from "./project/validation.js";
13
+ export { CancelledError, runWizard } from "./project/wizard.js";
14
+ export { startDevServer, } from "./runner/dev-runner.js";
15
+ export { getVersion } from "./version.js";
16
+ /**
17
+ * Common startup pipeline for Kyuu CLI commands.
18
+ * Establishes project root, delegates to loadApplicationContext for automatic config discovery,
19
+ * and starts the HTTP server on the resolved host and port.
20
+ */
21
+ export async function runCliCommand(mode, options) {
22
+ const projectRoot = options?.projectRoot ? resolve(options.projectRoot) : process.cwd();
23
+ const context = await loadApplicationContext({
24
+ projectRoot,
25
+ });
26
+ const server = context.app.listen();
27
+ if (!server.listening) {
28
+ await new Promise((res, rej) => {
29
+ server.once("listening", res);
30
+ server.once("error", rej);
31
+ });
32
+ }
33
+ return {
34
+ context,
35
+ server,
36
+ config: context.config,
37
+ };
38
+ }
39
+ export async function runDev(options) {
40
+ return runCliCommand("development", options);
41
+ }
42
+ export async function runStart(options) {
43
+ return runCliCommand("production", options);
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,sBAAsB,GAGvB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,kBAAkB,GAGnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAiD,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAA0B,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EACL,kBAAkB,GAGnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAA2D,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAsB,MAAM,kBAAkB,CAAC;AAMzE,OAAO,EAAE,mBAAmB,EAAsB,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAyB,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AACpF,OAAO,EACL,cAAc,GAGf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAa1C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAkC,EAClC,OAAoB;IAEpB,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAExF,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC;QAC3C,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAEpC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACnC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO;QACP,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAoB;IAC/C,OAAO,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAoB;IACjD,OAAO,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { execFile } from "node:child_process";
2
+ declare const execFileAsync: typeof execFile.__promisify__;
3
+ export interface GitInitResult {
4
+ success: boolean;
5
+ error?: string;
6
+ }
7
+ /**
8
+ * Initializes a Git repository in the target directory if requested.
9
+ */
10
+ export declare function initializeGitRepo(directory: string, execFn?: typeof execFileAsync): Promise<GitInitResult>;
11
+ export {};
12
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/project/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,QAAA,MAAM,aAAa,+BAAsB,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,OAAO,aAA6B,GAC3C,OAAO,CAAC,aAAa,CAAC,CAcxB"}