@enactprotocol/shared 2.0.0 → 2.0.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 (89) hide show
  1. package/dist/config.d.ts +164 -0
  2. package/dist/config.d.ts.map +1 -0
  3. package/dist/config.js +386 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/constants.d.ts +17 -0
  6. package/dist/constants.d.ts.map +1 -0
  7. package/dist/constants.js +26 -0
  8. package/dist/constants.js.map +1 -0
  9. package/dist/execution/command.d.ts +102 -0
  10. package/dist/execution/command.d.ts.map +1 -0
  11. package/dist/execution/command.js +262 -0
  12. package/dist/execution/command.js.map +1 -0
  13. package/dist/execution/index.d.ts +12 -0
  14. package/dist/execution/index.d.ts.map +1 -0
  15. package/dist/execution/index.js +17 -0
  16. package/dist/execution/index.js.map +1 -0
  17. package/dist/execution/runtime.d.ts +82 -0
  18. package/dist/execution/runtime.d.ts.map +1 -0
  19. package/dist/execution/runtime.js +273 -0
  20. package/dist/execution/runtime.js.map +1 -0
  21. package/dist/execution/types.d.ts +306 -0
  22. package/dist/execution/types.d.ts.map +1 -0
  23. package/dist/execution/types.js +14 -0
  24. package/dist/execution/types.js.map +1 -0
  25. package/dist/execution/validation.d.ts +43 -0
  26. package/dist/execution/validation.d.ts.map +1 -0
  27. package/dist/execution/validation.js +430 -0
  28. package/dist/execution/validation.js.map +1 -0
  29. package/dist/index.d.ts +21 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +49 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/manifest/index.d.ts +7 -0
  34. package/dist/manifest/index.d.ts.map +1 -0
  35. package/dist/manifest/index.js +10 -0
  36. package/dist/manifest/index.js.map +1 -0
  37. package/dist/manifest/loader.d.ts +76 -0
  38. package/dist/manifest/loader.d.ts.map +1 -0
  39. package/dist/manifest/loader.js +146 -0
  40. package/dist/manifest/loader.js.map +1 -0
  41. package/dist/manifest/parser.d.ts +64 -0
  42. package/dist/manifest/parser.d.ts.map +1 -0
  43. package/dist/manifest/parser.js +135 -0
  44. package/dist/manifest/parser.js.map +1 -0
  45. package/dist/manifest/validator.d.ts +95 -0
  46. package/dist/manifest/validator.d.ts.map +1 -0
  47. package/dist/manifest/validator.js +258 -0
  48. package/dist/manifest/validator.js.map +1 -0
  49. package/dist/paths.d.ts +57 -0
  50. package/dist/paths.d.ts.map +1 -0
  51. package/dist/paths.js +93 -0
  52. package/dist/paths.js.map +1 -0
  53. package/dist/registry.d.ts +73 -0
  54. package/dist/registry.d.ts.map +1 -0
  55. package/dist/registry.js +147 -0
  56. package/dist/registry.js.map +1 -0
  57. package/dist/resolver.d.ts +89 -0
  58. package/dist/resolver.d.ts.map +1 -0
  59. package/dist/resolver.js +282 -0
  60. package/dist/resolver.js.map +1 -0
  61. package/dist/types/index.d.ts +6 -0
  62. package/dist/types/index.d.ts.map +1 -0
  63. package/dist/types/index.js +5 -0
  64. package/dist/types/index.js.map +1 -0
  65. package/dist/types/manifest.d.ts +201 -0
  66. package/dist/types/manifest.d.ts.map +1 -0
  67. package/dist/types/manifest.js +13 -0
  68. package/dist/types/manifest.js.map +1 -0
  69. package/dist/types.d.ts +5 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +5 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/utils/fs.d.ts +105 -0
  74. package/dist/utils/fs.d.ts.map +1 -0
  75. package/dist/utils/fs.js +233 -0
  76. package/dist/utils/fs.js.map +1 -0
  77. package/dist/utils/logger.d.ts +112 -0
  78. package/dist/utils/logger.d.ts.map +1 -0
  79. package/dist/utils/logger.js +232 -0
  80. package/dist/utils/logger.js.map +1 -0
  81. package/dist/utils/version.d.ts +62 -0
  82. package/dist/utils/version.d.ts.map +1 -0
  83. package/dist/utils/version.js +259 -0
  84. package/dist/utils/version.js.map +1 -0
  85. package/package.json +2 -2
  86. package/src/config.ts +36 -2
  87. package/src/index.ts +1 -0
  88. package/tests/config.test.ts +190 -1
  89. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @enactprotocol/shared - Version utilities
