@ai-outfitter/outfitter 0.7.2 → 0.9.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 (89) hide show
  1. package/README.md +12 -2
  2. package/code/pi-extension/src/outfitter-extension.js +720 -0
  3. package/dist/agents/AdapterStatePaths.js +3 -1
  4. package/dist/agents/AdapterStatePaths.js.map +1 -1
  5. package/dist/agents/AgentAdapter.d.ts +3 -0
  6. package/dist/agents/AgentLaunch.js +5 -0
  7. package/dist/agents/AgentLaunch.js.map +1 -1
  8. package/dist/agents/OutfitterDocs.d.ts +2 -0
  9. package/dist/agents/OutfitterDocs.js +38 -0
  10. package/dist/agents/OutfitterDocs.js.map +1 -0
  11. package/dist/agents/claude/ClaudeAdapter.js +3 -2
  12. package/dist/agents/claude/ClaudeAdapter.js.map +1 -1
  13. package/dist/agents/pi/PiAdapter.js +24 -19
  14. package/dist/agents/pi/PiAdapter.js.map +1 -1
  15. package/dist/agents/pi/PiExtensionCache.d.ts +8 -0
  16. package/dist/agents/pi/PiExtensionCache.js +95 -5
  17. package/dist/agents/pi/PiExtensionCache.js.map +1 -1
  18. package/dist/agents/pi/PiSkillSources.d.ts +8 -0
  19. package/dist/agents/pi/PiSkillSources.js +69 -0
  20. package/dist/agents/pi/PiSkillSources.js.map +1 -0
  21. package/dist/cli/OutfitterCli.js +7 -2
  22. package/dist/cli/OutfitterCli.js.map +1 -1
  23. package/dist/cli/commands/PiLoginLaunch.js +28 -737
  24. package/dist/cli/commands/PiLoginLaunch.js.map +1 -1
  25. package/dist/cli/commands/RunCommand.d.ts +6 -17
  26. package/dist/cli/commands/RunCommand.js +115 -186
  27. package/dist/cli/commands/RunCommand.js.map +1 -1
  28. package/dist/cli/commands/SetupCommand.d.ts +4 -63
  29. package/dist/cli/commands/SetupCommand.js +13 -673
  30. package/dist/cli/commands/SetupCommand.js.map +1 -1
  31. package/dist/cli/commands/SyncCommand.d.ts +1 -1
  32. package/dist/cli/commands/SyncCommand.js +37 -12
  33. package/dist/cli/commands/SyncCommand.js.map +1 -1
  34. package/dist/cli/commands/run/RunFirstRunOnboarding.d.ts +7 -0
  35. package/dist/cli/commands/run/RunFirstRunOnboarding.js +52 -0
  36. package/dist/cli/commands/run/RunFirstRunOnboarding.js.map +1 -0
  37. package/dist/cli/commands/run/RunLaunchSummary.d.ts +2 -0
  38. package/dist/cli/commands/run/RunLaunchSummary.js +35 -0
  39. package/dist/cli/commands/run/RunLaunchSummary.js.map +1 -0
  40. package/dist/cli/commands/run/RunProfileResolution.d.ts +37 -0
  41. package/dist/cli/commands/run/RunProfileResolution.js +124 -0
  42. package/dist/cli/commands/run/RunProfileResolution.js.map +1 -0
  43. package/dist/cli/commands/run/RunStateWritePrompt.d.ts +2 -0
  44. package/dist/cli/commands/run/RunStateWritePrompt.js +29 -0
  45. package/dist/cli/commands/run/RunStateWritePrompt.js.map +1 -0
  46. package/dist/cli/commands/setup/SetupPrompts.d.ts +14 -0
  47. package/dist/cli/commands/setup/SetupPrompts.js +296 -0
  48. package/dist/cli/commands/setup/SetupPrompts.js.map +1 -0
  49. package/dist/cli/commands/setup/SetupSourceImport.d.ts +5 -0
  50. package/dist/cli/commands/setup/SetupSourceImport.js +177 -0
  51. package/dist/cli/commands/setup/SetupSourceImport.js.map +1 -0
  52. package/dist/cli/commands/setup/SetupSourceLaunch.d.ts +4 -0
  53. package/dist/cli/commands/setup/SetupSourceLaunch.js +65 -0
  54. package/dist/cli/commands/setup/SetupSourceLaunch.js.map +1 -0
  55. package/dist/cli/commands/setup/SetupStarterSource.d.ts +21 -0
  56. package/dist/cli/commands/setup/SetupStarterSource.js +133 -0
  57. package/dist/cli/commands/setup/SetupStarterSource.js.map +1 -0
  58. package/dist/cli/commands/setup/SetupTypes.d.ts +91 -0
  59. package/dist/cli/commands/setup/SetupTypes.js +26 -0
  60. package/dist/cli/commands/setup/SetupTypes.js.map +1 -0
  61. package/dist/compositeProfile/CompositeProfileCleanup.d.ts +9 -0
  62. package/dist/compositeProfile/CompositeProfileCleanup.js +87 -0
  63. package/dist/compositeProfile/CompositeProfileCleanup.js.map +1 -0
  64. package/dist/compositeProfile/StatePersistence.d.ts +16 -1
  65. package/dist/compositeProfile/StatePersistence.js +27 -5
  66. package/dist/compositeProfile/StatePersistence.js.map +1 -1
  67. package/dist/fs/SafeSymlink.d.ts +13 -0
  68. package/dist/fs/SafeSymlink.js +50 -0
  69. package/dist/fs/SafeSymlink.js.map +1 -0
  70. package/dist/settings/SettingsLoader.d.ts +1 -0
  71. package/dist/settings/SettingsLoader.js +10 -1
  72. package/dist/settings/SettingsLoader.js.map +1 -1
  73. package/doc/architecture/state_writeback_strategy.md +350 -0
  74. package/doc/documentation/README.md +21 -0
  75. package/doc/documentation/cli.md +74 -0
  76. package/doc/documentation/concepts.md +54 -0
  77. package/doc/documentation/first-time-cli-agent-users.md +137 -0
  78. package/doc/documentation/getting-started.md +49 -0
  79. package/doc/documentation/iterating-on-profiles.md +109 -0
  80. package/doc/documentation/profile-repository.md +111 -0
  81. package/doc/documentation/profiles.md +183 -0
  82. package/doc/documentation/state.md +224 -0
  83. package/doc/documentation/support-matrix.md +46 -0
  84. package/doc/documentation/switching-to-outfitter.md +130 -0
  85. package/doc/documentation/usecases/engineering.md +114 -0
  86. package/doc/documentation/usecases/organization-profile-catalog.md +140 -0
  87. package/doc/documentation/usecases/persona-reviews.md +173 -0
  88. package/doc/philosophy.md +25 -0
  89. package/package.json +3 -2
