@ai-outfitter/outfitter 0.11.0 → 1.0.2

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 (308) hide show
  1. package/.outfitter/skills/outfitter/SKILL.md +67 -37
  2. package/README.md +63 -35
  3. package/code/enterprise/cli/privateCatalogSettings.cjs +2 -2
  4. package/code/enterprise/pi-extension/privateCatalogOnboarding.js +5 -8
  5. package/code/enterprise/shared/privateCatalogPolicy.cjs +5 -5
  6. package/code/pi-extension/src/outfitter-extension.js +353 -553
  7. package/code/pi-extension/src/outfitter-runtime-extension.js +160 -0
  8. package/dist/agents/AgentLaunch.d.ts +9 -1
  9. package/dist/agents/AgentLaunch.js +19 -0
  10. package/dist/agents/AgentLaunch.js.map +1 -1
  11. package/dist/agents/PiCredentialPersistence.d.ts +6 -0
  12. package/dist/agents/PiCredentialPersistence.js +33 -0
  13. package/dist/agents/PiCredentialPersistence.js.map +1 -0
  14. package/dist/cli/OutfitterCli.js +10 -18
  15. package/dist/cli/OutfitterCli.js.map +1 -1
  16. package/dist/cli/commands/CommandObject.d.ts +0 -5
  17. package/dist/cli/commands/CommandObject.js +1 -4
  18. package/dist/cli/commands/CommandObject.js.map +1 -1
  19. package/dist/cli/commands/DumpCommand.d.ts +19 -0
  20. package/dist/cli/commands/DumpCommand.js +54 -0
  21. package/dist/cli/commands/DumpCommand.js.map +1 -0
  22. package/dist/cli/commands/ListCommand.d.ts +17 -0
  23. package/dist/cli/commands/ListCommand.js +77 -0
  24. package/dist/cli/commands/ListCommand.js.map +1 -0
  25. package/dist/cli/commands/PiRuntimeLaunch.d.ts +8 -0
  26. package/dist/cli/commands/PiRuntimeLaunch.js +47 -0
  27. package/dist/cli/commands/PiRuntimeLaunch.js.map +1 -0
  28. package/dist/cli/commands/ProcessDefaults.d.ts +2 -0
  29. package/dist/cli/commands/ProcessDefaults.js +5 -0
  30. package/dist/cli/commands/ProcessDefaults.js.map +1 -0
  31. package/dist/cli/commands/RunAgentCommand.d.ts +46 -0
  32. package/dist/cli/commands/RunAgentCommand.js +176 -0
  33. package/dist/cli/commands/RunAgentCommand.js.map +1 -0
  34. package/dist/cli/commands/SetupCommand.d.ts +38 -6
  35. package/dist/cli/commands/SetupCommand.js +194 -232
  36. package/dist/cli/commands/SetupCommand.js.map +1 -1
  37. package/dist/cli/commands/ValidateCommand.d.ts +20 -0
  38. package/dist/cli/commands/ValidateCommand.js +54 -0
  39. package/dist/cli/commands/ValidateCommand.js.map +1 -0
  40. package/dist/composer/Composer.d.ts +11 -0
  41. package/dist/composer/Composer.js +72 -0
  42. package/dist/composer/Composer.js.map +1 -0
  43. package/dist/composer/Composition.d.ts +33 -0
  44. package/dist/composer/Composition.js +2 -0
  45. package/dist/composer/Composition.js.map +1 -0
  46. package/dist/dump/Containment.d.ts +8 -0
  47. package/dist/dump/Containment.js +22 -0
  48. package/dist/dump/Containment.js.map +1 -0
  49. package/dist/dump/Dump.d.ts +8 -0
  50. package/dist/dump/Dump.js +182 -0
  51. package/dist/dump/Dump.js.map +1 -0
  52. package/dist/extensions/PiExtensionCache.d.ts +30 -0
  53. package/dist/extensions/PiExtensionCache.js +92 -0
  54. package/dist/extensions/PiExtensionCache.js.map +1 -0
  55. package/dist/fs/TypeConflict.d.ts +6 -0
  56. package/dist/fs/TypeConflict.js +21 -0
  57. package/dist/fs/TypeConflict.js.map +1 -0
  58. package/dist/paths/OutfitterCache.d.ts +6 -0
  59. package/dist/paths/OutfitterCache.js +17 -0
  60. package/dist/paths/OutfitterCache.js.map +1 -0
  61. package/dist/projection/Materialize.d.ts +24 -0
  62. package/dist/projection/Materialize.js +83 -0
  63. package/dist/projection/Materialize.js.map +1 -0
  64. package/dist/projection/ProjectHarness.d.ts +5 -0
  65. package/dist/projection/ProjectHarness.js +77 -0
  66. package/dist/projection/ProjectHarness.js.map +1 -0
  67. package/dist/projection/Projection.d.ts +23 -0
  68. package/dist/projection/Projection.js +2 -0
  69. package/dist/projection/Projection.js.map +1 -0
  70. package/dist/resolver/AgentDefinition.d.ts +30 -0
  71. package/dist/resolver/AgentDefinition.js +123 -0
  72. package/dist/resolver/AgentDefinition.js.map +1 -0
  73. package/dist/resolver/Layer.d.ts +12 -0
  74. package/dist/resolver/Layer.js +30 -0
  75. package/dist/resolver/Layer.js.map +1 -0
  76. package/dist/resolver/Resolver.d.ts +3 -0
  77. package/dist/resolver/Resolver.js +163 -0
  78. package/dist/resolver/Resolver.js.map +1 -0
  79. package/dist/resolver/ResolverContext.d.ts +15 -0
  80. package/dist/resolver/ResolverContext.js +11 -0
  81. package/dist/resolver/ResolverContext.js.map +1 -0
  82. package/dist/resolver/ResolverValidation.d.ts +11 -0
  83. package/dist/resolver/ResolverValidation.js +112 -0
  84. package/dist/resolver/ResolverValidation.js.map +1 -0
  85. package/dist/resolver/Resource.d.ts +88 -0
  86. package/dist/resolver/Resource.js +34 -0
  87. package/dist/resolver/Resource.js.map +1 -0
  88. package/dist/schemas/agent.schema.json +48 -0
  89. package/dist/schemas/settings.schema.json +32 -9
  90. package/dist/settings/Settings.d.ts +34 -5
  91. package/dist/settings/Settings.js +3 -1
  92. package/dist/settings/Settings.js.map +1 -1
  93. package/dist/settings/SettingsLoader.d.ts +1 -1
  94. package/dist/settings/SettingsLoader.js +23 -22
  95. package/dist/settings/SettingsLoader.js.map +1 -1
  96. package/dist/settings/SettingsMerger.js +12 -10
  97. package/dist/settings/SettingsMerger.js.map +1 -1
  98. package/dist/setup/DefaultCatalog.d.ts +20 -0
  99. package/dist/setup/DefaultCatalog.js +89 -0
  100. package/dist/setup/DefaultCatalog.js.map +1 -0
  101. package/dist/setup/Setup.d.ts +43 -0
  102. package/dist/setup/Setup.js +261 -0
  103. package/dist/setup/Setup.js.map +1 -0
  104. package/dist/skills/SkillDocument.d.ts +6 -1
  105. package/dist/skills/SkillDocument.js.map +1 -1
  106. package/dist/sources/SourceCache.d.ts +19 -0
  107. package/dist/{profiles/ProfileCache.js → sources/SourceCache.js} +22 -18
  108. package/dist/sources/SourceCache.js.map +1 -0
  109. package/dist/validation/SchemaValidator.d.ts +1 -1
  110. package/dist/validation/SchemaValidator.js +4 -13
  111. package/dist/validation/SchemaValidator.js.map +1 -1
  112. package/docs/architecture/state_writeback_strategy.md +54 -122
  113. package/docs/documentation/README.md +33 -12
  114. package/docs/documentation/actions.md +35 -52
  115. package/docs/documentation/agents.md +109 -0
  116. package/docs/documentation/best-practices.md +25 -63
  117. package/docs/documentation/catalogs.md +126 -0
  118. package/docs/documentation/cli.md +39 -41
  119. package/docs/documentation/concepts.md +66 -23
  120. package/docs/documentation/dump-and-bake.md +30 -0
  121. package/docs/documentation/first-time-cli-agent-users.md +8 -8
  122. package/docs/documentation/getting-started.md +28 -8
  123. package/docs/documentation/hooks.md +20 -0
  124. package/docs/documentation/iterating-on-profiles.md +56 -70
  125. package/docs/documentation/local-development.md +84 -0
  126. package/docs/documentation/migration.md +39 -0
  127. package/docs/documentation/personas.md +41 -0
  128. package/docs/documentation/porting-claude.md +54 -0
  129. package/docs/documentation/profiles.md +16 -169
  130. package/docs/documentation/settings.md +61 -0
  131. package/docs/documentation/skills.md +93 -334
  132. package/docs/documentation/state.md +24 -62
  133. package/docs/documentation/subagents.md +37 -0
  134. package/docs/documentation/support-matrix.md +40 -35
  135. package/docs/documentation/switching-to-outfitter.md +75 -81
  136. package/docs/documentation/tasks.md +13 -0
  137. package/docs/documentation/usecases/engineering.md +67 -84
  138. package/docs/documentation/usecases/organization-profile-catalog.md +83 -111
  139. package/docs/documentation/usecases/persona-reviews.md +133 -139
  140. package/docs/philosophy.md +2 -2
  141. package/package.json +3 -3
  142. package/src/schemas/agent.schema.json +48 -0
  143. package/src/schemas/settings.schema.json +32 -9
  144. package/dist/agents/AdapterProfileControls.d.ts +0 -21
  145. package/dist/agents/AdapterProfileControls.js +0 -76
  146. package/dist/agents/AdapterProfileControls.js.map +0 -1
  147. package/dist/agents/AdapterStatePaths.d.ts +0 -12
  148. package/dist/agents/AdapterStatePaths.js +0 -46
  149. package/dist/agents/AdapterStatePaths.js.map +0 -1
  150. package/dist/agents/AgentAdapter.d.ts +0 -44
  151. package/dist/agents/AgentAdapter.js +0 -2
  152. package/dist/agents/AgentAdapter.js.map +0 -1
  153. package/dist/agents/AgentRegistry.d.ts +0 -6
  154. package/dist/agents/AgentRegistry.js +0 -17
  155. package/dist/agents/AgentRegistry.js.map +0 -1
  156. package/dist/agents/LaunchResources.d.ts +0 -17
  157. package/dist/agents/LaunchResources.js +0 -61
  158. package/dist/agents/LaunchResources.js.map +0 -1
  159. package/dist/agents/OutfitterSkill.d.ts +0 -11
  160. package/dist/agents/OutfitterSkill.js +0 -128
  161. package/dist/agents/OutfitterSkill.js.map +0 -1
  162. package/dist/agents/ResourceIdentity.d.ts +0 -2
  163. package/dist/agents/ResourceIdentity.js +0 -51
  164. package/dist/agents/ResourceIdentity.js.map +0 -1
  165. package/dist/agents/claude/ClaudeAdapter.d.ts +0 -2
  166. package/dist/agents/claude/ClaudeAdapter.js +0 -148
  167. package/dist/agents/claude/ClaudeAdapter.js.map +0 -1
  168. package/dist/agents/claude/ClaudeCompositeProfileWriter.d.ts +0 -5
  169. package/dist/agents/claude/ClaudeCompositeProfileWriter.js +0 -7
  170. package/dist/agents/claude/ClaudeCompositeProfileWriter.js.map +0 -1
  171. package/dist/agents/pi/PiAdapter.d.ts +0 -2
  172. package/dist/agents/pi/PiAdapter.js +0 -363
  173. package/dist/agents/pi/PiAdapter.js.map +0 -1
  174. package/dist/agents/pi/PiArgs.d.ts +0 -2
  175. package/dist/agents/pi/PiArgs.js +0 -15
  176. package/dist/agents/pi/PiArgs.js.map +0 -1
  177. package/dist/agents/pi/PiCompositeProfileWriter.d.ts +0 -5
  178. package/dist/agents/pi/PiCompositeProfileWriter.js +0 -7
  179. package/dist/agents/pi/PiCompositeProfileWriter.js.map +0 -1
  180. package/dist/agents/pi/PiExtensionCache.d.ts +0 -12
  181. package/dist/agents/pi/PiExtensionCache.js +0 -195
  182. package/dist/agents/pi/PiExtensionCache.js.map +0 -1
  183. package/dist/agents/pi/PiMcpConfig.d.ts +0 -2
  184. package/dist/agents/pi/PiMcpConfig.js +0 -114
  185. package/dist/agents/pi/PiMcpConfig.js.map +0 -1
  186. package/dist/agents/pi/PiSettingsMergePolicy.d.ts +0 -17
  187. package/dist/agents/pi/PiSettingsMergePolicy.js +0 -59
  188. package/dist/agents/pi/PiSettingsMergePolicy.js.map +0 -1
  189. package/dist/agents/pi/PiSkillSources.d.ts +0 -8
  190. package/dist/agents/pi/PiSkillSources.js +0 -73
  191. package/dist/agents/pi/PiSkillSources.js.map +0 -1
  192. package/dist/cli/commands/FirstRunWelcomeProfile.d.ts +0 -11
  193. package/dist/cli/commands/FirstRunWelcomeProfile.js +0 -110
  194. package/dist/cli/commands/FirstRunWelcomeProfile.js.map +0 -1
  195. package/dist/cli/commands/PiLoginLaunch.d.ts +0 -22
  196. package/dist/cli/commands/PiLoginLaunch.js +0 -170
  197. package/dist/cli/commands/PiLoginLaunch.js.map +0 -1
  198. package/dist/cli/commands/RunCommand.d.ts +0 -36
  199. package/dist/cli/commands/RunCommand.js +0 -345
  200. package/dist/cli/commands/RunCommand.js.map +0 -1
  201. package/dist/cli/commands/SyncCommand.d.ts +0 -46
  202. package/dist/cli/commands/SyncCommand.js +0 -244
  203. package/dist/cli/commands/SyncCommand.js.map +0 -1
  204. package/dist/cli/commands/WelcomeCommand.d.ts +0 -56
  205. package/dist/cli/commands/WelcomeCommand.js +0 -224
  206. package/dist/cli/commands/WelcomeCommand.js.map +0 -1
  207. package/dist/cli/commands/assets/outfitter-ascii.txt +0 -5
  208. package/dist/cli/commands/profile/Command.d.ts +0 -7
  209. package/dist/cli/commands/profile/Command.js +0 -24
  210. package/dist/cli/commands/profile/Command.js.map +0 -1
  211. package/dist/cli/commands/profile/CreateCommand.d.ts +0 -19
  212. package/dist/cli/commands/profile/CreateCommand.js +0 -115
  213. package/dist/cli/commands/profile/CreateCommand.js.map +0 -1
  214. package/dist/cli/commands/profile/LintCommand.d.ts +0 -19
  215. package/dist/cli/commands/profile/LintCommand.js +0 -155
  216. package/dist/cli/commands/profile/LintCommand.js.map +0 -1
  217. package/dist/cli/commands/profile/ListCommand.d.ts +0 -19
  218. package/dist/cli/commands/profile/ListCommand.js +0 -91
  219. package/dist/cli/commands/profile/ListCommand.js.map +0 -1
  220. package/dist/cli/commands/profile/Shared.d.ts +0 -9
  221. package/dist/cli/commands/profile/Shared.js +0 -10
  222. package/dist/cli/commands/profile/Shared.js.map +0 -1
  223. package/dist/cli/commands/run/RunFirstRunOnboarding.d.ts +0 -7
  224. package/dist/cli/commands/run/RunFirstRunOnboarding.js +0 -52
  225. package/dist/cli/commands/run/RunFirstRunOnboarding.js.map +0 -1
  226. package/dist/cli/commands/run/RunLaunchSummary.d.ts +0 -2
  227. package/dist/cli/commands/run/RunLaunchSummary.js +0 -35
  228. package/dist/cli/commands/run/RunLaunchSummary.js.map +0 -1
  229. package/dist/cli/commands/run/RunProfileResolution.d.ts +0 -39
  230. package/dist/cli/commands/run/RunProfileResolution.js +0 -128
  231. package/dist/cli/commands/run/RunProfileResolution.js.map +0 -1
  232. package/dist/cli/commands/run/RunStateWritePrompt.d.ts +0 -2
  233. package/dist/cli/commands/run/RunStateWritePrompt.js +0 -29
  234. package/dist/cli/commands/run/RunStateWritePrompt.js.map +0 -1
  235. package/dist/cli/commands/setup/SetupPrompts.d.ts +0 -14
  236. package/dist/cli/commands/setup/SetupPrompts.js +0 -296
  237. package/dist/cli/commands/setup/SetupPrompts.js.map +0 -1
  238. package/dist/cli/commands/setup/SetupSourceImport.d.ts +0 -5
  239. package/dist/cli/commands/setup/SetupSourceImport.js +0 -177
  240. package/dist/cli/commands/setup/SetupSourceImport.js.map +0 -1
  241. package/dist/cli/commands/setup/SetupSourceLaunch.d.ts +0 -4
  242. package/dist/cli/commands/setup/SetupSourceLaunch.js +0 -65
  243. package/dist/cli/commands/setup/SetupSourceLaunch.js.map +0 -1
  244. package/dist/cli/commands/setup/SetupStarterSource.d.ts +0 -21
  245. package/dist/cli/commands/setup/SetupStarterSource.js +0 -133
  246. package/dist/cli/commands/setup/SetupStarterSource.js.map +0 -1
  247. package/dist/cli/commands/setup/SetupTypes.d.ts +0 -91
  248. package/dist/cli/commands/setup/SetupTypes.js +0 -26
  249. package/dist/cli/commands/setup/SetupTypes.js.map +0 -1
  250. package/dist/compositeProfile/CompositeProfile.d.ts +0 -8
  251. package/dist/compositeProfile/CompositeProfile.js +0 -6
  252. package/dist/compositeProfile/CompositeProfile.js.map +0 -1
  253. package/dist/compositeProfile/CompositeProfileAssembler.d.ts +0 -12
  254. package/dist/compositeProfile/CompositeProfileAssembler.js +0 -32
  255. package/dist/compositeProfile/CompositeProfileAssembler.js.map +0 -1
  256. package/dist/compositeProfile/CompositeProfileCleanup.d.ts +0 -9
  257. package/dist/compositeProfile/CompositeProfileCleanup.js +0 -87
  258. package/dist/compositeProfile/CompositeProfileCleanup.js.map +0 -1
  259. package/dist/compositeProfile/CompositeProfileFile.d.ts +0 -16
  260. package/dist/compositeProfile/CompositeProfileFile.js +0 -16
  261. package/dist/compositeProfile/CompositeProfileFile.js.map +0 -1
  262. package/dist/compositeProfile/CompositeProfileTemplate.d.ts +0 -15
  263. package/dist/compositeProfile/CompositeProfileTemplate.js +0 -65
  264. package/dist/compositeProfile/CompositeProfileTemplate.js.map +0 -1
  265. package/dist/compositeProfile/CompositeProfileWatcher.d.ts +0 -18
  266. package/dist/compositeProfile/CompositeProfileWatcher.js +0 -46
  267. package/dist/compositeProfile/CompositeProfileWatcher.js.map +0 -1
  268. package/dist/compositeProfile/StatePersistence.d.ts +0 -39
  269. package/dist/compositeProfile/StatePersistence.js +0 -249
  270. package/dist/compositeProfile/StatePersistence.js.map +0 -1
  271. package/dist/fs/SafeSymlink.d.ts +0 -13
  272. package/dist/fs/SafeSymlink.js +0 -50
  273. package/dist/fs/SafeSymlink.js.map +0 -1
  274. package/dist/profiles/Profile.d.ts +0 -60
  275. package/dist/profiles/Profile.js +0 -7
  276. package/dist/profiles/Profile.js.map +0 -1
  277. package/dist/profiles/ProfileCache.d.ts +0 -8
  278. package/dist/profiles/ProfileCache.js.map +0 -1
  279. package/dist/profiles/ProfileLoader.d.ts +0 -28
  280. package/dist/profiles/ProfileLoader.js +0 -299
  281. package/dist/profiles/ProfileLoader.js.map +0 -1
  282. package/dist/profiles/ProfileMerger.d.ts +0 -19
  283. package/dist/profiles/ProfileMerger.js +0 -112
  284. package/dist/profiles/ProfileMerger.js.map +0 -1
  285. package/dist/profiles/ProfileSource.d.ts +0 -35
  286. package/dist/profiles/ProfileSource.js +0 -13
  287. package/dist/profiles/ProfileSource.js.map +0 -1
  288. package/dist/profiles/PromptIncludes.d.ts +0 -32
  289. package/dist/profiles/PromptIncludes.js +0 -147
  290. package/dist/profiles/PromptIncludes.js.map +0 -1
  291. package/dist/prompts/SystemPromptExport.d.ts +0 -16
  292. package/dist/prompts/SystemPromptExport.js +0 -81
  293. package/dist/prompts/SystemPromptExport.js.map +0 -1
  294. package/dist/schemas/profile-source.schema.json +0 -29
  295. package/dist/schemas/profile.schema.json +0 -200
  296. package/dist/skills/ProfileSkillResolution.d.ts +0 -21
  297. package/dist/skills/ProfileSkillResolution.js +0 -88
  298. package/dist/skills/ProfileSkillResolution.js.map +0 -1
  299. package/dist/skills/SkillCatalog.d.ts +0 -41
  300. package/dist/skills/SkillCatalog.js +0 -119
  301. package/dist/skills/SkillCatalog.js.map +0 -1
  302. package/dist/skills/SkillResolution.d.ts +0 -34
  303. package/dist/skills/SkillResolution.js +0 -369
  304. package/dist/skills/SkillResolution.js.map +0 -1
  305. package/docs/documentation/profile-repository.md +0 -179
  306. package/src/schemas/SchemaDocument.ts +0 -20
  307. package/src/schemas/profile-source.schema.json +0 -29
  308. package/src/schemas/profile.schema.json +0 -200