3
+ *
4
+ * Provides semver parsing, comparison, and range checking.
5
+ */
6
+ export interface ParsedVersion {
7
+ major: number;
8
+ minor: number;
9
+ patch: number;
10
+ prerelease?: string | undefined;
11
+ build?: string | undefined;
12
+ raw: string;
13
+ }
14
+ export interface VersionRange {
15
+ operator: "=" | ">" | ">=" | "<" | "<=" | "^" | "~";
16
+ version: ParsedVersion;
17
+ raw: string;
18
+ }
19
+ /**
20
+ * Parse a semver version string
21
+ * Supports: 1.0.0, 1.0, 1, 1.0.0-alpha, 1.0.0+build, 1.0.0-alpha+build
22
+ */
23
+ export declare function parseVersion(version: string): ParsedVersion | null;
24
+ /**
25
+ * Check if a string is a valid semver version
26
+ */
27
+ export declare function isValidVersion(version: string): boolean;
28
+ /**
29
+ * Compare two version strings
30
+ * @returns -1 if a < b, 0 if a === b, 1 if a > b
31
+ */
32
+ export declare function compareVersions(a: string, b: string): -1 | 0 | 1;
33
+ /**
34
+ * Parse a version range string
35
+ * Supports: =1.0.0, >1.0.0, >=1.0.0, <1.0.0, <=1.0.0, ^1.0.0, ~1.0.0
36
+ */
37
+ export declare function parseRange(range: string): VersionRange | null;
38
+ /**
39
+ * Check if a version satisfies a range
40
+ */
41
+ export declare function satisfiesRange(version: string, range: string): boolean;
42
+ /**
43
+ * Sort versions in ascending order
44
+ */
45
+ export declare function sortVersions(versions: string[]): string[];
46
+ /**
47
+ * Get the highest version from a list
48
+ */
49
+ export declare function getHighestVersion(versions: string[]): string | null;
50
+ /**
51
+ * Increment a version by bump type
52
+ */
53
+ export declare function incrementVersion(version: string, bump: "major" | "minor" | "patch"): string | null;
54
+ /**
55
+ * Coerce a string to a valid semver, filling in missing parts
56
+ */
57
+ export declare function coerceVersion(version: string): string | null;
58
+ /**
59
+ * Format a parsed version back to string
60
+ */
61
+ export declare function formatVersion(version: ParsedVersion): string;
62
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACpD,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA2BlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAgChE;AA0CD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA6B7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAgDtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAOnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAChC,MAAM,GAAG,IAAI,CAYf;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAS5D"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * @enactprotocol/shared - Version utilities
3
+ *
4
+ * Provides semver parsing, comparison, and range checking.
5
+ */
6
+ /**
7
+ * Parse a semver version string
8
+ * Supports: 1.0.0, 1.0, 1, 1.0.0-alpha, 1.0.0+build, 1.0.0-alpha+build
9
+ */
10
+ export function parseVersion(version) {
11
+ const trimmed = version.trim();
12
+ // Remove leading 'v' if present (common in tags)
13
+ const normalized = trimmed.startsWith("v") ? trimmed.slice(1) : trimmed;
14
+ // Full semver regex with prerelease and build metadata
15
+ const semverRegex = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([a-zA-Z0-9.-]+))?(?:\+([a-zA-Z0-9.-]+))?$/;
16
+ const match = normalized.match(semverRegex);
17
+ if (!match) {
18
+ return null;
19
+ }
20
+ const major = Number.parseInt(match[1] ?? "0", 10);
21
+ const minor = Number.parseInt(match[2] ?? "0", 10);
22
+ const patch = Number.parseInt(match[3] ?? "0", 10);
23
+ return {
24
+ major,
25
+ minor,
26
+ patch,
27
+ prerelease: match[4],
28
+ build: match[5],
29
+ raw: trimmed,
30
+ };
31
+ }
32
+ /**
33
+ * Check if a string is a valid semver version
34
+ */
35
+ export function isValidVersion(version) {
36
+ return parseVersion(version) !== null;
37
+ }
38
+ /**
39
+ * Compare two version strings
40
+ * @returns -1 if a < b, 0 if a === b, 1 if a > b
41
+ */
42
+ export function compareVersions(a, b) {
43
+ const parsedA = parseVersion(a);
44
+ const parsedB = parseVersion(b);
45
+ // Invalid versions sort last
46
+ if (!parsedA && !parsedB)
47
+ return 0;
48
+ if (!parsedA)
49
+ return 1;
50
+ if (!parsedB)
51
+ return -1;
52
+ // Compare major.minor.patch
53
+ if (parsedA.major !== parsedB.major) {
54
+ return parsedA.major < parsedB.major ? -1 : 1;
55
+ }
56
+ if (parsedA.minor !== parsedB.minor) {
57
+ return parsedA.minor < parsedB.minor ? -1 : 1;
58
+ }
59
+ if (parsedA.patch !== parsedB.patch) {
60
+ return parsedA.patch < parsedB.patch ? -1 : 1;
61
+ }
62
+ // Prerelease comparison
63
+ // A version without prerelease is greater than one with
64
+ if (!parsedA.prerelease && parsedB.prerelease)
65
+ return 1;
66
+ if (parsedA.prerelease && !parsedB.prerelease)
67
+ return -1;
68
+ // Both have prereleases - compare lexically
69
+ if (parsedA.prerelease && parsedB.prerelease) {
70
+ const prereleaseCompare = comparePrerelease(parsedA.prerelease, parsedB.prerelease);
71
+ if (prereleaseCompare !== 0)
72
+ return prereleaseCompare;
73
+ }
74
+ return 0;
75
+ }
76
+ /**
77
+ * Compare prerelease strings according to semver rules
78
+ */
79
+ function comparePrerelease(a, b) {
80
+ const partsA = a.split(".");
81
+ const partsB = b.split(".");
82
+ for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
83
+ const partA = partsA[i];
84
+ const partB = partsB[i];
85
+ // Shorter prerelease is less than longer
86
+ if (partA === undefined)
87
+ return -1;
88
+ if (partB === undefined)
89
+ return 1;
90
+ const numA = Number.parseInt(partA, 10);
91
+ const numB = Number.parseInt(partB, 10);
92
+ const isNumA = !Number.isNaN(numA) && String(numA) === partA;
93
+ const isNumB = !Number.isNaN(numB) && String(numB) === partB;
94
+ // Numeric identifiers are less than alphanumeric
95
+ if (isNumA && !isNumB)
96
+ return -1;
97
+ if (!isNumA && isNumB)
98
+ return 1;
99
+ // Both numeric - compare as numbers
100
+ if (isNumA && isNumB) {
101
+ if (numA < numB)
102
+ return -1;
103
+ if (numA > numB)
104
+ return 1;
105
+ continue;
106
+ }
107
+ // Both alphanumeric - compare lexically
108
+ if (partA < partB)
109
+ return -1;
110
+ if (partA > partB)
111
+ return 1;
112
+ }
113
+ return 0;
114
+ }
115
+ /**
116
+ * Parse a version range string
117
+ * Supports: =1.0.0, >1.0.0, >=1.0.0, <1.0.0, <=1.0.0, ^1.0.0, ~1.0.0
118
+ */
119
+ export function parseRange(range) {
120
+ const trimmed = range.trim();
121
+ // Match operator at start
122
+ const rangeRegex = /^([=><^~]+)?\s*(.+)$/;
123
+ const match = trimmed.match(rangeRegex);
124
+ if (!match || !match[2]) {
125
+ return null;
126
+ }
127
+ const operator = (match[1] ?? "=");
128
+ const versionStr = match[2];
129
+ // Validate operator
130
+ if (!["=", ">", ">=", "<", "<=", "^", "~"].includes(operator)) {
131
+ return null;
132
+ }
133
+ const version = parseVersion(versionStr);
134
+ if (!version) {
135
+ return null;
136
+ }
137
+ return {
138
+ operator,
139
+ version,
140
+ raw: trimmed,
141
+ };
142
+ }
143
+ /**
144
+ * Check if a version satisfies a range
145
+ */
146
+ export function satisfiesRange(version, range) {
147
+ const parsedVersion = parseVersion(version);
148
+ const parsedRange = parseRange(range);
149
+ if (!parsedVersion || !parsedRange) {
150
+ return false;
151
+ }
152
+ const comparison = compareVersions(version, parsedRange.version.raw);
153
+ switch (parsedRange.operator) {
154
+ case "=":
155
+ return comparison === 0;
156
+ case ">":
157
+ return comparison === 1;
158
+ case ">=":
159
+ return comparison >= 0;
160
+ case "<":
161
+ return comparison === -1;
162
+ case "<=":
163
+ return comparison <= 0;
164
+ case "^":
165
+ // Caret range: compatible changes (same major, >= version)
166
+ // ^1.2.3 := >=1.2.3 <2.0.0
167
+ // ^0.2.3 := >=0.2.3 <0.3.0
168
+ // ^0.0.3 := >=0.0.3 <0.0.4
169
+ if (comparison === -1)
170
+ return false;
171
+ if (parsedRange.version.major === 0) {
172
+ if (parsedRange.version.minor === 0) {
173
+ // ^0.0.x - must be exact patch
174
+ return parsedVersion.patch === parsedRange.version.patch;
175
+ }
176
+ // ^0.x - must be same minor
177
+ return parsedVersion.minor === parsedRange.version.minor;
178
+ }
179
+ // ^x - must be same major
180
+ return parsedVersion.major === parsedRange.version.major;
181
+ case "~":
182
+ // Tilde range: patch-level changes (same major.minor, >= version)
183
+ // ~1.2.3 := >=1.2.3 <1.3.0
184
+ if (comparison === -1)
185
+ return false;
186
+ return (parsedVersion.major === parsedRange.version.major &&
187
+ parsedVersion.minor === parsedRange.version.minor);
188
+ default:
189
+ return false;
190
+ }
191
+ }
192
+ /**
193
+ * Sort versions in ascending order
194
+ */
195
+ export function sortVersions(versions) {
196
+ return [...versions].sort(compareVersions);
197
+ }
198
+ /**
199
+ * Get the highest version from a list
200
+ */
201
+ export function getHighestVersion(versions) {
202
+ const valid = versions.filter(isValidVersion);
203
+ if (valid.length === 0)
204
+ return null;
205
+ const sorted = sortVersions(valid);
206
+ const last = sorted[sorted.length - 1];
207
+ return last ?? null;
208
+ }
209
+ /**
210
+ * Increment a version by bump type
211
+ */
212
+ export function incrementVersion(version, bump) {
213
+ const parsed = parseVersion(version);
214
+ if (!parsed)
215
+ return null;
216
+ switch (bump) {
217
+ case "major":
218
+ return `${parsed.major + 1}.0.0`;
219
+ case "minor":
220
+ return `${parsed.major}.${parsed.minor + 1}.0`;
221
+ case "patch":
222
+ return `${parsed.major}.${parsed.minor}.${parsed.patch + 1}`;
223
+ }
224
+ }
225
+ /**
226
+ * Coerce a string to a valid semver, filling in missing parts
227
+ */
228
+ export function coerceVersion(version) {
229
+ const trimmed = version.trim();
230
+ const normalized = trimmed.startsWith("v") ? trimmed.slice(1) : trimmed;
231
+ // Try parsing as-is first
232
+ const parsed = parseVersion(normalized);
233
+ if (parsed) {
234
+ return `${parsed.major}.${parsed.minor}.${parsed.patch}`;
235
+ }
236
+ // Try extracting numbers
237
+ const numbers = normalized.match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?/);
238
+ if (!numbers) {
239
+ return null;
240
+ }
241
+ const major = Number.parseInt(numbers[1] ?? "0", 10);
242
+ const minor = Number.parseInt(numbers[2] ?? "0", 10);
243
+ const patch = Number.parseInt(numbers[3] ?? "0", 10);
244
+ return `${major}.${minor}.${patch}`;
245
+ }
246
+ /**
247
+ * Format a parsed version back to string
248
+ */
249
+ export function formatVersion(version) {
250
+ let result = `${version.major}.${version.minor}.${version.patch}`;
251
+ if (version.prerelease) {
252
+ result += `-${version.prerelease}`;
253
+ }
254
+ if (version.build) {
255
+ result += `+${version.build}`;
256
+ }
257
+ return result;
258
+ }
259
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enactprotocol/shared",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "Core business logic and utilities for Enact",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,7 +18,7 @@
18
18
  "typecheck": "tsc --noEmit"
