@effect-app/cli 1.26.3 → 1.26.5

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/gist.js CHANGED
@@ -13,6 +13,7 @@ import { RunCommandService } from "./os-command.js";
13
13
  export class GistEntry extends Schema.Class("GistEntry")({
14
14
  description: Schema.String,
15
15
  public: Schema.Boolean,
16
+ company: Schema.String,
16
17
  files: Schema.Array(Schema.String)
17
18
  }) {
18
19
  }
@@ -76,16 +77,26 @@ export class GistEntryDecoded extends GistEntry.transformOrFail("GistEntryDecode
76
77
  }) {
77
78
  }
78
79
  export class GistYAML extends Schema.Class("GistYAML")({
79
- gists: Schema.Record({
80
+ gists: Schema
81
+ .Record({
80
82
  key: Schema.String,
81
83
  value: GistEntryDecoded
82
- }),
84
+ })
85
+ .pipe(Schema.optionalWith({
86
+ default: () => ({}),
87
+ nullable: true,
88
+ exact: true
89
+ })),
83
90
  settings: Schema.Struct({
84
91
  token_env: Schema.String,
85
92
  base_directory: Schema.String
86
93
  })
87
94
  }) {
88
95
  }
96
+ /**
97
+ * Cache entry representing a gist mapping.
98
+ * Each entry contains the gist's human-readable name and GitHub ID.
99
+ */
89
100
  export class GistCacheEntry extends Schema.Class("GistCacheEntry")({
90
101
  name: Schema.String,
91
102
  id: Schema.String
@@ -93,23 +104,27 @@ export class GistCacheEntry extends Schema.Class("GistCacheEntry")({
93
104
  }
94
105
  export const GistCacheEntries = Schema.Array(GistCacheEntry);
95
106
  /**
96
- * Gist cache mapping YAML configuration names to GitHub gist IDs.
107
+ * Gist cache mapping YAML configuration names to GitHub gist IDs with company awareness.
97
108
  *
98
109
  * Since GitHub gists don't have user-defined names, we maintain a cache
99
110
  * that maps the human-readable names from our YAML config to actual gist IDs.
111
+ * Each cache entry is associated with a company, enabling multi-tenant operations.
100
112
  * This allows us to:
101
113
  * - Update existing gists instead of creating duplicates
102
114
  * - Clean up obsolete entries when gists are removed from config
103
115
  * - Persist the name->ID mapping across CLI runs
116
+ * - Isolate gist operations by company context
104
117
  *
105
118
  * The cache itself is stored as a secret GitHub gist for persistence.
106
119
  */
107
120
  export class GistCache {
108
121
  entries;
109
122
  gist_id;
110
- constructor({ entries, gist_id }) {
123
+ company;
124
+ constructor({ company, entries, gist_id }) {
111
125
  this.entries = entries;
112
126
  this.gist_id = gist_id;
127
+ this.company = company;
113
128
  }
114
129
  }
115
130
  //
@@ -118,20 +133,20 @@ export class GistCache {
118
133
  //
119
134
  class GistCacheNotFound extends Data.TaggedError("GistCacheNotFound") {
120
135
  }
136
+ class GistCacheOfCompanyNotFound extends Data.TaggedError("GistCacheOfCompanyNotFound") {
137
+ }
121
138
  class GistYAMLError extends Data.TaggedError("GistYAMLError") {
122
139
  }
123
140
  //
124
141
  //
125
142
  // Services
126
143
  //
144
+ // @effect-diagnostics-next-line missingEffectServiceDependency:off
127
145
  class GHGistService extends Effect.Service()("GHGistService", {
128
146
  dependencies: [RunCommandService.Default],
129
147
  effect: Effect.gen(function* () {
130
148
  const CACHE_GIST_DESCRIPTION = "GIST_CACHE_DO_NOT_EDIT_effa_cli_internal";
131
149
  const { runGetExitCode, runGetString } = yield* RunCommandService;
132
- if ((yield* runGetExitCode("gh --version").pipe(Effect.orDie)) !== 0) {
133
- return yield* Effect.dieMessage("GitHub CLI (gh) is not installed or not found in PATH. Please install it to use the gist command.");
134
- }
135
150
  // the client cannot recover from PlatformErrors, so we convert failures into defects to clean up the signatures
136
151
  const runGetExitCodeSuppressed = (...args) => {
137
152
  return runGetExitCode(...args).pipe(Effect.catchAll((e) => Effect.dieMessage(`Command failed: ${args.join(" ")}\nError: ${e.message}`)), Effect.asVoid);
@@ -150,7 +165,7 @@ class GHGistService extends Effect.Service()("GHGistService", {
150
165
  return gist_id && gist_id.length > 0 ? Option.some(gist_id) : Option.none();
151
166
  }
152
167
  const loadGistCache = Effect
153
- .fn("effa-cli.gist.loadGistCache")(function* () {
168
+ .fn("effa-cli.gist.loadGistCache")(function* (company, { recCache = false, recCacheCompany = false } = { recCache: false, recCacheCompany: false }) {
154
169
  // search for existing cache gist
155
170
  const output = yield* runGetStringSuppressed(`gh gist list --filter "${CACHE_GIST_DESCRIPTION}"`)
156
171
  .pipe(Effect.orElse(() => Effect.succeed("")));
@@ -158,41 +173,56 @@ class GHGistService extends Effect.Service()("GHGistService", {
158
173
  // extract first gist ID (should be our cache gist)
159
174
  const firstLine = lines[0];
160
175
  if (!firstLine) {
161
- return yield* new GistCacheNotFound({ reason: "Empty gist list output" });
176
+ return yield* new GistCacheNotFound({ message: "Empty gist list output" });
162
177
  }
163
178
  const parts = firstLine.split(/\s+/);
164
179
  const gist_id = parts[0]?.trim();
165
180
  if (!gist_id) {
166
- return yield* new GistCacheNotFound({ reason: "No gist ID found in output" });
181
+ if (recCache) {
182
+ return yield* Effect.dieMessage("Failed to create or locate cache gist after creation attempt");
183
+ }
184
+ return yield* new GistCacheNotFound({ message: "No gist ID found in output" });
167
185
  }
168
186
  else {
169
187
  yield* Effect.logInfo(`Found existing cache gist with ID ${gist_id}`);
170
188
  }
171
- // read cache gist content
172
- const cacheContent = yield* runGetStringSuppressed(`gh gist view ${gist_id}`)
173
- .pipe(Effect.orElse(() => Effect.succeed("")));
174
- const entries = yield* pipe(cacheContent.split(CACHE_GIST_DESCRIPTION)[1]?.trim(), pipe(Schema.parseJson(GistCacheEntries), Schema.decodeUnknown), Effect.orElse(() => new GistCacheNotFound({ reason: "Failed to parse cache JSON" })));
175
- return { entries, gist_id };
176
- }, Effect.catchTag("GistCacheNotFound", () => Effect.gen(function* () {
177
- // cache doesn't exist, create it
189
+ // read company-specific cache file
190
+ const filesInCache = yield* runGetStringSuppressed(`gh gist view ${gist_id} --files`).pipe(Effect.map((files) => files
191
+ .trim()
192
+ .split("\n")
193
+ .map((f) => f.trim())));
194
+ if (!filesInCache.includes(`${company}.json`)) {
195
+ if (recCacheCompany) {
196
+ return yield* Effect.dieMessage(`Failed to create or locate cache entry for company ${company} after creation attempt`);
197
+ }
198
+ return yield* new GistCacheOfCompanyNotFound({
199
+ message: `Cache gist not found of company ${company}`,
200
+ cache_gist_id: gist_id
201
+ });
202
+ }
203
+ else {
204
+ const cacheContent = yield* runGetStringSuppressed(`gh gist view ${gist_id} -f "${company}.json"`);
205
+ const entries = yield* pipe(cacheContent, pipe(Schema.parseJson(GistCacheEntries), Schema.decodeUnknown), Effect.orDie);
206
+ return new GistCache({ entries, gist_id, company });
207
+ }
208
+ }, (_, company) => _.pipe(Effect.catchTag("GistCacheNotFound", () => Effect.gen(function* () {
178
209
  yield* Effect.logInfo("Cache gist not found, creating new cache...");
179
- const cacheJson = yield* pipe([], pipe(Schema.parseJson(GistCacheEntries), Schema.encodeUnknown),
180
- // cannot recover from parse errors in any case, better to die here instead of cluttering the signature
181
- Effect.orDie);
182
- const gistUrl = yield* runGetStringSuppressed(`echo '${cacheJson}' | gh gist create --desc="${CACHE_GIST_DESCRIPTION}" -`);
183
- const gist_id = yield* pipe(gistUrl, extractGistIdFromUrl, Option.match({
184
- onNone: () => Effect.dieMessage(`Could not extract cache's gist ID from URL: ${gistUrl}`),
185
- onSome: (id) => Effect.succeed(id).pipe(Effect.tap(Effect.logInfo(`Created new cache gist with ID ${id}`)))
186
- }));
187
- return { entries: [], gist_id };
188
- })), Effect.map(({ entries, gist_id }) => new GistCache({ entries, gist_id })));
210
+ yield* runGetStringSuppressed(`echo "do_not_delete" | gh gist create --desc="${CACHE_GIST_DESCRIPTION}" -f effa-gist.cache -`);
211
+ // retry loading the cache after creating it
212
+ return yield* loadGistCache(company, { recCache: true });
213
+ }))), (_, company) => _.pipe(Effect.catchTag("GistCacheOfCompanyNotFound", (e) => Effect.gen(function* () {
214
+ yield* Effect.logInfo(`Cache for company ${company} not found, creating company-specific cache file...`);
215
+ yield* runGetStringSuppressed(`echo "[]" | gh gist edit ${e.cache_gist_id} -a ${company}.json -`);
216
+ // retry loading the cache after creating it
217
+ return yield* loadGistCache(company, { recCacheCompany: true });
218
+ }))));
189
219
  const saveGistCache = Effect.fn("effa-cli.gist.saveGistCache")(function* (cache) {
190
220
  const cacheJson = yield* pipe(cache.entries, pipe(Schema.parseJson(GistCacheEntries), Schema.encodeUnknown),
191
221
  // cannot recover from parse errors in any case, better to die here instead of cluttering the signature
192
222
  Effect.orDie);
193
- yield* runGetExitCodeSuppressed(`echo '${cacheJson}' | gh gist edit ${cache.gist_id} -`);
223
+ yield* runGetExitCodeSuppressed(`echo '${cacheJson}' | gh gist edit ${cache.gist_id} -f ${cache.company}.json -`);
194
224
  });
195
- const createGistWithFiles = Effect.fn("GHGistService.createGistWithFiles")(function* ({ cache, description, files, gist_name, is_public }) {
225
+ const createGistWithFiles = Effect.fn("GHGistService.createGistWithFiles")(function* ({ description, env, files, gist_name, is_public }) {
196
226
  yield* Effect.logInfo(`Creating gist ${gist_name} with ${files.length} file(s)`);
197
227
  const ghCommand = [
198
228
  "gh",
@@ -200,63 +230,106 @@ class GHGistService extends Effect.Service()("GHGistService", {
200
230
  "create",
201
231
  `--desc="${description}"`,
202
232
  is_public ? "--public" : "",
203
- ...files.map((filePath) => `"${filePath}"`)
233
+ ...files.map((file) => `"${file.path}"`)
204
234
  ]
205
235
  .filter((x) => !!x)
206
236
  .join(" ");
207
237
  // create and capture the created gist URL
208
238
  const gistUrl = yield* runGetStringSuppressed(ghCommand);
209
239
  // extract ID from URL
210
- return yield* pipe(gistUrl, extractGistIdFromUrl, Option.match({
240
+ const gistNameId = yield* pipe(gistUrl, extractGistIdFromUrl, Option.match({
211
241
  onNone: () => Effect.dieMessage(`Failed to extract gist ID from URL: ${gistUrl}`),
212
242
  onSome: (id) => Effect
213
- .succeed(new GistCache({
214
- gist_id: cache.gist_id,
215
- entries: [...cache.entries, { name: gist_name, id }]
216
- }))
243
+ .succeed({ name: gist_name, id })
217
244
  .pipe(Effect.tap(Effect.logInfo(`Created gist with ID ${id}`)))
218
245
  }));
246
+ // rename all files to include environment prefix for multi-environment support
247
+ for (const file of files) {
248
+ const originalName = file.name;
249
+ const name_with_env = `${env}.${originalName}`;
250
+ const ghRenameCommand = [
251
+ "gh",
252
+ "gist",
253
+ "rename",
254
+ gistNameId.id,
255
+ originalName,
256
+ name_with_env
257
+ ]
258
+ .join(" ");
259
+ yield* Effect.logInfo(`Renaming file ${originalName} to ${name_with_env} in gist ${gist_name}`);
260
+ yield* runGetStringSuppressed(ghRenameCommand);
261
+ }
262
+ return gistNameId;
219
263
  });
220
- const getGistFileNames = Effect.fn("getGistFileNames")(function* ({ gist_id, gist_name }) {
264
+ const getGistFileNames = Effect.fn("getGistFileNames")(function* ({ env, gist_id, gist_name }) {
221
265
  yield* Effect.logInfo(`Retrieving file names from gist ${gist_name} with ID ${gist_id}`);
222
266
  const output = yield* runGetStringSuppressed(`gh gist view ${gist_id} --files`);
223
- return output
267
+ // filter file names by environment prefix and remove the prefix
268
+ // files in gists are prefixed with "env." to support multiple environments
269
+ return Array.filterMap(output
224
270
  .trim()
225
- .split("\n")
226
- .filter((line) => line.trim());
271
+ .split("\n"), (fn) => {
272
+ const fnTrimmed = fn.trim();
273
+ if (!fnTrimmed.startsWith(env + ".")) {
274
+ return Option.none();
275
+ }
276
+ return Option.some(fnTrimmed.substring(env.length + 1) // remove env prefix and dot
277
+ );
278
+ });
227
279
  });
228
- const removeFileFromGist = Effect.fn("removeFileFromGist")(function* ({ file_name, gist_id, gist_name }) {
229
- yield* Effect.logInfo(`Removing file ${file_name} from gist ${gist_name}`);
230
- return yield* runGetExitCodeSuppressed(`gh gist edit ${gist_id} --remove "${file_name}"`);
280
+ const removeFileFromGist = Effect.fn("removeFileFromGist")(function* ({ env, file_name, gist_id, gist_name }) {
281
+ const name_with_env = `${env}.${file_name}`;
282
+ yield* Effect.logInfo(`Removing file ${name_with_env} from gist ${gist_name}`);
283
+ return yield* runGetExitCodeSuppressed(`gh gist edit ${gist_id} --remove "${name_with_env}"`);
231
284
  });
232
- const updateFileOfGist = Effect.fn("updateFileOfGist")(function* ({ file_name, file_path, gist_id, gist_name }) {
233
- yield* Effect.logInfo(`Updating file ${file_name} located at ${file_path} of gist ${gist_name}`);
285
+ const updateFileOfGist = Effect.fn("updateFileOfGist")(function* ({ env, file_name, file_path, gist_id, gist_name }) {
286
+ const name_with_env = `${env}.${file_name}`;
287
+ yield* Effect.logInfo(`Updating file ${name_with_env} located at ${file_path} of gist ${gist_name}`);
288
+ // it seems this does not require renaming the file
234
289
  const editCommand = [
235
290
  "gh",
236
291
  "gist",
237
292
  "edit",
238
293
  gist_id,
239
294
  "-f",
240
- file_name,
295
+ name_with_env,
241
296
  `"${file_path}"`
242
297
  ]
243
298
  .join(" ");
244
299
  return yield* runGetExitCodeSuppressed(editCommand);
245
300
  });
246
- const addFileToGist = Effect.fn("addFileToGist")(function* ({ file_path, gist_id, gist_name }) {
247
- yield* Effect.logInfo(`Adding file ${file_path} to gist ${gist_name}`);
301
+ const addFileToGist = Effect.fn("addFileToGist")(function* ({ env, file, gist_id, gist_name }) {
302
+ yield* Effect.logInfo(`Adding file ${file.path} to gist ${gist_name}`);
248
303
  const editCommand = [
249
304
  "gh",
250
305
  "gist",
251
306
  "edit",
252
307
  gist_id,
253
308
  "-a",
254
- `"${file_path}"`
309
+ `"${file.path}"`
255
310
  ]
256
311
  .join(" ");
257
- return yield* runGetExitCodeSuppressed(editCommand);
312
+ yield* runGetExitCodeSuppressed(editCommand);
313
+ const renameCommand = [
314
+ "gh",
315
+ "gist",
316
+ "rename",
317
+ gist_id,
318
+ file.name,
319
+ `${env}.${file.name}`
320
+ ]
321
+ .join(" ");
322
+ yield* Effect.logInfo(`Renaming file ${file.name} to ${env}.${file.name} in gist ${gist_name}`);
323
+ return yield* runGetExitCodeSuppressed(renameCommand);
324
+ });
325
+ const deleteGist = Effect.fn("deleteGist")(function* ({ gist_id, gist_name }) {
326
+ yield* Effect.logInfo(`Deleting gist ${gist_name} with ID ${gist_id}`);
327
+ return yield* runGetExitCodeSuppressed(`gh gist delete ${gist_id}`);
258
328
  });
259
329
  const login = Effect.fn("GHGistService.login")(function* (token) {
330
+ if ((yield* runGetExitCode("gh --version").pipe(Effect.orDie)) !== 0) {
331
+ return yield* Effect.dieMessage("GitHub CLI (gh) is not installed or not found in PATH. Please install it to use the gist command.");
332
+ }
260
333
  const isLogged = yield* runGetExitCode(`echo ${token} | gh auth login --with-token`).pipe(Effect.orDie);
261
334
  if (isLogged !== 0) {
262
335
  return yield* Effect.fail(new Error("Failed to log in to GitHub CLI with provided token"));
@@ -289,51 +362,67 @@ class GHGistService extends Effect.Service()("GHGistService", {
289
362
  */
290
363
  saveGistCache,
291
364
  /**
292
- * Creates a new GitHub gist with the specified files and updates the local cache.
293
- * Generates a GitHub CLI command to create the gist and extracts the resulting gist ID.
365
+ * Creates a new GitHub gist with the specified files and renames them with environment prefixes.
366
+ * Generates a GitHub CLI command to create the gist, extracts the resulting gist ID,
367
+ * and renames all files with environment prefixes for multi-environment support.
294
368
  *
295
- * @param cache - The current GistCache instance
296
- * @param name - The human-readable name for this gist (used in cache mapping)
369
+ * @param gist_name - The human-readable name for this gist (used in cache mapping)
297
370
  * @param description - The description for the GitHub gist
298
- * @param files - Array of file paths to include in the gist
371
+ * @param files - Array of file objects with path and name properties to include in the gist
299
372
  * @param is_public - Whether the gist should be public or private
300
- * @returns An Effect that yields an updated GistCache with the new gist entry
373
+ * @param env - Environment prefix to prepend to file names (e.g., "local-dev", "prod")
374
+ * @returns An Effect that yields a gist entry object with name and id properties
301
375
  */
302
376
  createGistWithFiles,
303
377
  /**
304
- * Retrieves file names from a GitHub gist.
305
- * Fetches the list of files contained in the specified gist.
378
+ * Retrieves file names from a GitHub gist, filtered by environment prefix.
379
+ * Fetches the list of files contained in the specified gist and returns only
380
+ * those that match the current environment, with the environment prefix removed.
306
381
  *
307
382
  * @param gist_id - The GitHub gist ID to retrieve file names from
308
383
  * @param gist_name - The human-readable name of the gist (for logging purposes)
309
- * @returns An Effect that yields an array of file names
384
+ * @param env - Environment prefix to filter files by (e.g., "local-dev", "prod")
385
+ * @returns An Effect that yields an array of file names with environment prefix removed
310
386
  */
311
387
  getGistFileNames,
312
388
  /**
313
389
  * Removes a file from a specified GitHub gist.
390
+ * The file name is automatically prefixed with the environment when removing.
314
391
  * @param gist_id - The ID of the gist to modify
315
392
  * @param gist_name - The human-readable name of the gist (for logging purposes)
316
- * @param file_name - The name of the file to remove from the gist
393
+ * @param file_name - The base name of the file to remove (without environment prefix)
394
+ * @param env - Environment prefix that was used when the file was added
317
395
  * @returns An Effect that succeeds when the file is removed
318
396
  */
319
397
  removeFileFromGist,
320
398
  /**
321
399
  * Updates a file in a specified GitHub gist.
400
+ * The file name is automatically prefixed with the environment when updating.
322
401
  * @param gist_id - The ID of the gist to modify
323
402
  * @param gist_name - The human-readable name of the gist (for logging purposes)
324
- * @param file_name - The name of the file to remove from the gist
403
+ * @param file_name - The base name of the file to update (without environment prefix)
325
404
  * @param file_path - The local path of the file to update in the gist
405
+ * @param env - Environment prefix that was used when the file was added
326
406
  * @returns An Effect that succeeds when the file is updated
327
407
  */
328
408
  updateFileOfGist,
329
409
  /**
330
410
  * Adds a new file to a specified GitHub gist.
411
+ * The file is automatically renamed with an environment prefix for multi-environment support.
331
412
  * @param gist_id - The ID of the gist to modify
332
413
  * @param gist_name - The human-readable name of the gist (for logging purposes)
333
- * @param file_path - The local path of the file to add to the gist
334
- * @returns An Effect that succeeds when the file is added
414
+ * @param file - The file object containing path and name properties
415
+ * @param env - Environment prefix to prepend to the file name
416
+ * @returns An Effect that succeeds when the file is added and renamed
335
417
  */
336
- addFileToGist
418
+ addFileToGist,
419
+ /**
420
+ * Deletes a specified GitHub gist by its ID.
421
+ * @param gist_id - The ID of the gist to delete
422
+ * @param gist_name - The human-readable name of the gist (for logging purposes)
423
+ * @returns An Effect that succeeds when the gist is deleted
424
+ */
425
+ deleteGist
337
426
  };
338
427
  })
339
428
  }) {
@@ -349,30 +438,40 @@ export class GistHandler extends Effect.Service()("GistHandler", {
349
438
  const path = yield* Path.Path;
350
439
  return {
351
440
  handler: Effect.fn("effa-cli.gist.GistHandler")(function* ({ YAMLPath }) {
441
+ // load company and environment from environment variables
442
+ const CONFIG = yield* Effect.all({
443
+ company: Config.string("COMPANY"),
444
+ env: Config.string("ENV").pipe(Config.withDefault("local-dev"))
445
+ });
446
+ yield* Effect.logInfo(`Company: ${CONFIG.company}, ENV: ${CONFIG.env}`);
352
447
  yield* Effect.logInfo(`Reading configuration from ${YAMLPath}`);
353
448
  const configExists = yield* fs.exists(YAMLPath);
354
449
  if (!configExists) {
355
450
  return yield* Effect.fail(new Error(`Configuration file not found: ${YAMLPath}`));
356
451
  }
357
- const config = yield* pipe(YAMLPath, fs.readFileString, Effect.andThen((content) => Effect.try({
452
+ const configFromYaml = yield* pipe(YAMLPath, fs.readFileString, Effect.andThen((content) => Effect.try({
358
453
  try: () => yaml.load(content),
359
454
  catch(error) {
360
- return new GistYAMLError({ reason: `Failed to parse YAML: ${error.message}` });
455
+ return new GistYAMLError({ message: `Failed to parse YAML: ${error.message}` });
361
456
  }
362
457
  })), Effect.andThen(Schema.decodeUnknown(GistYAML)));
363
458
  // load GitHub token securely from environment variable
364
- const redactedToken = yield* Config.redacted(config.settings.token_env);
365
- yield* Effect.logInfo(`Using GitHub token from environment variable: ${config.settings.token_env}`);
459
+ const redactedToken = yield* Config.redacted(configFromYaml.settings.token_env);
460
+ yield* Effect.logInfo(`Using GitHub token from environment variable: ${configFromYaml.settings.token_env}`);
366
461
  yield* Effect.logInfo(`Token loaded: ${redactedToken}`); // this will show <redacted> in logs
367
462
  yield* GH.login(Redacted.value(redactedToken));
368
- const cache = yield* SynchronizedRef.make(yield* GH.loadGistCache());
369
- // handle each gist entry in the configuration
370
- for (const [name, gistConfig] of Object.entries(config.gists)) {
463
+ const cache = yield* SynchronizedRef.make(yield* GH.loadGistCache(CONFIG.company));
464
+ // filter YAML gists by company to ensure isolation between different organizations
465
+ // this prevents cross-company gist operations and maintains data separation
466
+ const thisCompanyGistsFromYaml = Object
467
+ .entries(configFromYaml.gists)
468
+ .filter(([, v]) => v.company === CONFIG.company);
469
+ for (const [name, gistConfig] of thisCompanyGistsFromYaml) {
371
470
  const { description, files_with_name, public: is_public } = gistConfig;
372
471
  yield* Effect.logInfo(`Processing gist ${name}`);
373
472
  const filesOnDiskWithFullPath = yield* Effect
374
473
  .all(files_with_name.map((f) => Effect.gen(function* () {
375
- const fullPath = path.join(config.settings.base_directory, f.path);
474
+ const fullPath = path.join(configFromYaml.settings.base_directory, f.path);
376
475
  const fileExists = yield* fs.exists(fullPath);
377
476
  if (!fileExists) {
378
477
  yield* Effect.logWarning(`File not found: ${fullPath}, skipping...`);
@@ -394,7 +493,8 @@ export class GistHandler extends Effect.Service()("GistHandler", {
394
493
  // get current files in the gist to detect removed files
395
494
  const gistFileNames = new Set(yield* GH.getGistFileNames({
396
495
  gist_id: gistFromCache.id,
397
- gist_name: gistFromCache.name
496
+ gist_name: gistFromCache.name,
497
+ env: CONFIG.env
398
498
  }));
399
499
  const expectedFiles = new Set(filesOnDiskWithFullPath.map(({ name }) => name));
400
500
  // remove files that are no longer in YAML configuration
@@ -403,7 +503,8 @@ export class GistHandler extends Effect.Service()("GistHandler", {
403
503
  yield* GH.removeFileFromGist({
404
504
  gist_id: gistFromCache.id,
405
505
  gist_name: gistFromCache.name,
406
- file_name: gf
506
+ file_name: gf,
507
+ env: CONFIG.env
407
508
  });
408
509
  }
409
510
  }
@@ -414,54 +515,73 @@ export class GistHandler extends Effect.Service()("GistHandler", {
414
515
  gist_id: gistFromCache.id,
415
516
  gist_name: gistFromCache.name,
416
517
  file_name: f.name,
417
- file_path: f.path
518
+ file_path: f.path,
519
+ env: CONFIG.env
418
520
  });
419
521
  }
420
522
  else {
421
523
  yield* GH.addFileToGist({
422
524
  gist_id: gistFromCache.id,
423
525
  gist_name: gistFromCache.name,
424
- file_path: f.path
526
+ file: f,
527
+ env: CONFIG.env
425
528
  });
426
529
  }
427
530
  }
428
531
  }
429
532
  else {
430
533
  if (filesOnDiskWithFullPath.length !== 0) {
431
- yield* SynchronizedRef.getAndUpdateEffect(cache, (cache) => {
432
- return GH.createGistWithFiles({
433
- gist_name: name,
434
- description,
435
- is_public,
436
- cache,
437
- files: filesOnDiskWithFullPath.map((f) => f.path)
534
+ yield* SynchronizedRef.getAndUpdateEffect(cache, Effect.fnUntraced(function* (cache) {
535
+ return new GistCache({
536
+ gist_id: cache.gist_id,
537
+ entries: [
538
+ ...cache.entries,
539
+ {
540
+ ...(yield* GH.createGistWithFiles({
541
+ gist_name: name,
542
+ description,
543
+ is_public,
544
+ files: filesOnDiskWithFullPath,
545
+ env: CONFIG.env
546
+ }))
547
+ }
548
+ ],
549
+ company: cache.company
438
550
  });
439
- });
551
+ }));
440
552
  }
441
553
  else {
442
554
  yield* Effect.logWarning(`No valid files found for gist ${name}, skipping creation...`);
443
555
  }
444
556
  }
445
- // here the local cache has been updated, but not yet saved to GitHub
446
- // we still want to remove gists from cache that are no longer in the configuration
447
- const configGistNames = new Set(Object.entries(config.gists).map(([name]) => name));
448
- const newCache = yield* SynchronizedRef.updateAndGetEffect(cache, Effect.fnUntraced(function* (cache) {
449
- const newEntries = [...cache.entries];
450
- for (let i = newEntries.length - 1; i >= 0; i--) {
451
- const cacheEntry = newEntries[i];
452
- if (cacheEntry && !configGistNames.has(cacheEntry.name)) {
453
- yield* Effect.logInfo(`Obsolete gist ${cacheEntry.name} with ID ${cacheEntry.id}) will be removed from cache`);
454
- newEntries.splice(i, 1);
455
- }
456
- }
457
- return { ...cache, entries: newEntries };
458
- }));
459
- yield* GH.saveGistCache(newCache);
460
- yield* Effect.logInfo("Gist operations completed");
461
557
  }
558
+ // cache cleanup: remove gists that are no longer in YAML configuration
559
+ // only affects entries for the current company to maintain isolation
560
+ const configGistNames = new Set(thisCompanyGistsFromYaml
561
+ .map(([name]) => name));
562
+ const newCache = yield* SynchronizedRef.updateAndGetEffect(cache, Effect.fnUntraced(function* (cache) {
563
+ const newEntries = [...cache.entries];
564
+ // remove obsolete cache entries for current company only
565
+ // this ensures gists from other companies remain untouched
566
+ for (let i = newEntries.length - 1; i >= 0; i--) {
567
+ const cacheEntry = newEntries[i];
568
+ if (cacheEntry && !configGistNames.has(cacheEntry.name)) {
569
+ // delete the actual gist from GitHub
570
+ yield* GH.deleteGist({
571
+ gist_id: cacheEntry.id,
572
+ gist_name: cacheEntry.name
573
+ });
574
+ yield* Effect.logInfo(`Obsolete gist ${cacheEntry.name} of company ${CONFIG.company} with ID ${cacheEntry.id}) will be removed from cache`);
575
+ newEntries.splice(i, 1);
576
+ }
577
+ }
578
+ return { ...cache, entries: newEntries };
579
+ }));
580
+ yield* GH.saveGistCache(newCache);
581
+ yield* Effect.logInfo("Gist operations completed");
462
582
  })
463
583
  };
464
584
  })
465
585
  }) {
466
586
  }
467
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9naXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxxQ0FBcUM7QUFDckMsOENBQThDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFbkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUVsSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQTtBQUMvQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFbkQsRUFBRTtBQUNGLEVBQUU7QUFDRixVQUFVO0FBQ1YsRUFBRTtBQUVGLE1BQU0sT0FBTyxTQUFVLFNBQVEsTUFBTSxDQUFDLEtBQUssQ0FBWSxXQUFXLENBQUMsQ0FBQztJQUNsRSxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU07SUFDMUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPO0lBQ3RCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Q0FDbkMsQ0FBQztDQUFHO0FBRUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFNBQVMsQ0FBQyxlQUFlLENBQW1CLGtCQUFrQixDQUFDLENBQUM7SUFDcEcsZUFBZSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMxQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDbkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNO0tBQ3BCLENBQUMsQ0FBQztDQUNK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
587
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9naXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxxQ0FBcUM7QUFDckMsOENBQThDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFbkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUVsSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQTtBQUMvQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFbkQsRUFBRTtBQUNGLEVBQUU7QUFDRixVQUFVO0FBQ1YsRUFBRTtBQUVGLE1BQU0sT0FBTyxTQUFVLFNBQVEsTUFBTSxDQUFDLEtBQUssQ0FBWSxXQUFXLENBQUMsQ0FBQztJQUNsRSxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU07SUFDMUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPO0lBQ3RCLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTTtJQUN0QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0NBQ25DLENBQUM7Q0FBRztBQUVMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTLENBQUMsZUFBZSxDQUFtQixrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BHLGVBQWUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDMUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ25CLElBQUksRUFBRSxNQUFN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