@fentaris/cli 0.1.1 → 0.1.3

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 (81) hide show
  1. package/dist/app/main.d.ts +3 -0
  2. package/dist/app/main.d.ts.map +1 -0
  3. package/dist/app/main.js +64 -0
  4. package/dist/app/main.js.map +1 -0
  5. package/dist/commands/auth.d.ts +3 -0
  6. package/dist/commands/auth.d.ts.map +1 -0
  7. package/dist/commands/auth.js +49 -0
  8. package/dist/commands/auth.js.map +1 -0
  9. package/dist/commands/build.d.ts +3 -0
  10. package/dist/commands/build.d.ts.map +1 -0
  11. package/dist/commands/build.js +27 -0
  12. package/dist/commands/build.js.map +1 -0
  13. package/dist/commands/check.d.ts +3 -0
  14. package/dist/commands/check.d.ts.map +1 -0
  15. package/dist/commands/check.js +13 -0
  16. package/dist/commands/check.js.map +1 -0
  17. package/dist/commands/dev.d.ts +3 -0
  18. package/dist/commands/dev.d.ts.map +1 -0
  19. package/dist/commands/dev.js +9 -0
  20. package/dist/commands/dev.js.map +1 -0
  21. package/dist/commands/doctor.d.ts +3 -0
  22. package/dist/commands/doctor.d.ts.map +1 -0
  23. package/dist/commands/doctor.js +11 -0
  24. package/dist/commands/doctor.js.map +1 -0
  25. package/dist/commands/init.d.ts +3 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +46 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/secrets.d.ts +3 -0
  30. package/dist/commands/secrets.d.ts.map +1 -0
  31. package/dist/commands/secrets.js +21 -0
  32. package/dist/commands/secrets.js.map +1 -0
  33. package/dist/domain/auth/local-store.d.ts +11 -0
  34. package/dist/domain/auth/local-store.d.ts.map +1 -0
  35. package/dist/domain/auth/local-store.js +75 -0
  36. package/dist/domain/auth/local-store.js.map +1 -0
  37. package/dist/domain/health/checks.d.ts +6 -0
  38. package/dist/domain/health/checks.d.ts.map +1 -0
  39. package/dist/domain/health/checks.js +124 -0
  40. package/dist/domain/health/checks.js.map +1 -0
  41. package/dist/domain/project/project.d.ts +8 -0
  42. package/dist/domain/project/project.d.ts.map +1 -0
  43. package/dist/domain/project/project.js +92 -0
  44. package/dist/domain/project/project.js.map +1 -0
  45. package/dist/domain/template/template.d.ts +11 -0
  46. package/dist/domain/template/template.d.ts.map +1 -0
  47. package/dist/domain/template/template.js +215 -0
  48. package/dist/domain/template/template.js.map +1 -0
  49. package/dist/index.d.ts +7 -71
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +20 -858
  52. package/dist/index.js.map +1 -1
  53. package/dist/platform/runtime.d.ts +3 -0
  54. package/dist/platform/runtime.d.ts.map +1 -0
  55. package/dist/platform/runtime.js +43 -0
  56. package/dist/platform/runtime.js.map +1 -0
  57. package/dist/shared/constants.d.ts +7 -0
  58. package/dist/shared/constants.d.ts.map +1 -0
  59. package/dist/shared/constants.js +6 -0
  60. package/dist/shared/constants.js.map +1 -0
  61. package/dist/shared/parse.d.ts +3 -0
  62. package/dist/shared/parse.d.ts.map +1 -0
  63. package/dist/shared/parse.js +22 -0
  64. package/dist/shared/parse.js.map +1 -0
  65. package/dist/shared/types.d.ts +61 -0
  66. package/dist/shared/types.d.ts.map +1 -0
  67. package/dist/shared/types.js +2 -0
  68. package/dist/shared/types.js.map +1 -0
  69. package/dist/shared/utils.d.ts +11 -0
  70. package/dist/shared/utils.d.ts.map +1 -0
  71. package/dist/shared/utils.js +54 -0
  72. package/dist/shared/utils.js.map +1 -0
  73. package/dist/ui/format.d.ts +17 -0
  74. package/dist/ui/format.d.ts.map +1 -0
  75. package/dist/ui/format.js +79 -0
  76. package/dist/ui/format.js.map +1 -0
  77. package/package.json +7 -7
  78. package/dist/index.test.d.ts +0 -2
  79. package/dist/index.test.d.ts.map +0 -1
  80. package/dist/index.test.js +0 -150
  81. package/dist/index.test.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ import type { Runtime } from "../shared/types.js";