19
19
  },
20
20
  "dependencies": {
21
- "@enactprotocol/trust": "2.0.0",
21
+ "@enactprotocol/trust": "2.0.2",
22
22
  "js-yaml": "^4.1.1",
23
23
  "zod": "^4.1.13"
24
24
  },
package/src/config.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
- import { dirname } from "node:path";
7
+ import { dirname, join } from "node:path";
8
8
  import yaml from "js-yaml";
9
9
  import { getConfigPath, getEnactHome } from "./paths";
10
10
 
@@ -95,7 +95,7 @@ export const DEFAULT_CONFIG: EnactConfig = {
95
95
  verbose: false,
96
96
  },
97
97
  registry: {
98
- url: "https://enact.tools",
98
+ url: "https://siikwkfgsmouioodghho.supabase.co/functions/v1",
99
99
  },
100
100
  };
101
101
 
@@ -257,6 +257,40 @@ export function configExists(): boolean {
257
257
  return existsSync(getConfigPath());
258
258
  }
259
259
 
260
+ /**
261
+ * Ensure global setup is complete
262
+ * Creates ~/.enact/ directory structure and default config if they don't exist.
263
+ * This is a non-interactive initialization that runs silently.
264
+ * @returns true if setup was performed, false if already initialized
265
+ */
266
+ export function ensureGlobalSetup(): boolean {
267
+ const enactHome = getEnactHome();
268
+ const configPath = getConfigPath();
269
+ const cacheDir = join(enactHome, "cache");
270
+
271
+ let performedSetup = false;
272
+
273
+ // Ensure ~/.enact/ directory exists
274
+ if (!existsSync(enactHome)) {
275
+ mkdirSync(enactHome, { recursive: true });
276
+ performedSetup = true;
277
+ }
278
+
279
+ // Ensure ~/.enact/cache/ directory exists
280
+ if (!existsSync(cacheDir)) {
281
+ mkdirSync(cacheDir, { recursive: true });
282
+ performedSetup = true;
283
+ }
284
+
285
+ // Create default config if it doesn't exist
286
+ if (!existsSync(configPath)) {
287
+ saveConfig({ ...DEFAULT_CONFIG });
288
+ performedSetup = true;
289
+ }
290
+
291
+ return performedSetup;
292
+ }
293
+
260
294
  // =============================================================================
