@ai-outfitter/outfitter 1.0.3 → 1.1.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.
Files changed (47) hide show
  1. package/code/enterprise/cli/privateCatalogGate.cjs +3 -3
  2. package/dist/cli/OutfitterCli.js +2 -0
  3. package/dist/cli/OutfitterCli.js.map +1 -1
  4. package/dist/cli/commands/DumpCommand.js +8 -3
  5. package/dist/cli/commands/DumpCommand.js.map +1 -1
  6. package/dist/cli/commands/ListCommand.js +4 -3
  7. package/dist/cli/commands/ListCommand.js.map +1 -1
  8. package/dist/cli/commands/PiRuntimeLaunch.js +3 -16
  9. package/dist/cli/commands/PiRuntimeLaunch.js.map +1 -1
  10. package/dist/cli/commands/RunAgentCommand.js +1 -0
  11. package/dist/cli/commands/RunAgentCommand.js.map +1 -1
  12. package/dist/cli/commands/SetupCommand.d.ts +1 -1
  13. package/dist/cli/commands/SetupCommand.js +6 -13
  14. package/dist/cli/commands/SetupCommand.js.map +1 -1
  15. package/dist/cli/commands/SyncCommand.d.ts +31 -0
  16. package/dist/cli/commands/SyncCommand.js +162 -0
  17. package/dist/cli/commands/SyncCommand.js.map +1 -0
  18. package/dist/cli/commands/ValidateCommand.js +4 -2
  19. package/dist/cli/commands/ValidateCommand.js.map +1 -1
  20. package/dist/paths/RepositoryAssets.d.ts +4 -0
  21. package/dist/paths/RepositoryAssets.js +26 -0
  22. package/dist/paths/RepositoryAssets.js.map +1 -0
  23. package/dist/resolver/Layer.d.ts +17 -1
  24. package/dist/resolver/Layer.js +23 -15
  25. package/dist/resolver/Layer.js.map +1 -1
  26. package/dist/resolver/ResolverContext.d.ts +2 -0
  27. package/dist/resolver/ResolverContext.js +7 -2
  28. package/dist/resolver/ResolverContext.js.map +1 -1
  29. package/dist/settings/SettingsLoader.d.ts +12 -3
  30. package/dist/settings/SettingsLoader.js +25 -11
  31. package/dist/settings/SettingsLoader.js.map +1 -1
  32. package/dist/setup/DefaultCatalog.d.ts +2 -1
  33. package/dist/setup/DefaultCatalog.js +25 -50
  34. package/dist/setup/DefaultCatalog.js.map +1 -1
  35. package/dist/sources/GitRepository.d.ts +28 -0
  36. package/dist/sources/GitRepository.js +139 -0
  37. package/dist/sources/GitRepository.js.map +1 -0
  38. package/dist/sources/PrivateCatalogGate.d.ts +27 -0
  39. package/dist/sources/PrivateCatalogGate.js +23 -0
  40. package/dist/sources/PrivateCatalogGate.js.map +1 -0
  41. package/dist/sources/SourceCache.d.ts +11 -1
  42. package/dist/sources/SourceCache.js +11 -2
  43. package/dist/sources/SourceCache.js.map +1 -1
  44. package/docs/documentation/catalogs.md +10 -2
  45. package/docs/documentation/cli.md +11 -3
  46. package/docs/documentation/settings.md +4 -2
  47. package/package.json +1 -1
@@ -1,3 +1,4 @@
1
+ import type { RemoteSourceReference } from '../sources/SourceCache.js';
1
2
  import type { Settings } from '../settings/Settings.js';
2
3
  import type { Layer } from './Resource.js';