@@ -0,0 +1,224 @@
1
+ # State persistence
2
+
3
+ Outfitter launches agent CLIs from a temporary composite profile. During a run, Pi, Claude Code, or another adapter may write state such as settings, sessions, plugin installs, caches, auth metadata, or MCP configuration.
4
+
5
+ Outfitter does not silently copy every file back into your profiles. Instead, each adapter declares the state paths it understands, chooses safe defaults, and lets profiles override how writes to those paths are handled.
6
+
7
+ ## Default behavior
8
+
9
+ Most users do not need to configure `state_persistence` at all. By default, Outfitter keeps known agent CLI state durable and reports unexpected writes.
10
+
11
+ ```yaml
12
+ # This is the behavior most users get without writing any state_persistence block.
13
+ # Known Pi and Claude Code state paths default to symlink, so normal setup survives.
14
+ # Unknown writes default to warn, so surprising files are reported instead of silently persisted.
15
+ state_persistence:
16
+ auth.json: symlink # Pi login/auth state survives future runs.
17
+ settings.json: symlink # Native CLI settings stay durable.
18
+ mcp.json: symlink # MCP/server configuration stays durable.
19
+ plugins/: symlink # Installed plugins can be reused.
20
+ cache/: symlink # Useful package/cache state can be reused.
21
+ sessions/: symlink # Session/project state is durable unless a profile overrides it.
22
+ unknown: warn # Unexpected writes are visible and not silently copied into a profile.
23
+ ```
24
+
25
+ Some generated Pi runtime files, such as transformed settings or keybindings, may be treated as one-run generated files even though the underlying state path normally defaults to `symlink`. This keeps Outfitter-managed launch reconciliation from becoming accidental user state.
26
+
27
+ ## How state works
28
+
29
+ Outfitter separates runtime files into three groups:
30
+
31
+ 1. **Generated profile files** — files Outfitter builds from settings, profiles, templates, and adapter rules. These are temporary and reproducible.
32
+ 2. **Declared state paths** — files or directories the selected agent CLI is expected to read or write, such as `settings.json`, `mcp.json`, `plugins/`, or `sessions/`.
33
+ 3. **Unknown writes** — anything the agent writes outside declared state paths. Outfitter never silently persists these because it does not know their owner or merge rules.
34
+
35
+ Only declared state paths can be persisted automatically.
36
+
37
+ ## Profile option
38
+
39
+ Use `state_persistence` in a profile to override adapter defaults:
40
+
41
+ ```yaml
42
+ id: strict-ci
43
+ label: Strict CI
44
+
45
+ # Omitted paths use the selected adapter's default strategy.
46
+ # This profile only overrides paths where CI should be stricter than normal.
47
+ state_persistence:
48
+ settings.json: error # Fail if the agent changes settings during the run.
49
+ mcp.json: error # Fail if tool/server config changes during the run.
50
+ plugins/: error # Fail if plugin state changes during the run.
51
+ unknown: error # Fail if the agent writes an undeclared file.
52
+
53
+ controls:
54
+ thinking: high
55
+ ```
56
+
57
+ ## Strategies
58
+
59
+ `state_persistence` values can be:
60
+
61
+ ```yaml
62
+ state_persistence:
63
+ auth.json: symlink # Persist writes through a durable profile-managed or native CLI path.
64
+ cache/: discard # Allow writes, then throw them away when the run ends.
65
+ plugins/: warn # Allow writes, discard them, and report them after the run.
66
+ settings.json: error # Allow the run, then fail if this path changed.
67
+ mcp.json: prompt # Ask after the run: persist, discard, or always persist for this profile.
68
+ ```
69
+
70
+ Use `symlink` for state you want to keep, such as login state, durable settings, MCP config, or plugin installs. Use `discard`, `warn`, or `error` for state that should not become part of the durable profile. Use `prompt` when you want to decide interactively after each run.
71
+
72
+ ## Prompt strategy
73
+
74
+ When a `prompt` path changed during a run and both stdin and stdout are interactive terminals, Outfitter asks what to do with the change after the agent exits:
75
+
76
+ - **persist** — copy the change to the path's durable source (the profile-managed file or the native CLI location) for this run only.
77
+ - **discard** — throw the change away with the rest of the composite profile.
78
+ - **always** — persist the change and record a `state_persistence: <path>: symlink` override in the selected profile's own YAML file, so future runs persist writes to that path automatically.
79
+
80
+ The "always" choice is written into the selected profile's `profile.yml` because profiles are the single source of truth for `state_persistence` policy. If the selected profile comes from a remote or cached source, Outfitter never mutates the cache: the change is persisted once and a warning explains that the choice could not be recorded.
81
+
82
+ In non-interactive sessions (CI, scripts, piped stdio), `prompt` falls back to `warn` and Outfitter prints an explicit `prompt skipped: non-interactive` notice.
83
+
84
+ Undeclared writes governed by `unknown: prompt` cannot be persisted because they have no durable destination; Outfitter reports them as warnings and says so.
85
+
86
+ ## Temporary directory cleanup
87
+
88
+ Composite profile 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.
89
+
90
+ 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.
91
+
92
+ ## User stories
93
+
94
+ ### Keep login working
95
+
96
+ ```yaml
97
+ # Story: A developer connects Pi to a model provider during first-run setup.
98
+ # Goal: The next `outfitter` launch remembers the login instead of asking again.
99
+ state_persistence:
100
+ auth.json: symlink # Keep provider login/auth metadata durable.
101
+ models.json: symlink # Keep discovered/configured model metadata durable.
102
+ ```
103
+
104
+ ### Keep shared catalogs clean
105
+
106
+ ```yaml
107
+ # Story: A team publishes a shared engineering profile catalog.
108
+ # Goal: MCP config can come from the catalog, but one user's random runtime files
109
+ # should not become shared team state.
110
+ state_persistence:
111
+ mcp.json: symlink # Keep intentional tool/server config durable.
112
+ unknown: warn # Report unexpected writes instead of silently sharing them.
113
+ ```
114
+
115
+ ### Make CI reproducible
116
+
117
+ ```yaml
118
+ # Story: A platform engineer runs an Outfitter profile in CI.
119
+ # Goal: CI should prove the profile is complete, not depend on hidden runtime mutation.
120
+ state_persistence:
121
+ settings.json: error # Settings drift means the profile is incomplete.
122
+ mcp.json: error # Tool config drift should fail the job.
123
+ plugins/: error # Plugin installs/updates should be explicit in the profile.
124
+ unknown: error # Any undeclared write is a reproducibility problem.
125
+ ```
126
+
127
+ ### Avoid cross-project leakage
128
+
129
+ ```yaml
130
+ # Story: A consultant switches between client repositories.
131
+ # Goal: Sessions, caches, and temp files from one client should not show up in another.
132
+ state_persistence:
133
+ sessions/: discard # Throw away conversation/session state after the run.
134
+ cache/: discard # Throw away cache data tied to this run.
135
+ tmp/: discard # Throw away temporary runtime artifacts.
136
+ unknown: warn # Still report surprising writes for investigation.
137
+ ```
138
+
139
+ ### Experiment without losing visibility
140
+
141
+ ```yaml
142
+ # Story: An engineer tries new plugins or package installs locally.
143
+ # Goal: Let the experiment run, but report what changed so the user can decide
144
+ # whether to make it durable later.
145
+ state_persistence:
146
+ plugins/: warn # Allow plugin changes, but do not persist silently.
147
+ unknown: warn # Surface other writes that may need a policy.
148
+ ```
149
+
150
+ ## Pi state paths
151
+
152
+ The Pi adapter declares these paths:
153
+
154
+ ```yaml
155
+ state_persistence:
156
+ auth.json: symlink # Login/auth state; allowed: symlink, error, prompt.
157
+ settings.json: symlink # Pi settings; generated launch transforms may be one-run.
158
+ keybindings.json: symlink # Pi keybindings; Outfitter may generate launch keybindings.
159
+ mcp.json: symlink # MCP/server configuration.
160
+ models.json: symlink # Model/provider metadata.
161
+ trust.json: symlink # Pi trust decisions.
162
+ plugins/: symlink # Pi plugins.
163
+ cache/: symlink # Pi cache data.
164
+ sessions/: symlink # Pi sessions.
165
+ npm/: symlink # Pi npm package installs.
166
+ git/: symlink # Pi git package checkouts.
167
+ tmp/: symlink # Pi temporary runtime tree; allowed: symlink, discard.
168
+ utilities/: symlink # Shared utility binaries such as rg/fd.
169
+ bin/: symlink # Utility binary links.
170
+ unknown: warn # Undeclared writes; allowed: discard, warn, error, prompt.
171
+ ```
172
+
173
+ ## Claude Code state paths
174
+
175
+ The Claude Code adapter declares these paths:
176
+
177
+ ```yaml
178
+ state_persistence:
179
+ settings.json: symlink # Claude Code settings.
180
+ agents/: symlink # Claude agent definitions.
181
+ skills/: symlink # Claude skills.
182
+ commands/: symlink # Claude commands/prompts.
183
+ plugins/: symlink # Claude plugins.
184
+ projects/: symlink # Claude project/session state.
185
+ debug/: symlink # Claude debug state.
186
+ unknown: warn # Undeclared writes; allowed: discard, warn, error, prompt.
187
+ ```
188
+
189
+ Claude Code project/session state is represented through `projects/`. If a profile sets `controls.session_directory` or `controls.claude.session_directory`, Outfitter uses that location for Claude project state.
190
+
191
+ ## Where durable state lives
192
+
193
+ When a path uses `symlink`, Outfitter looks for a matching file or directory under the selected profile's CLI-specific resources:
194
+
195
+ ```text
196
+ profiles/
197
+ default/
198
+ profile.yml
199
+ cli_specific/
200
+ pi/
201
+ settings.json
202
+ mcp.json
203
+ claude/
204
+ settings.json
205
+ skills/
206
+ ```
207
+
208
+ If no profile-managed source exists, Outfitter falls back to the native CLI state location for most paths, such as `~/.pi/agent/...` for Pi or `~/.claude/...` for Claude Code.
209
+
210
+ This fallback is not another profile layer. It does not participate in inheritance, merge precedence, or profile controls; it only provides a durable destination for state paths.
211
+
212
+ ## When to change defaults
213
+
214
+ Most users can keep the adapter defaults. Override `state_persistence` when you need a profile with a specific state policy:
215
+
216
+ ```yaml
217
+ state_persistence:
218
+ cache/: discard # Throwaway demos, sessions, or caches.
219
+ plugins/: warn # Local experimentation is okay but should be visible.
220
+ settings.json: error # CI, reproducibility checks, or locked-down project profiles.
221
+ auth.json: symlink # Intentional durable setup.
222
+ ```
223
+
224
+ For the complete adapter contract and rationale, see [State writeback strategy](../architecture/state_writeback_strategy.md).
@@ -0,0 +1,46 @@
1
+ # Adapter support matrix
2
+
3
+ What Outfitter can control per agent CLI today. Pi is the primary and most complete adapter; Claude Code is supported with gaps.
4
+
5
+ Status values:
6
+
7
+ - **Supported** — Outfitter translates this concept for the CLI through at least one native mechanism.
8
+ - **Partial** — some of the concept works today, with documented gaps.
9
+ - **Roadmap** — the CLI appears to support the concept, but Outfitter does not translate it yet.
10
+
11
+ When a profile requests a control an adapter cannot translate, Outfitter warns to stderr; `--strict` makes those warnings fatal.
12
+
13
+ | What you can control | Pi | Claude Code |
14
+ | ------------------------------------------------- | --------- | ----------- |
15
+ | Agent config directory | Supported | Supported |
16
+ | Session directory (`session_directory`) | Supported | Supported |
17
+ | Extensions / plugins (`extensions`) | Supported | Supported |
18
+ | Skills (`skills`) | Supported | Partial |
19
+ | Prompt templates / commands (`prompt_template`) | Supported | Partial |
20
+ | System prompt (`system_prompt`) | Supported | Supported |
21
+ | Appended system prompt (`append_system_prompt`) | Supported | Supported |
22
+ | Model selection (`model`, `provider`, `thinking`) | Supported | Partial |
23
+ | Credentials and environment (`environment`) | Supported | Supported |
24
+ | Tool availability | Roadmap | Roadmap |
25
+ | Context files | Roadmap | Roadmap |
26
+ | Theme / UI presentation | Roadmap | Roadmap |
27
+ | Project override policy | Roadmap | Roadmap |
28
+ | Working directory | Roadmap | Roadmap |
29
+ | Pass-through arguments | Supported | Supported |
30
+ | Bootstrap hook | Supported | Roadmap |
31
+
32
+ ## Claude Code notes
33
+
34
+ - **Config and session state** — Outfitter points `CLAUDE_CONFIG_DIR` at the composite profile, declares Claude state paths (`settings.json`, `agents/`, `skills/`, `commands/`, `plugins/`, `projects/`) for persistence, and lets `session_directory` choose where `projects/` session state is symlinked from. There is no standalone session-dir flag.
35
+ - **Skills (Partial)** — native Claude skills work when a profile ships them as `cli_specific/claude/skills/` directories, which Outfitter places in the profiled config directory. The generic `controls.skills` selector is not translated for Claude and warns if requested.
36
+ - **Prompt templates (Partial)** — same shape: native `cli_specific/claude/commands/` directories work, but the generic `controls.prompt_template` selector is not translated and warns.
37
+ - **Model selection (Partial)** — `model` maps to `--model` and `thinking` maps to `--effort`, but `provider` is not translated for Claude and warns if requested.
38
+ - **Extensions** — `controls.extensions` entries are passed as repeated `--plugin-dir` flags.
39
+ - **DeepWork jobs** — the `controls.deepwork` selection is Pi-only today and warns on Claude.
40
+
41
+ ## Pi notes
42
+
43
+ - Pi translates the full generic control set: `provider`, `model`, `thinking`, `system_prompt`, `append_system_prompt`, `extensions` (`--extension`), `skills` (`--skill`), `prompt_template` (`--prompt-template`), `environment`, `args`, `session_directory`, and DeepWork job selection.
44
+ - Bootstrap behavior (for example the onboarding flow) uses an explicit Pi bootstrap extension via `--extension`.
45
+
46
+ For the architecture-level definitions behind each row, see [Controllable elements](../architecture/controllable-elements.md).
@@ -0,0 +1,130 @@
1
+ # Switching to Outfitter
2
+
3
+ This guide is for people who already use Pi, Claude Code, Codex, Cursor, or another agent CLI and want Outfitter to make that setup repeatable. The goal is not to copy every local experiment into a profile. The goal is to capture the small set of habits that reliably jumpstart the human.
4
+
5
+ ## Migration shape
6
+
7
+ 1. Keep the current agent CLI installed and working.
8
+ 2. Identify the behavior you rely on every week: prompts, planning rules, permission posture, skills, subagents, and state you want preserved.
9
+ 3. Create one Outfitter home profile for stable personal defaults.
10
+ 4. Add project overlays only where a repository needs different instructions or tools.
11
+ 5. Run `outfitter`, compare the session to your old workflow, and tighten the profile before adding more controls.
12
+
13
+ ## What to migrate first
14
+
15
+ Migrate durable operating rules before migrating files:
16
+
17
+ - how much autonomy the agent gets;
18
+ - when it must plan before editing;
19
+ - how it should use subagents;
20
+ - what review or test evidence you expect;
21
+ - what writing voice or product judgment it should preserve;
22
+ - which skills/extensions are essential.
23
+
24
+ Leave transient chat tricks behind. If a rule is not worth committing to a profile, it probably belongs in the next prompt, not the baseline.
25
+
26
+ ## Home profile template
27
+
28
+ Use this as a commented migration worksheet. The comments are intentionally user-facing: they encode the human jumpstart idea and the writing nucleation seed that should make a fresh session feel like your best existing setup.
29
+
30
+ ```yaml
31
+ # ~/.outfitter/settings.yml
32
+ # Human jumpstart: this default profile should make `outfitter` feel like
33
+ # your current best agent setup, but with fewer manual launch steps.
34
+ default_profile: migrated-agent-workbench
35
+ default_agent: pi
36
+ profile_sources:
37
+ - path: ./profiles
38
+
39
+ ---
40
+ # ~/.outfitter/profiles/migrated-agent-workbench/profile.yml
41
+ id: migrated-agent-workbench
42
+ label: Migrated Agent Workbench
43
+ # Name the workflow this replaces: "Claude Code defaults", "Codex review mode", etc.
44
+ description: Personal agent-CLI habits migrated into an Outfitter-managed Pi profile.
45
+
46
+ controls:
47
+ # YOLO posture: grant routine local autonomy while keeping irreversible work gated.
48
+ append_system_prompt: |
49
+ You may inspect files, make focused edits, and run local validation commands.
50
+ Ask before deleting files, changing dependencies, pushing, publishing, touching credentials,
51
+ mutating production data, or making irreversible external changes.
52
+
53
+ Plan before broad rewrites. Use acceptance criteria that can be checked from repo state.
54
+ Prefer small commits and explain validation evidence before calling work done.
55
+
56
+ Writing nucleation: treat rough notes as source material, not final requirements.
57
+ Convert ambiguous requests into a short plan, preserve interesting claims, and remove filler.
58
+
59
+ # Keep controls minimal during migration. Add model/thinking/tool settings only when
60
+ # they represent a stable preference rather than a one-off experiment.
61
+ thinking: high
62
+
63
+ # Skills can come from Pi packages, the Outfitter default profile catalog, or project profiles.
64
+ # Add only skills you expect to use repeatedly.
65
+ skills: []
66
+
67
+ # Subagents may be provided by the active Pi/Outfitter profile or project config.
68
+ # Document how you want the lead agent to use them even before adding custom definitions.
69
+ ```
70
+
71
+ ## Project overlay template
72
+
73
+ Use a project overlay when a repository has instructions that should not leak into every session.
74
+
75
+ ```yaml
76
+ # <repo>/.outfitter/settings.yml
77
+ # Project jumpstart: select the repo-specific profile when `outfitter` starts here.
78
+ default_profile: project-workbench
79
+ profile_sources:
80
+ # Import the home profile this project inherits from.
81
+ # Adjust the relative path to match the repo's depth under your home directory.
82
+ - path: ../../.outfitter/profiles
83
+ only:
84
+ - migrated-agent-workbench
85
+ - path: ./profiles
86
+
87
+ ---
88
+ # <repo>/.outfitter/profiles/project-workbench/profile.yml
89
+ id: project-workbench
90
+ label: Project Workbench
91
+ inherits:
92
+ - migrated-agent-workbench
93
+ controls:
94
+ append_system_prompt: |
95
+ Use this repository's docs, tests, and issue tracker as the source of truth.
96
+ Record durable decisions in project files, not only in chat.
97
+ Run the narrowest relevant validation before broad checks.
98
+ ```
99
+
100
+ ## Mapping old habits to Outfitter
101
+
102
+ | Existing habit | Outfitter/Pi shape |
103
+ | ------------------------------------ | -------------------------------------------------------------------------------------------------------- |
104
+ | “Always plan before edits.” | Use the plan extension keybinding (`Shift+Tab` in the default Outfitter Pi setup) before implementation. |
105
+ | “Use YOLO except dangerous actions.” | State allowed local actions and approval gates in the profile. |
106
+ | “Run code review after changes.” | Add or enable a review skill, then invoke it inside Pi with a slash command such as `/skill:review`. |
107
+ | “Spawn a second agent for research.” | Add subagent guidance and use available subagent definitions when active. |
108
+ | “Use browser or GitHub helpers.” | Load the Pi extension/tool package through the profile that needs it. |
109
+ | “Keep project context durable.” | Commit project instructions to `AGENTS.md`; keep personal defaults in the Outfitter home profile. |
110
+ | “Keep a project-specific prompt.” | Add a project overlay that inherits the home profile. |
111
+
112
+ ## Check the active capabilities
113
+
114
+ Because tools differ by CLI and profile, start migrated sessions with:
115
+
116
+ ```text
117
+ List the active tools, skills, extensions, and subagents. Note which are vanilla Pi, which come from Outfitter's default profile catalog, and which are project-local. Also read AGENTS.md if this repo has one.
118
+ ```
119
+
120
+ If a capability only exists because a Pi extension is active, document that in the profile or project README. If a behavior is a project rule rather than a personal preference, put it in `AGENTS.md` so every agent session can inherit it.
121
+
122
+ ## Migration checkpoint
123
+
124
+ Run:
125
+
126
+ ```bash
127
+ outfitter
128
+ ```
129
+
130
+ If the first session does not feel like a better version of your old setup, edit the prompt seed before adding more files. The first win is reliable launch plus useful starting context; broader profile catalogs can come after that baseline holds.
@@ -0,0 +1,114 @@
1
+ # Engineering Profile Catalog
2
+
3
+ An engineering profile catalog is a shared setup source for people who write code, review changes, operate infrastructure, and debug production-like systems. It gives engineers a reliable default Pi session without asking each teammate to rebuild the same model, thinking, prompt, skill, and extension choices by hand.
4
+
5
+ For example, `acme-engineering-outfitter` can publish a small catalog with profiles for day-to-day implementation, deeper platform work, and lightweight review or triage.
6
+
7
+ ```text
8
+ acme-engineering-outfitter/
9
+ settings.yml
10
+ profiles/
11
+ base-engineering/
12
+ profile.yml
13
+ engineer/
14
+ profile.yml
15
+ platform-engineer/
16
+ profile.yml
17
+ reviewer/
18
+ profile.yml
19
+ ```
20
+
21
+ ## Catalog settings
22
+
23
+ ```yaml
24
+ # acme-engineering-outfitter/settings.yml
25
+ profile_sources:
26
+ - path: ./profiles
27
+ only:
28
+ - engineer
29
+ - platform-engineer
30
+ - reviewer
31
+ ```
32
+
33
+ ## Shared base profile
34
+
35
+ ```yaml
36
+ # profiles/base-engineering/profile.yml
37
+ id: base-engineering
38
+ label: Engineering Base
39
+ template: true
40
+ description: Shared engineering operating rules for code, tests, and infrastructure.
41
+ controls:
42
+ append_system_prompt: |
43
+ Work as a careful engineering agent. Read the relevant code before editing,
44
+ prefer small reversible changes, keep secrets out of logs, run focused tests,
45
+ and return changed files plus verification evidence.
46
+ ```
47
+
48
+ ## Role profiles
49
+
50
+ Engineering catalogs SHOULD separate routine implementation from high-risk infrastructure and review work. The examples below are role-shaped; replace model IDs and thinking levels with the exact choices exposed by the team's agent providers.
51
+
52
+ ```yaml
53
+ # profiles/engineer/profile.yml
54
+ id: engineer
55
+ label: Software Engineer
56
+ description: Default for feature work, bug fixes, and test-backed implementation.
57
+ inherits:
58
+ - base-engineering
59
+ controls:
60
+ provider: anthropic
61
+ model: anthropic/claude-sonnet-4
62
+ thinking: high
63
+ append_system_prompt: |
64
+ Optimize for correct, reviewable implementation. Inspect nearby code and tests,
65
+ make narrow commits, run the smallest meaningful validation, and summarize risks.
66
+ ```
67
+
68
+ ```yaml
69
+ # profiles/platform-engineer/profile.yml
70
+ id: platform-engineer
71
+ label: Platform Engineer
72
+ description: Higher-caution profile for CI, infrastructure, deployment, and incident work.
73
+ inherits:
74
+ - base-engineering
75
+ controls:
76
+ provider: anthropic
77
+ model: anthropic/claude-opus-4
78
+ thinking: xhigh
79
+ append_system_prompt: |
80
+ Treat infrastructure and production-like systems as high-risk. Diagnose before
81
+ mutating state, name rollback paths, and ask before deploys, credential use,
82
+ payments, or irreversible operations.
83
+ ```
84
+
85
+ ```yaml
86
+ # profiles/reviewer/profile.yml
87
+ id: reviewer
88
+ label: Code Reviewer
89
+ description: Review-focused profile for diffs, pull requests, and release readiness.
90
+ inherits:
91
+ - base-engineering
92
+ controls:
93
+ provider: openai
94
+ model: openai/gpt-4.1
95
+ thinking: medium
96
+ append_system_prompt: |
97
+ Review for correctness, regression risk, missing tests, unsafe operations,
98
+ unclear rollout paths, and documentation drift. Prioritize actionable findings
99
+ over style nits.
100
+ ```
101
+
102
+ ## Verification pattern
103
+
104
+ Engineering catalogs SHOULD make verification expectations explicit in prompts or comments so agents return evidence instead of vague completion claims.
105
+
106
+ ```yaml
107
+ # profiles/engineer/profile.yml excerpt
108
+ controls:
109
+ append_system_prompt: |
110
+ When you change code, report the exact tests or checks you ran. If a check is
111
+ skipped, say why and name the smallest follow-up validation that would reduce risk.
112
+ ```
113
+
114
+ This gives an engineering team a repeatable catalog with safe defaults: fast enough for common implementation, cautious enough for infrastructure, and explicit about verification evidence.
@@ -0,0 +1,140 @@
1
+ # Organization Profile Catalog
2
+
3
+ An organization profile catalog is a shared setup source that publishes named roles instead of asking every user to choose providers, models, thinking levels, extensions, and prompts by hand.
4
+ For example, `acme` can publish a small catalog that gives engineers, platform operators, support staff, and executives a useful default Pi session while still letting projects override the final profile.
5
+
6
+ ```text
7
+ acme-outfitter-catalog/
8
+ settings.yml
9
+ profiles/
10
+ base-acme/
11
+ profile.yml
12
+ engineer/
13
+ profile.yml
14
+ platform-operator/
15
+ profile.yml
16
+ support-triage/
17
+ profile.yml
18
+ exec-briefing/
19
+ profile.yml
20
+ ```
21
+
22
+ ## Catalog settings
23
+
24
+ ```yaml
25
+ # acme-outfitter-catalog/settings.yml
26
+ profile_sources:
27
+ - path: ./profiles
28
+ only:
29
+ - engineer
30
+ - platform-operator
31
+ - support-triage
32
+ - exec-briefing
33
+ ```
34
+
35
+ ## Shared base profile
36
+
37
+ ```yaml
38
+ # profiles/base-acme/profile.yml
39
+ id: base-acme
40
+ label: Acme Base
41
+ template: true
42
+ description: Shared Acme operating rules for every published role.
43
+ controls:
44
+ append_system_prompt: |
45
+ Work as an Acme operator: prefer small reversible changes, cite durable evidence,
46
+ keep secrets out of logs and docs, and write decisions into repository files.
47
+ ```
48
+
49
+ ## Role profiles
50
+
51
+ The catalog SHOULD publish role profiles that make the cost/latency/quality tradeoff explicit.
52
+ Use provider-qualified model IDs that match the models available in the team's Pi or Claude configuration.
53
+ The examples below are intentionally role-shaped; replace model IDs with the exact names exposed by the organization's provider catalog.
54
+
55
+ ```yaml
56
+ # profiles/engineer/profile.yml
57
+ id: engineer
58
+ label: Software Engineer
59
+ description: Default for feature work, debugging, tests, and code review.
60
+ inherits:
61
+ - base-acme
62
+ controls:
63
+ provider: anthropic
64
+ model: anthropic/claude-sonnet-4
65
+ thinking: high
66
+ append_system_prompt: |
67
+ Optimize for correct implementation over speed. Read nearby code before editing,
68
+ run the narrowest meaningful tests, and return changed files plus verification.
69
+ ```
70
+
71
+ ```yaml
72
+ # profiles/platform-operator/profile.yml
73
+ id: platform-operator
74
+ label: Platform Operator
75
+ description: Higher-reasoning profile for infrastructure, incidents, CI, and release safety.
76
+ inherits:
77
+ - base-acme
78
+ controls:
79
+ provider: anthropic
80
+ model: anthropic/claude-opus-4
81
+ thinking: xhigh
82
+ append_system_prompt: |
83
+ Treat production-like systems as high-risk. Prefer diagnosis before mutation,
84
+ name rollback paths, and ask before deploys, credential use, payments, or irreversible changes.
85
+ ```
86
+
87
+ ```yaml
88
+ # profiles/support-triage/profile.yml
89
+ id: support-triage
90
+ label: Support Triage
91
+ description: Lower-cost profile for ticket summarization, reproduction notes, and routing.
92
+ inherits:
93
+ - base-acme
94
+ controls:
95
+ provider: openai
96
+ model: openai/gpt-4.1-mini
97
+ thinking: low
98
+ append_system_prompt: |
99
+ Convert messy user reports into concise reproduction steps, affected surfaces,
100
+ suspected owners, and the next question that would unblock diagnosis.
101
+ ```
102
+
103
+ ```yaml
104
+ # profiles/exec-briefing/profile.yml
105
+ id: exec-briefing
106
+ label: Executive Briefing
107
+ description: Fast profile for dense status synthesis and decision memos.
108
+ inherits:
109
+ - base-acme
110
+ controls:
111
+ provider: openai
112
+ model: openai/gpt-4.1
113
+ thinking: medium
114
+ append_system_prompt: |
115
+ Produce dense prose for leaders: state the decision, evidence, risk, owner,
116
+ deadline, and the smallest reversible next action. Avoid implementation trivia unless it changes the decision.
117
+ ```
118
+
119
+ ## Budget annotation pattern
120
+
121
+ Profiles can carry comments that explain why a role uses a given model and thinking level without embedding current vendor prices.
122
+ Keep the metric relative, because token prices and model names drift.
123
+
124
+ ```yaml
125
+ # Metric docstring for catalog maintainers:
126
+ # budget_units estimates relative spend and latency for a role, not an invoice.
127
+ # budget_units = expected_input_tokens * input_weight
128
+ # + expected_output_tokens * output_weight
129
+ # + expected_reasoning_tokens * thinking_weight
130
+ # thinking_weight guideline: low=1, medium=2, high=4, xhigh=8.
131
+ # Use low/medium for repeatable summarization or routing; use high/xhigh when a wrong answer
132
+ # can cause rework, outages, bad code, unsafe operations, or expensive human review.
133
+
134
+ # profiles/platform-operator/profile.yml excerpt
135
+ controls:
136
+ model: anthropic/claude-opus-4
137
+ thinking: xhigh # Expensive by design: infra mistakes dominate token spend.
138
+ ```
139
+
140
+ This gives the organization a publishable catalog with clear defaults: cheaper profiles for high-volume low-risk work, stronger reasoning for code and infrastructure, and role prompts that teach the agent what evidence and output shape matter for each job.