@ai-outfitter/outfitter 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -2
- package/code/pi-extension/src/outfitter-extension.js +9 -1
- package/dist/agents/AgentLaunch.d.ts +2 -2
- package/dist/agents/AgentLaunch.js +4 -3
- package/dist/agents/AgentLaunch.js.map +1 -1
- package/dist/agents/ClaudeStatePersistence.d.ts +18 -0
- package/dist/agents/ClaudeStatePersistence.js +225 -0
- package/dist/agents/ClaudeStatePersistence.js.map +1 -0
- package/dist/cli/OutfitterCli.js +1 -1
- package/dist/cli/OutfitterCli.js.map +1 -1
- package/dist/cli/commands/RunAgentCommand.js +76 -15
- package/dist/cli/commands/RunAgentCommand.js.map +1 -1
- package/dist/cli/commands/SyncCommand.d.ts +7 -3
- package/dist/cli/commands/SyncCommand.js +110 -20
- package/dist/cli/commands/SyncCommand.js.map +1 -1
- package/dist/projection/CodexMcp.d.ts +11 -0
- package/dist/projection/CodexMcp.js +143 -0
- package/dist/projection/CodexMcp.js.map +1 -0
- package/dist/projection/Materialize.d.ts +3 -1
- package/dist/projection/Materialize.js +7 -3
- package/dist/projection/Materialize.js.map +1 -1
- package/dist/projection/ProjectHarness.js +66 -29
- package/dist/projection/ProjectHarness.js.map +1 -1
- package/dist/projection/Projection.d.ts +2 -0
- package/dist/resolver/Layer.d.ts +5 -2
- package/dist/resolver/Layer.js +47 -8
- package/dist/resolver/Layer.js.map +1 -1
- package/dist/resolver/ResolverContext.d.ts +1 -1
- package/dist/resolver/ResolverContext.js +1 -1
- package/dist/resolver/ResolverContext.js.map +1 -1
- package/dist/resolver/ResolverValidation.d.ts +12 -1
- package/dist/resolver/ResolverValidation.js +30 -20
- package/dist/resolver/ResolverValidation.js.map +1 -1
- package/dist/schemas/settings.schema.json +1 -1
- package/dist/schemas/system-extension-hook.schema.json +38 -0
- package/dist/settings/Settings.d.ts +1 -1
- package/dist/settings/Settings.js +1 -1
- package/dist/settings/Settings.js.map +1 -1
- package/dist/settings/SettingsLoader.js.map +1 -1
- package/dist/setup/DefaultCatalog.d.ts +18 -0
- package/dist/setup/DefaultCatalog.js +74 -13
- package/dist/setup/DefaultCatalog.js.map +1 -1
- package/dist/sources/SourceCache.d.ts +20 -0
- package/dist/sources/SourceCache.js +31 -1
- package/dist/sources/SourceCache.js.map +1 -1
- package/dist/sources/TransitiveSources.d.ts +43 -0
- package/dist/sources/TransitiveSources.js +177 -0
- package/dist/sources/TransitiveSources.js.map +1 -0
- package/dist/system/SystemExtensionHook.d.ts +34 -0
- package/dist/system/SystemExtensionHook.js +190 -0
- package/dist/system/SystemExtensionHook.js.map +1 -0
- package/dist/validation/SchemaValidator.d.ts +1 -1
- package/dist/validation/SchemaValidator.js +2 -0
- package/dist/validation/SchemaValidator.js.map +1 -1
- package/docs/architecture/state_writeback_strategy.md +15 -3
- package/docs/documentation/README.md +14 -1
- package/docs/documentation/catalogs.md +61 -2
- package/docs/documentation/cli.md +2 -1
- package/docs/documentation/concepts.md +2 -2
- package/docs/documentation/hooks.md +33 -0
- package/docs/documentation/in-cluster.md +2 -0
- package/docs/documentation/migration.md +1 -1
- package/docs/documentation/personas.md +1 -1
- package/docs/documentation/settings.md +1 -1
- package/docs/documentation/state.md +27 -0
- package/docs/documentation/support-matrix.md +34 -23
- package/docs/documentation/usecases/org-onboarding-sdlc-report.md +143 -0
- package/docs/documentation/usecases/persona-reviews.md +1 -1
- package/docs/philosophy.md +20 -0
- package/package.json +1 -1
- package/src/schemas/settings.schema.json +1 -1
- package/src/schemas/system-extension-hook.schema.json +38 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { syncRemoteRepositoryAtomically } from '../../sources/GitRepository.js';
|
|
1
2
|
import { type GitHubRepositoryVisibilityClassifier, type PrivateCatalogPrompt, type PrivateCatalogSourceGate } from '../../sources/PrivateCatalogGate.js';
|
|
2
3
|
import type { CommandObject } from './CommandObject.js';
|
|
3
4
|
export type SyncStatus = 'updated' | 'unchanged' | 'skipped' | 'failed';
|
|
4
|
-
export type SyncSourceKind = 'remote_settings' | 'source';
|
|
5
|
+
export type SyncSourceKind = 'remote_settings' | 'source' | 'transitive';
|
|
5
6
|
export interface SyncSourceResult {
|
|
6
7
|
readonly kind: SyncSourceKind;
|
|
7
8
|
readonly uri: string;
|
|
@@ -18,6 +19,8 @@ export interface SyncCommandInput {
|
|
|
18
19
|
readonly homeDirectory: string;
|
|
19
20
|
readonly projectDirectory: string;
|
|
20
21
|
}
|
|
22
|
+
/** Fetches one repository into the cache. Injectable so tests exercise the closure hermetically. */
|
|
23
|
+
export type RepositorySync = typeof syncRemoteRepositoryAtomically;
|
|
21
24
|
export interface SyncCommandDependencies {
|
|
22
25
|
readonly homeDirectory?: string;
|
|
23
26
|
readonly projectDirectory?: string;
|
|
@@ -25,7 +28,8 @@ export interface SyncCommandDependencies {
|
|
|
25
28
|
readonly prompt?: PrivateCatalogPrompt;
|
|
26
29
|
readonly privateCatalogGate?: PrivateCatalogSourceGate;
|
|
27
30
|
readonly writeLine?: (message: string) => void;
|
|
31
|
+
readonly syncRepository?: RepositorySync;
|
|
28
32
|
}
|
|
29
|
-
/** Validates
|
|
30
|
-
export declare const executeSyncCommand: (input: SyncCommandInput, dependencies?: Pick<SyncCommandDependencies, "classifier" | "prompt" | "privateCatalogGate">) => SyncCommandResult;
|
|
33
|
+
/** Validates settings, syncs remote settings, reloads, syncs remote sources, then their closure. */
|
|
34
|
+
export declare const executeSyncCommand: (input: SyncCommandInput, dependencies?: Pick<SyncCommandDependencies, "classifier" | "prompt" | "privateCatalogGate" | "syncRepository">) => SyncCommandResult;
|
|
31
35
|
export declare const createSyncCommand: (dependencies?: SyncCommandDependencies) => CommandObject;
|
|
@@ -5,9 +5,10 @@ import { remoteSourceLayer } from '../../resolver/Layer.js';
|
|
|
5
5
|
import { resolveResources } from '../../resolver/Resolver.js';
|
|
6
6
|
import { validateEffectiveSet } from '../../resolver/ResolverValidation.js';
|
|
7
7
|
import { createSettingsLoadPlan, discoverSettingsLoadPlan, formatSettingsIssue, loadSettings, loadSettingsFiles, loadSettingsWithCachedRemoteSettings, resolveRemoteSettingsPath, } from '../../settings/SettingsLoader.js';
|
|
8
|
-
import { syncRemoteRepositoryAtomically } from '../../sources/GitRepository.js';
|
|
8
|
+
import { syncRemoteRepositoryAtomically, tryReadCleanHead } from '../../sources/GitRepository.js';
|
|
9
9
|
import { createEnterprisePrivateCatalogGate, } from '../../sources/PrivateCatalogGate.js';
|
|
10
|
-
import { createRemoteRepositoryCachePath, formatRemoteSourceDisplay, isRemoteSource, redactEmbeddedSourceCredentials, } from '../../sources/SourceCache.js';
|
|
10
|
+
import { createRemoteRepositoryCachePath, encodeRemoteSourceSelection, formatRemoteSourceDisplay, isRemoteSource, redactEmbeddedSourceCredentials, resolveSourcePayloadRoot, } from '../../sources/SourceCache.js';
|
|
11
|
+
import { readDeclaredRemoteSources } from '../../sources/TransitiveSources.js';
|
|
11
12
|
import { resolveHomeDirectory, resolveProjectDirectory } from './ProcessDefaults.js';
|
|
12
13
|
const formatSettingsIssues = (heading, issues) => [
|
|
13
14
|
heading,
|
|
@@ -36,7 +37,10 @@ const validateSourceCheckout = (repositoryPath, source) => {
|
|
|
36
37
|
if (!existsSync(layer.root)) {
|
|
37
38
|
throw new Error(`Configured source path '${source.path}' was not found in the fetched repository.`);
|
|
38
39
|
}
|
|
39
|
-
|
|
40
|
+
// A source is validated in isolation here, so an unresolved loadout slug is deferred (a warning,
|
|
41
|
+
// not a failure): a catalog may reference a skill supplied by a catalog it declares as a transitive
|
|
42
|
+
// dependency (OFTR-004.6), and loadout wholeness is validated against the merged tree at resolution.
|
|
43
|
+
const findings = validateEffectiveSet(resolveResources([layer]), undefined, { deferLoadoutResolution: true });
|
|
40
44
|
const errors = findings.filter((finding) => finding.severity === 'error');
|
|
41
45
|
if (errors.length > 0) {
|
|
42
46
|
throw new Error(`Fetched source is invalid: ${errors.map((finding) => `${finding.resource} ${finding.message}`).join('; ')}`);
|
|
@@ -46,41 +50,103 @@ const validateSourceCheckout = (repositoryPath, source) => {
|
|
|
46
50
|
/** Runs the private-catalog gate over one phase's sources, then fetches everything it allowed. */
|
|
47
51
|
const syncPhase = (input) => {
|
|
48
52
|
const gated = input.gate.filter(input.sources, input.cacheDirectory);
|
|
53
|
+
// Pair each source with its own result so a later step reads the checkout by identity, never by a
|
|
54
|
+
// display string (which omits a `uri:` source's ref and would collide across refs).
|
|
49
55
|
const synced = gated.allowedSources.map((source) => {
|
|
50
56
|
const cachePath = createRemoteRepositoryCachePath(input.homeDirectory, source, input.cacheDirectory);
|
|
51
57
|
const uri = formatRemoteSourceDisplay(source);
|
|
52
58
|
try {
|
|
53
|
-
const result =
|
|
59
|
+
const result = input.syncRepository({
|
|
54
60
|
cachePath,
|
|
55
61
|
source,
|
|
56
62
|
validate: (repositoryPath) => input.validate(repositoryPath, source),
|
|
57
63
|
});
|
|
58
64
|
return {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
source,
|
|
66
|
+
result: {
|
|
67
|
+
kind: input.kind,
|
|
68
|
+
uri,
|
|
69
|
+
cachePath,
|
|
70
|
+
status: result.status,
|
|
71
|
+
message: result.warnings === 0 ? undefined : `validated with ${result.warnings} warning(s)`,
|
|
72
|
+
},
|
|
64
73
|
};
|
|
65
74
|
}
|
|
66
75
|
catch (error) {
|
|
67
76
|
return {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
77
|
+
source,
|
|
78
|
+
result: {
|
|
79
|
+
kind: input.kind,
|
|
80
|
+
uri,
|
|
81
|
+
cachePath,
|
|
82
|
+
status: 'failed',
|
|
83
|
+
message: redactEmbeddedSourceCredentials(formatCaughtError(error)),
|
|
84
|
+
},
|
|
73
85
|
};
|
|
74
86
|
}
|
|
75
87
|
});
|
|
76
88
|
return {
|
|
77
89
|
allowedSources: gated.allowedSources,
|
|
78
90
|
messages: gated.messages,
|
|
79
|
-
results: [
|
|
91
|
+
results: [
|
|
92
|
+
...gated.skippedResults.map((result) => ({ ...result, kind: input.kind })),
|
|
93
|
+
...synced.map((s) => s.result),
|
|
94
|
+
],
|
|
95
|
+
// A source is traversable when its checkout is readable on disk *now* — not only when this run
|
|
96
|
+
// refreshed it. A failed refresh leaves the prior valid cache in place (atomic sync) and
|
|
97
|
+
// resolution keeps using it, so its declared dependencies must still be discovered; a failed
|
|
98
|
+
// first fetch leaves no checkout, so it is correctly excluded.
|
|
99
|
+
readableSources: synced.filter((s) => tryReadCleanHead(s.result.cachePath) !== undefined).map((s) => s.source),
|
|
80
100
|
};
|
|
81
101
|
};
|
|
82
|
-
|
|
83
|
-
|
|
102
|
+
/** Fetches sources declared by synced catalogs until no new sources remain (OFTR-004.6.7). */
|
|
103
|
+
const syncTransitiveClosure = (input) => {
|
|
104
|
+
const messages = [];
|
|
105
|
+
const results = [];
|
|
106
|
+
const visited = new Set(input.directRemoteSources.map(encodeRemoteSourceSelection));
|
|
107
|
+
let frontier = input.sourcePhase.readableSources;
|
|
108
|
+
while (frontier.length > 0) {
|
|
109
|
+
const discovered = [];
|
|
110
|
+
for (const parent of frontier) {
|
|
111
|
+
const checkoutRoot = createRemoteRepositoryCachePath(input.homeDirectory, parent, input.cacheDirectory);
|
|
112
|
+
// An absolute or escaping `path:` on a directly configured source throws here; skip it rather
|
|
113
|
+
// than crash sync (transitive sources are path-less and never reach this).
|
|
114
|
+
let payloadRoot;
|
|
115
|
+
try {
|
|
116
|
+
payloadRoot = resolveSourcePayloadRoot(checkoutRoot, parent);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const declared = readDeclaredRemoteSources(payloadRoot, checkoutRoot, formatRemoteSourceDisplay(parent));
|
|
122
|
+
messages.push(...declared.warnings.map((warning) => `warning: ${warning}`));
|
|
123
|
+
for (const entry of declared.sources) {
|
|
124
|
+
const key = encodeRemoteSourceSelection(entry.source);
|
|
125
|
+
if (visited.has(key))
|
|
126
|
+
continue;
|
|
127
|
+
visited.add(key);
|
|
128
|
+
discovered.push(entry.source);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (discovered.length === 0)
|
|
132
|
+
break;
|
|
133
|
+
const phase = syncPhase({
|
|
134
|
+
kind: 'transitive',
|
|
135
|
+
sources: discovered,
|
|
136
|
+
homeDirectory: input.homeDirectory,
|
|
137
|
+
cacheDirectory: input.cacheDirectory,
|
|
138
|
+
gate: input.gate,
|
|
139
|
+
syncRepository: input.syncRepository,
|
|
140
|
+
validate: validateSourceCheckout,
|
|
141
|
+
});
|
|
142
|
+
messages.push(...phase.messages, ...phase.results.map(formatResult));
|
|
143
|
+
results.push(...phase.results);
|
|
144
|
+
frontier = phase.readableSources;
|
|
145
|
+
}
|
|
146
|
+
return { messages, results };
|
|
147
|
+
};
|
|
148
|
+
const finishSync = (mergedIssues, remoteSettingsPhase, sourcePhase, transitiveClosure) => {
|
|
149
|
+
const results = [...remoteSettingsPhase.results, ...sourcePhase.results, ...transitiveClosure.results];
|
|
84
150
|
const settingsMessages = mergedIssues.length === 0
|
|
85
151
|
? []
|
|
86
152
|
: formatSettingsIssues('Merged settings contain errors after remote-settings synchronization.', mergedIssues);
|
|
@@ -90,6 +156,7 @@ const finishSync = (mergedIssues, remoteSettingsPhase, sourcePhase) => {
|
|
|
90
156
|
...settingsMessages,
|
|
91
157
|
...sourcePhase.messages,
|
|
92
158
|
...sourcePhase.results.map(formatResult),
|
|
159
|
+
...transitiveClosure.messages,
|
|
93
160
|
];
|
|
94
161
|
if (results.length === 0 && mergedIssues.length === 0) {
|
|
95
162
|
messages.push('No remote sources are configured.');
|
|
@@ -100,7 +167,7 @@ const finishSync = (mergedIssues, remoteSettingsPhase, sourcePhase) => {
|
|
|
100
167
|
results,
|
|
101
168
|
};
|
|
102
169
|
};
|
|
103
|
-
/** Validates
|
|
170
|
+
/** Validates settings, syncs remote settings, reloads, syncs remote sources, then their closure. */
|
|
104
171
|
export const executeSyncCommand = (input, dependencies = {}) => {
|
|
105
172
|
const local = loadSettings(discoverSettingsLoadPlan(input));
|
|
106
173
|
if (local.issues.length > 0) {
|
|
@@ -116,27 +183,50 @@ export const executeSyncCommand = (input, dependencies = {}) => {
|
|
|
116
183
|
classifier: dependencies.classifier,
|
|
117
184
|
prompt: dependencies.prompt,
|
|
118
185
|
});
|
|
186
|
+
const syncRepository = dependencies.syncRepository ?? syncRemoteRepositoryAtomically;
|
|
119
187
|
const remoteSettingsPhase = syncPhase({
|
|
120
188
|
kind: 'remote_settings',
|
|
189
|
+
// Non-null is safe: `emptySettings()` (Settings.ts) always defaults `remoteSettings` to `[]`.
|
|
121
190
|
sources: local.settings.remoteSettings,
|
|
122
191
|
homeDirectory: input.homeDirectory,
|
|
123
192
|
cacheDirectory: local.settings.cacheDirectory,
|
|
124
193
|
gate,
|
|
194
|
+
syncRepository,
|
|
125
195
|
validate: validateRemoteSettingsCheckout,
|
|
126
196
|
});
|
|
127
197
|
const merged = loadSettingsWithCachedRemoteSettings(input, {
|
|
128
198
|
remoteSettingsReferences: remoteSettingsPhase.allowedSources,
|
|
129
199
|
localSettings: local,
|
|
130
200
|
});
|
|
201
|
+
// Non-null is safe: `emptySettings()` (Settings.ts) always defaults `sources` to `[]`. Deduplicate
|
|
202
|
+
// exact-duplicate configured sources so an identical entry listed twice is fetched once, not twice
|
|
203
|
+
// (OFTR-004.6.6); distinct subpaths of one repo+ref stay distinct (path-aware key).
|
|
204
|
+
const seenSources = new Set();
|
|
205
|
+
const directRemoteSources = merged.settings.sources.filter(isRemoteSource).filter((source) => {
|
|
206
|
+
const key = encodeRemoteSourceSelection(source);
|
|
207
|
+
if (seenSources.has(key))
|
|
208
|
+
return false;
|
|
209
|
+
seenSources.add(key);
|
|
210
|
+
return true;
|
|
211
|
+
});
|
|
131
212
|
const sourcePhase = syncPhase({
|
|
132
213
|
kind: 'source',
|
|
133
|
-
sources:
|
|
214
|
+
sources: directRemoteSources,
|
|
134
215
|
homeDirectory: input.homeDirectory,
|
|
135
216
|
cacheDirectory: merged.settings.cacheDirectory,
|
|
136
217
|
gate,
|
|
218
|
+
syncRepository,
|
|
137
219
|
validate: validateSourceCheckout,
|
|
138
220
|
});
|
|
139
|
-
|
|
221
|
+
const transitiveClosure = syncTransitiveClosure({
|
|
222
|
+
homeDirectory: input.homeDirectory,
|
|
223
|
+
cacheDirectory: merged.settings.cacheDirectory,
|
|
224
|
+
gate,
|
|
225
|
+
syncRepository,
|
|
226
|
+
directRemoteSources,
|
|
227
|
+
sourcePhase,
|
|
228
|
+
});
|
|
229
|
+
return finishSync(merged.issues, remoteSettingsPhase, sourcePhase, transitiveClosure);
|
|
140
230
|
};
|
|
141
231
|
export const createSyncCommand = (dependencies = {}) => ({
|
|
142
232
|
name: 'sync',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/SyncCommand.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,oCAAoC,EACpC,yBAAyB,GAC1B,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"SyncCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/SyncCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface CodexMcpProjection {
|
|
2
|
+
readonly args: readonly string[];
|
|
3
|
+
readonly warnings: readonly string[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Codex CLI `-c` values are TOML, not JSON. HTTP header values written as `${ENV_NAME}` are
|
|
7
|
+
* translated to `env_http_headers`, and `Authorization: Bearer ${ENV_NAME}` becomes
|
|
8
|
+
* `bearer_token_env_var`, so the secret itself stays out of argv. Other values must use Codex's
|
|
9
|
+
* literal `http_headers` because the protocol definition contains no environment reference.
|
|
10
|
+
*/
|
|
11
|
+
export declare const projectCodexMcpServers: (selectedIds: readonly string[], servers: Readonly<Record<string, unknown>>) => CodexMcpProjection;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// Translates selected protocol MCP server definitions into Codex CLI TOML overrides.
|
|
2
|
+
const asRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
3
|
+
? value
|
|
4
|
+
: {};
|
|
5
|
+
const tomlString = (value) => JSON.stringify(value.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/gu, '\uFFFD')).replace(/\u007F/gu, '\\u007F');
|
|
6
|
+
const CODEX_MCP_ID = /^[A-Za-z0-9_-]+$/u;
|
|
7
|
+
const ENVIRONMENT_REFERENCE = /\$\{[A-Za-z_][A-Za-z0-9_]*\}/u;
|
|
8
|
+
const tomlInlineTable = (value) => `{ ${Object.entries(value)
|
|
9
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
10
|
+
.map(([key, item]) => `${tomlString(key)} = ${tomlString(item)}`)
|
|
11
|
+
.join(', ')} }`;
|
|
12
|
+
const environmentReference = (value) => /^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/u.exec(value)?.[1];
|
|
13
|
+
const bearerTokenReference = (header, value) => header.toLowerCase() === 'authorization' ? /^Bearer \$\{([A-Za-z_][A-Za-z0-9_]*)\}$/iu.exec(value)?.[1] : undefined;
|
|
14
|
+
const supportedTransport = (value) => value === undefined || value === 'stdio' || value === 'http' || value === 'streamable-http';
|
|
15
|
+
const override = (key, value) => ['-c', `${key}=${value}`];
|
|
16
|
+
const warnUnexpandedReferences = (id, field, value, warnings) => {
|
|
17
|
+
if (ENVIRONMENT_REFERENCE.test(value)) {
|
|
18
|
+
warnings.push(`codex MCP server '${id}' field '${field}' contains environment references that Codex does not expand.`);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const projectStdioEnvironmentEntry = (id, name, value, literalEnvironment, environmentVariables, warnings) => {
|
|
22
|
+
if (typeof value !== 'string') {
|
|
23
|
+
warnings.push(`codex adapter dropped non-string MCP env entry '${name}' from server '${id}'.`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const environment = environmentReference(value);
|
|
27
|
+
if (environment === undefined) {
|
|
28
|
+
literalEnvironment[name] = value;
|
|
29
|
+
warnings.push(`codex MCP server '${id}' env entry '${name}' is literal and will be visible in process arguments.`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (name === environment) {
|
|
33
|
+
environmentVariables.push(environment);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
warnings.push(`codex adapter cannot project MCP server '${id}' env entry '${name}': environment reference '${value}' would rename '${environment}'.`);
|
|
37
|
+
};
|
|
38
|
+
const projectHttpServer = (id, prefix, url, server, warnings) => {
|
|
39
|
+
warnUnexpandedReferences(id, 'url', url, warnings);
|
|
40
|
+
const args = [...override(`${prefix}.url`, tomlString(url))];
|
|
41
|
+
const literalHeaders = {};
|
|
42
|
+
const environmentHeaders = {};
|
|
43
|
+
let bearerTokenEnvironment;
|
|
44
|
+
for (const [header, value] of Object.entries(asRecord(server.headers))) {
|
|
45
|
+
if (typeof value !== 'string') {
|
|
46
|
+
warnings.push(`codex adapter dropped non-string MCP header '${header}' from server '${id}'.`);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const bearerToken = bearerTokenReference(header, value);
|
|
50
|
+
const environment = environmentReference(value);
|
|
51
|
+
if (bearerToken !== undefined)
|
|
52
|
+
bearerTokenEnvironment = bearerToken;
|
|
53
|
+
else if (environment === undefined) {
|
|
54
|
+
literalHeaders[header] = value;
|
|
55
|
+
warnings.push(`codex MCP server '${id}' header '${header}' is literal and will be visible in process arguments.`);
|
|
56
|
+
}
|
|
57
|
+
else
|
|
58
|
+
environmentHeaders[header] = environment;
|
|
59
|
+
}
|
|
60
|
+
if (Object.keys(literalHeaders).length > 0) {
|
|
61
|
+
args.push(...override(`${prefix}.http_headers`, tomlInlineTable(literalHeaders)));
|
|
62
|
+
}
|
|
63
|
+
if (Object.keys(environmentHeaders).length > 0) {
|
|
64
|
+
args.push(...override(`${prefix}.env_http_headers`, tomlInlineTable(environmentHeaders)));
|
|
65
|
+
}
|
|
66
|
+
if (bearerTokenEnvironment !== undefined) {
|
|
67
|
+
args.push(...override(`${prefix}.bearer_token_env_var`, tomlString(bearerTokenEnvironment)));
|
|
68
|
+
}
|
|
69
|
+
return args;
|
|
70
|
+
};
|
|
71
|
+
const projectStdioServer = (id, prefix, command, server, warnings) => {
|
|
72
|
+
warnUnexpandedReferences(id, 'command', command, warnings);
|
|
73
|
+
const args = [...override(`${prefix}.command`, tomlString(command))];
|
|
74
|
+
if (Array.isArray(server.args)) {
|
|
75
|
+
const commandArgs = [];
|
|
76
|
+
for (const [index, value] of server.args.entries()) {
|
|
77
|
+
if (typeof value === 'string') {
|
|
78
|
+
warnUnexpandedReferences(id, `args[${index}]`, value, warnings);
|
|
79
|
+
commandArgs.push(value);
|
|
80
|
+
}
|
|
81
|
+
else
|
|
82
|
+
warnings.push(`codex adapter dropped non-string MCP arg at index ${index} from server '${id}'.`);
|
|
83
|
+
}
|
|
84
|
+
args.push(...override(`${prefix}.args`, `[${commandArgs.map(tomlString).join(', ')}]`));
|
|
85
|
+
}
|
|
86
|
+
const literalEnvironment = {};
|
|
87
|
+
const environmentVariables = [];
|
|
88
|
+
for (const [name, value] of Object.entries(asRecord(server.env))) {
|
|
89
|
+
projectStdioEnvironmentEntry(id, name, value, literalEnvironment, environmentVariables, warnings);
|
|
90
|
+
}
|
|
91
|
+
if (Object.keys(literalEnvironment).length > 0) {
|
|
92
|
+
args.push(...override(`${prefix}.env`, tomlInlineTable(literalEnvironment)));
|
|
93
|
+
}
|
|
94
|
+
if (environmentVariables.length > 0) {
|
|
95
|
+
args.push(...override(`${prefix}.env_vars`, `[${environmentVariables
|
|
96
|
+
.sort((left, right) => left.localeCompare(right))
|
|
97
|
+
.map(tomlString)
|
|
98
|
+
.join(', ')}]`));
|
|
99
|
+
}
|
|
100
|
+
if (typeof server.cwd === 'string') {
|
|
101
|
+
warnUnexpandedReferences(id, 'cwd', server.cwd, warnings);
|
|
102
|
+
args.push(...override(`${prefix}.cwd`, tomlString(server.cwd)));
|
|
103
|
+
}
|
|
104
|
+
return args;
|
|
105
|
+
};
|
|
106
|
+
// Codex merges `-c` overrides with user and project `config.toml` and has no exclusive MCP mode, so
|
|
107
|
+
// selecting any server leaves lower-layer servers active. Reported as an adapter warning, which
|
|
108
|
+
// `--strict` makes fatal.
|
|
109
|
+
const ADDITIVE_PROJECTION_WARNING = 'codex MCP projection is additive: user and project MCP servers remain active because Codex has no strict isolation mode.';
|
|
110
|
+
/**
|
|
111
|
+
* Codex CLI `-c` values are TOML, not JSON. HTTP header values written as `${ENV_NAME}` are
|
|
112
|
+
* translated to `env_http_headers`, and `Authorization: Bearer ${ENV_NAME}` becomes
|
|
113
|
+
* `bearer_token_env_var`, so the secret itself stays out of argv. Other values must use Codex's
|
|
114
|
+
* literal `http_headers` because the protocol definition contains no environment reference.
|
|
115
|
+
*/
|
|
116
|
+
export const projectCodexMcpServers = (selectedIds, servers) => {
|
|
117
|
+
const args = [];
|
|
118
|
+
const warnings = [ADDITIVE_PROJECTION_WARNING];
|
|
119
|
+
for (const id of selectedIds) {
|
|
120
|
+
if (!CODEX_MCP_ID.test(id)) {
|
|
121
|
+
warnings.push(`codex adapter cannot project MCP server '${id}': id contains characters Codex -c key paths cannot express.`);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const server = asRecord(servers[id]);
|
|
125
|
+
const prefix = `mcp_servers.${id}`;
|
|
126
|
+
if (!supportedTransport(server.type)) {
|
|
127
|
+
const transport = typeof server.type === 'string' ? server.type : (JSON.stringify(server.type) ?? typeof server.type);
|
|
128
|
+
warnings.push(`codex adapter cannot project MCP server '${id}': transport '${transport}' is unsupported.`);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (typeof server.url === 'string') {
|
|
132
|
+
args.push(...projectHttpServer(id, prefix, server.url, server, warnings));
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (typeof server.command === 'string') {
|
|
136
|
+
args.push(...projectStdioServer(id, prefix, server.command, server, warnings));
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
warnings.push(`codex adapter cannot project MCP server '${id}': expected a URL or command.`);
|
|
140
|
+
}
|
|
141
|
+
return { args, warnings };
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=CodexMcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexMcp.js","sourceRoot":"","sources":["../../src/projection/CodexMcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CompositionPlan } from '../composer/Composition.js';
|
|
2
|
+
import type { Harness } from '../settings/Settings.js';
|
|
2
3
|
export interface MaterializedComposition {
|
|
3
4
|
readonly rootDirectory: string;
|
|
4
5
|
/** Absolute path to the composed system prompt written for the run. */
|
|
@@ -12,6 +13,7 @@ export interface MaterializedComposition {
|
|
|
12
13
|
/** Subagents whose merged agent definition could not be materialized. */
|
|
13
14
|
readonly skippedSubagents: readonly string[];
|
|
14
15
|
}
|
|
16
|
+
export declare const writeMcpConfig: (path: string, mcpServers: Readonly<Record<string, unknown>>) => void;
|
|
15
17
|
/**
|
|
16
18
|
* Overlays native harness configuration into the runtime root. Inputs arrive highest precedence
|
|
17
19
|
* first, so copying in reverse order lets higher layers replace matching files. Symlinked overlay
|
|
@@ -19,4 +21,4 @@ export interface MaterializedComposition {
|
|
|
19
21
|
*/
|
|
20
22
|
export declare const materializeConfigurationOverlays: (sourceDirectories: readonly string[], rootDirectory: string) => void;
|
|
21
23
|
/** Writes composed identity, skills, subagents, and selected MCP servers into the runtime root. */
|
|
22
|
-
export declare const materializeComposition: (composition: CompositionPlan, rootDirectory: string) => MaterializedComposition;
|
|
24
|
+
export declare const materializeComposition: (composition: CompositionPlan, rootDirectory: string, harness: Harness) => MaterializedComposition;
|
|
@@ -28,6 +28,10 @@ const writeGeneratedFile = (path, content) => {
|
|
|
28
28
|
removeTargetTypeConflict(path, 'file');
|
|
29
29
|
writeFileSync(path, content);
|
|
30
30
|
};
|
|
31
|
+
const serializeMcpConfig = (mcpServers) => `${JSON.stringify({ mcpServers }, null, 2)}\n`;
|
|
32
|
+
export const writeMcpConfig = (path, mcpServers) => {
|
|
33
|
+
writeGeneratedFile(path, serializeMcpConfig(mcpServers));
|
|
34
|
+
};
|
|
31
35
|
const safeName = (value) => value.replace(/[^a-zA-Z0-9._-]+/g, '-');
|
|
32
36
|
/**
|
|
33
37
|
* Overlays native harness configuration into the runtime root. Inputs arrive highest precedence
|
|
@@ -162,7 +166,7 @@ const materializeIdentity = (composition, rootDirectory) => {
|
|
|
162
166
|
return { systemPromptPath, appendPromptPaths };
|
|
163
167
|
};
|
|
164
168
|
/** Writes composed identity, skills, subagents, and selected MCP servers into the runtime root. */
|
|
165
|
-
export const materializeComposition = (composition, rootDirectory) => {
|
|
169
|
+
export const materializeComposition = (composition, rootDirectory, harness) => {
|
|
166
170
|
mkdirSync(rootDirectory, { recursive: true });
|
|
167
171
|
const { systemPromptPath, appendPromptPaths } = materializeIdentity(composition, rootDirectory);
|
|
168
172
|
const skillDirectories = [];
|
|
@@ -177,8 +181,8 @@ export const materializeComposition = (composition, rootDirectory) => {
|
|
|
177
181
|
}
|
|
178
182
|
}
|
|
179
183
|
const skippedSubagents = materializeSubagents(composition.loadout.subagents, composition.loadout.composedSubagents, rootDirectory);
|
|
180
|
-
if (composition.loadout.mcp.length > 0) {
|
|
181
|
-
|
|
184
|
+
if (harness === 'claude' || (harness === 'pi' && composition.loadout.mcp.length > 0)) {
|
|
185
|
+
writeMcpConfig(join(rootDirectory, 'mcp.json'), composition.loadout.mcpServers);
|
|
182
186
|
}
|
|
183
187
|
return {
|
|
184
188
|
rootDirectory,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Materialize.js","sourceRoot":"","sources":["../../src/projection/Materialize.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"Materialize.js","sourceRoot":"","sources":["../../src/projection/Materialize.ts"],"names":[],"mappings":"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"}
|