@@ -1,8 +1,8 @@
1
1
  # State persistence
2
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.
3
+ Outfitter launches agent CLIs from a temporary baked composition. 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
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.
5
+ Outfitter does not silently copy every file back into your `.agents` tree. Instead, each adapter declares the state paths it understands, chooses safe defaults, and lets settings override how writes to those paths are handled.
6
6
 
7
7
  ## Default behavior
8
8
 
@@ -18,40 +18,33 @@ state_persistence:
18
18
  mcp.json: symlink # MCP/server configuration stays durable.
19
19
  plugins/: symlink # Installed plugins can be reused.
20
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.
21
+ sessions/: symlink # Session/project state is durable unless overridden.
22
+ unknown: warn # Unexpected writes are visible and not silently persisted.
23
23
  ```
24
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.
25
+ Some generated 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
26
 
27
27
  ## How state works
28
28
 
29
29
  Outfitter separates runtime files into three groups:
30
30
 
31
- 1. **Generated profile files** — files Outfitter builds from settings, profiles, templates, and adapter rules. These are temporary and reproducible.
31
+ 1. **Generated composition files** — files Outfitter bakes from the resolved `.agents` layers and adapter rules. These are temporary and reproducible.
32
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
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
34
 
35
- Only declared state paths can be persisted automatically.
35
+ Only declared state paths can be persisted automatically. Baked artifacts and [dumps](./dump-and-bake.md) never contain persisted state — state is runtime, not configuration.
36
36
 
37
- ## Profile option
37
+ ## Configuring persistence
38
38
 
39
- Use `state_persistence` in a profile to override adapter defaults:
39
+ Set `state_persistence` in [settings](./settings.md) — globally, per project, or in `settings.local.yml` for one machine:
40
40
 
41
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.
42
+ # .agents/settings.yml — a stricter policy for a CI project
47
43
  state_persistence:
48
44
  settings.json: error # Fail if the agent changes settings during the run.
49
45
  mcp.json: error # Fail if tool/server config changes during the run.
50
46
  plugins/: error # Fail if plugin state changes during the run.
51
47
  unknown: error # Fail if the agent writes an undeclared file.
52
-
53
- controls:
54
- thinking: high
55
48
  ```