2
+ export declare function main(argv: string[], runtime: Runtime): Promise<number>;
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/app/main.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG9D,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAY5E"}
@@ -0,0 +1,64 @@
1
+ import { runLegacyAuth } from "../commands/auth.js";
2
+ import { runBuild } from "../commands/build.js";
3
+ import { runCheck } from "../commands/check.js";
4
+ import { runDev } from "../commands/dev.js";
5
+ import { runDoctor } from "../commands/doctor.js";
6
+ import { runInit } from "../commands/init.js";
7
+ import { runSecrets } from "../commands/secrets.js";
8
+ import { cliVersion } from "../shared/constants.js";
9
+ import { parseCommand } from "../shared/parse.js";
10
+ import { printHelp, style } from "../ui/format.js";
11
+ export async function main(argv, runtime) {
12
+ const command = parseCommand(argv);
13
+ try {
14
+ await route(command, runtime);
15
+ return 0;
16
+ }
17
+ catch (error) {
18
+ runtime.out.error(style.fail(error instanceof Error ? error.message : String(error)));
19
+ return 1;
20
+ }
21
+ finally {
22
+ runtime.prompt.close();
23
+ }
24
+ }
25
+ async function route(command, runtime) {
26
+ if (command.name === "help" || command.options.help === true) {
27
+ printHelp(runtime);
28
+ return;
29
+ }
30
+ if (command.name === "version") {
31
+ runtime.out.log(cliVersion);
32
+ return;
33
+ }
34
+ if (command.name === "auth") {
35
+ await runLegacyAuth(command, runtime);
36
+ return;
37
+ }
38
+ if (command.name === "secrets") {
39
+ await runSecrets(command, runtime);
40
+ return;
41
+ }
42
+ if (command.name === "init") {
43
+ await runInit(command, runtime);
44
+ return;
45
+ }
46
+ if (command.name === "doctor") {
47
+ await runDoctor(command, runtime);
48
+ return;
49
+ }
50
+ if (command.name === "check") {
51
+ await runCheck(command, runtime);
52
+ return;
53
+ }
54
+ if (command.name === "dev") {
55
+ await runDev(runtime);
56
+ return;
57
+ }
58
+ if (command.name === "build") {
59
+ await runBuild(runtime);
60
+ return;
61
+ }
62
+ throw new Error(`Unknown command "${command.name}". Run fentaris help.`);
63
+ }
64
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/app/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliCommand, Runtime } from "../shared/types.js";
2
+ export declare function runLegacyAuth(command: CliCommand, runtime: Runtime): Promise<void>;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAc,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI1E,wBAAsB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAaxF"}
@@ -0,0 +1,49 @@
1
+ import { addUserApiKey, initLocalAuth, inspectAuthFiles, storeCredential } from "../domain/auth/local-store.js";
2
+ import { required } from "../shared/utils.js";
3
+ import { printHelp, style } from "../ui/format.js";
4
+ export async function runLegacyAuth(command, runtime) {
5
+ const [action] = command.args;
6
+ if (action === "init") {
7
+ await initAuth(command.options, runtime);
8
+ }
9
+ else if (action === "set-api-key") {
10
+ await setApiKey(command.options, runtime);
11
+ }
12
+ else if (action === "set-credential") {
13
+ await setCredential(command.options, runtime);
14
+ }
15
+ else if (action === "inspect") {
16
+ await inspectAuth(command.options, runtime);
17
+ }
18
+ else {
19
+ printHelp(runtime);
20
+ }
21
+ }
22
+ async function initAuth(options, runtime) {
23
+ const dir = required(options, "dir");
24
+ required(options, "key");
25
+ await initLocalAuth(options);
26
+ runtime.out.log(style.pass(`Initialized local auth files in ${dir}`));
27
+ }
28
+ async function setApiKey(options, runtime) {
29
+ const dir = required(options, "dir");
30
+ const key = required(options, "key");
31
+ const userId = required(options, "user");
32
+ const apiKey = required(options, "api-key");
33
+ await addUserApiKey(dir, key, userId, apiKey);
34
+ runtime.out.log(style.pass(`Stored API key hash for user ${userId}`));
35
+ }
36
+ async function setCredential(options, runtime) {
37
+ const dir = required(options, "dir");
38
+ const key = required(options, "key");
39
+ const reference = required(options, "ref");
40
+ const value = required(options, "value");
41
+ await storeCredential(dir, key, reference, value, options);
42
+ runtime.out.log(style.pass(`Stored credential ${reference}`));
43
+ }
44
+ async function inspectAuth(options, runtime) {
45
+ const dir = required(options, "dir");
46
+ const key = required(options, "key");
47
+ runtime.out.log(JSON.stringify(await inspectAuthFiles(dir, key), null, 2));
48
+ }
49
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Runtime } from "../shared/types.js";
2
+ export declare function runBuild(runtime: Runtime): Promise<void>;
3
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B9D"}
@@ -0,0 +1,27 @@
1
+ import { copyFile, mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getProjectCheckResults, hasFailure } from "../domain/health/checks.js";
4
+ import { discoverProject, runPackageScript } from "../domain/project/project.js";
5
+ import { buildDir, cliVersion } from "../shared/constants.js";
6
+ import { printHealthResults, section, style } from "../ui/format.js";
7
+ export async function runBuild(runtime) {
8
+ const project = await discoverProject(runtime.cwd);
9
+ const results = await getProjectCheckResults(project, true);
10
+ if (hasFailure(results)) {
11
+ printHealthResults(runtime, results);
12
+ throw new Error("Build requires a valid Fentaris project.");
13
+ }
14
+ section(runtime, "Build");
15
+ await runPackageScript(project.config.packageManager, project.root, "build", runtime.runner);
16
+ const outputDir = path.join(project.root, buildDir);
17
+ await mkdir(outputDir, { recursive: true });
18
+ await copyFile(path.join(project.root, "package.json"), path.join(outputDir, "package.json"));
19
+ await writeFile(path.join(outputDir, "manifest.json"), JSON.stringify({
20
+ name: project.config.name,
21
+ entrypoint: project.config.entrypoint,
22
+ createdBy: `fentaris ${cliVersion}`,
23
+ }, null, 2));
24
+ runtime.out.log(` ${style.pass(`Build output: ${path.relative(runtime.cwd, outputDir)}`)}`);
25
+ runtime.out.log(` Runtime entrypoint: ${project.config.entrypoint}`);
26
+ }
27
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7F,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9F,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EACrC,IAAI,CAAC,SAAS,CACZ;QACE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;QACzB,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU;QACrC,SAAS,EAAE,YAAY,UAAU,EAAE;KACpC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,yBAAyB,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliCommand, Runtime } from "../shared/types.js";
2
+ export declare function runCheck(command: CliCommand, runtime: Runtime): Promise<void>;
3
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG9D,wBAAsB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnF"}
@@ -0,0 +1,13 @@
1
+ import { getProjectCheckResults, hasFailure, hasWarning } from "../domain/health/checks.js";
2
+ import { discoverProject } from "../domain/project/project.js";
3
+ import { printHealthResults, section } from "../ui/format.js";
4
+ export async function runCheck(command, runtime) {
5
+ section(runtime, "Project Check");
6
+ const project = await discoverProject(runtime.cwd);
7
+ const results = await getProjectCheckResults(project, command.options.offline === true);
8
+ printHealthResults(runtime, results);
9
+ if (hasFailure(results) || (command.options.strict === true && hasWarning(results))) {
10
+ throw new Error("Project check reported issues.");
11
+ }
12
+ }
13
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAmB,EAAE,OAAgB;IAClE,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;IACxF,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Runtime } from "../shared/types.js";
2
+ export declare function runDev(runtime: Runtime): Promise<void>;
3
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,wBAAsB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D"}
@@ -0,0 +1,9 @@
1
+ import { discoverProject, runPackageScript } from "../domain/project/project.js";
2
+ import { section, style } from "../ui/format.js";
3
+ export async function runDev(runtime) {
4
+ const project = await discoverProject(runtime.cwd);
5
+ section(runtime, "Dev");
6
+ runtime.out.log(` ${style.pass(`Starting ${project.config.name} at http://localhost:${project.config.port}${project.config.path}`)}`);
7
+ await runPackageScript(project.config.packageManager, project.root, "dev", runtime.runner);
8
+ }
9
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEjF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAgB;IAC3C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,MAAM,CAAC,IAAI,wBAAwB,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACvI,MAAM,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliCommand, Runtime } from "../shared/types.js";
2
+ export declare function runDoctor(command: CliCommand, runtime: Runtime): Promise<void>;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG9D,wBAAsB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpF"}
@@ -0,0 +1,11 @@
1
+ import { getDoctorResults, hasFailure, hasWarning } from "../domain/health/checks.js";
2
+ import { printHealthResults, section } from "../ui/format.js";
3
+ export async function runDoctor(command, runtime) {
4
+ section(runtime, "Doctor");
5
+ const results = await getDoctorResults(runtime, command.options.fix === true);
6
+ printHealthResults(runtime, results);
7
+ if (hasFailure(results) || (command.options.strict === true && hasWarning(results))) {
8
+ throw new Error("Doctor reported issues.");
9
+ }
10
+ }
11
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEtF,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAmB,EAAE,OAAgB;IACnE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IAC9E,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliCommand, Runtime } from "../shared/types.js";
2
+ export declare function runInit(command: CliCommand, runtime: Runtime): Promise<void>;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI9D,wBAAsB,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ClF"}
@@ -0,0 +1,46 @@
1
+ import path from "node:path";
2
+ import { getDoctorResults } from "../domain/health/checks.js";
3
+ import { ensureEmptyTargetDirectory, resolveProjectName, runPackageInstall, selectPackageManager, } from "../domain/project/project.js";
4
+ import { initTemplateAuth, renderTemplate, writeTemplate } from "../domain/template/template.js";
5
+ import { authDir } from "../shared/constants.js";
6
+ import { numberOption, randomToken, stringOption } from "../shared/utils.js";
7
+ import { nextSteps, printBanner, printHealthResults, section, style } from "../ui/format.js";
8
+ export async function runInit(command, runtime) {
9
+ printBanner(runtime);
10
+ const projectName = await resolveProjectName(command.args[0], runtime.prompt);
11
+ const targetDir = path.resolve(runtime.cwd, projectName);
12
+ await ensureEmptyTargetDirectory(targetDir);
13
+ const packageManager = await selectPackageManager(runtime.probe, runtime.prompt);
14
+ const template = renderTemplate({
15
+ projectName,
16
+ packageManager,
17
+ port: numberOption(command.options, "port", 4000),
18
+ proxyPath: stringOption(command.options, "path", "/mcp"),
19
+ authKey: randomToken("fentaris-auth"),
20
+ guestApiKey: randomToken("guest"),
21
+ adminApiKey: randomToken("admin"),
22
+ });
23
+ section(runtime, "Create Project");
24
+ await writeTemplate(targetDir, template.files);
25
+ await initTemplateAuth(path.join(targetDir, authDir), template.authKey, template.guestApiKey, template.adminApiKey);
26
+ runtime.out.log(` ${style.pass(`Created ${projectName}`)}`);
27
+ section(runtime, "Install");
28
+ if (command.options["skip-install"] === true) {
29
+ runtime.out.log(` ${style.warn("Skipped dependency install by request.")}`);
30
+ }
31
+ else {
32
+ await runPackageInstall(packageManager, targetDir, runtime.runner);
33
+ runtime.out.log(` ${style.pass(`Installed dependencies with ${packageManager}`)}`);
34
+ }
35
+ section(runtime, "Git");
36
+ await runtime.runner("git", ["init"], { cwd: targetDir, stdio: "ignore" });
37
+ runtime.out.log(` ${style.pass("Initialized git repository")}`);
38
+ section(runtime, "Doctor");
39
+ const doctorResults = await getDoctorResults({ ...runtime, cwd: targetDir }, false);
40
+ printHealthResults(runtime, doctorResults);
41
+ section(runtime, "Next Steps");
42
+ runtime.out.log(` ${style.label("Demo guest API key")} ${template.guestApiKey}`);
43
+ runtime.out.log(` ${style.label("Demo admin API key")} ${template.adminApiKey}`);
44
+ runtime.out.log(nextSteps([`cd ${projectName}`, "cp .env.example .env", "fentaris dev"]));
45
+ }
46
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliCommand, Runtime } from "../shared/types.js";
2
+ export declare function runSecrets(command: CliCommand, runtime: Runtime): Promise<void>;
3
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG9D,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrF"}
@@ -0,0 +1,21 @@
1
+ import path from "node:path";
2
+ import { authKeyFromRuntime, secretScope, storeCredential } from "../domain/auth/local-store.js";
3
+ import { discoverProject } from "../domain/project/project.js";
4
+ import { section, style } from "../ui/format.js";
5
+ export async function runSecrets(command, runtime) {
6
+ const [action, reference] = command.args;
7
+ if (action !== "set" || !reference) {
8
+ throw new Error("Usage: fentaris secrets set <reference> [--user <id> | --group <id>]");
9
+ }
10
+ if (typeof command.options.user === "string" && typeof command.options.group === "string") {
11
+ throw new Error("Use either --user or --group, not both.");
12
+ }
13
+ const project = await discoverProject(runtime.cwd);
14
+ const key = await authKeyFromRuntime(runtime, command.options);
15
+ const value = typeof command.options.value === "string" ? command.options.value : await runtime.prompt.text(`Secret value for ${reference}`, { secret: true });
16
+ await storeCredential(path.join(project.root, project.config.authDir), key, reference, value, command.options);
17
+ section(runtime, "Secrets");
18
+ runtime.out.log(` ${style.pass(`Stored ${reference} as ${secretScope(command.options)} credential.`)}`);
19
+ runtime.out.log("Value: <redacted>");
20
+ }
21
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAmB,EAAE,OAAgB;IACpE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IACzC,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC1F,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/J,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/G,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,SAAS,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACzG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type LocalCredentials } from "@fentaris/core";
2
+ import type { CliOptions, Runtime } from "../../shared/types.js";
3
+ export declare function initLocalAuth(options: CliOptions): Promise<void>;
4
+ export declare function storeCredential(dir: string, key: string, reference: string, value: string, options: CliOptions): Promise<void>;
5
+ export declare function addUserApiKey(dir: string, key: string, userId: string, apiKey: string): Promise<void>;
6
+ export declare function inspectAuthFiles(dir: string, key: string): Promise<unknown>;
7
+ export declare function authKeyFromRuntime(runtime: Runtime, options: CliOptions): Promise<string>;
8
+ export declare function secretScope(options: CliOptions): string;
9
+ export declare function readCredentials(dir: string, key: string): Promise<LocalCredentials>;
10
+ export declare function writeCredentials(dir: string, key: string, credentials: LocalCredentials): Promise<void>;
11
+ //# sourceMappingURL=local-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../../../src/domain/auth/local-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGjE,wBAAsB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtE;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAapI;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3G;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBjF;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ/F;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAQvD;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEzF;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7G"}
@@ -0,0 +1,75 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { FentarisAuth } from "@fentaris/core";
4
+ import { redactRecord, required } from "../../shared/utils.js";
5
+ export async function initLocalAuth(options) {
6
+ const dir = required(options, "dir");
7
+ const key = required(options, "key");
8
+ await mkdir(dir, { recursive: true });
9
+ await writeCredentials(dir, key, { users: {}, groups: {}, defaults: {} });
10
+ }
11
+ export async function storeCredential(dir, key, reference, value, options) {
12
+ const credentials = await readCredentials(dir, key);
13
+ if (typeof options.user === "string") {
14
+ const user = credentials.users[options.user] ?? { apiKeys: [], credentials: {} };
15
+ credentials.users[options.user] = { ...user, credentials: { ...user.credentials, [reference]: value } };
16
+ }
17
+ else if (typeof options.group === "string") {
18
+ credentials.groups[options.group] = { ...(credentials.groups[options.group] ?? {}), [reference]: value };
19
+ }
20
+ else {
21
+ credentials.defaults[reference] = value;
22
+ }
23
+ await writeCredentials(dir, key, credentials);
24
+ }
25
+ export async function addUserApiKey(dir, key, userId, apiKey) {
26
+ const credentials = await readCredentials(dir, key);
27
+ const user = credentials.users[userId] ?? { apiKeys: [], credentials: {} };
28
+ const hashed = FentarisAuth.hashApiKey(apiKey);
29
+ credentials.users[userId] = {
30
+ ...user,
31
+ apiKeys: user.apiKeys.includes(hashed) ? user.apiKeys : [...user.apiKeys, hashed],
32
+ };
33
+ await writeCredentials(dir, key, credentials);
34
+ }
35
+ export async function inspectAuthFiles(dir, key) {
36
+ const credentials = await readCredentials(dir, key);
37
+ return {
38
+ credentials: {
39
+ users: Object.fromEntries(Object.entries(credentials.users).map(([userId, userEntry]) => [
40
+ userId,
41
+ {
42
+ apiKeys: userEntry.apiKeys.map(() => "<redacted>"),
43
+ credentials: redactRecord(userEntry.credentials),
44
+ },
45
+ ])),
46
+ groups: Object.fromEntries(Object.entries(credentials.groups).map(([groupId, values]) => [groupId, redactRecord(values)])),
47
+ defaults: redactRecord(credentials.defaults),
48
+ },
49
+ };
50
+ }
51
+ export async function authKeyFromRuntime(runtime, options) {
52
+ if (typeof options.key === "string") {
53
+ return options.key;
54
+ }
55
+ if (typeof runtime.env.FENTARIS_AUTH_KEY === "string" && runtime.env.FENTARIS_AUTH_KEY.trim()) {
56
+ return runtime.env.FENTARIS_AUTH_KEY;
57
+ }
58
+ return runtime.prompt.text("Local auth encryption key", { secret: true });
59
+ }
60
+ export function secretScope(options) {
61
+ if (typeof options.user === "string") {
62
+ return `user ${options.user}`;
63
+ }
64
+ if (typeof options.group === "string") {
65
+ return `group ${options.group}`;
66
+ }
67
+ return "default";
68
+ }
69
+ export async function readCredentials(dir, key) {
70
+ return FentarisAuth.decryptCredentials(JSON.parse(await readFile(path.join(dir, "credentials.enc.json"), "utf8")), key);
71
+ }
72
+ export async function writeCredentials(dir, key, credentials) {
73
+ await writeFile(path.join(dir, "credentials.enc.json"), JSON.stringify(FentarisAuth.encryptCredentials(credentials, key), null, 2));
74
+ }
75
+ //# sourceMappingURL=local-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-store.js","sourceRoot":"","sources":["../../../src/domain/auth/local-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAyB,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAmB;IACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,GAAW,EAAE,SAAiB,EAAE,KAAa,EAAE,OAAmB;IACnH,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEpD,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACjF,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;IAC1G,CAAC;SAAM,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC7C,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;IAC3G,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IAC1C,CAAC;IAED,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,GAAW,EAAE,MAAc,EAAE,MAAc;IAC1F,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/C,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;QAC1B,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;KAClF,CAAC;IACF,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,GAAW;IAC7D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEpD,OAAO;QACL,WAAW,EAAE;YACX,KAAK,EAAE,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC;gBAC7D,MAAM;gBACN;oBACE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;oBAClD,WAAW,EAAE,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC;iBACjD;aACF,CAAC,CACH;YACD,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1H,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC;SAC7C;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAgB,EAAE,OAAmB;IAC5E,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,GAAG,CAAC;IACrB,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9F,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACvC,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAmB;IAC7C,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,SAAS,OAAO,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,GAAW;IAC5D,OAAO,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,EAAE,MAAM,CAAC,CAAY,EAAE,GAAG,CAAC,CAAC;AACrI,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,GAAW,EAAE,WAA6B;IAC5F,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACtI,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { HealthResult, ProjectDiscovery, Runtime } from "../../shared/types.js";
2
+ export declare function getDoctorResults(runtime: Runtime, shouldFix: boolean): Promise<HealthResult[]>;
3
+ export declare function getProjectCheckResults(project: ProjectDiscovery, offline: boolean): Promise<HealthResult[]>;
4
+ export declare function hasFailure(results: HealthResult[]): boolean;
5
+ export declare function hasWarning(results: HealthResult[]): boolean;
6
+ //# sourceMappingURL=checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/domain/health/checks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwCpG;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAuCjH;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAE3D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAE3D"}
@@ -0,0 +1,124 @@
1
+ import { constants as fsConstants } from "node:fs";
2
+ import { mkdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { authDir, supportedPackageManagers } from "../../shared/constants.js";
5
+ import { canAccess, exists, numberOption, readJson } from "../../shared/utils.js";
6
+ export async function getDoctorResults(runtime, shouldFix) {
7
+ const results = [
8
+ {
9
+ group: "Runtime",
10
+ label: "Node.js",
11
+ status: Number(process.versions.node.split(".")[0]) >= 20 ? "pass" : "fail",
12
+ detail: `Detected ${process.versions.node}; Fentaris requires Node 20 or newer.`,
13
+ },
14
+ ...supportedPackageManagers.map((manager) => ({
15
+ group: "Runtime",
16
+ label: manager,
17
+ status: runtime.probe(manager, ["--version"]) ? "pass" : "warn",
18
+ detail: runtime.probe(manager, ["--version"]) ? "Available" : "Not found",
19
+ })),
20
+ {
21
+ group: "Runtime",
22
+ label: "git",
23
+ status: runtime.probe("git", ["--version"]) ? "pass" : "fail",
24
+ detail: runtime.probe("git", ["--version"]) ? "Available" : "Required for project initialization.",
25
+ },
26
+ {
27
+ group: "Runtime",
28
+ label: "Docker",
29
+ status: runtime.probe("docker", ["--version"]) ? "pass" : "warn",
30
+ detail: runtime.probe("docker", ["--version"]) ? "Available" : "Optional for future container workflows.",
31
+ },
32
+ await cliDirectoryResult(runtime.cwd),
33
+ await writableResult(runtime.cwd),
34
+ await portResult(numberOption({}, "port", 4000)),
35
+ ];
36
+ if (shouldFix) {
37
+ for (const result of results.filter((item) => item.fix)) {
38
+ if (await runtime.prompt.confirm(`Apply fix for ${result.label}?`)) {
39
+ await result.fix?.();
40
+ }
41
+ }
42
+ }
43
+ return results;
44
+ }
45
+ export async function getProjectCheckResults(project, offline) {
46
+ const expectedFiles = [
47
+ "package.json",
48
+ "tsconfig.json",
49
+ "fentaris.json",
50
+ ".env.example",
51
+ ".gitignore",
52
+ "README.md",
53
+ project.config.entrypoint,
54
+ path.join(project.config.authDir, "credentials.enc.json"),
55
+ ];
56
+ const results = [];
57
+ for (const file of expectedFiles) {
58
+ const fileExists = await exists(path.join(project.root, file));
59
+ results.push({
60
+ group: "Files",
61
+ label: file,
62
+ status: fileExists ? "pass" : "fail",
63
+ detail: fileExists ? "Found" : "Missing",
64
+ });
65
+ }
66
+ const packageJson = await readJson(path.join(project.root, "package.json"));
67
+ results.push({
68
+ group: "Package",
69
+ label: "package metadata",
70
+ status: hasPackageMetadata(packageJson) ? "pass" : "fail",
71
+ detail: hasPackageMetadata(packageJson) ? "Fentaris scripts and dependency are present." : "Expected @fentaris/core dependency and dev/build scripts.",
72
+ });
73
+ results.push({
74
+ group: "Auth",
75
+ label: "local auth references",
76
+ status: project.config.authDir === authDir ? "pass" : "warn",
77
+ detail: `Using ${project.config.authDir}`,
78
+ });
79
+ return results;
80
+ }
81
+ export function hasFailure(results) {
82
+ return results.some((result) => result.status === "fail");
83
+ }
84
+ export function hasWarning(results) {
85
+ return results.some((result) => result.status === "warn");
86
+ }
87
+ function hasPackageMetadata(value) {
88
+ if (!value || typeof value !== "object") {
89
+ return false;
90
+ }
91
+ const packageJson = value;
92
+ return Boolean(packageJson.dependencies?.["@fentaris/core"] && packageJson.scripts?.dev && packageJson.scripts?.build);
93
+ }
94
+ async function writableResult(dir) {
95
+ const writable = await canAccess(dir, fsConstants.W_OK);
96
+ return {
97
+ group: "Filesystem",
98
+ label: "CLI writable directory",
99
+ status: writable ? "pass" : "fail",
100
+ detail: writable ? `Writable: ${dir}` : `Cannot write to ${dir}`,
101
+ };
102
+ }
103
+ async function cliDirectoryResult(cwd) {
104
+ const cliDir = path.join(cwd, ".fentaris");
105
+ const present = await exists(cliDir);
106
+ return {
107
+ group: "Filesystem",
108
+ label: "CLI local directory",
109
+ status: present ? "pass" : "warn",
110
+ detail: present ? `Found ${cliDir}` : `Missing ${cliDir}; doctor --fix can create it.`,
111
+ fix: async () => {
112
+ await mkdir(cliDir, { recursive: true });
113
+ },
114
+ };
115
+ }
116
+ async function portResult(port) {
117
+ return {
118
+ group: "Network",
119
+ label: `localhost:${port}`,
120
+ status: "pass",
121
+ detail: "Port check is deferred to runtime startup.",
122
+ };
123
+ }
124
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/domain/health/checks.ts"],"names":[],"mappings":"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"}