@ai-outfitter/outfitter 1.9.0 → 1.11.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/dist/agents/ClaudeConfigStrategy.d.ts +15 -0
- package/dist/agents/ClaudeConfigStrategy.js +53 -0
- package/dist/agents/ClaudeConfigStrategy.js.map +1 -0
- package/dist/agents/PiCredentialPersistence.d.ts +3 -3
- package/dist/agents/PiCredentialPersistence.js +9 -4
- package/dist/agents/PiCredentialPersistence.js.map +1 -1
- package/dist/cli/commands/RunAgentCommand.d.ts +5 -0
- package/dist/cli/commands/RunAgentCommand.js +33 -9
- package/dist/cli/commands/RunAgentCommand.js.map +1 -1
- package/dist/composer/Composer.js +3 -0
- package/dist/composer/Composer.js.map +1 -1
- package/dist/composer/Composition.d.ts +3 -0
- package/dist/composer/Models.d.ts +20 -0
- package/dist/composer/Models.js +160 -0
- package/dist/composer/Models.js.map +1 -0
- package/dist/projection/Materialize.d.ts +7 -0
- package/dist/projection/Materialize.js +27 -0
- package/dist/projection/Materialize.js.map +1 -1
- package/dist/projection/ModelProjection.d.ts +8 -0
- package/dist/projection/ModelProjection.js +127 -0
- package/dist/projection/ModelProjection.js.map +1 -0
- package/dist/projection/ProjectHarness.js +60 -24
- package/dist/projection/ProjectHarness.js.map +1 -1
- package/dist/projection/Projection.d.ts +11 -1
- package/dist/schemas/settings.schema.json +4 -0
- package/dist/settings/Settings.d.ts +14 -0
- package/dist/settings/Settings.js +7 -0
- package/dist/settings/Settings.js.map +1 -1
- package/dist/settings/SettingsLoader.js +4 -2
- package/dist/settings/SettingsLoader.js.map +1 -1
- package/dist/settings/SettingsMerger.js +3 -0
- package/dist/settings/SettingsMerger.js.map +1 -1
- package/docs/documentation/agents.md +36 -0
- package/docs/documentation/cli.md +8 -6
- package/docs/documentation/porting-claude.md +4 -0
- package/docs/documentation/settings.md +2 -0
- package/docs/documentation/state.md +17 -6
- package/docs/documentation/support-matrix.md +30 -27
- package/package.json +1 -1
- package/src/schemas/settings.schema.json +4 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Harness } from '../settings/Settings.js';
|
|
1
|
+
import type { Harness, Isolation } from '../settings/Settings.js';
|
|
2
2
|
export interface AgentLaunchPlan {
|
|
3
3
|
readonly command: string;
|
|
4
4
|
readonly args: readonly string[];
|
|
@@ -17,6 +17,16 @@ export interface ProjectionInput {
|
|
|
17
17
|
readonly harness: Harness;
|
|
18
18
|
readonly rootDirectory: string;
|
|
19
19
|
readonly homeDirectory: string;
|
|
20
|
+
/** Runtime credential values used only when a harness requires an environment-variable alias. */
|
|
21
|
+
readonly processEnvironment?: Readonly<Record<string, string | undefined>>;
|
|
22
|
+
/**
|
|
23
|
+
* Whether the launch stands on the machine's native harness configuration (claude only; pi and
|
|
24
|
+
* codex have no inherit path yet). Defaults to `inherit`, so a profile layers over the user's own
|
|
25
|
+
* trust, permissions, MCP servers, and plugins instead of replacing them.
|
|
26
|
+
*/
|
|
27
|
+
readonly isolation?: Isolation;
|
|
28
|
+
/** Profile slug, which names the generated plugin so its commands and subagents namespace readably. */
|
|
29
|
+
readonly profileSlug?: string;
|
|
20
30
|
/** Durable session store for the run (pi only); omitted to leave the harness default in place. */
|
|
21
31
|
readonly sessionDirectory?: string;
|
|
22
32
|
readonly passThroughArgs?: readonly string[];
|
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
"properties": {
|
|
7
7
|
"default_agent": { "type": "string", "minLength": 1 },
|
|
8
8
|
"default_harness": { "enum": ["pi", "claude", "codex"] },
|
|
9
|
+
"isolation": {
|
|
10
|
+
"enum": ["inherit", "isolated"],
|
|
11
|
+
"description": "Whether a run stands on the machine's native harness configuration (inherit, the default) or on the projection alone (isolated). Honored only from home-scope settings."
|
|
12
|
+
},
|
|
9
13
|
"cache_directory": { "type": "string", "minLength": 1 },
|
|
10
14
|
"state_persistence": {
|
|
11
15
|
"type": "object",
|
|
@@ -9,6 +9,14 @@ export type CustomSettings = Readonly<Record<string, SettingsValue>>;
|
|
|
9
9
|
/** Harnesses Outfitter can launch a composed agent in. */
|
|
10
10
|
export declare const HARNESSES: readonly ["pi", "claude", "codex"];
|
|
11
11
|
export type Harness = (typeof HARNESSES)[number];
|
|
12
|
+
/**
|
|
13
|
+
* How much of the user's own harness configuration a run stands on. `inherit` layers the
|
|
14
|
+
* composition over the machine's native configuration — trust, permissions, credentials, and the
|
|
15
|
+
* MCP servers and plugins already installed there. `isolated` launches from the projection alone,
|
|
16
|
+
* which is what a reproducible CI or container run wants.
|
|
17
|
+
*/
|
|
18
|
+
export declare const ISOLATIONS: readonly ["inherit", "isolated"];
|
|
19
|
+
export type Isolation = (typeof ISOLATIONS)[number];
|
|
12
20
|
/** Functional persistence strategies for adapter-declared state paths. */
|
|
13
21
|
export type StatePersistenceStrategy = 'symlink' | 'discard' | 'warn' | 'error' | 'prompt';
|
|
14
22
|
export type StatePersistence = Readonly<Record<string, StatePersistenceStrategy>>;
|
|
@@ -47,6 +55,12 @@ export interface Settings {
|
|
|
47
55
|
readonly defaultAgent?: string;
|
|
48
56
|
/** Harness that plain `outfitter` launches when `--harness` is omitted. */
|
|
49
57
|
readonly defaultHarness?: Harness;
|
|
58
|
+
/**
|
|
59
|
+
* Whether runs stand on the machine's native harness configuration. Honored only from the home
|
|
60
|
+
* scope: a checked-in project or a remote catalog must not decide how much of the user's machine
|
|
61
|
+
* a profile it ships sees.
|
|
62
|
+
*/
|
|
63
|
+
readonly isolation?: Isolation;
|
|
50
64
|
readonly sources?: readonly SourceReference[];
|
|
51
65
|
readonly remoteSettings?: readonly RemoteSettingsReference[];
|
|
52
66
|
readonly cacheDirectory?: string;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
/** Harnesses Outfitter can launch a composed agent in. */
|
|
2
2
|
export const HARNESSES = ['pi', 'claude', 'codex'];
|
|
3
|
+
/**
|
|
4
|
+
* How much of the user's own harness configuration a run stands on. `inherit` layers the
|
|
5
|
+
* composition over the machine's native configuration — trust, permissions, credentials, and the
|
|
6
|
+
* MCP servers and plugins already installed there. `isolated` launches from the projection alone,
|
|
7
|
+
* which is what a reproducible CI or container run wants.
|
|
8
|
+
*/
|
|
9
|
+
export const ISOLATIONS = ['inherit', 'isolated'];
|
|
3
10
|
export const emptySettings = () => ({
|
|
4
11
|
sources: [],
|
|
5
12
|
remoteSettings: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/settings/Settings.ts"],"names":[],"mappings":"AAQA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/settings/Settings.ts"],"names":[],"mappings":"AAQA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAG5D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,UAAU,CAAU,CAAC;AAkD3D,MAAM,CAAC,MAAM,aAAa,GAAG,GAAa,EAAE,CAAC,CAAC;IAC5C,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,EAAE;CACnB,CAAC,CAAC"}
|
|
@@ -117,12 +117,14 @@ const addSettingsFile = (location, files, issues) => {
|
|
|
117
117
|
settings: convertSettingsDocument(parsed.document, dirname(location.path), location.scope),
|
|
118
118
|
});
|
|
119
119
|
};
|
|
120
|
-
// Enterprise governance controls are honored only from the user's own
|
|
121
|
-
// checked-in project or remote catalog cannot enable private catalogs
|
|
120
|
+
// Enterprise governance controls and the isolation choice are honored only from the user's own
|
|
121
|
+
// ~/.agents settings so a checked-in project or remote catalog cannot enable private catalogs, or
|
|
122
|
+
// decide how much of the user's machine a profile it ships can see, on the user's behalf.
|
|
122
123
|
const isHomeScope = (scope) => scope === 'user' || scope === 'user-local';
|
|
123
124
|
const convertSettingsDocument = (document, settingsDirectory, scope) => ({
|
|
124
125
|
defaultAgent: document.default_agent,
|
|
125
126
|
defaultHarness: document.default_harness,
|
|
127
|
+
isolation: isHomeScope(scope) ? document.isolation : undefined,
|
|
126
128
|
sources: document.sources?.map((source) => convertSource(source, settingsDirectory)),
|
|
127
129
|
remoteSettings: document.remote_settings?.map(convertRemoteSettingsSource),
|
|
128
130
|
cacheDirectory: document.cache_directory === undefined
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"SettingsLoader.js","sourceRoot":"","sources":["../../src/settings/SettingsLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { emptySettings } from './Settings.js';
|
|
|
5
5
|
export const mergeSettingsStack = (settingsStack) => {
|
|
6
6
|
let defaultAgent;
|
|
7
7
|
let defaultHarness;
|
|
8
|
+
let isolation;
|
|
8
9
|
let sources;
|
|
9
10
|
let remoteSettings;
|
|
10
11
|
let cacheDirectory;
|
|
@@ -16,6 +17,7 @@ export const mergeSettingsStack = (settingsStack) => {
|
|
|
16
17
|
for (const settings of settingsStack) {
|
|
17
18
|
defaultAgent = settings.defaultAgent ?? defaultAgent;
|
|
18
19
|
defaultHarness = settings.defaultHarness ?? defaultHarness;
|
|
20
|
+
isolation = settings.isolation ?? isolation;
|
|
19
21
|
sources = settings.sources ?? sources;
|
|
20
22
|
remoteSettings = settings.remoteSettings ?? remoteSettings;
|
|
21
23
|
cacheDirectory = settings.cacheDirectory ?? cacheDirectory;
|
|
@@ -32,6 +34,7 @@ export const mergeSettingsStack = (settingsStack) => {
|
|
|
32
34
|
...emptySettings(),
|
|
33
35
|
defaultAgent,
|
|
34
36
|
defaultHarness,
|
|
37
|
+
isolation,
|
|
35
38
|
sources: sources ?? [],
|
|
36
39
|
remoteSettings: remoteSettings ?? [],
|
|
37
40
|
cacheDirectory,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsMerger.js","sourceRoot":"","sources":["../../src/settings/SettingsMerger.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qDAAqD;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,aAAkC,EAAY,EAAE;IACjF,IAAI,YAAgC,CAAC;IACrC,IAAI,cAA0C,CAAC;IAC/C,IAAI,OAA4B,CAAC;IACjC,IAAI,cAA0C,CAAC;IAC/C,IAAI,cAAkC,CAAC;IACvC,IAAI,gBAA8C,CAAC;IACnD,IAAI,cAA0C,CAAC;IAC/C,IAAI,OAA4B,CAAC;IACjC,IAAI,UAAkC,CAAC;IACvC,IAAI,SAAgC,CAAC;IAErC,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,YAAY,GAAG,QAAQ,CAAC,YAAY,IAAI,YAAY,CAAC;QACrD,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"SettingsMerger.js","sourceRoot":"","sources":["../../src/settings/SettingsMerger.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qDAAqD;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,aAAkC,EAAY,EAAE;IACjF,IAAI,YAAgC,CAAC;IACrC,IAAI,cAA0C,CAAC;IAC/C,IAAI,SAAgC,CAAC;IACrC,IAAI,OAA4B,CAAC;IACjC,IAAI,cAA0C,CAAC;IAC/C,IAAI,cAAkC,CAAC;IACvC,IAAI,gBAA8C,CAAC;IACnD,IAAI,cAA0C,CAAC;IAC/C,IAAI,OAA4B,CAAC;IACjC,IAAI,UAAkC,CAAC;IACvC,IAAI,SAAgC,CAAC;IAErC,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,YAAY,GAAG,QAAQ,CAAC,YAAY,IAAI,YAAY,CAAC;QACrD,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,cAAc,CAAC;QAC3D,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,SAAS,CAAC;QAE5C,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC;QACtC,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,cAAc,CAAC;QAC3D,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,cAAc,CAAC;QAC3D,gBAAgB;YACd,QAAQ,CAAC,gBAAgB,KAAK,SAAS;gBACrC,CAAC,CAAC,gBAAgB;gBAClB,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC5D,cAAc,GAAG,2BAA2B,CAAC,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;QACtF,OAAO,GAAG,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzF,UAAU,GAAG,QAAQ,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxG,SAAS,GAAG,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IACrG,CAAC;IAED,OAAO;QACL,GAAG,aAAa,EAAE;QAClB,YAAY;QACZ,cAAc;QACd,SAAS;QACT,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,cAAc,EAAE,cAAc,IAAI,EAAE;QACpC,cAAc;QACd,gBAAgB,EAAE,gBAAgB,IAAI,EAAE;QACxC,cAAc,EAAE,cAAc,IAAI,EAAE;QACpC,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,UAAU,EAAE,UAAU,IAAI,EAAE;QAC5B,SAAS,EAAE,SAAS,IAAI,EAAE;KAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAClC,eAA2C,EAC3C,gBAA4C,EAChB,EAAE,CAC9B,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAE5G,MAAM,mBAAmB,GAAG,CAC1B,eAA2C,EAC3C,gBAAgC,EAChB,EAAE,CAAC,sBAAsB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC"}
|
|
@@ -76,6 +76,42 @@ See [Skills](./skills.md#agent-local-skills).
|
|
|
76
76
|
`subagents` are always catalog-wide (a delegate is a shared agent).
|
|
77
77
|
`extensions`/`plugins` are harness-native passthroughs with no on-disk namespace, and `model`/`thinking`/`tools` are per-agent already via `config.json` merge.
|
|
78
78
|
|
|
79
|
+
### Provider and model registry
|
|
80
|
+
|
|
81
|
+
A selected model uses `provider/model`. Outfitter resolves it against the effective layered `models.json`; workspace definitions override home and catalog definitions by provider ID, while model entries merge by model ID. The resulting provider endpoint is canonical for the run — adapters do not silently reuse the model ID against a harness default endpoint.
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"providers": {
|
|
86
|
+
"company-claude": {
|
|
87
|
+
"name": "Company Anthropic gateway",
|
|
88
|
+
"baseUrl": "https://models.example.com/anthropic",
|
|
89
|
+
"api": "anthropic-messages",
|
|
90
|
+
"apiKey": "$COMPANY_MODELS_TOKEN",
|
|
91
|
+
"headers": { "X-Tenant": "engineering" },
|
|
92
|
+
"models": [{ "id": "luna", "reasoning": true }]
|
|
93
|
+
},
|
|
94
|
+
"company-codex": {
|
|
95
|
+
"name": "Company OpenAI gateway",
|
|
96
|
+
"baseUrl": "https://models.example.com/openai/v1",
|
|
97
|
+
"api": "openai-responses",
|
|
98
|
+
"apiKey": "$COMPANY_MODELS_TOKEN",
|
|
99
|
+
"models": [{ "id": "sol", "reasoning": true }]
|
|
100
|
+
},
|
|
101
|
+
"ollama": {
|
|
102
|
+
"name": "Local Ollama",
|
|
103
|
+
"baseUrl": "http://127.0.0.1:11434/v1",
|
|
104
|
+
"api": "openai-completions",
|
|
105
|
+
"models": [{ "id": "qwen3-coder" }]
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
An agent can select `company-claude/luna`, `company-codex/sol`, or `ollama/qwen3-coder` without carrying endpoint configuration of its own. Pi receives the merged registry plus native provider/model flags. Claude Code projects `anthropic-messages` targets through its native gateway environment. Codex projects `openai-responses` targets through native provider overrides. The example Ollama `openai-completions` target remains available to Pi, but Codex reports it as unsupported. An unsupported dialect warns and fails under `--strict`; it never falls back to the same model name at another endpoint.
|
|
112
|
+
|
|
113
|
+
Credentials are references, not catalog content: use a single environment-variable reference such as `"$COMPANY_MODELS_TOKEN"`. Literal API keys, command-based credential sources, and literal `Authorization` headers are rejected. Supply the named variable in the launch environment.
|
|
114
|
+
|
|
79
115
|
## Inheritance and prompt fragments
|
|
80
116
|
|
|
81
117
|
An agent may specialize one or more base agents with `inherits`.
|
|
@@ -13,12 +13,14 @@ See [Telemetry](./telemetry.md) for the pseudonymous analytics event contract an
|
|
|
13
13
|
|
|
14
14
|
Resolve, compose, and launch an agent. `run` is the default command, so plain `outfitter` and `outfitter run` are equivalent.
|
|
15
15
|
|
|
16
|
-
| Argument / Option | Description
|
|
17
|
-
| --------------------- |
|
|
18
|
-
| `[agent]` | Agent slug to run. Defaults to the settings `default_agent`.
|
|
19
|
-
| `--harness <harness>` | Harness to launch in: `pi`, `claude`, or `codex`. Defaults to `default_harness`.
|
|
20
|
-
| `--log-level <level>` | Use `info` for quiet loading or `debug` for installer output.
|
|
21
|
-
| `--strict` | Fail instead of warning when the adapter cannot project part of the composition.
|
|
16
|
+
| Argument / Option | Description |
|
|
17
|
+
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
18
|
+
| `[agent]` | Agent slug to run. Defaults to the settings `default_agent`. |
|
|
19
|
+
| `--harness <harness>` | Harness to launch in: `pi`, `claude`, or `codex`. Defaults to `default_harness`. |
|
|
20
|
+
| `--log-level <level>` | Use `info` for quiet loading or `debug` for installer output. |
|
|
21
|
+
| `--strict` | Fail instead of warning when the adapter cannot project part of the composition. |
|
|
22
|
+
| `--isolated` | Launch from the composition alone, ignoring your own harness configuration (trust, permissions, MCP servers, plugins). Claude only; the default is to inherit it. |
|
|
23
|
+
| `--retain-projection` | Keep the runtime projection directory after the run and print its path, for inspection. |
|
|
22
24
|
|
|
23
25
|
Set `OUTFITTER_LOG_LEVEL=debug` to enable debug startup output without passing the option. The
|
|
24
26
|
`setup` command also accepts `--log-level` for its automatic profile launch.
|
|
@@ -31,6 +31,10 @@ Runtime and account state is not configuration and stays in `~/.claude` untouche
|
|
|
31
31
|
|
|
32
32
|
This is the same boundary [state persistence](./state.md) enforces at run time: configuration lives in the tree, mutable state lives with the harness.
|
|
33
33
|
|
|
34
|
+
Staying native does not mean being ignored. A Claude run inherits this state by default, so the
|
|
35
|
+
permissions, hooks, plugins, trust, and MCP servers listed above apply to an Outfitter-launched
|
|
36
|
+
session exactly as they do to a native one. `--isolated` is what leaves them behind.
|
|
37
|
+
|
|
34
38
|
## After porting
|
|
35
39
|
|
|
36
40
|
Your resources are now protocol resources. Reference them by slug from an agent's loadout like anything else:
|
|
@@ -23,6 +23,7 @@ In a standalone `.agents` repository the repository root is the tree, so the fil
|
|
|
23
23
|
# .agents/settings.yml
|
|
24
24
|
default_agent: engineer # which agent runs by default
|
|
25
25
|
default_harness: pi # which harness to launch: pi, claude, or codex
|
|
26
|
+
isolation: inherit # inherit (default) or isolated; see below. Honored only from ~/.agents.
|
|
26
27
|
|
|
27
28
|
# Where protocol resources come from, beyond this tree and ~/.agents.
|
|
28
29
|
sources:
|
|
@@ -47,6 +48,7 @@ telemetry:
|
|
|
47
48
|
```
|
|
48
49
|
|
|
49
50
|
- `default_agent` / `default_harness` — which agent plain `outfitter` runs, and the harness it launches in.
|
|
51
|
+
- `isolation` — whether a run stands on the harness configuration already on this machine. `inherit`, the default, layers the composition over it, so a Claude run keeps your workspace trust, permissions, credentials, plugins, and MCP servers. `isolated` launches from the composition alone, which is what a reproducible CI or container run wants; `--isolated` selects it for one run. Only Claude has an inherit path today. This key is honored **only** from your own `~/.agents` settings: a checked-in project or a remote catalog must not decide how much of your machine a profile it ships can see.
|
|
50
52
|
- `sources` — ordered list of remote or local `.agents` payloads. Remote entries (`github:` / `uri:`) accept `ref:` pinning and an optional `path:` to the payload inside the repository; see [Catalogs](./catalogs.md) for conventions and trust guidance.
|
|
51
53
|
- `remote_settings` — shared settings a repository distributes; cached locally and merged below your project and user settings, so anything you set locally wins.
|
|
52
54
|
- `cache_directory` — the repository cache root used consistently by sync, remote settings, remote
|
|
@@ -76,7 +76,7 @@ Undeclared writes governed by `unknown: prompt` cannot be persisted because they
|
|
|
76
76
|
|
|
77
77
|
## Temporary directory cleanup
|
|
78
78
|
|
|
79
|
-
Baked composition directories are created under the system temporary directory and removed automatically when the Outfitter process exits or receives a handled signal. Removal deletes symlink entries without following them, so the durable auth/settings state the links point at is never touched. Pass `--
|
|
79
|
+
Baked composition directories are created under the system temporary directory and removed automatically when the Outfitter process exits or receives a handled signal. Removal deletes symlink entries without following them, so the durable auth/settings state the links point at is never touched. Pass `--retain-projection` to keep the directory for inspection; Outfitter prints its path.
|
|
80
80
|
|
|
81
81
|
Each startup also best-effort sweeps `outfitter-*` directories older than seven days from the temporary root. The sweep never follows symlinks, so a stale directory's links are removed while their targets survive.
|
|
82
82
|
|
|
@@ -190,7 +190,15 @@ The last form is how a resident or in-cluster agent keeps continuity across rest
|
|
|
190
190
|
|
|
191
191
|
## Claude Code state paths
|
|
192
192
|
|
|
193
|
-
|
|
193
|
+
By default a Claude run inherits the machine's own configuration: Outfitter sets no
|
|
194
|
+
`CLAUDE_CONFIG_DIR`, and the composition reaches the session as a plugin directory instead. Claude
|
|
195
|
+
reads and writes `~/.claude` exactly as it does in a native session, so credentials, workspace
|
|
196
|
+
trust, permission approvals, and session history need no bridge at all — there is nothing to seed
|
|
197
|
+
and nothing to copy back, and nothing Outfitter does can race your other Claude sessions. The rest
|
|
198
|
+
of this section describes an **isolated** run (`--isolated`, or `isolation: isolated` in your
|
|
199
|
+
`~/.agents/settings.yml`), where the projection is the whole configuration.
|
|
200
|
+
|
|
201
|
+
Under isolation, Claude credentials need a narrow adapter bridge in addition to the path-keyed state below. Claude
|
|
194
202
|
reads `.credentials.json` and `.claude.json` directly from `CLAUDE_CONFIG_DIR`; the ephemeral
|
|
195
203
|
projection gives `.credentials.json` no durable home, and `.claude.json`'s native location
|
|
196
204
|
(`~/.claude.json`, outside `~/.claude`) does not share its config-dir-relative path. Outfitter
|
|
@@ -203,11 +211,11 @@ instead of copying the projected credentials back. Claude MCP OAuth tokens
|
|
|
203
211
|
live under `mcpOAuth` in `.credentials.json`, keyed by `<serverName>|<hash>`, so server
|
|
204
212
|
authorizations acquired in an Outfitter-launched Claude session persist across runs through that
|
|
205
213
|
whole-file copy-back. Outfitter never copies the full machine-local `~/.claude.json` into a
|
|
206
|
-
projection or merges its other projected state back. Trust accepted inside an
|
|
207
|
-
therefore discarded, so
|
|
208
|
-
natively.
|
|
214
|
+
projection or merges its other projected state back. Trust accepted inside an isolated session is
|
|
215
|
+
therefore discarded, so an isolated run prompts for trust in a workspace that was never trusted
|
|
216
|
+
natively — which is one reason isolation is not the default.
|
|
209
217
|
|
|
210
|
-
Claude session history has a second narrow bridge because `CLAUDE_CONFIG_DIR` also redirects
|
|
218
|
+
Isolated Claude session history has a second narrow bridge because `CLAUDE_CONFIG_DIR` also redirects
|
|
211
219
|
Claude's native `projects/` tree into the temporary projection. Before launch, Outfitter derives
|
|
212
220
|
Claude's project slug from the absolute working directory and copies only that slug directory from
|
|
213
221
|
`~/.claude/projects/`. This keeps other projects' transcripts out of the projection while making
|
|
@@ -217,6 +225,9 @@ the projection's slug directories back into `~/.claude/projects/` atomically wit
|
|
|
217
225
|
Durable files are never deleted. A seed or copy-back failure emits a warning and does not replace
|
|
218
226
|
Claude's exit code or error.
|
|
219
227
|
|
|
228
|
+
These declared paths describe the isolated strategy; an inherited run writes to the native
|
|
229
|
+
locations directly and declares nothing.
|
|
230
|
+
|
|
220
231
|
The Claude Code adapter declares these paths:
|
|
221
232
|
|
|
222
233
|
```yaml
|
|
@@ -12,33 +12,35 @@ When a composition requests something an adapter cannot project, Outfitter warns
|
|
|
12
12
|
|
|
13
13
|
Tasks and bake are not in this matrix — they are the subject of a [separate upcoming RFC](./tasks.md).
|
|
14
14
|
|
|
15
|
-
| What Outfitter projects | Pi | Claude Code | Codex CLI
|
|
16
|
-
| ------------------------------------------------------------------------ | --------- | ----------- |
|
|
17
|
-
| Agent config directory | Supported | Supported | Roadmap
|
|
18
|
-
| Session directory | Supported | Supported | Roadmap
|
|
19
|
-
| Agent identity (`system-prompt.md`, `agents.md`, `agents/<id>/agent.md`) | Supported | Supported | Roadmap
|
|
20
|
-
| Subagents (`agents/<id>` as harness delegates) | Supported | Supported | Roadmap
|
|
21
|
-
| Skills (`skills/<id>`) | Supported | Partial | Roadmap
|
|
22
|
-
| Commands (`commands/`) | Supported | Partial | Roadmap
|
|
23
|
-
| Knowledge (`knowledge/`) | Supported | Partial | Roadmap
|
|
24
|
-
| Model selection (`models.json`) | Supported |
|
|
25
|
-
| MCP servers (`mcp.json`) | Supported | Supported | Partial
|
|
26
|
-
| Extensions (agent `extensions:` loadout) | Supported | Pi only | Pi only
|
|
27
|
-
| Plugins (agent `plugins:` loadout) | Supported | Roadmap | Roadmap
|
|
28
|
-
| Credentials and environment | Supported | Supported | Roadmap
|
|
29
|
-
| DeepWork job selection | Supported | Roadmap | Roadmap
|
|
30
|
-
| Hooks | Partial | Partial | Roadmap
|
|
31
|
-
| Tool availability (agent `tools:` loadout) | Supported | Supported | Roadmap
|
|
32
|
-
| Theme / UI presentation | Roadmap | Roadmap | Roadmap
|
|
33
|
-
| Working directory | Roadmap | Roadmap | Roadmap
|
|
34
|
-
| Pass-through arguments | Supported | Supported | Supported
|
|
35
|
-
| Bootstrap hook | Supported | Roadmap | Roadmap
|
|
15
|
+
| What Outfitter projects | Pi | Claude Code | Codex CLI |
|
|
16
|
+
| ------------------------------------------------------------------------ | --------- | ----------- | ---------- |
|
|
17
|
+
| Agent config directory | Supported | Supported | Roadmap |
|
|
18
|
+
| Session directory | Supported | Supported | Roadmap |
|
|
19
|
+
| Agent identity (`system-prompt.md`, `agents.md`, `agents/<id>/agent.md`) | Supported | Supported | Roadmap |
|
|
20
|
+
| Subagents (`agents/<id>` as harness delegates) | Supported | Supported | Roadmap |
|
|
21
|
+
| Skills (`skills/<id>`) | Supported | Partial | Roadmap |
|
|
22
|
+
| Commands (`commands/`) | Supported | Partial | Roadmap |
|
|
23
|
+
| Knowledge (`knowledge/`) | Supported | Partial | Roadmap |
|
|
24
|
+
| Model selection (`models.json`) | Supported | Supported¹ | Supported² |
|
|
25
|
+
| MCP servers (`mcp.json`) | Supported | Supported | Partial |
|
|
26
|
+
| Extensions (agent `extensions:` loadout) | Supported | Pi only | Pi only |
|
|
27
|
+
| Plugins (agent `plugins:` loadout) | Supported | Roadmap | Roadmap |
|
|
28
|
+
| Credentials and environment | Supported | Supported | Roadmap |
|
|
29
|
+
| DeepWork job selection | Supported | Roadmap | Roadmap |
|
|
30
|
+
| Hooks | Partial | Partial | Roadmap |
|
|
31
|
+
| Tool availability (agent `tools:` loadout) | Supported | Supported | Roadmap |
|
|
32
|
+
| Theme / UI presentation | Roadmap | Roadmap | Roadmap |
|
|
33
|
+
| Working directory | Roadmap | Roadmap | Roadmap |
|
|
34
|
+
| Pass-through arguments | Supported | Supported | Supported |
|
|
35
|
+
| Bootstrap hook | Supported | Roadmap | Roadmap |
|
|
36
|
+
|
|
37
|
+
¹ Canonical `anthropic-messages` providers. ² Canonical `openai-responses` providers. Other dialects warn and fail under `--strict` rather than changing endpoints.
|
|
36
38
|
|
|
37
39
|
## Codex CLI notes
|
|
38
40
|
|
|
39
41
|
- **Launch mode** — Outfitter launches `codex` directly. Pass-through arguments choose the native mode: no subcommand keeps the interactive CLI shape, while `-- exec ...` selects non-interactive `codex exec`.
|
|
40
42
|
- **Agent identity and appended prompts** — Codex has no native identity projection yet: launches drop the composed identity/system prompt and any `--append-prompt` documents, supplied documents produce a separate warning, and `--strict` aborts before execution.
|
|
41
|
-
- **Model selection
|
|
43
|
+
- **Model selection** — an agent's `provider/model` selection resolves from layered `models.json`. OpenAI Responses providers map to native `model_provider`, `base_url`, `env_key`, header, wire API, and `-m` overrides. Unsupported dialects warn and omit the target instead of reusing its model ID against Codex's default endpoint. Thinking, tools, skills, subagents, plugins, and prompt templates remain unsupported and warn when selected.
|
|
42
44
|
- **Extensions (Pi only)** — `extensions:` names pi extension packages, so a Codex or Claude Code launch installs none of them. This is a property of the element, not a gap a user can close, so it produces no warning and does not fail under `--strict`.
|
|
43
45
|
- **MCP servers (Partial)** — selected stdio fields (`command`, `args`, `env`, `cwd`) and streamable HTTP fields (`url`, `headers`) become repeated TOML-valued `-c mcp_servers.<id>.<key>=...` overrides. Server ids must contain only letters, digits, `_`, or `-`; other ids cannot be expressed by Codex `-c` key paths and are skipped with a warning. Legacy SSE and other HTTP transport types are also skipped with a warning. User and project `config.toml` servers remain active because Codex has no strict MCP isolation mode, so every launch warns that projection is additive, even when no servers are selected.
|
|
44
46
|
- **Stdio environment safety** — `${ENV_NAME}` becomes an `env_vars` reference only when the stdio `env` key is also `ENV_NAME`; a reference that would rename the variable is dropped with a warning. Literal values pass through `env` and are visible in process arguments.
|
|
@@ -46,13 +48,14 @@ Tasks and bake are not in this matrix — they are the subject of a [separate up
|
|
|
46
48
|
|
|
47
49
|
## Claude Code notes
|
|
48
50
|
|
|
49
|
-
- **
|
|
51
|
+
- **Your configuration comes first** — by default a Claude run stands on the configuration already on the machine. Outfitter sets no `CLAUDE_CONFIG_DIR`; it declares the baked composition a Claude plugin and passes it through `--plugin-dir`, so the session keeps your workspace trust, `~/.claude/settings.json` permissions, credentials, plugins, and configured MCP servers, and the profile's skills, subagents, and prompts layer on top. Nothing is seeded and nothing is copied back, because Claude is reading and writing its real configuration directory throughout. Pass `--isolated`, or set `isolation: isolated` in your `~/.agents/settings.yml`, to launch from the composition alone — the reproducible form for CI and containers, and what the remaining bullets in this section describe. If the installed Claude is too old to load a plugin directory, Outfitter falls back to an isolated run and says so rather than failing the launch.
|
|
52
|
+
- **Isolated config and session state** — an isolated run points `CLAUDE_CONFIG_DIR` at the baked composition. Before launch it copies only the current working directory's history from `~/.claude/projects/<project-slug>/` into the projection, so native `--continue` and `--resume` work without exposing other projects. After every successful or failed launch it atomically merges new or changed session files from every projected slug back into `~/.claude/projects/` with mode `0600`, never deleting durable history. Session bridge failures warn without masking the Claude exit. Outfitter also declares Claude state paths (`settings.json`, `agents/`, `skills/`, `commands/`, `plugins/`, `projects/`) for [state persistence](./state.md), and can [symlink a ported `~/.claude`](./porting-claude.md) so native use keeps working. MCP configuration from that port is no longer auto-discovered by Outfitter-launched Claude runs; those servers apply only when an agent selects them by slug. See the next bullet.
|
|
50
53
|
- **Credentials, onboarding, and workspace trust** — before launch, Outfitter copies `~/.claude/.credentials.json` to the temporary root as `.credentials.json` with mode `0600`. The projected `.claude.json` contains `oauthAccount` and `hasCompletedOnboarding` when those keys are present in durable `~/.claude.json`. It also contains `projects[<cwd>].hasTrustDialogAccepted: true` only when that exact accepted trust decision already exists there; other projects and unrelated machine state are not copied. After any successful or failed launch, a `.credentials.json` changed by the run is copied back wholesale and `oauthAccount` is atomically merged into durable `.claude.json` without replacing unrelated keys. If the durable credentials also changed after seeding, Outfitter preserves that concurrent refresh and warns instead of copying back. MCP OAuth tokens live under `mcpOAuth` in `.credentials.json`, keyed by `<serverName>|<hash>`, so authorizations acquired in an Outfitter-launched Claude session persist across runs. Other projected `.claude.json` state, including trust accepted during the session, is discarded; a workspace that has never been trusted by native Claude therefore prompts again on every run.
|
|
51
|
-
- **MCP servers** — every Claude launch passes the generated `mcp.json` through `--mcp-config
|
|
52
|
-
- **Subagents** — selected `agents/<id>` definitions are materialized into
|
|
54
|
+
- **MCP servers** — every Claude launch passes the generated `mcp.json` through `--mcp-config`. An inherited run stops there, so the composition's servers merge with the ones already configured on the machine: selecting a server says what the profile needs, not what the user may not have. An isolated run adds `--strict-mcp-config`, which excludes MCP servers from user or project configuration, `.claude.json`, and plugins so only the composition's servers are active.
|
|
55
|
+
- **Subagents** — selected `agents/<id>` definitions are materialized into the composition's agents directory. An inherited run loads them under the plugin's name (`<profile>:<subagent>`); an isolated run finds them natively under `CLAUDE_CONFIG_DIR`.
|
|
53
56
|
- **Skills (Partial)** — selected skills are materialized into the config directory's skills surface; remaining gaps are tracked per release. The bundled Outfitter skill ships through the plugin channel.
|
|
54
|
-
- **Model selection
|
|
55
|
-
- **Hooks
|
|
57
|
+
- **Model selection** — an agent's `provider/model` selection resolves from layered `models.json`. Anthropic Messages providers map to native `--model`, `ANTHROPIC_BASE_URL`, `ANTHROPIC_AUTH_TOKEN`, and custom-header controls. Unsupported dialects warn and omit the target instead of reusing its model ID against Claude's default endpoint. Thinking level maps to `--effort`.
|
|
58
|
+
- **Hooks** — Outfitter does not project hook configuration for Claude, and there is no portable protocol hooks resource yet. An inherited run keeps the hooks in your own `~/.claude/settings.json`; an isolated run has none. See [Hooks](./hooks.md).
|
|
56
59
|
- **Tool availability** — `tools.allow` (after `tools.deny` removes entries) maps to both `--tools` (_availability_: an unlisted builtin is not in the session) and `--allowedTools` (_permission_: the granted tools are pre-approved, so a headless session is not stopped by a prompt); `tools.deny` always maps to `--disallowedTools`, including when both are declared, and a bare denied name removes the tool from context per Claude's docs. An allowlist that `tools.deny` empties maps to `--tools ""`, Claude's documented "disable all tools" form. Caveat: per the CLI reference, `--tools` governs the built-in set only — MCP tools (`mcp__server__*`) are unaffected and are governed by which MCP servers the loadout selects, so `--tools ""` is not exactly pi's zero-tool session when MCP servers are present. Claude's behavior here comes from `claude --help` and the CLI reference, not local measurement.
|
|
57
60
|
- **DeepWork jobs** — job selection is Pi-only today and warns on Claude.
|
|
58
61
|
- **Bundled Outfitter skill** — every launch also publishes Outfitter's own self-documentation skill as a bundled plugin, so the agent can explain Outfitter and this launch's configuration.
|
package/package.json
CHANGED
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
"properties": {
|
|
7
7
|
"default_agent": { "type": "string", "minLength": 1 },
|
|
8
8
|
"default_harness": { "enum": ["pi", "claude", "codex"] },
|
|
9
|
+
"isolation": {
|
|
10
|
+
"enum": ["inherit", "isolated"],
|
|
11
|
+
"description": "Whether a run stands on the machine's native harness configuration (inherit, the default) or on the projection alone (isolated). Honored only from home-scope settings."
|
|
12
|
+
},
|
|
9
13
|
"cache_directory": { "type": "string", "minLength": 1 },
|
|
10
14
|
"state_persistence": {
|
|
11
15
|
"type": "object",
|