56
49
 
57
50
  ## Strategies
@@ -60,24 +53,22 @@ controls:
60
53
 
61
54
  ```yaml
62
55
  state_persistence:
63
- auth.json: symlink # Persist writes through a durable profile-managed or native CLI path.
56
+ auth.json: symlink # Persist writes through a durable native CLI path.
64
57
  cache/: discard # Allow writes, then throw them away when the run ends.
65
58
  plugins/: warn # Allow writes, discard them, and report them after the run.
66
59
  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.
60
+ mcp.json: prompt # Ask after the run: persist, discard, or always persist.
68
61
  ```
69
62
 
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.
63
+ 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 durable. Use `prompt` when you want to decide interactively after each run.
71
64
 
72
65
  ## Prompt strategy
73
66
 
74
67
  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
68
 
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.
69
+ - **persist** — copy the change to the path's durable destination for this run only.
70
+ - **discard** — throw the change away with the rest of the baked composition.
71
+ - **always** — persist the change and record a `state_persistence: <path>: symlink` override in the editable settings scope, so future runs persist writes to that path automatically. Outfitter never mutates a synced catalog cache: if the active configuration comes from a remote source, the change is persisted once and a warning explains that the choice could not be recorded.
81
72
 
82
73
  In non-interactive sessions (CI, scripts, piped stdio), `prompt` falls back to `warn` and Outfitter prints an explicit `prompt skipped: non-interactive` notice.
