@fentaris/cli 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +2 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +1 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/secrets.d.ts.map +1 -1
- package/dist/commands/secrets.js +139 -7
- package/dist/commands/secrets.js.map +1 -1
- package/dist/domain/auth/local-store.d.ts +10 -3
- package/dist/domain/auth/local-store.d.ts.map +1 -1
- package/dist/domain/auth/local-store.js +47 -11
- package/dist/domain/auth/local-store.js.map +1 -1
- package/dist/domain/health/checks.d.ts +1 -0
- package/dist/domain/health/checks.d.ts.map +1 -1
- package/dist/domain/health/checks.js +29 -35
- package/dist/domain/health/checks.js.map +1 -1
- package/dist/domain/project/env.d.ts +3 -0
- package/dist/domain/project/env.d.ts.map +1 -0
- package/dist/domain/project/env.js +41 -0
- package/dist/domain/project/env.js.map +1 -0
- package/dist/domain/project/project.d.ts +1 -1
- package/dist/domain/project/project.d.ts.map +1 -1
- package/dist/domain/project/project.js +4 -2
- package/dist/domain/project/project.js.map +1 -1
- package/dist/domain/secrets/backend.d.ts +9 -0
- package/dist/domain/secrets/backend.d.ts.map +1 -0
- package/dist/domain/secrets/backend.js +38 -0
- package/dist/domain/secrets/backend.js.map +1 -0
- package/dist/domain/secrets/doctor.d.ts +22 -0
- package/dist/domain/secrets/doctor.d.ts.map +1 -0
- package/dist/domain/secrets/doctor.js +216 -0
- package/dist/domain/secrets/doctor.js.map +1 -0
- package/dist/domain/secrets/manifest-scan.d.ts +16 -0
- package/dist/domain/secrets/manifest-scan.d.ts.map +1 -0
- package/dist/domain/secrets/manifest-scan.js +38 -0
- package/dist/domain/secrets/manifest-scan.js.map +1 -0
- package/dist/domain/template/template.d.ts +0 -4
- package/dist/domain/template/template.d.ts.map +1 -1
- package/dist/domain/template/template.js +18 -81
- package/dist/domain/template/template.js.map +1 -1
- package/dist/shared/types.d.ts +7 -3
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/ui/format.d.ts.map +1 -1
- package/dist/ui/format.js +4 -0
- package/dist/ui/format.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { diffManifest, encodeSecretScope, parseManifest, secretRefKey, } from "@fentaris/core";
|
|
5
|
+
import { exists } from "../../shared/utils.js";
|
|
6
|
+
import { credentialsPath, formatScopeLabel, manifestPath, openLocalSecretsBackend } from "./backend.js";
|
|
7
|
+
import { scanEntrypointForSecrets } from "./manifest-scan.js";
|
|
8
|
+
export async function getSecretsDoctorIssues(project, runtime, options = {}) {
|
|
9
|
+
const issues = [];
|
|
10
|
+
const required = await loadRequiredReferences(project);
|
|
11
|
+
const key = runtime.env.FENTARIS_AUTH_KEY;
|
|
12
|
+
const storeExists = await exists(credentialsPath(project));
|
|
13
|
+
let stored = [];
|
|
14
|
+
if (storeExists && key?.trim()) {
|
|
15
|
+
try {
|
|
16
|
+
const backend = await openLocalSecretsBackend(project, runtime, { key });
|
|
17
|
+
stored = await backend.listRefs();
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
issues.push({
|
|
21
|
+
status: "fail",
|
|
22
|
+
ref: "credentials.enc.json",
|
|
23
|
+
scope: "local",
|
|
24
|
+
detail: error instanceof Error ? error.message : "Unable to decrypt local credentials.",
|
|
25
|
+
hint: "Verify FENTARIS_AUTH_KEY matches the local credential store.",
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else if (storeExists) {
|
|
30
|
+
issues.push({
|
|
31
|
+
status: "warn",
|
|
32
|
+
ref: "credentials.enc.json",
|
|
33
|
+
scope: "local",
|
|
34
|
+
detail: "Encrypted store found but FENTARIS_AUTH_KEY is not set.",
|
|
35
|
+
hint: "Set FENTARIS_AUTH_KEY to verify stored secrets.",
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const diff = diffManifest(required, stored);
|
|
39
|
+
for (const entry of diff.missing) {
|
|
40
|
+
issues.push({
|
|
41
|
+
status: options.strict ? "fail" : "warn",
|
|
42
|
+
ref: entry.ref,
|
|
43
|
+
scope: entry.scope,
|
|
44
|
+
detail: "Required secret is missing from the local store.",
|
|
45
|
+
hint: hintForSet(entry),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
for (const entry of diff.extra) {
|
|
49
|
+
issues.push({
|
|
50
|
+
status: "warn",
|
|
51
|
+
ref: entry.ref,
|
|
52
|
+
scope: encodeSecretScope(entry.scope),
|
|
53
|
+
detail: "Stored secret is not listed in the secrets manifest.",
|
|
54
|
+
hint: "Run fentaris secrets manifest to update the committed schema.",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
for (const tracked of await gitTrackedSecretFiles(project)) {
|
|
58
|
+
issues.push({
|
|
59
|
+
status: "fail",
|
|
60
|
+
ref: tracked,
|
|
61
|
+
scope: "git",
|
|
62
|
+
detail: "Sensitive file is tracked by git.",
|
|
63
|
+
hint: `Remove it from git tracking and add it to .gitignore.`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (project.config.panther?.projectId) {
|
|
67
|
+
issues.push({
|
|
68
|
+
status: "warn",
|
|
69
|
+
ref: "panther.cloud",
|
|
70
|
+
scope: "cloud",
|
|
71
|
+
detail: "Panther Cloud project is configured but cloud sync is not available yet.",
|
|
72
|
+
hint: "Use the local encrypted store for now. Cloud sync arrives in a later release.",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (project.config.authDir !== ".fentaris") {
|
|
76
|
+
issues.push({
|
|
77
|
+
status: "warn",
|
|
78
|
+
ref: "authDir",
|
|
79
|
+
scope: "config",
|
|
80
|
+
detail: `Custom authDir (${project.config.authDir}) may not match credentialJson() defaults.`,
|
|
81
|
+
hint: "Prefer authDir \".fentaris\" unless you have aligned all credential paths.",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return issues;
|
|
85
|
+
}
|
|
86
|
+
export async function secretsDoctorHealthResults(project, runtime, options = {}) {
|
|
87
|
+
if (!runtime) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
const issues = await getSecretsDoctorIssues(project, runtime, options);
|
|
91
|
+
const manifestExists = await exists(manifestPath(project));
|
|
92
|
+
const entrypoint = path.join(project.root, project.config.entrypoint);
|
|
93
|
+
const scanned = await exists(entrypoint) ? await scanEntrypointForSecrets(entrypoint) : { references: [], envVars: [] };
|
|
94
|
+
const shouldHaveManifest = manifestExists || scanned.references.length > 0;
|
|
95
|
+
const results = shouldHaveManifest
|
|
96
|
+
? [
|
|
97
|
+
{
|
|
98
|
+
group: "Auth",
|
|
99
|
+
label: "secrets manifest",
|
|
100
|
+
status: manifestExists ? "pass" : "warn",
|
|
101
|
+
detail: manifestExists ? "Found committed secrets schema." : "Missing secrets.manifest.json.",
|
|
102
|
+
hint: manifestExists ? undefined : "Run fentaris secrets manifest to generate the committed schema.",
|
|
103
|
+
},
|
|
104
|
+
]
|
|
105
|
+
: [];
|
|
106
|
+
for (const issue of issues) {
|
|
107
|
+
results.push({
|
|
108
|
+
group: "Auth",
|
|
109
|
+
label: issue.ref === issue.scope ? issue.ref : `${issue.ref} (${issue.scope})`,
|
|
110
|
+
status: issue.status,
|
|
111
|
+
detail: issue.detail,
|
|
112
|
+
hint: issue.hint,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return results;
|
|
116
|
+
}
|
|
117
|
+
export async function loadRequiredReferences(project) {
|
|
118
|
+
const manifestFile = manifestPath(project);
|
|
119
|
+
if (await exists(manifestFile)) {
|
|
120
|
+
const manifest = parseManifest(JSON.parse(await readFile(manifestFile, "utf8")));
|
|
121
|
+
return manifest.references;
|
|
122
|
+
}
|
|
123
|
+
const entrypoint = path.join(project.root, project.config.entrypoint);
|
|
124
|
+
if (await exists(entrypoint)) {
|
|
125
|
+
return (await scanEntrypointForSecrets(entrypoint)).references;
|
|
126
|
+
}
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
export function buildListRows(required, stored) {
|
|
130
|
+
const storedByKey = new Map(stored.map((entry) => [secretRefKey(entry.ref, entry.scope), entry]));
|
|
131
|
+
const rows = [];
|
|
132
|
+
const seen = new Set();
|
|
133
|
+
for (const entry of required) {
|
|
134
|
+
const scope = decodeScope(entry.scope);
|
|
135
|
+
const key = secretRefKey(entry.ref, scope);
|
|
136
|
+
seen.add(key);
|
|
137
|
+
const storedEntry = storedByKey.get(key);
|
|
138
|
+
rows.push({
|
|
139
|
+
ref: entry.ref,
|
|
140
|
+
scope: entry.scope,
|
|
141
|
+
kind: "credential",
|
|
142
|
+
status: storedEntry ? "set" : "missing",
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
for (const entry of stored) {
|
|
146
|
+
const key = secretRefKey(entry.ref, entry.scope);
|
|
147
|
+
if (seen.has(key)) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
rows.push({
|
|
151
|
+
ref: entry.ref,
|
|
152
|
+
scope: formatScopeLabel(entry.scope),
|
|
153
|
+
kind: entry.kind,
|
|
154
|
+
status: entry.kind === "apiKey" ? `${entry.count} key${entry.count === 1 ? "" : "s"}` : "set",
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return rows;
|
|
158
|
+
}
|
|
159
|
+
async function gitTrackedSecretFiles(project) {
|
|
160
|
+
if (!(await isGitRepository(project.root))) {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
const candidates = [
|
|
164
|
+
path.relative(project.root, credentialsPath(project)),
|
|
165
|
+
".env",
|
|
166
|
+
];
|
|
167
|
+
const tracked = [];
|
|
168
|
+
for (const candidate of candidates) {
|
|
169
|
+
if (await gitTracksFile(project.root, candidate)) {
|
|
170
|
+
tracked.push(candidate);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return tracked;
|
|
174
|
+
}
|
|
175
|
+
function hintForSet(entry) {
|
|
176
|
+
if (entry.scope === "default") {
|
|
177
|
+
return `fentaris secrets set ${entry.ref}`;
|
|
178
|
+
}
|
|
179
|
+
if (entry.scope.startsWith("user:")) {
|
|
180
|
+
return `fentaris secrets set ${entry.ref} --user ${entry.scope.slice("user:".length)}`;
|
|
181
|
+
}
|
|
182
|
+
if (entry.scope.startsWith("group:")) {
|
|
183
|
+
return `fentaris secrets set ${entry.ref} --group ${entry.scope.slice("group:".length)}`;
|
|
184
|
+
}
|
|
185
|
+
return `fentaris secrets set ${entry.ref}`;
|
|
186
|
+
}
|
|
187
|
+
function decodeScope(scope) {
|
|
188
|
+
if (scope === "default") {
|
|
189
|
+
return { kind: "default" };
|
|
190
|
+
}
|
|
191
|
+
if (scope.startsWith("user:")) {
|
|
192
|
+
return { kind: "user", id: scope.slice("user:".length) };
|
|
193
|
+
}
|
|
194
|
+
if (scope.startsWith("group:")) {
|
|
195
|
+
return { kind: "group", id: scope.slice("group:".length) };
|
|
196
|
+
}
|
|
197
|
+
return { kind: "default" };
|
|
198
|
+
}
|
|
199
|
+
async function isGitRepository(root) {
|
|
200
|
+
return new Promise((resolve) => {
|
|
201
|
+
const child = spawn("git", ["rev-parse", "--is-inside-work-tree"], { cwd: root, stdio: ["ignore", "pipe", "ignore"] });
|
|
202
|
+
child.on("error", () => resolve(false));
|
|
203
|
+
child.on("close", (code) => resolve(code === 0));
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
async function gitTracksFile(root, relativePath) {
|
|
207
|
+
if (!(await exists(path.join(root, relativePath)))) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
return new Promise((resolve) => {
|
|
211
|
+
const child = spawn("git", ["ls-files", "--error-unmatch", relativePath], { cwd: root, stdio: "ignore" });
|
|
212
|
+
child.on("error", () => resolve(false));
|
|
213
|
+
child.on("close", (code) => resolve(code === 0));
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/domain/secrets/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type ManifestScanResult = {
|
|
2
|
+
references: Array<{
|
|
3
|
+
ref: string;
|
|
4
|
+
scope: string;
|
|
5
|
+
}>;
|
|
6
|
+
envVars: string[];
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Scan a TypeScript entrypoint for credential references.
|
|
10
|
+
*/
|
|
11
|
+
export declare function scanEntrypointForSecrets(entrypointPath: string): Promise<ManifestScanResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Scan TypeScript source for credential references.
|
|
14
|
+
*/
|
|
15
|
+
export declare function scanSourceForSecrets(source: string): ManifestScanResult;
|
|
16
|
+
//# sourceMappingURL=manifest-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-scan.d.ts","sourceRoot":"","sources":["../../../src/domain/secrets/manifest-scan.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAGlG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA0BvE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
const credentialPattern = /\bcredential\s*\(\s*["']([^"']+)["']\s*\)/gu;
|
|
3
|
+
const credentialEnvPattern = /\bcredentialEnv\s*\(\s*["']([^"']+)["']\s*\)/gu;
|
|
4
|
+
/**
|
|
5
|
+
* Scan a TypeScript entrypoint for credential references.
|
|
6
|
+
*/
|
|
7
|
+
export async function scanEntrypointForSecrets(entrypointPath) {
|
|
8
|
+
const source = await readFile(entrypointPath, "utf8");
|
|
9
|
+
return scanSourceForSecrets(source);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Scan TypeScript source for credential references.
|
|
13
|
+
*/
|
|
14
|
+
export function scanSourceForSecrets(source) {
|
|
15
|
+
const refs = new Set();
|
|
16
|
+
const envVars = new Set();
|
|
17
|
+
for (const pattern of [credentialPattern, /credential\s*\(\s*`([^`]+)`\s*\)/gu]) {
|
|
18
|
+
pattern.lastIndex = 0;
|
|
19
|
+
for (const match of source.matchAll(pattern)) {
|
|
20
|
+
const ref = match[1]?.trim();
|
|
21
|
+
if (ref) {
|
|
22
|
+
refs.add(ref);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
credentialEnvPattern.lastIndex = 0;
|
|
27
|
+
for (const match of source.matchAll(credentialEnvPattern)) {
|
|
28
|
+
const envVar = match[1]?.trim();
|
|
29
|
+
if (envVar) {
|
|
30
|
+
envVars.add(envVar);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
references: [...refs].sort().map((ref) => ({ ref, scope: "default" })),
|
|
35
|
+
envVars: [...envVars].sort(),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=manifest-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-scan.js","sourceRoot":"","sources":["../../../src/domain/secrets/manifest-scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,iBAAiB,GAAG,6CAA6C,CAAC;AACxE,MAAM,oBAAoB,GAAG,gDAAgD,CAAC;AAO9E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,cAAsB;IACnE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,CAAC,iBAAiB,EAAE,oCAAoC,CAAC,EAAE,CAAC;QAChF,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC7B,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,SAAS,GAAG,CAAC,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAChC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE;KAC7B,CAAC;AACJ,CAAC"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import type { TemplateInput } from "../../shared/types.js";
|
|
2
2
|
export declare function renderTemplate(input: TemplateInput): {
|
|
3
3
|
files: Record<string, string>;
|
|
4
|
-
authKey: string;
|
|
5
|
-
guestApiKey: string;
|
|
6
|
-
adminApiKey: string;
|
|
7
4
|
};
|
|
8
5
|
export declare function renderEntrypoint(input: TemplateInput): string;
|
|
9
6
|
export declare function writeTemplate(targetDir: string, files: Record<string, string>): Promise<void>;
|
|
10
|
-
export declare function initTemplateAuth(dir: string, key: string, guestApiKey: string, adminApiKey: string): Promise<void>;
|
|
11
7
|
//# sourceMappingURL=template.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/domain/template/template.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/domain/template/template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAuEtF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAmB7D;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnG"}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { FentarisAuth } from "@fentaris/core";
|
|
4
3
|
import { authDir, remoteMcpUrl } from "../../shared/constants.js";
|
|
5
|
-
import { writeCredentials } from "../auth/local-store.js";
|
|
6
4
|
export function renderTemplate(input) {
|
|
7
5
|
return {
|
|
8
|
-
authKey: input.authKey,
|
|
9
|
-
guestApiKey: input.guestApiKey,
|
|
10
|
-
adminApiKey: input.adminApiKey,
|
|
11
6
|
files: {
|
|
12
7
|
"README.md": renderReadme(input),
|
|
13
8
|
"package.json": JSON.stringify({
|
|
@@ -21,7 +16,6 @@ export function renderTemplate(input) {
|
|
|
21
16
|
start: "node dist/index.js",
|
|
22
17
|
},
|
|
23
18
|
dependencies: {
|
|
24
|
-
"@modelcontextprotocol/server-filesystem": "latest",
|
|
25
19
|
"@fentaris/core": "latest",
|
|
26
20
|
tsx: "latest",
|
|
27
21
|
},
|
|
@@ -51,77 +45,27 @@ export function renderTemplate(input) {
|
|
|
51
45
|
path: input.proxyPath,
|
|
52
46
|
authDir,
|
|
53
47
|
}, null, 2),
|
|
54
|
-
".env": [
|
|
55
|
-
`FENTARIS_AUTH_KEY=${input.authKey}`,
|
|
56
|
-
`FENTARIS_GUEST_API_KEY=${input.guestApiKey}`,
|
|
57
|
-
`FENTARIS_ADMIN_API_KEY=${input.adminApiKey}`,
|
|
58
|
-
"",
|
|
59
|
-
].join("\n"),
|
|
60
48
|
".gitignore": [
|
|
61
49
|
"node_modules/",
|
|
62
50
|
"dist/",
|
|
63
51
|
".env",
|
|
64
52
|
".env.*",
|
|
65
|
-
".fentaris
|
|
53
|
+
".fentaris/*",
|
|
54
|
+
"!.fentaris/secrets.manifest.json",
|
|
66
55
|
".fentaris/build/",
|
|
67
56
|
"*.log",
|
|
68
57
|
"",
|
|
69
58
|
].join("\n"),
|
|
59
|
+
".fentaris/secrets.manifest.json": JSON.stringify({ version: 1, references: [] }, null, 2),
|
|
70
60
|
"src/index.ts": renderEntrypoint(input),
|
|
71
|
-
"demo-files/README.md": "# Fentaris demo files\n\nThis directory is intentionally scoped for the demo filesystem MCP server.\n",
|
|
72
61
|
},
|
|
73
62
|
};
|
|
74
63
|
}
|
|
75
64
|
export function renderEntrypoint(input) {
|
|
76
|
-
return `import {
|
|
77
|
-
credentialJson,
|
|
78
|
-
fentaris,
|
|
79
|
-
group,
|
|
80
|
-
policy,
|
|
81
|
-
profiler,
|
|
82
|
-
stdio,
|
|
83
|
-
streamableHttp,
|
|
84
|
-
user,
|
|
85
|
-
} from "@fentaris/core";
|
|
86
|
-
|
|
87
|
-
const guest = user("guest", {
|
|
88
|
-
displayName: "Guest Demo User",
|
|
89
|
-
apiKeys: [credentialJson("users.guest.apiKeys.0")],
|
|
90
|
-
});
|
|
91
|
-
const admin = user("admin", {
|
|
92
|
-
displayName: "Admin Demo User",
|
|
93
|
-
apiKeys: [credentialJson("users.admin.apiKeys.0")],
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
const limitedPolicy = policy("limited-demo")
|
|
97
|
-
.mcp("demo-files")
|
|
98
|
-
.allow("list_allowed_directories")
|
|
99
|
-
.mcp("demo-files")
|
|
100
|
-
.allow("list_directory")
|
|
101
|
-
.mcp("specification")
|
|
102
|
-
.allow("*");
|
|
103
|
-
|
|
104
|
-
const adminPolicy = policy("admin-full-access").mcp("*").allow("*");
|
|
105
|
-
|
|
106
|
-
const runtimeProfiler = profiler()
|
|
107
|
-
.pretty()
|
|
108
|
-
.on("mcp.call.success", (event) => {
|
|
109
|
-
console.log(\`profile -> \${event.server ?? "unknown"}:\${event.operation} completed in \${event.durationMs ?? 0}ms\`);
|
|
110
|
-
});
|
|
65
|
+
return `import { fentaris, streamableHttp } from "@fentaris/core";
|
|
111
66
|
|
|
112
67
|
const app = fentaris({
|
|
113
|
-
|
|
114
|
-
group({ id: "limited", users: [guest], policy: limitedPolicy }),
|
|
115
|
-
group({ id: "admins", users: [admin], policy: adminPolicy }),
|
|
116
|
-
],
|
|
117
|
-
profiler: runtimeProfiler,
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
app.mcp("demo-files", {
|
|
121
|
-
transport: stdio({
|
|
122
|
-
command: "npx",
|
|
123
|
-
args: ["-y", "@modelcontextprotocol/server-filesystem", "./demo-files"],
|
|
124
|
-
}),
|
|
68
|
+
user: { id: "demo" },
|
|
125
69
|
});
|
|
126
70
|
|
|
127
71
|
app.mcp("specification", {
|
|
@@ -144,27 +88,13 @@ export async function writeTemplate(targetDir, files) {
|
|
|
144
88
|
await writeFile(filePath, contents);
|
|
145
89
|
}
|
|
146
90
|
}
|
|
147
|
-
export async function initTemplateAuth(dir, key, guestApiKey, adminApiKey) {
|
|
148
|
-
await mkdir(dir, { recursive: true });
|
|
149
|
-
await writeCredentials(dir, key, {
|
|
150
|
-
users: {
|
|
151
|
-
guest: { apiKeys: [FentarisAuth.hashApiKey(guestApiKey)], credentials: {} },
|
|
152
|
-
admin: { apiKeys: [FentarisAuth.hashApiKey(adminApiKey)], credentials: {} },
|
|
153
|
-
},
|
|
154
|
-
groups: { limited: {} },
|
|
155
|
-
defaults: {},
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
91
|
function renderReadme(input) {
|
|
159
92
|
return `# ${input.projectName}
|
|
160
93
|
|
|
161
94
|
This project was generated by the Fentaris CLI. It starts a local MCP proxy with:
|
|
162
95
|
|
|
163
|
-
- API-key authentication backed by encrypted credentials in \`.fentaris/credentials.enc.json\`
|
|
164
|
-
- A limited \`guest\` user and an unrestricted \`admin\` user
|
|
165
|
-
- A local filesystem demo server mounted as \`demo-files\`
|
|
166
96
|
- A remote HTTP MCP server mounted as \`specification\`
|
|
167
|
-
-
|
|
97
|
+
- One local demo user and no authentication or policy configuration
|
|
168
98
|
|
|
169
99
|
## Quick start
|
|
170
100
|
|
|
@@ -173,20 +103,27 @@ ${input.packageManager} install
|
|
|
173
103
|
${input.packageManager} dev
|
|
174
104
|
\`\`\`
|
|
175
105
|
|
|
176
|
-
The proxy listens on \`http://localhost:${input.port}${input.proxyPath}\` by default.
|
|
106
|
+
\`fentaris dev\` starts the project. The proxy listens on \`http://localhost:${input.port}${input.proxyPath}\` by default.
|
|
177
107
|
|
|
178
108
|
## Project files
|
|
179
109
|
|
|
180
|
-
- \`src/index.ts\` configures the app
|
|
110
|
+
- \`src/index.ts\` configures the app user and upstream MCP server.
|
|
181
111
|
- \`fentaris.json\` configures the project entrypoint, port, path, and CLI runtime defaults.
|
|
182
|
-
- \`.fentaris/
|
|
183
|
-
|
|
112
|
+
- \`.fentaris/secrets.manifest.json\` lists required credential references (schema only, safe to commit).
|
|
113
|
+
|
|
114
|
+
## Secrets workflow
|
|
115
|
+
|
|
116
|
+
\`\`\`sh
|
|
117
|
+
fentaris secrets set github.token
|
|
118
|
+
fentaris secrets list
|
|
119
|
+
fentaris secrets manifest
|
|
120
|
+
fentaris doctor
|
|
121
|
+
\`\`\`
|
|
184
122
|
|
|
185
123
|
## Useful commands
|
|
186
124
|
|
|
187
125
|
\`\`\`sh
|
|
188
126
|
fentaris check --offline
|
|
189
|
-
fentaris secrets set github.token --user admin
|
|
190
127
|
fentaris build
|
|
191
128
|
\`\`\`
|
|
192
129
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/domain/template/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/domain/template/template.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/types.d.ts
CHANGED
|
@@ -33,9 +33,6 @@ export type TemplateInput = {
|
|
|
33
33
|
packageManager: PackageManager;
|
|
34
34
|
port: number;
|
|
35
35
|
proxyPath: string;
|
|
36
|
-
authKey: string;
|
|
37
|
-
guestApiKey: string;
|
|
38
|
-
adminApiKey: string;
|
|
39
36
|
};
|
|
40
37
|
export type HealthStatus = "pass" | "warn" | "fail";
|
|
41
38
|
export type HealthResult = {
|
|
@@ -54,6 +51,13 @@ export type ProjectConfig = {
|
|
|
54
51
|
port: number;
|
|
55
52
|
path: string;
|
|
56
53
|
authDir: string;
|
|
54
|
+
secrets?: {
|
|
55
|
+
provider?: "local";
|
|
56
|
+
};
|
|
57
|
+
panther?: {
|
|
58
|
+
projectId?: string;
|
|
59
|
+
environment?: string;
|
|
60
|
+
};
|
|
57
61
|
};
|
|
58
62
|
export type ProjectDiscovery = {
|
|
59
63
|
root: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;AAE1D,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEhH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;AAEtE,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/F,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,EAAE,IAAI,CAAC,OAAO,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/format.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAc9E,eAAO,MAAM,KAAK;mBACD,MAAM;qBACJ,MAAM;mBACR,MAAM;kBACP,MAAM;qBACH,MAAM;kBACT,MAAM;kBACN,MAAM;kBACN,MAAM;CACrB,CAAC;AAEF,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG7D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAElD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAelF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEjD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAc9E,eAAO,MAAM,KAAK;mBACD,MAAM;qBACJ,MAAM;mBACR,MAAM;kBACP,MAAM;qBACH,MAAM;kBACT,MAAM;kBACN,MAAM;kBACN,MAAM;CACrB,CAAC;AAEF,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG7D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAElD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAelF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEjD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmBhD"}
|
package/dist/ui/format.js
CHANGED
|
@@ -53,6 +53,10 @@ export function printHelp(runtime) {
|
|
|
53
53
|
${style.command("fentaris doctor [--fix] [--strict] [--json] [--runtime] [--timeout <ms>]")}
|
|
54
54
|
${style.command("fentaris build")}
|
|
55
55
|
${style.command("fentaris secrets set <reference> [--user <id> | --group <id>]")}
|
|
56
|
+
${style.command("fentaris secrets list [--json]")}
|
|
57
|
+
${style.command("fentaris secrets unset <reference> [--user <id> | --group <id>]")}
|
|
58
|
+
${style.command("fentaris secrets manifest [--check]")}
|
|
59
|
+
${style.command("fentaris secrets doctor [--strict] [--json]")}
|
|
56
60
|
|
|
57
61
|
Legacy local auth:
|
|
58
62
|
${style.command("fentaris auth init --dir .fentaris/auth --key <key>")}
|
package/dist/ui/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fentaris/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Fentaris MCP Proxy - CLI",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"dist"
|
|
12
12
|
],
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@fentaris/core": "0.
|
|
14
|
+
"@fentaris/core": "0.6.0"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@types/node": "^25.9.1",
|