@fentaris/cli 0.1.0 → 0.1.2

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 +6 -71
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +11 -864
  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
@@ -1,150 +0,0 @@
1
- import { mkdtemp, mkdir, readdir, readFile, writeFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import { tmpdir } from "node:os";
4
- import { describe, expect, it, vi } from "vitest";
5
- import { FentarisAuth } from "@fentaris/core";
6
- import { discoverProject, ensureEmptyTargetDirectory, main, parseCommand, renderTemplate, resolveProjectName, selectPackageManager } from "./index.js";
7
- function prompt(values = []) {
8
- return {
9
- text: vi.fn(async () => values.shift() ?? ""),
10
- select: async (_question, choices) => choices[0],
11
- confirm: vi.fn(async () => true),
12
- close: vi.fn(),
13
- };
14
- }
15
- function runtime(cwd, probes = {}) {
16
- const calls = [];
17
- return {
18
- cwd,
19
- env: { FENTARIS_AUTH_KEY: "test-key" },
20
- out: { log: vi.fn(), error: vi.fn() },
21
- runner: vi.fn(async (command, args, options) => {
22
- calls.push({ command, args, cwd: options?.cwd });
23
- return { code: 0 };
24
- }),
25
- probe: vi.fn((command) => probes[command] ?? false),
26
- prompt: prompt(["secret-value"]),
27
- calls,
28
- };
29
- }
30
- describe("command routing helpers", () => {
31
- it("parses nested commands and options", () => {
32
- expect(parseCommand(["secrets", "set", "github.token", "--user", "alice"])).toEqual({
33
- name: "secrets",
34
- args: ["set", "github.token"],
35
- options: { user: "alice" },
36
- });
37
- });
38
- it("resolves provided and prompted project names", async () => {
39
- await expect(resolveProjectName("my-app", prompt())).resolves.toBe("my-app");
40
- await expect(resolveProjectName(undefined, prompt(["asked-app"]))).resolves.toBe("asked-app");
41
- });
42
- it("rejects non-empty target directories", async () => {
43
- const dir = await mkdtemp(join(tmpdir(), "fentaris-cli-"));
44
- await writeFile(join(dir, "existing.txt"), "content");
45
- await expect(ensureEmptyTargetDirectory(dir)).rejects.toThrow("new or empty");
46
- });
47
- it("selects a package manager without prompting when only one exists", async () => {
48
- await expect(selectPackageManager((command) => command === "pnpm", prompt())).resolves.toBe("pnpm");
49
- });
50
- });
51
- describe("project template", () => {
52
- it("renders expected files and ignores local secrets", () => {
53
- const rendered = renderTemplate({
54
- projectName: "demo",
55
- packageManager: "pnpm",
56
- port: 4000,
57
- proxyPath: "/mcp",
58
- authKey: "auth-key",
59
- guestApiKey: "guest-key",
60
- adminApiKey: "admin-key",
61
- });
62
- expect(Object.keys(rendered.files).sort()).toEqual([
63
- ".env.example",
64
- ".gitignore",
65
- "demo-files/README.md",
66
- "fentaris.config.json",
67
- "package.json",
68
- "src/index.ts",
69
- "tsconfig.json",
70
- ]);
71
- expect(rendered.files[".gitignore"]).toContain(".fentaris/auth/");
72
- expect(rendered.files["src/index.ts"]).toContain("https://mcp.specification.website/mcp");
73
- expect(rendered.files["src/index.ts"]).toContain("rateLimitMiddleware");
74
- expect(rendered.files["src/index.ts"]).toContain("admin-full-access");
75
- });
76
- });
77
- describe("project commands", () => {
78
- it("initializes a project with dry-run install and git commands", async () => {
79
- const dir = await mkdtemp(join(tmpdir(), "fentaris-cli-"));
80
- const rt = runtime(dir, { pnpm: true, git: true, docker: false });
81
- await expect(main(["init", "demo", "--skip-install"], rt)).resolves.toBe(0);
82
- const config = JSON.parse(await readFile(join(dir, "demo", "fentaris.config.json"), "utf8"));
83
- expect(config.name).toBe("demo");
84
- expect(rt.calls.some((call) => call.command === "git" && call.args[0] === "init")).toBe(true);
85
- });
86
- it("discovers projects from nested directories", async () => {
87
- const dir = await mkdtemp(join(tmpdir(), "fentaris-cli-"));
88
- const srcDir = join(dir, "src", "nested");
89
- await mkdir(srcDir, { recursive: true });
90
- await writeFile(join(dir, "fentaris.config.json"), JSON.stringify({ name: "demo", packageManager: "pnpm", entrypoint: "src/index.ts", port: 4000, path: "/mcp", authDir: ".fentaris/auth" }));
91
- await expect(discoverProject(srcDir)).resolves.toMatchObject({ root: dir });
92
- });
93
- it("runs dev through the discovered package manager", async () => {
94
- const dir = await mkdtemp(join(tmpdir(), "fentaris-cli-"));
95
- const rt = runtime(dir, { pnpm: true, git: true, docker: true });
96
- await expect(main(["init", "demo", "--skip-install"], rt)).resolves.toBe(0);
97
- rt.cwd = join(dir, "demo", "src");
98
- await expect(main(["dev"], rt)).resolves.toBe(0);
99
- expect(rt.calls.some((call) => call.command === "pnpm" && call.args.join(" ") === "dev")).toBe(true);
100
- });
101
- it("builds a deterministic local artifact", async () => {
102
- const dir = await mkdtemp(join(tmpdir(), "fentaris-cli-"));
103
- const rt = runtime(dir, { pnpm: true, git: true, docker: true });
104
- await expect(main(["init", "demo", "--skip-install"], rt)).resolves.toBe(0);
105
- rt.cwd = join(dir, "demo");
106
- await expect(main(["build"], rt)).resolves.toBe(0);
107
- const manifest = JSON.parse(await readFile(join(dir, "demo", ".fentaris", "build", "manifest.json"), "utf8"));
108
- expect(manifest.entrypoint).toBe("src/index.ts");
109
- expect(rt.calls.some((call) => call.command === "pnpm" && call.args.join(" ") === "run build")).toBe(true);
110
- });
111
- it("validates check modes and strict warning exit behavior", async () => {
112
- const dir = await mkdtemp(join(tmpdir(), "fentaris-cli-"));
113
- const rt = runtime(dir, { pnpm: true, git: true, docker: false });
114
- await expect(main(["init", "demo", "--skip-install"], rt)).resolves.toBe(0);
115
- rt.cwd = join(dir, "demo");
116
- await expect(main(["check", "--offline"], rt)).resolves.toBe(0);
117
- await expect(main(["check", "--offline", "--strict"], rt)).resolves.toBe(1);
118
- await expect(main(["doctor", "--strict"], rt)).resolves.toBe(1);
119
- });
120
- it("prompts before applying doctor fixes", async () => {
121
- const dir = await mkdtemp(join(tmpdir(), "fentaris-cli-"));
122
- const rt = runtime(dir, { pnpm: true, git: true, docker: true });
123
- await expect(main(["doctor", "--fix"], rt)).resolves.toBe(0);
124
- expect(rt.prompt.confirm).toHaveBeenCalledWith("Apply fix for CLI local directory?");
125
- await expect(readdir(join(dir, ".fentaris"))).resolves.toEqual([]);
126
- });
127
- it("does not expose deploy before it is implemented", async () => {
128
- const dir = await mkdtemp(join(tmpdir(), "fentaris-cli-"));
129
- const rt = runtime(dir);
130
- await expect(main(["deploy"], rt)).resolves.toBe(1);
131
- expect(rt.out.error).toHaveBeenCalledWith(expect.stringContaining('Unknown command "deploy"'));
132
- });
133
- });
134
- describe("secrets", () => {
135
- it("stores redacted user secrets in FentarisAuth-compatible credentials", async () => {
136
- const dir = await mkdtemp(join(tmpdir(), "fentaris-cli-"));
137
- const project = join(dir, "project");
138
- const authDir = join(project, ".fentaris", "auth");
139
- await mkdir(authDir, { recursive: true });
140
- await writeFile(join(project, "fentaris.config.json"), JSON.stringify({ name: "demo", packageManager: "pnpm", entrypoint: "src/index.ts", port: 4000, path: "/mcp", authDir: ".fentaris/auth" }));
141
- await writeFile(join(authDir, "credentials.enc.json"), JSON.stringify(FentarisAuth.encryptCredentials({ users: {}, groups: {}, defaults: {} }, "test-key")));
142
- await writeFile(join(authDir, "upstream-auth.json"), JSON.stringify({ servers: {} }));
143
- const rt = runtime(project);
144
- await expect(main(["secrets", "set", "github.token", "--user", "alice"], rt)).resolves.toBe(0);
145
- const credentials = FentarisAuth.decryptCredentials(JSON.parse(await readFile(join(authDir, "credentials.enc.json"), "utf8")), "test-key");
146
- expect(credentials.users.alice?.credentials["github.token"]).toBe("secret-value");
147
- expect(rt.out.log).toHaveBeenCalledWith("Value: <redacted>");
148
- });
149
- });
150
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}