83
74
 
@@ -85,7 +76,7 @@ Undeclared writes governed by `unknown: prompt` cannot be persisted because they
85
76
 
86
77
  ## Temporary directory cleanup
87
78
 
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.
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.
89
80
 
90
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.
91
82
 
@@ -104,7 +95,7 @@ state_persistence:
104
95
  ### Keep shared catalogs clean
105
96
 
106
97
  ```yaml
107
- # Story: A team publishes a shared engineering profile catalog.
98
+ # Story: A team publishes a shared .agents catalog.
108
99
  # Goal: MCP config can come from the catalog, but one user's random runtime files
109
100
  # should not become shared team state.
110
101
  state_persistence:
@@ -115,12 +106,12 @@ state_persistence:
115
106
  ### Make CI reproducible
116
107
 
117
108
  ```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.
109
+ # Story: A platform engineer runs a baked Outfitter task in CI.
110
+ # Goal: CI should prove the composition is complete, not depend on hidden runtime mutation.
120
111
  state_persistence:
121
- settings.json: error # Settings drift means the profile is incomplete.
112
+ settings.json: error # Settings drift means the composition is incomplete.
122
113
  mcp.json: error # Tool config drift should fail the job.
123
- plugins/: error # Plugin installs/updates should be explicit in the profile.
114
+ plugins/: error # Plugin installs/updates should be explicit in the tree.
124
115
  unknown: error # Any undeclared write is a reproducibility problem.
