@enactprotocol/shared 2.0.0 → 2.0.1
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/config.d.ts +164 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +386 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +17 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -0
- package/dist/execution/command.d.ts +102 -0
- package/dist/execution/command.d.ts.map +1 -0
- package/dist/execution/command.js +262 -0
- package/dist/execution/command.js.map +1 -0
- package/dist/execution/index.d.ts +12 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +17 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/runtime.d.ts +82 -0
- package/dist/execution/runtime.d.ts.map +1 -0
- package/dist/execution/runtime.js +273 -0
- package/dist/execution/runtime.js.map +1 -0
- package/dist/execution/types.d.ts +306 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/execution/types.js +14 -0
- package/dist/execution/types.js.map +1 -0
- package/dist/execution/validation.d.ts +43 -0
- package/dist/execution/validation.d.ts.map +1 -0
- package/dist/execution/validation.js +430 -0
- package/dist/execution/validation.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/index.d.ts +7 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +10 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/loader.d.ts +76 -0
- package/dist/manifest/loader.d.ts.map +1 -0
- package/dist/manifest/loader.js +146 -0
- package/dist/manifest/loader.js.map +1 -0
- package/dist/manifest/parser.d.ts +64 -0
- package/dist/manifest/parser.d.ts.map +1 -0
- package/dist/manifest/parser.js +135 -0
- package/dist/manifest/parser.js.map +1 -0
- package/dist/manifest/validator.d.ts +95 -0
- package/dist/manifest/validator.d.ts.map +1 -0
- package/dist/manifest/validator.js +258 -0
- package/dist/manifest/validator.js.map +1 -0
- package/dist/paths.d.ts +57 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +93 -0
- package/dist/paths.js.map +1 -0
- package/dist/registry.d.ts +73 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +147 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolver.d.ts +89 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +282 -0
- package/dist/resolver.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/manifest.d.ts +201 -0
- package/dist/types/manifest.d.ts.map +1 -0
- package/dist/types/manifest.js +13 -0
- package/dist/types/manifest.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +105 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +233 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +112 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +232 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/version.d.ts +62 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +259 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +2 -2
- package/src/config.ts +36 -2
- package/src/index.ts +1 -0
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest validator using Zod
|
|
3
|
+
*
|
|
4
|
+
* Validates that parsed manifests conform to the Enact specification
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod/v4";
|
|
7
|
+
// ==================== Zod Schemas ====================
|
|
8
|
+
/**
|
|
9
|
+
* Environment variable schema
|
|
10
|
+
*/
|
|
11
|
+
const EnvVariableSchema = z.object({
|
|
12
|
+
description: z.string().min(1, "Description is required"),
|
|
13
|
+
secret: z.boolean().optional(),
|
|
14
|
+
default: z.string().optional(),
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Author schema
|
|
18
|
+
*/
|
|
19
|
+
const AuthorSchema = z.object({
|
|
20
|
+
name: z.string().min(1, "Author name is required"),
|
|
21
|
+
email: z.string().email().optional(),
|
|
22
|
+
url: z.string().url().optional(),
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* Tool annotations schema
|
|
26
|
+
*/
|
|
27
|
+
const ToolAnnotationsSchema = z.object({
|
|
28
|
+
title: z.string().optional(),
|
|
29
|
+
readOnlyHint: z.boolean().optional(),
|
|
30
|
+
destructiveHint: z.boolean().optional(),
|
|
31
|
+
idempotentHint: z.boolean().optional(),
|
|
32
|
+
openWorldHint: z.boolean().optional(),
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Resource requirements schema
|
|
36
|
+
*/
|
|
37
|
+
const ResourceRequirementsSchema = z.object({
|
|
38
|
+
memory: z.string().optional(),
|
|
39
|
+
gpu: z.string().optional(),
|
|
40
|
+
disk: z.string().optional(),
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* Tool example schema
|
|
44
|
+
*/
|
|
45
|
+
const ToolExampleSchema = z.object({
|
|
46
|
+
input: z.record(z.string(), z.unknown()).optional(),
|
|
47
|
+
output: z.unknown().optional(),
|
|
48
|
+
description: z.string().optional(),
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* JSON Schema validation (basic structure check)
|
|
52
|
+
* We don't fully validate JSON Schema here, just ensure it's an object
|
|
53
|
+
*/
|
|
54
|
+
const JsonSchemaSchema = z
|
|
55
|
+
.object({
|
|
56
|
+
type: z.string().optional(),
|
|
57
|
+
properties: z.record(z.string(), z.unknown()).optional(),
|
|
58
|
+
required: z.array(z.string()).optional(),
|
|
59
|
+
items: z.unknown().optional(),
|
|
60
|
+
enum: z.array(z.unknown()).optional(),
|
|
61
|
+
description: z.string().optional(),
|
|
62
|
+
})
|
|
63
|
+
.passthrough(); // Allow additional JSON Schema fields
|
|
64
|
+
/**
|
|
65
|
+
* Semantic version regex
|
|
66
|
+
*/
|
|
67
|
+
const SEMVER_REGEX = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
|
|
68
|
+
/**
|
|
69
|
+
* Tool name regex - hierarchical path format
|
|
70
|
+
*/
|
|
71
|
+
const TOOL_NAME_REGEX = /^[a-z0-9_-]+(?:\/[a-z0-9_-]+)+$/;
|
|
72
|
+
/**
|
|
73
|
+
* Go duration regex (used for timeout)
|
|
74
|
+
*/
|
|
75
|
+
const GO_DURATION_REGEX = /^(\d+)(ns|us|µs|ms|s|m|h)$/;
|
|
76
|
+
/**
|
|
77
|
+
* Complete tool manifest schema
|
|
78
|
+
*/
|
|
79
|
+
const ToolManifestSchema = z
|
|
80
|
+
.object({
|
|
81
|
+
// Required fields
|
|
82
|
+
name: z
|
|
83
|
+
.string()
|
|
84
|
+
.min(1, "Tool name is required")
|
|
85
|
+
.regex(TOOL_NAME_REGEX, "Tool name must be hierarchical path format (e.g., 'org/tool' or 'org/category/tool')"),
|
|
86
|
+
description: z
|
|
87
|
+
.string()
|
|
88
|
+
.min(1, "Description is required")
|
|
89
|
+
.max(500, "Description should be 500 characters or less"),
|
|
90
|
+
// Recommended fields
|
|
91
|
+
enact: z.string().optional(),
|
|
92
|
+
version: z
|
|
93
|
+
.string()
|
|
94
|
+
.regex(SEMVER_REGEX, "Version must be valid semver (e.g., '1.0.0')")
|
|
95
|
+
.optional(),
|
|
96
|
+
from: z.string().optional(),
|
|
97
|
+
command: z.string().optional(),
|
|
98
|
+
timeout: z
|
|
99
|
+
.string()
|
|
100
|
+
.regex(GO_DURATION_REGEX, "Timeout must be Go duration format (e.g., '30s', '5m', '1h')")
|
|
101
|
+
.optional(),
|
|
102
|
+
license: z.string().optional(),
|
|
103
|
+
tags: z.array(z.string()).optional(),
|
|
104
|
+
// Schema fields
|
|
105
|
+
inputSchema: JsonSchemaSchema.optional(),
|
|
106
|
+
outputSchema: JsonSchemaSchema.optional(),
|
|
107
|
+
// Environment variables
|
|
108
|
+
env: z.record(z.string(), EnvVariableSchema).optional(),
|
|
109
|
+
// Behavior & Resources
|
|
110
|
+
annotations: ToolAnnotationsSchema.optional(),
|
|
111
|
+
resources: ResourceRequirementsSchema.optional(),
|
|
112
|
+
// Documentation
|
|
113
|
+
doc: z.string().optional(),
|
|
114
|
+
authors: z.array(AuthorSchema).optional(),
|
|
115
|
+
// Testing
|
|
116
|
+
examples: z.array(ToolExampleSchema).optional(),
|
|
117
|
+
})
|
|
118
|
+
.passthrough(); // Allow x-* custom fields
|
|
119
|
+
// ==================== Validation Functions ====================
|
|
120
|
+
/**
|
|
121
|
+
* Convert Zod error to our ValidationError format
|
|
122
|
+
*/
|
|
123
|
+
function zodErrorToValidationErrors(zodError) {
|
|
124
|
+
return zodError.issues.map((issue) => ({
|
|
125
|
+
path: issue.path.join("."),
|
|
126
|
+
message: issue.message,
|
|
127
|
+
code: issue.code,
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Generate warnings for recommended but missing fields
|
|
132
|
+
*/
|
|
133
|
+
function generateWarnings(manifest) {
|
|
134
|
+
const warnings = [];
|
|
135
|
+
// Check for recommended fields
|
|
136
|
+
if (!manifest.enact) {
|
|
137
|
+
warnings.push({
|
|
138
|
+
path: "enact",
|
|
139
|
+
message: "Protocol version (enact) is recommended for compatibility",
|
|
140
|
+
code: "MISSING_RECOMMENDED",
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (!manifest.version) {
|
|
144
|
+
warnings.push({
|
|
145
|
+
path: "version",
|
|
146
|
+
message: "Tool version is recommended for versioning and updates",
|
|
147
|
+
code: "MISSING_RECOMMENDED",
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (!manifest.from && manifest.command) {
|
|
151
|
+
warnings.push({
|
|
152
|
+
path: "from",
|
|
153
|
+
message: "Container image (from) is recommended for reproducibility",
|
|
154
|
+
code: "MISSING_RECOMMENDED",
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (!manifest.license) {
|
|
158
|
+
warnings.push({
|
|
159
|
+
path: "license",
|
|
160
|
+
message: "License is recommended for published tools",
|
|
161
|
+
code: "MISSING_RECOMMENDED",
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
if (!manifest.inputSchema && manifest.command) {
|
|
165
|
+
warnings.push({
|
|
166
|
+
path: "inputSchema",
|
|
167
|
+
message: "Input schema is recommended for tools with parameters",
|
|
168
|
+
code: "MISSING_RECOMMENDED",
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
if (!manifest.outputSchema) {
|
|
172
|
+
warnings.push({
|
|
173
|
+
path: "outputSchema",
|
|
174
|
+
message: "Output schema is recommended for structured output validation",
|
|
175
|
+
code: "MISSING_RECOMMENDED",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// Check for potential issues
|
|
179
|
+
if (manifest.env) {
|
|
180
|
+
for (const [key, value] of Object.entries(manifest.env)) {
|
|
181
|
+
if (value.secret && value.default) {
|
|
182
|
+
warnings.push({
|
|
183
|
+
path: `env.${key}`,
|
|
184
|
+
message: "Secret variables should not have default values",
|
|
185
|
+
code: "SECRET_WITH_DEFAULT",
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Check for timeout on command tools
|
|
191
|
+
if (manifest.command && !manifest.timeout) {
|
|
192
|
+
warnings.push({
|
|
193
|
+
path: "timeout",
|
|
194
|
+
message: "Timeout is recommended for command-based tools",
|
|
195
|
+
code: "MISSING_RECOMMENDED",
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return warnings;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Validate a tool manifest
|
|
202
|
+
*
|
|
203
|
+
* @param manifest - The manifest to validate (parsed but unvalidated)
|
|
204
|
+
* @returns ValidationResult with valid flag, errors, and warnings
|
|
205
|
+
*/
|
|
206
|
+
export function validateManifest(manifest) {
|
|
207
|
+
const result = ToolManifestSchema.safeParse(manifest);
|
|
208
|
+
if (!result.success) {
|
|
209
|
+
return {
|
|
210
|
+
valid: false,
|
|
211
|
+
errors: zodErrorToValidationErrors(result.error),
|
|
212
|
+
warnings: [],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// Generate warnings for missing recommended fields
|
|
216
|
+
const warnings = generateWarnings(result.data);
|
|
217
|
+
return {
|
|
218
|
+
valid: true,
|
|
219
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Validate and return the typed manifest
|
|
224
|
+
* Throws if validation fails
|
|
225
|
+
*
|
|
226
|
+
* @param manifest - The manifest to validate
|
|
227
|
+
* @returns The validated ToolManifest
|
|
228
|
+
* @throws Error if validation fails
|
|
229
|
+
*/
|
|
230
|
+
export function validateManifestStrict(manifest) {
|
|
231
|
+
const result = validateManifest(manifest);
|
|
232
|
+
if (!result.valid) {
|
|
233
|
+
const errorMessages = result.errors?.map((e) => `${e.path}: ${e.message}`).join(", ");
|
|
234
|
+
throw new Error(`Manifest validation failed: ${errorMessages}`);
|
|
235
|
+
}
|
|
236
|
+
return manifest;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Check if a string is a valid tool name
|
|
240
|
+
*/
|
|
241
|
+
export function isValidToolName(name) {
|
|
242
|
+
return TOOL_NAME_REGEX.test(name);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Check if a string is a valid semver version
|
|
246
|
+
*/
|
|
247
|
+
export function isValidVersion(version) {
|
|
248
|
+
return SEMVER_REGEX.test(version);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Check if a string is a valid Go duration
|
|
252
|
+
*/
|
|
253
|
+
export function isValidTimeout(timeout) {
|
|
254
|
+
return GO_DURATION_REGEX.test(timeout);
|
|
255
|
+
}
|
|
256
|
+
// Export the schema for external use
|
|
257
|
+
export { ToolManifestSchema };
|
|
258
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/manifest/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path resolution utilities for Enact directories and tool locations
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Scope for tool directories
|
|
6
|
+
*/
|
|
7
|
+
export type ToolScope = "user" | "project";
|
|
8
|
+
/**
|
|
9
|
+
* Get the Enact home directory (~/.enact/)
|
|
10
|
+
* @returns Absolute path to ~/.enact/
|
|
11
|
+
*/
|
|
12
|
+
export declare function getEnactHome(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Get the project-level .enact directory
|
|
15
|
+
* Searches up from current working directory to find .enact/
|
|
16
|
+
* NOTE: Does NOT return ~/.enact/ - that's the global home, not a project dir
|
|
17
|
+
* @param startDir - Directory to start searching from (defaults to cwd)
|
|
18
|
+
* @returns Absolute path to .enact/ or null if not found
|
|
19
|
+
*/
|
|
20
|
+
export declare function getProjectEnactDir(startDir?: string): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* Get the tools directory for specified scope
|
|
23
|
+
*
|
|
24
|
+
* NOTE: For global scope ("user"), this is DEPRECATED.
|
|
25
|
+
* Global tools are now tracked in ~/.enact/tools.json and stored in cache.
|
|
26
|
+
* Use getToolsJsonPath("global") and getToolCachePath() from ./registry instead.
|
|
27
|
+
*
|
|
28
|
+
* For project scope, this returns .enact/tools/ where project tools are copied.
|
|
29
|
+
*
|
|
30
|
+
* @param scope - 'user' for ~/.enact/tools/ (deprecated) or 'project' for .enact/tools/
|
|
31
|
+
* @param startDir - For project scope, directory to start searching from
|
|
32
|
+
* @returns Absolute path to tools directory or null if project scope and not found
|
|
33
|
+
* @deprecated Use registry.ts functions for global tools
|
|
34
|
+
*/
|
|
35
|
+
export declare function getToolsDir(scope: ToolScope, startDir?: string): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Get the cache directory (~/.enact/cache/)
|
|
38
|
+
* @returns Absolute path to ~/.enact/cache/
|
|
39
|
+
*/
|
|
40
|
+
export declare function getCacheDir(): string;
|
|
41
|
+
/**
|
|
42
|
+
* Get the configuration file path (~/.enact/config.yaml)
|
|
43
|
+
* @returns Absolute path to ~/.enact/config.yaml
|
|
44
|
+
*/
|
|
45
|
+
export declare function getConfigPath(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Get the global .env file path (~/.enact/.env)
|
|
48
|
+
* @returns Absolute path to ~/.enact/.env
|
|
49
|
+
*/
|
|
50
|
+
export declare function getGlobalEnvPath(): string;
|
|
51
|
+
/**
|
|
52
|
+
* Get the project .env file path (.enact/.env)
|
|
53
|
+
* @param startDir - Directory to start searching from
|
|
54
|
+
* @returns Absolute path to .enact/.env or null if not found
|
|
55
|
+
*/
|
|
56
|
+
export declare function getProjectEnvPath(startDir?: string): string | null;
|
|
57
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBnE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS9E;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGlE"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path resolution utilities for Enact directories and tool locations
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import { join, resolve } from "node:path";
|
|
7
|
+
/**
|
|
8
|
+
* Get the Enact home directory (~/.enact/)
|
|
9
|
+
* @returns Absolute path to ~/.enact/
|
|
10
|
+
*/
|
|
11
|
+
export function getEnactHome() {
|
|
12
|
+
return join(homedir(), ".enact");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get the project-level .enact directory
|
|
16
|
+
* Searches up from current working directory to find .enact/
|
|
17
|
+
* NOTE: Does NOT return ~/.enact/ - that's the global home, not a project dir
|
|
18
|
+
* @param startDir - Directory to start searching from (defaults to cwd)
|
|
19
|
+
* @returns Absolute path to .enact/ or null if not found
|
|
20
|
+
*/
|
|
21
|
+
export function getProjectEnactDir(startDir) {
|
|
22
|
+
let currentDir = resolve(startDir ?? process.cwd());
|
|
23
|
+
const root = resolve("/");
|
|
24
|
+
const enactHome = getEnactHome();
|
|
25
|
+
// Walk up directory tree looking for .enact/
|
|
26
|
+
while (currentDir !== root) {
|
|
27
|
+
const enactDir = join(currentDir, ".enact");
|
|
28
|
+
// Skip ~/.enact/ - that's the global home, not a project directory
|
|
29
|
+
if (existsSync(enactDir) && enactDir !== enactHome) {
|
|
30
|
+
return enactDir;
|
|
31
|
+
}
|
|
32
|
+
const parentDir = resolve(currentDir, "..");
|
|
33
|
+
if (parentDir === currentDir) {
|
|
34
|
+
break; // Reached root
|
|
35
|
+
}
|
|
36
|
+
currentDir = parentDir;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the tools directory for specified scope
|
|
42
|
+
*
|
|
43
|
+
* NOTE: For global scope ("user"), this is DEPRECATED.
|
|
44
|
+
* Global tools are now tracked in ~/.enact/tools.json and stored in cache.
|
|
45
|
+
* Use getToolsJsonPath("global") and getToolCachePath() from ./registry instead.
|
|
46
|
+
*
|
|
47
|
+
* For project scope, this returns .enact/tools/ where project tools are copied.
|
|
48
|
+
*
|
|
49
|
+
* @param scope - 'user' for ~/.enact/tools/ (deprecated) or 'project' for .enact/tools/
|
|
50
|
+
* @param startDir - For project scope, directory to start searching from
|
|
51
|
+
* @returns Absolute path to tools directory or null if project scope and not found
|
|
52
|
+
* @deprecated Use registry.ts functions for global tools
|
|
53
|
+
*/
|
|
54
|
+
export function getToolsDir(scope, startDir) {
|
|
55
|
+
if (scope === "user") {
|
|
56
|
+
// DEPRECATED: Global tools now use tools.json + cache
|
|
57
|
+
// This path is kept for backward compatibility during migration
|
|
58
|
+
return join(getEnactHome(), "tools");
|
|
59
|
+
}
|
|
60
|
+
const projectDir = getProjectEnactDir(startDir);
|
|
61
|
+
return projectDir ? join(projectDir, "tools") : null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the cache directory (~/.enact/cache/)
|
|
65
|
+
* @returns Absolute path to ~/.enact/cache/
|
|
66
|
+
*/
|
|
67
|
+
export function getCacheDir() {
|
|
68
|
+
return join(getEnactHome(), "cache");
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get the configuration file path (~/.enact/config.yaml)
|
|
72
|
+
* @returns Absolute path to ~/.enact/config.yaml
|
|
73
|
+
*/
|
|
74
|
+
export function getConfigPath() {
|
|
75
|
+
return join(getEnactHome(), "config.yaml");
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the global .env file path (~/.enact/.env)
|
|
79
|
+
* @returns Absolute path to ~/.enact/.env
|
|
80
|
+
*/
|
|
81
|
+
export function getGlobalEnvPath() {
|
|
82
|
+
return join(getEnactHome(), ".env");
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get the project .env file path (.enact/.env)
|
|
86
|
+
* @param startDir - Directory to start searching from
|
|
87
|
+
* @returns Absolute path to .enact/.env or null if not found
|
|
88
|
+
*/
|
|
89
|
+
export function getProjectEnvPath(startDir) {
|
|
90
|
+
const projectDir = getProjectEnactDir(startDir);
|
|
91
|
+
return projectDir ? join(projectDir, ".env") : null;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAO1C;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,IAAI,UAAU,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,6CAA6C;IAC7C,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC5C,mEAAmE;QACnE,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,eAAe;QACxB,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,KAAgB,EAAE,QAAiB;IAC7D,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,sDAAsD;QACtD,gEAAgE;QAChE,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiB;IACjD,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local tool registry management
|
|
3
|
+
*
|
|
4
|
+
* Manages tools.json files for tracking installed tools:
|
|
5
|
+
* - Global: ~/.enact/tools.json (installed with -g)
|
|
6
|
+
* - Project: .enact/tools.json (project dependencies)
|
|
7
|
+
*
|
|
8
|
+
* Tools are stored in cache and referenced by version in tools.json.
|
|
9
|
+
* This eliminates the need for a separate ~/.enact/tools/ directory.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Structure of tools.json file
|
|
13
|
+
*/
|
|
14
|
+
export interface ToolsRegistry {
|
|
15
|
+
/** Map of tool name to installed version */
|
|
16
|
+
tools: Record<string, string>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Scope for tool registry
|
|
20
|
+
*/
|
|
21
|
+
export type RegistryScope = "global" | "project";
|
|
22
|
+
/**
|
|
23
|
+
* Information about an installed tool
|
|
24
|
+
*/
|
|
25
|
+
export interface InstalledToolInfo {
|
|
26
|
+
name: string;
|
|
27
|
+
version: string;
|
|
28
|
+
scope: RegistryScope;
|
|
29
|
+
cachePath: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the path to tools.json for the specified scope
|
|
33
|
+
*/
|
|
34
|
+
export declare function getToolsJsonPath(scope: RegistryScope, startDir?: string): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* Load tools.json from the specified scope
|
|
37
|
+
* Returns empty registry if file doesn't exist
|
|
38
|
+
*/
|
|
39
|
+
export declare function loadToolsRegistry(scope: RegistryScope, startDir?: string): ToolsRegistry;
|
|
40
|
+
/**
|
|
41
|
+
* Save tools.json to the specified scope
|
|
42
|
+
*/
|
|
43
|
+
export declare function saveToolsRegistry(registry: ToolsRegistry, scope: RegistryScope, startDir?: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* Add a tool to the registry
|
|
46
|
+
*/
|
|
47
|
+
export declare function addToolToRegistry(toolName: string, version: string, scope: RegistryScope, startDir?: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Remove a tool from the registry
|
|
50
|
+
*/
|
|
51
|
+
export declare function removeToolFromRegistry(toolName: string, scope: RegistryScope, startDir?: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Check if a tool is installed in the registry
|
|
54
|
+
*/
|
|
55
|
+
export declare function isToolInstalled(toolName: string, scope: RegistryScope, startDir?: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Get the installed version of a tool
|
|
58
|
+
* Returns null if not installed
|
|
59
|
+
*/
|
|
60
|
+
export declare function getInstalledVersion(toolName: string, scope: RegistryScope, startDir?: string): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Get the cache path for an installed tool
|
|
63
|
+
*/
|
|
64
|
+
export declare function getToolCachePath(toolName: string, version: string): string;
|
|
65
|
+
/**
|
|
66
|
+
* List all installed tools in a registry
|
|
67
|
+
*/
|
|
68
|
+
export declare function listInstalledTools(scope: RegistryScope, startDir?: string): InstalledToolInfo[];
|
|
69
|
+
/**
|
|
70
|
+
* Get tool info if installed (checks cache path exists)
|
|
71
|
+
*/
|
|
72
|
+
export declare function getInstalledToolInfo(toolName: string, scope: RegistryScope, startDir?: string): InstalledToolInfo | null;
|
|
73
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAiBxF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAuBN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAUT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAGT;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAGf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAI1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAc/F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,iBAAiB,GAAG,IAAI,CAoB1B"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local tool registry management
|
|
3
|
+
*
|
|
4
|
+
* Manages tools.json files for tracking installed tools:
|
|
5
|
+
* - Global: ~/.enact/tools.json (installed with -g)
|
|
6
|
+
* - Project: .enact/tools.json (project dependencies)
|
|
7
|
+
*
|
|
8
|
+
* Tools are stored in cache and referenced by version in tools.json.
|
|
9
|
+
* This eliminates the need for a separate ~/.enact/tools/ directory.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
12
|
+
import { dirname, join } from "node:path";
|
|
13
|
+
import { getCacheDir, getEnactHome, getProjectEnactDir } from "./paths";
|
|
14
|
+
/**
|
|
15
|
+
* Get the path to tools.json for the specified scope
|
|
16
|
+
*/
|
|
17
|
+
export function getToolsJsonPath(scope, startDir) {
|
|
18
|
+
if (scope === "global") {
|
|
19
|
+
return join(getEnactHome(), "tools.json");
|
|
20
|
+
}
|
|
21
|
+
const projectDir = getProjectEnactDir(startDir);
|
|
22
|
+
return projectDir ? join(projectDir, "tools.json") : null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Load tools.json from the specified scope
|
|
26
|
+
* Returns empty registry if file doesn't exist
|
|
27
|
+
*/
|
|
28
|
+
export function loadToolsRegistry(scope, startDir) {
|
|
29
|
+
const registryPath = getToolsJsonPath(scope, startDir);
|
|
30
|
+
if (!registryPath || !existsSync(registryPath)) {
|
|
31
|
+
return { tools: {} };
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const content = readFileSync(registryPath, "utf-8");
|
|
35
|
+
const parsed = JSON.parse(content);
|
|
36
|
+
return {
|
|
37
|
+
tools: parsed.tools ?? {},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Return empty registry on parse error
|
|
42
|
+
return { tools: {} };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Save tools.json to the specified scope
|
|
47
|
+
*/
|
|
48
|
+
export function saveToolsRegistry(registry, scope, startDir) {
|
|
49
|
+
let registryPath = getToolsJsonPath(scope, startDir);
|
|
50
|
+
// For project scope, create .enact/ directory if it doesn't exist
|
|
51
|
+
if (!registryPath && scope === "project") {
|
|
52
|
+
const projectRoot = startDir ?? process.cwd();
|
|
53
|
+
const enactDir = join(projectRoot, ".enact");
|
|
54
|
+
mkdirSync(enactDir, { recursive: true });
|
|
55
|
+
registryPath = join(enactDir, "tools.json");
|
|
56
|
+
}
|
|
57
|
+
if (!registryPath) {
|
|
58
|
+
throw new Error("Cannot save project registry: unable to determine registry path");
|
|
59
|
+
}
|
|
60
|
+
// Ensure directory exists
|
|
61
|
+
const dir = dirname(registryPath);
|
|
62
|
+
if (!existsSync(dir)) {
|
|
63
|
+
mkdirSync(dir, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
const content = JSON.stringify(registry, null, 2);
|
|
66
|
+
writeFileSync(registryPath, content, "utf-8");
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Add a tool to the registry
|
|
70
|
+
*/
|
|
71
|
+
export function addToolToRegistry(toolName, version, scope, startDir) {
|
|
72
|
+
const registry = loadToolsRegistry(scope, startDir);
|
|
73
|
+
registry.tools[toolName] = version;
|
|
74
|
+
saveToolsRegistry(registry, scope, startDir);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Remove a tool from the registry
|
|
78
|
+
*/
|
|
79
|
+
export function removeToolFromRegistry(toolName, scope, startDir) {
|
|
80
|
+
const registry = loadToolsRegistry(scope, startDir);
|
|
81
|
+
if (!(toolName in registry.tools)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
delete registry.tools[toolName];
|
|
85
|
+
saveToolsRegistry(registry, scope, startDir);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if a tool is installed in the registry
|
|
90
|
+
*/
|
|
91
|
+
export function isToolInstalled(toolName, scope, startDir) {
|
|
92
|
+
const registry = loadToolsRegistry(scope, startDir);
|
|
93
|
+
return toolName in registry.tools;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get the installed version of a tool
|
|
97
|
+
* Returns null if not installed
|
|
98
|
+
*/
|
|
99
|
+
export function getInstalledVersion(toolName, scope, startDir) {
|
|
100
|
+
const registry = loadToolsRegistry(scope, startDir);
|
|
101
|
+
return registry.tools[toolName] ?? null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get the cache path for an installed tool
|
|
105
|
+
*/
|
|
106
|
+
export function getToolCachePath(toolName, version) {
|
|
107
|
+
const cacheDir = getCacheDir();
|
|
108
|
+
const normalizedVersion = version.startsWith("v") ? version.slice(1) : version;
|
|
109
|
+
return join(cacheDir, toolName, `v${normalizedVersion}`);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* List all installed tools in a registry
|
|
113
|
+
*/
|
|
114
|
+
export function listInstalledTools(scope, startDir) {
|
|
115
|
+
const registry = loadToolsRegistry(scope, startDir);
|
|
116
|
+
const tools = [];
|
|
117
|
+
for (const [name, version] of Object.entries(registry.tools)) {
|
|
118
|
+
tools.push({
|
|
119
|
+
name,
|
|
120
|
+
version,
|
|
121
|
+
scope,
|
|
122
|
+
cachePath: getToolCachePath(name, version),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return tools;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get tool info if installed (checks cache path exists)
|
|
129
|
+
*/
|
|
130
|
+
export function getInstalledToolInfo(toolName, scope, startDir) {
|
|
131
|
+
const version = getInstalledVersion(toolName, scope, startDir);
|
|
132
|
+
if (!version) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const cachePath = getToolCachePath(toolName, version);
|
|
136
|
+
// Verify cache exists
|
|
137
|
+
if (!existsSync(cachePath)) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
name: toolName,
|
|
142
|
+
version,
|
|
143
|
+
scope,
|
|
144
|
+
cachePath,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|