@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.
Files changed (40) hide show
  1. package/dist/agents/ClaudeConfigStrategy.d.ts +15 -0
  2. package/dist/agents/ClaudeConfigStrategy.js +53 -0
  3. package/dist/agents/ClaudeConfigStrategy.js.map +1 -0
  4. package/dist/agents/PiCredentialPersistence.d.ts +3 -3
  5. package/dist/agents/PiCredentialPersistence.js +9 -4
  6. package/dist/agents/PiCredentialPersistence.js.map +1 -1
  7. package/dist/cli/commands/RunAgentCommand.d.ts +5 -0
  8. package/dist/cli/commands/RunAgentCommand.js +33 -9
  9. package/dist/cli/commands/RunAgentCommand.js.map +1 -1
  10. package/dist/composer/Composer.js +3 -0
  11. package/dist/composer/Composer.js.map +1 -1
  12. package/dist/composer/Composition.d.ts +3 -0
  13. package/dist/composer/Models.d.ts +20 -0
  14. package/dist/composer/Models.js +160 -0
  15. package/dist/composer/Models.js.map +1 -0
  16. package/dist/projection/Materialize.d.ts +7 -0
  17. package/dist/projection/Materialize.js +27 -0
  18. package/dist/projection/Materialize.js.map +1 -1
  19. package/dist/projection/ModelProjection.d.ts +8 -0
  20. package/dist/projection/ModelProjection.js +127 -0
  21. package/dist/projection/ModelProjection.js.map +1 -0
  22. package/dist/projection/ProjectHarness.js +60 -24
  23. package/dist/projection/ProjectHarness.js.map +1 -1
  24. package/dist/projection/Projection.d.ts +11 -1
  25. package/dist/schemas/settings.schema.json +4 -0
  26. package/dist/settings/Settings.d.ts +14 -0
  27. package/dist/settings/Settings.js +7 -0
  28. package/dist/settings/Settings.js.map +1 -1
  29. package/dist/settings/SettingsLoader.js +4 -2
  30. package/dist/settings/SettingsLoader.js.map +1 -1
  31. package/dist/settings/SettingsMerger.js +3 -0
  32. package/dist/settings/SettingsMerger.js.map +1 -1
  33. package/docs/documentation/agents.md +36 -0
  34. package/docs/documentation/cli.md +8 -6
  35. package/docs/documentation/porting-claude.md +4 -0
  36. package/docs/documentation/settings.md +2 -0
  37. package/docs/documentation/state.md +17 -6
  38. package/docs/documentation/support-matrix.md +30 -27
  39. package/package.json +1 -1
  40. 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;AA4C5D,MAAM,CAAC,MAAM,aAAa,GAAG,GAAa,EAAE,CAAC,CAAC;IAC5C,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,EAAE;CACnB,CAAC,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 ~/.agents settings so a
121
- // checked-in project or remote catalog cannot enable private catalogs on the user's behalf.
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":"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"}
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;QAE3D,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,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"}
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 `--debug` to keep the directory for inspection; Outfitter prints its path.
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
- Claude credentials need a narrow adapter bridge in addition to the path-keyed state below. Claude
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 Outfitter session is
207
- therefore discarded, so Claude prompts for trust on every run in a workspace that was never trusted
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 | Partial | Partial |
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 (Partial)** — an agent's model maps to `-m`. Provider maps have no projection element and produce no warning. Thinking, tools, skills, subagents, plugins, and prompt templates remain unsupported and warn when selected.
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
- - **Config and session state** — Outfitter 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.
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` with `--strict-mcp-config`. MCP servers from user or project configuration, `.claude.json`, and plugins are therefore excluded; only servers selected by the composition are active.
52
- - **Subagents** — selected `agents/<id>` definitions are materialized into Claude's native agents directory.
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 (Partial)** — model maps to `--model` and thinking level to `--effort`; provider selection is not projected for Claude and warns if requested.
55
- - **Hooks (Partial)** — hook configuration is projected into the generated `settings.json`; there is no portable protocol hooks resource yet. See [Hooks](./hooks.md).
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-outfitter/outfitter",
3
- "version": "1.9.0",
3
+ "version": "1.11.0",
4
4
  "description": "Profile-oriented wrapper for launching pi, Claude Code, and future agent CLIs with reproducible configuration.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -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",