125
116
  ```
126
117
 
@@ -186,39 +177,10 @@ state_persistence:
186
177
  unknown: warn # Undeclared writes; allowed: discard, warn, error, prompt.
187
178
  ```
188
179
 
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
180
  ## Where durable state lives
192
181
 
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.
182
+ When a path uses `symlink`, the durable destination is the native CLI state location — `~/.pi/agent/...` for Pi, `~/.claude/...` for Claude Code. The native location is not another configuration layer: it does not participate in resolution or merge precedence; it only provides a durable destination for state paths.
209
183
 
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
- ```
184
+ For a [ported Claude Code setup](./porting-claude.md), `~/.claude` configuration entries are themselves symlinks into `~/.agents/`, so persisted configuration state lands in the protocol tree while session and auth state stays native.
223
185
 
224
186
  For the complete adapter contract and rationale, see [State writeback strategy](../architecture/state_writeback_strategy.md).
@@ -0,0 +1,37 @@
1
+ # Subagents
2
+
3
+ A subagent is a protocol [agent](./agents.md) projected into the harness's native delegation mechanism, so a run can hand focused work to a separate context. You declare subagents in an agent's loadout — the `subagents` field of its `agent.md` frontmatter or `config.json` — not in any settings map.
4
+
5
+ ```markdown
6
+ ---
7
+ name: engineer
8
+ subagents: [code-reviewer, explorer]
9
+ ---
10
+ ```
11
+
12
+ Each slug resolves to an `agents/<id>/` definition across layers like any other resource. At launch the adapter projects the selected definitions into the harness's subagent surface:
13
+
14
+ - **Claude Code** — materialized into the harness's agents directory so they are invocable as native subagents.
15
+ - **Pi** — registered through Pi's subagent extension mechanism.
16
+
17
+ See the [adapter support matrix](./support-matrix.md) for current coverage.
18
+
19
+ ## Leader agents and delegation targets
20
+
21
+ The reason to give an agent subagents is to make it a **leader**: an agent that coordinates work and delegates the bounded pieces. A leader can delegate two ways, and the two compose:
22
+
23
+ - **To local coding-harness subagents** — agents projected into the running harness (Claude Code's agents directory, Pi's subagent extension). The leader hands off exploration, review, or parallelizable work to a fresh context on the same machine and gets the result back inline.
24
+ - **To issue- and action-backed subagents** — work dispatched asynchronously, backed by a GitHub issue and an [Outfitter action](./actions.md). The leader files the unit of work as an issue; an action runs the delegate agent headlessly and reports back on the issue or PR. This is how a leader parallelizes across machines and across time rather than within one session.
25
+
26
+ A leader's loadout is where both are declared: local delegates as `subagents`, remote work routed through the action it triggers. Keep each delegate bounded — one job, clear inputs, a defined deliverable back to the caller.
27
+
28
+ ## When to give an agent subagents
29
+
30
+ - **One focused agent** — a single agent doing the work directly. Prefer this default; delegation adds latency and context loss.
31
+ - **One leader managing subagents** — a coordinating agent that delegates exploration, review, or parallelizable work.
32
+
33
+ ## Authoring guidance
34
+
35
+ - Give each subagent a crisp `description` — the leader uses it to decide when to delegate.
36
+ - Keep subagents bounded: one job, clear inputs, a defined deliverable.
37
+ - Don't duplicate skill procedures into subagent definitions; a subagent can select and use [skills](./skills.md) through its own loadout like any agent.
@@ -1,49 +1,54 @@
1
1
  # Adapter support matrix
2
2
 
3
- What Outfitter can control per agent CLI today. Pi is the primary and most complete adapter; Claude Code is supported with gaps.
3
+ What Outfitter can project per agent CLI. Pi is the primary and most complete adapter; Claude Code is supported with gaps.
4
4
 
5
5
  Status values:
6
6
 
7
- - **Supported** — Outfitter translates this concept for the CLI through at least one native mechanism.
7
+ - **Supported** — Outfitter projects this concept for the CLI through at least one native mechanism.
8
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 |
9
+ - **Roadmap** — the CLI appears to support the concept, but Outfitter does not project it yet.
10
+
11
+ When a composition requests something an adapter cannot project, Outfitter warns to stderr; `--strict` makes those warnings fatal.
12
+
13
+ Tasks and bake are not in this matrix — they are the subject of a [separate upcoming RFC](./tasks.md).
14
+
15
+ | What Outfitter projects | Pi | Claude Code |
16
+ | ------------------------------------------------------------------------ | --------- | ----------- |
17
+ | Agent config directory | Supported | Supported |
18
+ | Session directory | Supported | Supported |
19
+ | Agent identity (`system-prompt.md`, `agents.md`, `agents/<id>/agent.md`) | Supported | Supported |
20
+ | Subagents (`agents/<id>` as harness delegates) | Supported | Supported |
21
+ | Skills (`skills/<id>`) | Supported | Partial |
22
+ | Commands (`commands/`) | Supported | Partial |
23
+ | Knowledge (`knowledge/`) | Supported | Partial |
24
+ | Model selection (`models.json`) | Supported | Partial |
25
+ | MCP servers (`mcp.json`) | Supported | Supported |
26
+ | Extensions (agent `extensions:` loadout) | Supported | Roadmap |
27
+ | Plugins (agent `plugins:` loadout) | Supported | Roadmap |
28
+ | Credentials and environment | Supported | Supported |
29
+ | DeepWork job selection | Supported | Roadmap |
30
+ | Hooks | Partial | Partial |
31
+ | Tool availability | Roadmap | Roadmap |
32
+ | Theme / UI presentation | Roadmap | Roadmap |
33
+ | Working directory | Roadmap | Roadmap |
34
+ | Pass-through arguments | Supported | Supported |
35
+ | Bootstrap hook | Supported | Roadmap |
31
36
 
32
37
  ## Claude Code notes
33
38
 
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 (including catalog skill IDs) is not translated for Claude yet and warns if requested; the bundled Outfitter skill ships through the plugin channel instead.
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
- - **Bundled Outfitter skill** — every launch also publishes Outfitter's own self-documentation skill (authored at `.outfitter/skills/outfitter` in the Outfitter repository) as a bundled plugin through `--plugin-dir`, so the agent can explain Outfitter and this launch's configuration.
40
- - **DeepWork jobs** — the `controls.deepwork` selection is Pi-only today and warns on Claude.
39
+ - **Config and session state** — Outfitter points `CLAUDE_CONFIG_DIR` at the baked composition, 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.
40
+ - **Subagents** — selected `agents/<id>` definitions are materialized into Claude's native agents directory.
41
+ - **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.
42
+ - **Model selection (Partial)** — model maps to `--model` and thinking level to `--effort`; provider selection is not projected for Claude and warns if requested.
43
+ - **Hooks (Partial)** — hook configuration is projected into the generated `settings.json`; there is no portable protocol hooks resource yet. See [Hooks](./hooks.md).
44
+ - **DeepWork jobs** — job selection is Pi-only today and warns on Claude.
45
+ - **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.
41
46
 
42
47
  ## Pi notes
43
48
 
44
- - 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.
45
- - **Catalog skills** — `controls.skills` entries may be catalog skill IDs (bare strings or `{ id, references }` objects). Outfitter resolves IDs across project, directory-profile, and configured-source `skills/` directories following layer precedence, materializes `references`, `scripts`, and `assets` frontmatter into a generated skill beneath the composite profile, and passes the generated directory via `--skill`. `outfitter profile lint` validates selections and references before launch.
46
- - Bootstrap behavior (for example the onboarding flow) uses an explicit Pi bootstrap extension via `--extension`.
47
- - Every launch also passes Outfitter's own self-documentation skill — materialized with its documentation references into the composite profile — through `--skill`.
49
+ - Pi projects the full resource set: agent identity, subagents (via the subagent extension), skills (`--skill`), commands, model configuration, MCP, extensions (`--extension`) and plugins as first-class loadout elements, environment, pass-through args, session directory, and DeepWork job selection.
50
+ - Selected skills resolve across layers following [layer precedence](./concepts.md#layer-precedence); `references`, `scripts`, and `assets` frontmatter materialize into a generated skill passed via `--skill`. `outfitter validate` checks selections and references before launch.
51
+ - **Hooks (Partial)** — bootstrap behavior uses an explicit Pi extension via `--extension`; recurring per-event hooks are extension territory. See [Hooks](./hooks.md).
52
+ - Every launch also passes Outfitter's own self-documentation skill through `--skill`.
48
53
 
49
54
  For the architecture-level definitions behind each row, see [Controllable elements](../architecture/controllable-elements.md).
@@ -1,14 +1,22 @@
1
1
  # Switching to Outfitter
2
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.
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 the tree. The goal is to capture the small set of habits that reliably jumpstart the human.
4
+
5
+ ## Two adoption paths
6
+
7
+ **You already have a `.agents/` directory.** You're done with the hard part — Outfitter reads the protocol directly. Set `default_agent` in `.agents/settings.yml` to one of your [agent](./agents.md) slugs — the agent's own loadout selects its skills, subagents, and knowledge — and run `outfitter`. Nothing is converted or re-authored.
8
+
9
+ **Your setup lives in `~/.claude`.** Let `outfitter setup` port it into `~/.agents/` and symlink it back so Claude Code keeps working natively — see [Porting a Claude Code setup](./porting-claude.md). Your ported skills, agents, and commands are then referenceable by slug like any protocol resource.
10
+
11
+ Starting from neither? `outfitter setup` bootstraps from the default catalog — see [Getting started](./getting-started.md).
4
12
 
5
13
  ## Migration shape
6
14
 
7
15
  1. Keep the current agent CLI installed and working.
8
16
  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.
17
+ 3. Put stable personal defaults in your global layer — ideally a versioned standalone `.agents` repo ([Local development](./local-development.md)).
18
+ 4. Add a project `.agents/` overlay only where a repository needs different instructions or tools.
19
+ 5. Run `outfitter`, compare the session to your old workflow, and tighten the tree before adding more.
12
20
 
13
21
  ## What to migrate first
14
22
 
@@ -19,105 +27,91 @@ Migrate durable operating rules before migrating files:
19
27
  - how it should use subagents;
20
28
  - what review or test evidence you expect;
21
29
  - what writing voice or product judgment it should preserve;
22
- - which skills/extensions are essential.
30
+ - which skills are essential.
23
31
 
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.
32
+ Leave transient chat tricks behind. If a rule is not worth committing to the tree, it probably belongs in the next prompt, not the baseline.
25
33
 
26
- ## Home profile template
34
+ ## Global layer template
27
35
 
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
36
+ Use this as a migration worksheet: one agent holding your durable posture and the skills you reach for.
38
37
 
38
+ ```
39
+ <!-- ~/.agents/agents/workbench/agent.md -->
39
40
  ---
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.
41
+ name: workbench
42
+ description: Personal agent-CLI habits migrated from my previous setup.
43
+ skills: [] # add only skills you expect to use repeatedly
44
+ ---
45
+
46
+ # Workbench
47
+
48
+ You may inspect files, make focused edits, and run local validation commands.
49
+ Ask before deleting files, changing dependencies, pushing, publishing, touching
50
+ credentials, mutating production data, or making irreversible external changes.
51
+
52
+ Plan before broad rewrites. Use acceptance criteria that can be checked from
53
+ repo state. Prefer small commits and explain validation evidence before
54
+ calling work done.
55
+
56
+ Treat rough notes as source material, not final requirements: convert
57
+ ambiguous requests into a short plan, preserve interesting claims, remove filler.
58
+ ```
59
+
60
+ ```yaml
61
+ # ~/.agents/settings.yml
62
+ default_agent: workbench
63
+ default_harness: pi
69
64
  ```
70
65
 
71
66
  ## Project overlay template
72
67
 
73
- Use a project overlay when a repository has instructions that should not leak into every session.
68
+ Use a project overlay when a repository has instructions that should not leak into every session. The workspace layer merges over your global layer by ID; `agents.md` carries project context.
74
69
 
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
70
+ ```
71
+ <!-- <repo>/.agents/agents.md -->
86
72
 
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.
73
+ Use this repository's docs, tests, and issue tracker as the source of truth.
74
+ Record durable decisions in project files, not only in chat.
75
+ Run the narrowest relevant validation before broad checks.
76
+ ```
77
+
78
+ A project overlay can add a skill to the workbench agent without redefining it. Put the additive loadout change in the agent's `config.json`: JSON files shallow-merge by key across layers, so the workspace layer adds `deployment-review` while the global `agent.md` identity stays intact. (A partial `agent.md` would _not_ merge field-by-field — it resolves whole-resource by ID and would replace the global body, so keep loadout tweaks in `config.json`.)
79
+
80
+ ```
81
+ <!-- <repo>/.agents/agents/workbench/config.json -->
82
+ {
83
+ "skills": ["deployment-review"]
84
+ }
85
+ ```
86
+
87
+ ```yaml
88
+ # <repo>/.agents/settings.yml
89
+ default_agent: workbench
98
90
  ```
99
91
 
100
92
  ## Mapping old habits to Outfitter
101
93
 
102
- | Existing habit | Outfitter/Pi shape |
94
+ | Existing habit | Outfitter shape |
103
95
  | ------------------------------------ | -------------------------------------------------------------------------------------------------------- |
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. |
96
+ | "Always plan before edits." | Use the plan extension keybinding (`Shift+Tab` in the default Outfitter Pi setup) before implementation. |
97
+ | "Use YOLO except dangerous actions." | State allowed local actions and approval gates in your agent. |
98
+ | "Run code review after changes." | Select a review skill, then invoke it with a slash command such as `/skill:review`. |
99
+ | "Spawn a second agent for research." | Select an explorer [subagent](./subagents.md) and describe when the lead agent should delegate. |
100
+ | "Use browser or GitHub helpers." | Add the MCP server to `mcp.json` in the layer that needs it. |
101
+ | "Keep project context durable." | Commit it to the project's `.agents/agents.md`; keep personal defaults in your global layer. |
102
+ | "Repeat the same CI/automation job." | Make it a [task](./tasks.md) with structured inputs. |
111
103
 
112
104
  ## Check the active capabilities
113
105
 
114
- Because tools differ by CLI and profile, start migrated sessions with:
106
+ Because tools differ by CLI and composition, start migrated sessions with:
115
107
 
116
108
  ```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.