261
295
  // Local Trust Management
262
296
  // =============================================================================
package/src/index.ts CHANGED
@@ -40,6 +40,7 @@ export {
40
40
  setConfigValue,
41
41
  resetConfig,
42
42
  configExists,
43
+ ensureGlobalSetup,
43
44
  DEFAULT_CONFIG,
44
45
  // Local trust management (new unified API)
45
46
  getTrustedIdentities,
@@ -11,6 +11,7 @@ import {
11
11
  addTrustedIdentity,
12
12
  configExists,
13
13
  emailToProviderIdentity,
14
+ ensureGlobalSetup,
14
15
  getConfigValue,
15
16
  getMinimumAttestations,
16
17
  getTrustPolicy,
@@ -25,6 +26,7 @@ import {
25
26
  saveConfig,
26
27
  setConfigValue,
27
28
  } from "../src/config";
29
+ import { getCacheDir, getConfigPath, getEnactHome } from "../src/paths";
28
30
 
29
31
  // Use a test-specific home directory to avoid affecting real config
30
32
  const TEST_HOME = join(import.meta.dir, "fixtures", "config-test-home");
@@ -64,7 +66,9 @@ describe("configuration manager", () => {
64
66
  expect(DEFAULT_CONFIG.trust?.minimum_attestations).toBe(1);
65
67
  expect(DEFAULT_CONFIG.cache?.maxSizeMb).toBe(1024);
66
68
  expect(DEFAULT_CONFIG.execution?.defaultTimeout).toBe("30s");
67
- expect(DEFAULT_CONFIG.registry?.url).toBe("https://enact.tools");
69
+ expect(DEFAULT_CONFIG.registry?.url).toBe(
70
+ "https://siikwkfgsmouioodghho.supabase.co/functions/v1"
71
+ );
68
72
  });
69
73
  });