3
4
  export interface LayerDiscoveryInput {
@@ -5,8 +6,23 @@ export interface LayerDiscoveryInput {
5
6
  readonly projectDirectory: string;
6
7
  readonly settings: Settings;
7
8
  }
9
+ /**
10
+ * Maps an already-materialized repository checkout to the layer `outfitter run` would resolve from
11
+ * it. `outfitter sync` reuses this against its temporary checkout so both agree on the payload root.
12
+ */
13
+ export declare const remoteSourceLayer: (repositoryPath: string, source: RemoteSourceReference) => Layer;
14
+ export interface LayerDiscoveryResult {
15
+ readonly layers: readonly Layer[];
16
+ /**
17
+ * Configured remote sources whose cache is absent, reported with `outfitter sync` guidance rather
18
+ * than silently dropped (OFTR-004.2.18). Reported, never fatal: a private catalog the enterprise
19
+ * gate skips is never cached, so `outfitter sync` skips it again and exits 0 — aborting here
20
+ * would deadlock every other command behind advice the user cannot act on (OFTR-004.2.15).
21
+ */
22
+ readonly unsynchronized: readonly string[];
23
+ }
8
24
  /**
9
25
  * Orders layers highest precedence first: workspace `.agents`, then global `~/.agents`,
10
26
  * then configured sources in order. Only layers whose root exists on disk are included.
11
27
  */
12
- export declare const discoverLayers: (input: LayerDiscoveryInput) => readonly Layer[];
28
+ export declare const discoverLayers: (input: LayerDiscoveryInput) => LayerDiscoveryResult;
@@ -1,20 +1,20 @@
1
1
  // Builds the ordered `.agents` layer stack (workspace over global over remote sources) from settings.
2
2
  import { existsSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
- import { encodeRemoteSource, resolveRemoteRepositorySubpath } from '../sources/SourceCache.js';
4
+ import { createRemoteRepositoryCachePath, formatRemoteSourceDisplay, isRemoteSource, resolveRemoteRepositorySubpath, } from '../sources/SourceCache.js';
5
5
  const agentsRoot = (directory) => join(directory, '.agents');
6
- // Remote sources cache under the configured cache_directory, defaulting to ~/.agents/cache.
7
- const cacheRoot = (input) => input.settings.cacheDirectory ?? join(input.homeDirectory, '.agents', 'cache');
8
- const sourceLayer = (input, source) => {
9
- if (source.path !== undefined && source.uri === undefined && source.github === undefined) {
10
- return { root: source.path, origin: 'source', label: source.path };
11
- }
12
- const remote = source;
13
- const repositoryPath = join(cacheRoot(input), 'repos', encodeRemoteSource(remote));
14
- const root = source.path === undefined ? repositoryPath : resolveRemoteRepositorySubpath(repositoryPath, source.path);
15
- const label = remote.uri ?? `github:${remote.github}`;
16
- return { root, origin: 'source', label };
17
- };
6
+ /**
7
+ * Maps an already-materialized repository checkout to the layer `outfitter run` would resolve from
8
+ * it. `outfitter sync` reuses this against its temporary checkout so both agree on the payload root.
9
+ */
10
+ export const remoteSourceLayer = (repositoryPath, source) => ({
11
+ root: source.path === undefined ? repositoryPath : resolveRemoteRepositorySubpath(repositoryPath, source.path),
12
+ origin: 'source',
13
+ label: formatRemoteSourceDisplay(source),
14
+ });
15
+ const sourceLayer = (input, source) => isRemoteSource(source)
16
+ ? remoteSourceLayer(createRemoteRepositoryCachePath(input.homeDirectory, source, input.settings.cacheDirectory), source)
17
+ : { root: source.path, origin: 'source', label: source.path };
18
18
  /**
19
19
  * Orders layers highest precedence first: workspace `.agents`, then global `~/.agents`,
20
20
  * then configured sources in order. Only layers whose root exists on disk are included.
@@ -23,8 +23,16 @@ export const discoverLayers = (input) => {
23
23
  const candidates = [
24
24
  { root: agentsRoot(input.projectDirectory), origin: 'workspace', label: 'workspace' },
25
25
  { root: agentsRoot(input.homeDirectory), origin: 'global', label: 'global' },
26
- ...(input.settings.sources ?? []).map((source) => sourceLayer(input, source)),
27
26
  ];
28
- return candidates.filter((layer) => existsSync(layer.root));
27
+ const unsynchronized = [];
28
+ for (const source of input.settings.sources ?? []) {
29
+ const layer = sourceLayer(input, source);
30
+ if (isRemoteSource(source) && !existsSync(layer.root)) {
31
+ unsynchronized.push(`Configured remote source '${layer.label}' is not synchronized at '${layer.root}'. Run 'outfitter sync' to fetch it.`);
32
+ continue;
33
+ }
34
+ candidates.push(layer);
35
+ }
36
+ return { layers: candidates.filter((layer) => existsSync(layer.root)), unsynchronized };
29
37
  };
30
38
  //# sourceMappingURL=Layer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Layer.js","sourceRoot":"","sources":["../../src/resolver/Layer.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAU/F,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAE7E,4FAA4F;AAC5F,MAAM,SAAS,GAAG,CAAC,KAA0B,EAAU,EAAE,CACvD,KAAK,CAAC,QAAQ,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAEjF,MAAM,WAAW,GAAG,CAAC,KAA0B,EAAE,MAAuB,EAAS,EAAE;IACjF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzF,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,MAAoF,CAAC;IACpG,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,MAAe,CAAC,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,8BAA8B,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACtH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC;IAEtD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAA0B,EAAoB,EAAE;IAC7E,MAAM,UAAU,GAAY;QAC1B,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;QACrF,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC5E,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;KAC9E,CAAC;IAEF,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC,CAAC"}
1
+ {"version":3,"file":"Layer.js","sourceRoot":"","sources":["../../src/resolver/Layer.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,cAAc,EACd,8BAA8B,GAC/B,MAAM,2BAA2B,CAAC;AAWnC,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAE7E;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,cAAsB,EAAE,MAA6B,EAAS,EAAE,CAAC,CAAC;IAClG,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,8BAA8B,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC;IAC9G,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,yBAAyB,CAAC,MAAM,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,KAA0B,EAAE,MAAuB,EAAS,EAAE,CACjF,cAAc,CAAC,MAAM,CAAC;IACpB,CAAC,CAAC,iBAAiB,CACf,+BAA+B,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAC3F,MAAM,CACP;IACH,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAalE;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAA0B,EAAwB,EAAE;IACjF,MAAM,UAAU,GAAY;QAC1B,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;QACrF,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;KAC7E,CAAC;IACF,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,cAAc,CAAC,IAAI,CACjB,6BAA6B,KAAK,CAAC,KAAK,6BAA6B,KAAK,CAAC,IAAI,sCAAsC,CACtH,CAAC;YACF,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;AAC1F,CAAC,CAAC"}
@@ -10,6 +10,8 @@ export interface ResolveResult {
10
10
  /** The merged settings loaded during resolution, so callers need not reload them. */
11
11
  readonly settings: Settings;
12
12
  readonly settingsIssues: readonly SettingsLoadIssue[];
13
+ /** Non-fatal `outfitter sync` guidance for configured remote sources with no cache. */
14
+ readonly warnings: readonly string[];
13
15
  }
14
16
  /** The single shared resolution path used by list, validate, run, and dump. */
15
17
  export declare const resolveEffectiveSet: (input: ResolveInput) => ResolveResult;
@@ -5,7 +5,12 @@ import { resolveResources } from './Resolver.js';
5
5
  /** The single shared resolution path used by list, validate, run, and dump. */
6
6
  export const resolveEffectiveSet = (input) => {
7
7
  const loadedSettings = loadSettingsWithCachedRemoteSettings(input);
8
- const layers = discoverLayers({ ...input, settings: loadedSettings.settings });
9
- return { set: resolveResources(layers), settings: loadedSettings.settings, settingsIssues: loadedSettings.issues };
8
+ const discovered = discoverLayers({ ...input, settings: loadedSettings.settings });
9
+ return {
10
+ set: resolveResources(discovered.layers),
11
+ settings: loadedSettings.settings,
12
+ settingsIssues: loadedSettings.issues,
13
+ warnings: discovered.unsynchronized,
14
+ };
10
15
  };
11
16
  //# sourceMappingURL=ResolverContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResolverContext.js","sourceRoot":"","sources":["../../src/resolver/ResolverContext.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,EAAE,oCAAoC,EAAE,MAAM,+BAA+B,CAAC;AAGrF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAcjD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAmB,EAAiB,EAAE;IACxE,MAAM,cAAc,GAAG,oCAAoC,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE/E,OAAO,EAAE,GAAG,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC;AACrH,CAAC,CAAC"}
1
+ {"version":3,"file":"ResolverContext.js","sourceRoot":"","sources":["../../src/resolver/ResolverContext.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,EAAE,oCAAoC,EAAE,MAAM,+BAA+B,CAAC;AAGrF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAgBjD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAmB,EAAiB,EAAE;IACxE,MAAM,cAAc,GAAG,oCAAoC,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEnF,OAAO;QACL,GAAG,EAAE,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC;QACxC,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,cAAc,EAAE,cAAc,CAAC,MAAM;QACrC,QAAQ,EAAE,UAAU,CAAC,cAAc;KACpC,CAAC;AACJ,CAAC,CAAC"}
@@ -26,9 +26,18 @@ export interface SettingsDiscoveryInput {
26
26
  readonly projectDirectory: string;
27
27
  }
28
28
  export declare const createSettingsLoadPlan: (locations: readonly SettingsLocation[]) => SettingsLoadPlan;
29
+ /** The one rendering of a settings issue every command reports. */
30
+ export declare const formatSettingsIssue: (issue: SettingsLoadIssue) => string;
29
31
  export declare const discoverSettingsLoadPlan: (input: SettingsDiscoveryInput) => SettingsLoadPlan;
30
- export declare const discoverRemoteSettingsLoadPlan: (homeDirectory: string, remoteSettings: readonly RemoteSettingsReference[]) => SettingsLoadPlan;
31
- export declare const resolveCachedRemoteSettingsPath: (homeDirectory: string, source: RemoteSettingsReference) => string;
32
+ export declare const discoverRemoteSettingsLoadPlan: (homeDirectory: string, remoteSettings: readonly RemoteSettingsReference[], cacheDirectory?: string) => SettingsLoadPlan;
33
+ export declare const resolveCachedRemoteSettingsPath: (homeDirectory: string, source: RemoteSettingsReference, cacheDirectory?: string) => string;
34
+ export declare const resolveRemoteSettingsPath: (repositoryPath: string, path: string) => string;
32
35
  export declare const loadSettingsFiles: (plan: SettingsLoadPlan) => SettingsLoadResult;
33
36
  export declare const loadSettings: (plan: SettingsLoadPlan) => LoadedSettings;
34
- export declare const loadSettingsWithCachedRemoteSettings: (input: SettingsDiscoveryInput, remoteSettingsReferencesOverride?: readonly RemoteSettingsReference[]) => LoadedSettings;
37
+ export interface CachedRemoteSettingsOptions {
38
+ /** Remote settings to fold in instead of the ones the local settings declare. */
39
+ readonly remoteSettingsReferences?: readonly RemoteSettingsReference[];
40
+ /** An already-loaded local stack, so callers that just read it do not parse every file twice. */
41
+ readonly localSettings?: LoadedSettings;
42
+ }
43
+ export declare const loadSettingsWithCachedRemoteSettings: (input: SettingsDiscoveryInput, options?: CachedRemoteSettingsOptions) => LoadedSettings;
@@ -8,6 +8,8 @@ import { mergeSettingsStack } from './SettingsMerger.js';
8
8
  export const createSettingsLoadPlan = (locations) => ({
9
9
  locations,
10
10
  });
11
+ /** The one rendering of a settings issue every command reports. */
12
+ export const formatSettingsIssue = (issue) => `${issue.filePath}#${issue.path} ${issue.message}`;
11
13
  const agentsSettings = (directory, ...rest) => join(directory, '.agents', ...rest);
12
14
  // Ordered lowest-to-highest precedence so later files fold over earlier ones during merge.
13
15
  export const discoverSettingsLoadPlan = (input) => createSettingsLoadPlan([
@@ -16,11 +18,14 @@ export const discoverSettingsLoadPlan = (input) => createSettingsLoadPlan([
16
18
  { scope: 'project', path: agentsSettings(input.projectDirectory, 'settings.yml') },
17
19
  { scope: 'project-local', path: agentsSettings(input.projectDirectory, 'settings.local.yml') },
18
20
  ]);
19
- export const discoverRemoteSettingsLoadPlan = (homeDirectory, remoteSettings) => discoverRemoteSettingsLocations(homeDirectory, remoteSettings).plan;
20
- export const resolveCachedRemoteSettingsPath = (homeDirectory, source) => {
21
- const repositoryPath = createRemoteRepositoryCachePath(homeDirectory, source);
22
- const configuredPath = resolveRemoteRepositorySubpath(repositoryPath, source.path);
23
- if (existsSync(configuredPath) || source.path !== 'settings.yml') {
21
+ export const discoverRemoteSettingsLoadPlan = (homeDirectory, remoteSettings, cacheDirectory) => discoverRemoteSettingsLocations(homeDirectory, remoteSettings, cacheDirectory).plan;
22
+ export const resolveCachedRemoteSettingsPath = (homeDirectory, source, cacheDirectory) => {
23
+ const repositoryPath = createRemoteRepositoryCachePath(homeDirectory, source, cacheDirectory);
24
+ return resolveRemoteSettingsPath(repositoryPath, source.path);
25
+ };
26
+ export const resolveRemoteSettingsPath = (repositoryPath, path) => {
27
+ const configuredPath = resolveRemoteRepositorySubpath(repositoryPath, path);
28
+ if (existsSync(configuredPath) || path !== 'settings.yml') {
24
29
  return configuredPath;
25
30
  }
26
31
  const nestedAgentsSettingsPath = resolveRemoteRepositorySubpath(repositoryPath, '.agents/settings.yml');
@@ -43,13 +48,13 @@ export const loadSettings = (plan) => {
43
48
  settings: mergeSettingsStack(result.files.map((file) => file.settings)),
44
49
  };
45
50
  };
46
- export const loadSettingsWithCachedRemoteSettings = (input, remoteSettingsReferencesOverride) => {
47
- const localSettings = loadSettings(discoverSettingsLoadPlan(input));
48
- const remoteSettingsReferences = remoteSettingsReferencesOverride ?? localSettings.settings.remoteSettings;
51
+ export const loadSettingsWithCachedRemoteSettings = (input, options = {}) => {
52
+ const localSettings = options.localSettings ?? loadSettings(discoverSettingsLoadPlan(input));
53
+ const remoteSettingsReferences = options.remoteSettingsReferences ?? localSettings.settings.remoteSettings;
49
54
  if (localSettings.issues.length > 0 || remoteSettingsReferences.length === 0) {
50
55
  return localSettings;
51
56
  }
52
- const remoteSettingsLocations = discoverRemoteSettingsLocations(input.homeDirectory, remoteSettingsReferences);
57
+ const remoteSettingsLocations = discoverRemoteSettingsLocations(input.homeDirectory, remoteSettingsReferences, localSettings.settings.cacheDirectory);
53
58
  const remoteSettings = loadSettings(remoteSettingsLocations.plan);
54
59
  const files = [...remoteSettings.files, ...localSettings.files];
55
60
  const issues = [...remoteSettingsLocations.issues, ...remoteSettings.issues, ...localSettings.issues];
@@ -59,14 +64,23 @@ export const loadSettingsWithCachedRemoteSettings = (input, remoteSettingsRefere
59
64
  settings: mergeSettingsStack(files.map((file) => file.settings)),
60
65
  };
61
66
  };
62
- const discoverRemoteSettingsLocations = (homeDirectory, remoteSettings) => {
67
+ const discoverRemoteSettingsLocations = (homeDirectory, remoteSettings, cacheDirectory) => {
63
68
  const locations = [];
64
69
  const issues = [];
65
70
  for (const [index, source] of remoteSettings.entries()) {
66
71
  try {
72
+ const path = resolveCachedRemoteSettingsPath(homeDirectory, source, cacheDirectory);
73
+ if (!existsSync(path)) {
74
+ issues.push({
75
+ filePath: `remote_settings[${index}]`,
76
+ path: `/remote_settings/${index}`,
77
+ message: `Cached remote settings '${path}' are missing. Run 'outfitter sync' to fetch configured remote settings.`,
78
+ });
79
+ continue;
80
+ }
67
81
  locations.push({
68
82
  scope: 'remote',
69
- path: resolveCachedRemoteSettingsPath(homeDirectory, source),
83
+ path,
70
84
  });
71
85
  }
72
86
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsLoader.js","sourceRoot":"","sources":["../../src/settings/SettingsLoader.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/D,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAE5G,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAQlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAoEzD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAsC,EAAoB,EAAE,CAAC,CAAC;IACnG,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAE,GAAG,IAAc,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;AAE7G,2FAA2F;AAC3F,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAA6B,EAAoB,EAAE,CAC1F,sBAAsB,CAAC;IACrB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE;IAC5E,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,aAAa,EAAE,oBAAoB,CAAC,EAAE;IACxF,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,gBAAgB,EAAE,cAAc,CAAC,EAAE;IAClF,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,EAAE;CAC/F,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,aAAqB,EACrB,cAAkD,EAChC,EAAE,CAAC,+BAA+B,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC;AAE3F,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,aAAqB,EAAE,MAA+B,EAAU,EAAE;IAChH,MAAM,cAAc,GAAG,+BAA+B,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC9E,MAAM,cAAc,GAAG,8BAA8B,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAEnF,IAAI,UAAU,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACjE,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,wBAAwB,GAAG,8BAA8B,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;IACxG,OAAO,UAAU,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,cAAc,CAAC;AAC1F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAsB,EAAsB,EAAE;IAC9E,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAsB,EAAkB,EAAE;IACrE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAEvC,OAAO;QACL,GAAG,MAAM;QACT,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACxE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAClD,KAA6B,EAC7B,gCAAqE,EACrD,EAAE;IAClB,MAAM,aAAa,GAAG,YAAY,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpE,MAAM,wBAAwB,GAAG,gCAAgC,IAAI,aAAa,CAAC,QAAQ,CAAC,cAAe,CAAC;IAE5G,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,wBAAwB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7E,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,uBAAuB,GAAG,+BAA+B,CAAC,KAAK,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC;IAC/G,MAAM,cAAc,GAAG,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtG,OAAO;QACL,KAAK;QACL,MAAM;QACN,QAAQ,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACjE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,+BAA+B,GAAG,CACtC,aAAqB,EACrB,cAAkD,EACjB,EAAE;IACnC,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC;gBACb,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,+BAA+B,CAAC,aAAa,EAAE,MAAM,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,mBAAmB,KAAK,GAAG;gBACrC,IAAI,EAAE,oBAAoB,KAAK,OAAO;gBACtC,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC;aAC9C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/D,6EAA6E;IAC7E,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC,CAAC;AAOF,MAAM,eAAe,GAAG,CACtB,QAA0B,EAC1B,KAA2B,EAC3B,MAA2B,EACrB,EAAE;IACR,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAErF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjG,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE/D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1F,OAAO;IACT,CAAC;IAED,KAAK,CAAC,IAAI,CAAC;QACT,QAAQ;QACR,QAAQ,EAAE,uBAAuB,CAAC,MAAM,CAAC,QAA4B,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;KAC/G,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,8FAA8F;AAC9F,4FAA4F;AAC5F,MAAM,WAAW,GAAG,CAAC,KAAgC,EAAW,EAAE,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,YAAY,CAAC;AAE9G,MAAM,uBAAuB,GAAG,CAC9B,QAA0B,EAC1B,iBAAyB,EACzB,KAAgC,EACtB,EAAE,CAAC,CAAC;IACd,YAAY,EAAE,QAAQ,CAAC,aAAa;IACpC,cAAc,EAAE,QAAQ,CAAC,eAAe;IACxC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpF,cAAc,EAAE,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,2BAA2B,CAAC;IAC1E,cAAc,EACZ,QAAQ,CAAC,eAAe,KAAK,SAAS;QACpC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,sBAAsB,CAAC,QAAQ,CAAC,eAAe,EAAE,iBAAiB,CAAC;IACzE,gBAAgB,EAAE,QAAQ,CAAC,iBAAiB;IAC5C,cAAc,EAAE,QAAQ,CAAC,eAAe;IACxC,OAAO,EAAE,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC;IACjD,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;CAC5F,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,OAA4C,EAAuB,EAAE,CACnG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAEtE,MAAM,yBAAyB,GAAG,CAAC,UAAkD,EAA0B,EAAE,CAC/G,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,CAAC,gBAAgB,EAAE,CAAC;AAE1F,MAAM,2BAA2B,GAAG,CAAC,MAA8B,EAA2B,EAAE;IAC9F,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,MAAsB,EAAE,iBAAyB,EAAmB,EAAE;IAC3F,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,MAAM,CAAC,IAAK,EAAE,iBAAiB,CAAC,EAAE,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,cAAsB,EAAE,iBAAyB,EAAU,EAAE;IAC3F,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AACpD,CAAC,CAAC"}
1
+ {"version":3,"file":"SettingsLoader.js","sourceRoot":"","sources":["../../src/settings/SettingsLoader.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export declare const defaultCatalogSource: {
5
5
  };
6
6
  export interface PinnedCatalogBootstrapInput {
7
7
  readonly homeDirectory: string;
8
+ readonly cacheDirectory?: string;
8
9
  readonly source: RemoteSourceReference & {
9
10
  readonly ref: string;
10
11
  };
@@ -17,4 +18,4 @@ export interface PinnedCatalogBootstrapResult {
17
18
  }
18
19
  /** Fetches one immutable catalog revision into the same cache path used by normal source resolution. */
19
20
  export declare const bootstrapPinnedCatalog: (input: PinnedCatalogBootstrapInput) => PinnedCatalogBootstrapResult;
20
- export declare const bootstrapDefaultCatalog: (homeDirectory: string) => PinnedCatalogBootstrapResult;
21
+ export declare const bootstrapDefaultCatalog: (homeDirectory: string, cacheDirectory?: string) => PinnedCatalogBootstrapResult;
@@ -1,25 +1,14 @@
1
1
  // Bootstraps the one canonical default catalog at the immutable revision shipped by Outfitter.
2
- import { execFileSync } from 'node:child_process';
3
- import { existsSync, mkdirSync, renameSync, rmSync } from 'node:fs';
4
- import { dirname, join } from 'node:path';
5
- import { createRemoteRepositoryCachePath, normalizeGitUri, normalizeRemoteSourceUri } from '../sources/SourceCache.js';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { runGit, syncRemoteRepositoryAtomically, tryReadCleanHead } from '../sources/GitRepository.js';
5
+ import { createRemoteRepositoryCachePath, redactEmbeddedSourceCredentials } from '../sources/SourceCache.js';
6
6
  export const defaultCatalogSource = {
7
7
  github: 'ai-outfitter/default-profiles',
8
8
  // TODO(release-automation): when default-profiles publishes a new Release Please tag, open a
9
9
  // conventional dependency-bump commit in Outfitter so its next Release Please release ships it.
10
10
  ref: 'v1.0.0',
11
11
  };
12
- const runGit = (arguments_) => {
13
- try {
14
- return execFileSync('git', [...arguments_], {
15
- encoding: 'utf8',
16
- stdio: ['ignore', 'pipe', 'pipe'],
17
- }).trim();
18
- }
19
- catch (error) {
20
- throw new Error(`git ${arguments_.join(' ')} failed: ${String(error)}`, { cause: error });
21
- }
22
- };
23
12
  const fullCommitPattern = /^[a-f0-9]{40}$/u;
24
13
  const versionTagPattern = /^v\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u;
25
14
  const assertImmutableRef = (ref) => {
@@ -32,8 +21,7 @@ const isPinnedCatalogCheckout = (root, ref) => {
32
21
  if (!existsSync(join(root, 'agents')))
33
22
  return false;
34
23
  try {
35
- return (runGit(['-C', root, 'rev-parse', 'HEAD']) === resolveExpectedCommit(root, ref) &&
36
- runGit(['-C', root, 'status', '--porcelain']) === '');
24
+ return tryReadCleanHead(root) === resolveExpectedCommit(root, ref);
37
25
  }
38
26
  catch {
39
27
  return false;
@@ -42,48 +30,35 @@ const isPinnedCatalogCheckout = (root, ref) => {
42
30
  /** Fetches one immutable catalog revision into the same cache path used by normal source resolution. */
43
31
  export const bootstrapPinnedCatalog = (input) => {
44
32
  assertImmutableRef(input.source.ref);
45
- const root = createRemoteRepositoryCachePath(input.homeDirectory, input.source);
33
+ const root = createRemoteRepositoryCachePath(input.homeDirectory, input.source, input.cacheDirectory);
46
34
  if (isPinnedCatalogCheckout(root, input.source.ref))
47
35
  return { root, source: input.source };
48
- mkdirSync(dirname(root), { recursive: true });
49
- const nonce = `${process.pid}-${Math.random().toString(16).slice(2)}`;
50
- const temporaryRoot = `${root}.outfitter-${nonce}.tmp`;
51
- const staleRoot = `${root}.outfitter-${nonce}.stale`;
52
- const remote = normalizeGitUri(normalizeRemoteSourceUri(input.source));
53
- let movedStaleCache = false;
54
36
  try {
55
- runGit(['init', '--quiet', temporaryRoot]);
56
- runGit(['-C', temporaryRoot, 'remote', 'add', 'origin', remote]);
57
- const fetchRef = fullCommitPattern.test(input.source.ref)
58
- ? input.source.ref
59
- : `refs/tags/${input.source.ref}:refs/tags/${input.source.ref}`;
60
- runGit(['-C', temporaryRoot, 'fetch', '--quiet', '--depth=1', 'origin', fetchRef]);
61
- runGit(['-C', temporaryRoot, 'checkout', '--quiet', '--detach', 'FETCH_HEAD']);
62
- if (!isPinnedCatalogCheckout(temporaryRoot, input.source.ref)) {
63
- throw new Error(`Fetched default catalog did not resolve to ${input.source.ref}.`);
64
- }
65
- if (existsSync(root)) {
66
- renameSync(root, staleRoot);
67
- movedStaleCache = true;
68
- }
69
- renameSync(temporaryRoot, root);
70
- if (movedStaleCache)
71
- rmSync(staleRoot, { recursive: true, force: true });
37
+ syncRemoteRepositoryAtomically({
38
+ cachePath: root,
39
+ fetchRef: versionTagPattern.test(input.source.ref)
40
+ ? `refs/tags/${input.source.ref}:refs/tags/${input.source.ref}`
41
+ : input.source.ref,
42
+ source: input.source,
43
+ // Validated with the same predicate the read path uses. A fresh checkout is not clean by
44
+ // construction — autocrlf, an LFS smudge, or a fileMode difference can leave it dirty — and
45
+ // accepting a dirty tree here would cache one that `tryReadCleanHead` rejects on every
46
+ // subsequent read, re-fetching forever.
47
+ validate: (temporaryRoot) => {
48
+ if (!isPinnedCatalogCheckout(temporaryRoot, input.source.ref)) {
49
+ throw new Error(`Fetched default catalog did not resolve to ${input.source.ref}.`);
50
+ }
51
+ return 0;
52
+ },
53
+ });
72
54
  return { root, source: input.source };
73
55
  }
74
56
  catch (error) {
75
- /* v8 ignore next -- only an OS-level failure during the atomic cache rename requires restoration. */
76
- if (movedStaleCache && !existsSync(root) && existsSync(staleRoot))
77
- renameSync(staleRoot, root);
78
- const detail = String(error);
57
+ const detail = redactEmbeddedSourceCredentials(String(error));
79
58
  throw new Error(`Could not fetch the default Outfitter catalog at pinned revision ${input.source.ref}. ${detail}`, {
80
59
  cause: error,
81
60
  });
82
61
  }
83
- finally {
84
- rmSync(temporaryRoot, { recursive: true, force: true });
85
- rmSync(staleRoot, { recursive: true, force: true });
86
- }
87
62
  };
88
- export const bootstrapDefaultCatalog = (homeDirectory) => bootstrapPinnedCatalog({ homeDirectory, source: defaultCatalogSource });
63
+ export const bootstrapDefaultCatalog = (homeDirectory, cacheDirectory) => bootstrapPinnedCatalog({ homeDirectory, cacheDirectory, source: defaultCatalogSource });
89
64
  //# sourceMappingURL=DefaultCatalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultCatalog.js","sourceRoot":"","sources":["../../src/setup/DefaultCatalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DefaultCatalog.js","sourceRoot":"","sources":["../../src/setup/DefaultCatalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { RemoteSourceReference } from './SourceCache.js';
2
+ export interface AtomicRepositorySyncInput {
3
+ readonly cachePath: string;
4
+ /** Optional fetch refspec used when verification needs a local ref (for example an immutable tag). */
5
+ readonly fetchRef?: string;
6
+ readonly source: RemoteSourceReference;
7
+ /**
8
+ * Inspects the fetched checkout before it is swapped in; throwing rejects the fetch. Returns the
9
+ * number of non-fatal warnings the checkout produced.
10
+ */
11
+ readonly validate?: (repositoryPath: string, commit: string) => number;
12
+ }
13
+ export interface AtomicRepositorySyncResult {
14
+ readonly commit: string;
15
+ readonly status: 'updated' | 'unchanged';
16
+ readonly warnings: number;
17
+ }
18
+ /** Guards against a `ref` that git would parse as an option (`--upload-pack=…` is code execution). */
19
+ export declare const assertFetchableRef: (ref: string) => void;
20
+ /** Runs one git invocation, raising captured stderr as a credential-redacted Error. */
21
+ export declare const runGit: (arguments_: readonly string[]) => string;
22
+ /** Reads the HEAD commit of a checkout, or undefined when it is missing, dirty, or unreadable. */
23
+ export declare const tryReadCleanHead: (root: string) => string | undefined;
24
+ /**
25
+ * Fetches into a temporary sibling and swaps only a validated checkout into place. A failed fetch,
26
+ * checkout, validation, or rename leaves an existing cache intact.
27
+ */
28
+ export declare const syncRemoteRepositoryAtomically: (input: AtomicRepositorySyncInput) => AtomicRepositorySyncResult;
@@ -0,0 +1,139 @@
1
+ // Atomically fetches Git repositories while preserving the last known-good cache on failure.
2
+ import { spawnSync } from 'node:child_process';
3
+ import { existsSync, mkdirSync, renameSync, rmSync } from 'node:fs';
4
+ import { dirname, join } from 'node:path';
5
+ import { normalizeGitUri, normalizeRemoteSourceUri, redactEmbeddedSourceCredentials } from './SourceCache.js';
6
+ // Repository-context variables must never leak in: with GIT_DIR/GIT_WORK_TREE exported (a git hook,
7
+ // `rebase --exec`, `bisect run`), `git -C <temporaryRoot> …` would operate on the *outer*
8
+ // repository, adding remotes to it and detaching its HEAD. Transport variables are left alone so a
9
+ // user's custom GIT_SSH_COMMAND still applies.
10
+ const repositoryContextVariables = new Set([
11
+ 'GIT_DIR',
12
+ 'GIT_WORK_TREE',
13
+ 'GIT_INDEX_FILE',
14
+ 'GIT_OBJECT_DIRECTORY',
15
+ 'GIT_ALTERNATE_OBJECT_DIRECTORIES',
16
+ 'GIT_COMMON_DIR',
17
+ 'GIT_NAMESPACE',
18
+ 'GIT_CEILING_DIRECTORIES',
19
+ ]);
20
+ const gitEnvironment = () => {
21
+ const environment = {};
22
+ for (const [key, value] of Object.entries(process.env)) {
23
+ if (!repositoryContextVariables.has(key))
24
+ environment[key] = value;
25
+ }
26
+ // Git reads interactive credential prompts from /dev/tty, so piping stdio does not suppress them:
27
+ // an auth-required or unknown-host remote would hang the CLI forever without these.
28
+ environment.GIT_TERMINAL_PROMPT = '0';
29
+ environment.GIT_SSH_COMMAND = process.env.GIT_SSH_COMMAND ?? 'ssh -o BatchMode=yes';
30
+ return environment;
31
+ };
32
+ /** Guards against a `ref` that git would parse as an option (`--upload-pack=…` is code execution). */
33
+ export const assertFetchableRef = (ref) => {
34
+ if (!/^[A-Za-z0-9_.][A-Za-z0-9_./-]*$/u.test(ref) || ref.includes('..')) {
35
+ throw new Error(`Source ref '${ref}' is not a valid git ref.`);
36
+ }
37
+ };
38
+ /** Runs one git invocation, raising captured stderr as a credential-redacted Error. */
39
+ export const runGit = (arguments_) => {
40
+ const result = spawnSync('git', [...arguments_], {
41
+ encoding: 'utf8',
42
+ stdio: ['ignore', 'pipe', 'pipe'],
43
+ env: gitEnvironment(),
44
+ timeout: 300_000,
45
+ });
46
+ if (result.error === undefined && result.status === 0) {
47
+ return result.stdout.trim();
48
+ }
49
+ const detail = [result.error?.message, result.stderr, result.stdout]
50
+ .filter((value) => value !== undefined && value.trim() !== '')
51
+ .join('\n');
52
+ const command = `git ${arguments_.join(' ')}`;
53
+ let suffix = `: ${detail.trim()}`;
54
+ /* v8 ignore else -- spawn failures always provide an Error or captured process output. */
55
+ if (detail === '')
56
+ suffix = '';
57
+ throw new Error(redactEmbeddedSourceCredentials(`${command} failed${suffix}`));
58
+ };
59
+ /** Reads the HEAD commit of a checkout, or undefined when it is missing, dirty, or unreadable. */
60
+ export const tryReadCleanHead = (root) => {
61
+ if (!existsSync(join(root, '.git')))
62
+ return undefined;
63
+ try {
64
+ if (runGit(['-C', root, 'status', '--porcelain']) !== '')
65
+ return undefined;
66
+ return runGit(['-C', root, 'rev-parse', 'HEAD']);
67
+ }
68
+ catch {
69
+ return undefined;
70
+ }
71
+ };
72
+ /**
73
+ * Rejects a remote or ref that git would parse as an option. Runs before any filesystem work so a
74
+ * hostile ref always reports as an invalid ref, rather than as whatever incidental error the cache
75
+ * path happens to raise first (a long encoded name exceeds the macOS filename limit, for example).
76
+ */
77
+ const assertFetchableSource = (source, fetchRef) => {
78
+ // Both the remote and the ref are positional arguments to `git fetch`; either one starting with
79
+ // `-` is parsed as an option, and `--upload-pack=<cmd>` is arbitrary command execution.
80
+ const remote = normalizeGitUri(normalizeRemoteSourceUri(source));
81
+ if (remote.startsWith('-'))
82
+ throw new Error(`Source URI '${remote}' must not begin with '-'.`);
83
+ // A refspec (`refs/tags/x:refs/tags/x`) is two refs; validate each side.
84
+ const ref = fetchRef ?? source.ref;
85
+ if (ref !== undefined)
86
+ for (const part of ref.split(':'))
87
+ assertFetchableRef(part);
88
+ };
89
+ const fetchSource = (temporaryRoot, source, fetchRef) => {
90
+ const remote = normalizeGitUri(normalizeRemoteSourceUri(source));
91
+ const ref = fetchRef ?? source.ref;
92
+ runGit(['init', '--quiet', temporaryRoot]);
93
+ // Fetch by URL rather than `remote add origin <url>`: a credential-bearing URL written into
94
+ // .git/config would be renamed into the long-lived cache and persist there in plaintext.
95
+ // An omitted ref must resolve the remote's default branch — with no refspec at all, FETCH_HEAD
96
+ // holds every branch tip and `rev-parse FETCH_HEAD` would take whichever sorts first.
97
+ runGit(['-C', temporaryRoot, 'fetch', '--quiet', '--depth=1', remote, ref ?? 'HEAD']);
98
+ runGit(['-C', temporaryRoot, 'checkout', '--quiet', '--detach', 'FETCH_HEAD']);
99
+ return runGit(['-C', temporaryRoot, 'rev-parse', 'HEAD']);
100
+ };
101
+ /**
102
+ * Fetches into a temporary sibling and swaps only a validated checkout into place. A failed fetch,
103
+ * checkout, validation, or rename leaves an existing cache intact.
104
+ */
105
+ export const syncRemoteRepositoryAtomically = (input) => {
106
+ assertFetchableSource(input.source, input.fetchRef);
107
+ mkdirSync(dirname(input.cachePath), { recursive: true });
108
+ const nonce = `${process.pid}-${Math.random().toString(16).slice(2)}`;
109
+ const temporaryRoot = `${input.cachePath}.outfitter-${nonce}.tmp`;
110
+ const staleRoot = `${input.cachePath}.outfitter-${nonce}.stale`;
111
+ let movedStaleCache = false;
112
+ try {
113
+ const commit = fetchSource(temporaryRoot, input.source, input.fetchRef);
114
+ const warnings = input.validate?.(temporaryRoot, commit) ?? 0;
115
+ if (tryReadCleanHead(input.cachePath) === commit) {
116
+ return { commit, status: 'unchanged', warnings };
117
+ }
118
+ if (existsSync(input.cachePath)) {
119
+ renameSync(input.cachePath, staleRoot);
120
+ movedStaleCache = true;
121
+ }
122
+ renameSync(temporaryRoot, input.cachePath);
123
+ if (movedStaleCache)
124
+ rmSync(staleRoot, { recursive: true, force: true });
125
+ return { commit, status: 'updated', warnings };
126
+ }
127
+ catch (error) {
128
+ /* v8 ignore next -- only an OS-level failure during the atomic rename needs restoration. */
129
+ if (movedStaleCache && !existsSync(input.cachePath) && existsSync(staleRoot)) {
130
+ renameSync(staleRoot, input.cachePath);
131
+ }
132
+ throw error;
133
+ }
134
+ finally {
135
+ rmSync(temporaryRoot, { recursive: true, force: true });
136
+ rmSync(staleRoot, { recursive: true, force: true });
137
+ }
138
+ };
139
+ //# sourceMappingURL=GitRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitRepository.js","sourceRoot":"","sources":["../../src/sources/GitRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { RemoteSourceReference } from './SourceCache.js';
2
+ export interface GitHubRepositoryVisibilityClassifier {
3
+ classify(repository: string): 'private' | 'public' | 'unknown';
4
+ }
5
+ export interface PrivateCatalogPrompt {
6
+ readonly interactive: boolean;
7
+ confirm(repository: string): boolean;
8
+ }
9
+ export interface PrivateCatalogSkippedResult {
10
+ readonly uri: string;
11
+ readonly cachePath: string;
12
+ readonly status: 'skipped';
13
+ readonly message: string;
14
+ }
15
+ export interface PrivateCatalogGateResult<T extends RemoteSourceReference> {
16
+ readonly allowedSources: readonly T[];
17
+ readonly skippedResults: readonly PrivateCatalogSkippedResult[];
18
+ readonly messages: readonly string[];
19
+ }
20
+ export interface PrivateCatalogSourceGate {
21
+ filter<T extends RemoteSourceReference>(sources: readonly T[], cacheDirectory?: string): PrivateCatalogGateResult<T>;
22
+ }
23
+ export declare const createEnterprisePrivateCatalogGate: (input: {
24
+ readonly homeDirectory: string;
25
+ readonly classifier?: GitHubRepositoryVisibilityClassifier;
26
+ readonly prompt?: PrivateCatalogPrompt;
27
+ }) => PrivateCatalogSourceGate;