109
+ List the active tools, skills, and subagents. Note which are vanilla harness
110
+ features, which come from the default catalog, and which are project-local.
111
+ Also read agents.md if this tree has one.
118
112
  ```
119
113
 
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.
114
+ If a behavior is a project rule rather than a personal preference, put it in the project's `.agents/agents.md` so every agent session can inherit it.
121
115
 
122
116
  ## Migration checkpoint
123
117
 
@@ -127,4 +121,4 @@ Run:
127
121
  outfitter
128
122
  ```
129
123
 
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.
124
+ If the first session does not feel like a better version of your old setup, edit the agent before adding more files. The first win is reliable launch plus useful starting context; broader catalogs can come after that baseline holds.
@@ -0,0 +1,13 @@
1
+ # Tasks
2
+
3
+ > **Status: future RFC.** Tasks are not part of the dotagents end state described here. This page is a placeholder for a concept that will be specified separately.
4
+
5
+ A task is intended to be a named, portable execution contract — the stable objective of a repeatable unit of work, the resources it composes, its structured input and output contract, and what "done" means — together with a **bake** step that freezes that contract and its inputs into an immutable, deterministic artifact for headless execution (CI, scheduled jobs, delegated work).
6
+
7
+ That surface — `tasks/<id>/task.md`, structured `inputs`, `outfitter task bake`, and task-backed [actions](./actions.md) — raises its own design questions (input trust boundaries, determinism guarantees, DeepWork job selection, adapter coverage) and will be worked out in a dedicated RFC rather than folded into this one.
8
+
9
+ Until then:
10
+
11
+ - Run work interactively by selecting an [agent](./agents.md): `outfitter run <agent-id>`.
12
+ - Inspect exactly what an agent composes with [`outfitter dump`](./dump-and-bake.md).
13
+ - For headless GitHub Actions runs today, see [Actions](./actions.md), which runs an agent non-interactively with structured inputs.