70
74
 
@@ -512,4 +516,189 @@ describe("configuration manager", () => {
512
516
  });
513
517
  });
514
518
  });
519
+
520
+ describe("ensureGlobalSetup", () => {
521
+ test("creates ~/.enact/ directory if it doesn't exist", () => {
522
+ const enactHome = getEnactHome();
523
+
524
+ // Clean up first to ensure fresh state
525
+ if (existsSync(enactHome)) {
526
+ rmSync(enactHome, { recursive: true, force: true });
527
+ }
528
+
529
+ // Run setup
530
+ const result = ensureGlobalSetup();
531
+
532
+ // Should have performed setup
533
+ expect(result).toBe(true);
534
+ expect(existsSync(enactHome)).toBe(true);
535
+ });
536
+
537
+ test("creates ~/.enact/cache/ directory", () => {
538
+ const enactHome = getEnactHome();
539
+ const cacheDir = getCacheDir();
540
+
541
+ // Clean up first
542
+ if (existsSync(enactHome)) {
543
+ rmSync(enactHome, { recursive: true, force: true });
544
+ }
545
+
546
+ ensureGlobalSetup();
547
+
548
+ expect(existsSync(cacheDir)).toBe(true);
549
+ });
550
+
551
+ test("creates default config.yaml", () => {
552
+ const enactHome = getEnactHome();
553
+ const configPath = getConfigPath();
554
+
555
+ // Clean up first
556
+ if (existsSync(enactHome)) {
557
+ rmSync(enactHome, { recursive: true, force: true });
558
+ }
559
+
560
+ ensureGlobalSetup();
561
+
562
+ expect(existsSync(configPath)).toBe(true);
563
+
564
+ // Verify config content
565
+ const config = loadConfig();
566
+ expect(config.version).toBe(DEFAULT_CONFIG.version);
567
+ expect(config.trust?.policy).toBe(DEFAULT_CONFIG.trust?.policy);
568
+ expect(config.registry?.url).toBe(DEFAULT_CONFIG.registry?.url);
569
+ });
570
+
571
+ test("returns false if already initialized", () => {
572
+ // First call should perform setup
573
+ ensureGlobalSetup();
574
+
575
+ // Second call should return false (already set up)
576
+ const result = ensureGlobalSetup();
577
+ expect(result).toBe(false);
578
+ });
579
+
580
+ test("is idempotent - multiple calls don't break things", () => {
581
+ // Run setup multiple times
582
+ ensureGlobalSetup();
583
+ ensureGlobalSetup();
584
+ ensureGlobalSetup();
585
+
586
+ // Everything should still work
587
+ expect(configExists()).toBe(true);
588
+ const config = loadConfig();
589
+ expect(config.version).toBeDefined();
590
+ });
591
+
592
+ test("preserves existing config if present", () => {
593
+ const enactHome = getEnactHome();
594
+
595
+ // Clean up first
596
+ if (existsSync(enactHome)) {
597
+ rmSync(enactHome, { recursive: true, force: true });
598
+ }
599
+
600
+ // Create initial config
601
+ ensureGlobalSetup();
602
+
603
+ // Modify the config
604
+ saveConfig({
605
+ ...DEFAULT_CONFIG,
606
+ trust: { policy: "require_attestation", auditors: ["github:test-user"] },
607
+ });
608
+
609
+ // Run setup again
610
+ ensureGlobalSetup();
611
+
612
+ // Config should be preserved
613
+ const config = loadConfig();
614
+ expect(config.trust?.policy).toBe("require_attestation");
615
+ expect(config.trust?.auditors).toContain("github:test-user");
616
+ });
617
+
618
+ test("creates cache directory even if config exists", () => {
619
+ const enactHome = getEnactHome();
620
+ const cacheDir = getCacheDir();
621
+
622
+ // Clean up first
623
+ if (existsSync(enactHome)) {
624
+ rmSync(enactHome, { recursive: true, force: true });
625
+ }
626
+
627
+ // Create only the home and config
628
+ mkdirSync(enactHome, { recursive: true });
629
+ saveConfig({ ...DEFAULT_CONFIG });
630
+
631
+ // Manually remove cache dir if it exists
632
+ if (existsSync(cacheDir)) {
633
+ rmSync(cacheDir, { recursive: true, force: true });
634
+ }
635
+
636
+ // Run setup
637
+ const result = ensureGlobalSetup();
638
+
639
+ // Should have created cache dir
640
+ expect(result).toBe(true);
641
+ expect(existsSync(cacheDir)).toBe(true);
642
+ });
643
+
644
+ test("default config has correct registry URL", () => {
645
+ const enactHome = getEnactHome();
646
+
647
+ // Clean up first
648
+ if (existsSync(enactHome)) {
649
+ rmSync(enactHome, { recursive: true, force: true });
650
+ }
651
+
652
+ ensureGlobalSetup();
653
+
654
+ const config = loadConfig();
655
+ expect(config.registry?.url).toBe("https://siikwkfgsmouioodghho.supabase.co/functions/v1");
656
+ });
657
+
658
+ test("default config has correct trust settings", () => {
659
+ const enactHome = getEnactHome();
660
+
661
+ // Clean up first
662
+ if (existsSync(enactHome)) {
663
+ rmSync(enactHome, { recursive: true, force: true });
664
+ }
665
+
666
+ ensureGlobalSetup();
667
+
668
+ const config = loadConfig();
669
+ expect(config.trust?.policy).toBe("prompt");
670
+ expect(config.trust?.minimum_attestations).toBe(1);
671
+ expect(config.trust?.auditors).toEqual([]);
672
+ });
673
+
674
+ test("default config has correct cache settings", () => {
675
+ const enactHome = getEnactHome();
676
+
677
+ // Clean up first
678
+ if (existsSync(enactHome)) {
679
+ rmSync(enactHome, { recursive: true, force: true });
680
+ }
681
+
682
+ ensureGlobalSetup();
683
+
684
+ const config = loadConfig();
685
+ expect(config.cache?.maxSizeMb).toBe(1024);
686
+ expect(config.cache?.ttlSeconds).toBe(86400 * 7); // 7 days
687
+ });
688
+
689
+ test("default config has correct execution settings", () => {
690
+ const enactHome = getEnactHome();
691
+
692
+ // Clean up first
693
+ if (existsSync(enactHome)) {
694
+ rmSync(enactHome, { recursive: true, force: true });
695
+ }
696
+
697
+ ensureGlobalSetup();
698
+
699
+ const config = loadConfig();
700
+ expect(config.execution?.defaultTimeout).toBe("30s");
701
+ expect(config.execution?.verbose).toBe(false);
702
+ });
703
+ });
515
704
  });