@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
@@ -0,0 +1,109 @@
1
+ # Agents
2
+
3
+ An agent is the protocol's identity resource — and, in Outfitter, the thing you run. A directory under `agents/<id>/` holds an `agent.md` definition and an optional `config.json`. Together they carry both _who the agent is_ and _what it runs with_: its skills, MCP servers, subagents, extensions, plugins, model, thinking level, and tool policy. That whole bundle — identity plus loadout — is what earlier drafts called a "profile." There is no separate profile resource; **an agent is the profile**. See [Profiles](./profiles.md).
4
+
5
+ ```text
6
+ .agents/
7
+ agents/
8
+ engineer/
9
+ agent.md
10
+ config.json # optional
11
+ skills/ # capabilities private to engineer
12
+ release-debug/SKILL.md
13
+ hooks/ # reserved for a future portable hook entity
14
+ code-reviewer/
15
+ agent.md
16
+ ```
17
+
18
+ ## agent.md
19
+
20
+ `agent.md` describes the identity in markdown — who the agent is, its policy and posture, how it approaches work — and declares its loadout in frontmatter:
21
+
22
+ ```markdown
23
+ ---
24
+ name: engineer
25
+ description: Implements features and fixes with a bias toward small, verifiable changes.
26
+ skills: [wiki, research]
27
+ subagents: [code-reviewer]
28
+ extensions: [outfitter-mode]
29
+ plugins: [git-tools]
30
+ mcp: [github]
31
+ model: gpt-5.2
32
+ thinking: high
33
+ tools:
34
+ allow: [read, edit, bash]
35
+ ---
36
+
37
+ # Engineer
38
+
39
+ You implement changes directly, keep diffs small, and verify before claiming done...
40
+ ```
41
+
42
+ Keep the prose focused on durable identity and behavior. Per-capability procedures belong in [skills](./skills.md); the frontmatter only _selects_ resources by slug — it never copies their content.
43
+
44
+ ### Loadout fields
45
+
46
+ | Field | Selects |
47
+ | ------------ | ---------------------------------------------------------------------------- |
48
+ | `skills` | [Skill](./skills.md) slugs made available to the run. |
49
+ | `mcp` | MCP servers from the tree's `mcp.json` to enable. |
50
+ | `subagents` | Agent slugs projected as harness delegates. See [Subagents](./subagents.md). |
51
+ | `extensions` | Pi extensions to load. First-class, per the adapter. |
52
+ | `plugins` | Pi plugins to load. First-class, per the adapter. |
53
+ | `model` | Provider/model from `models.json`. |
54
+ | `thinking` | Thinking/effort level. |
55
+ | `tools` | Allowed/denied tool policy for the run. |
56
+
57
+ Every value is a slug resolved across layers. Skills first check `agents/<agent>/skills/<slug>/` across layer precedence, then fall back to catalog-wide `skills/<slug>/`. This lets an agent own private implementation capabilities without exposing them to every agent in the catalog. See [Skills](./skills.md#agent-local-skills).
58
+
59
+ `knowledge` and `commands` resolve the same way — an agent may keep private files under `agents/<agent>/knowledge/` and `agents/<agent>/commands/`, local-first over the catalog-wide trees. `subagents` are always catalog-wide (a delegate is a shared agent). `extensions`/`plugins` are harness-native passthroughs with no on-disk namespace, and `model`/`thinking`/`tools` are per-agent already via `config.json` merge.
60
+
61
+ ## Pi configuration overlay
62
+
63
+ An agent may own native Pi configuration under `agents/<agent>/pi/`. Outfitter overlays that folder into the temporary `PI_CODING_AGENT_DIR` before launching Pi, so native files keep their standard names and formats:
64
+
65
+ ```text
66
+ agents/founder/
67
+ ├── agent.md
68
+ └── pi/
69
+ ├── settings.json
70
+ ├── keybindings.json
71
+ ├── models.json
72
+ └── themes/
73
+ ```
74
+
75
+ The overlay is file-based. Source layers are applied from lowest to highest precedence, so a workspace `agents/founder/pi/keybindings.json` replaces the same file from a global or remote catalog while unrelated lower-layer files remain present. Outfitter does not follow symlinks from the overlay. The folder is ignored when the selected harness is not Pi.
76
+
77
+ Outfitter writes generated identity and composed skills after applying the native overlay, and seeds durable Pi credentials immediately before launch. Those runtime-owned resources therefore cannot be replaced accidentally by a profile overlay.
78
+
79
+ Two per-agent surfaces are **discovered but not yet projected** (adapter parity is tracked in [#183](https://github.com/ai-outfitter/outfitter/issues/183)): `agents/<agent>/mcp.json` (merges by server id over the tree-root `mcp.json`) and the reserved `agents/<agent>/hooks/` namespace (see [Hooks](./hooks.md)). Both surface a validation warning when present so a selection placed there is never silently dropped.
80
+
81
+ ## config.json
82
+
83
+ The optional `config.json` carries structured or harness-specific configuration that is awkward in frontmatter, following the protocol's schema for the pinned revision. JSON files merge across layers per the protocol's JSON merge behavior, so a workspace layer can adjust one field of a globally defined agent — swap the model, add an extension — without copying the whole definition.
84
+
85
+ ## Tree-level context
86
+
87
+ Two files at the tree root complement agent definitions:
88
+
89
+ - `agents.md` — shared operating context that applies to every run from this tree.
90
+ - `system-prompt.md` — the base system prompt an agent's identity layers on top of.
91
+
92
+ ## Running an agent
93
+
94
+ Select an agent by slug; choose the harness with `--harness`:
95
+
96
+ ```bash
97
+ outfitter run engineer
98
+ outfitter run engineer --harness claude
99
+ ```
100
+
101
+ `default_agent` in [settings](./settings.md) sets what plain `outfitter` runs.
102
+
103
+ ## Resolution
104
+
105
+ Agents resolve by slug across layers — workspace, global, then remote sources — with merge-by-ID semantics: a workspace `agents/engineer/` overrides a global or remote one. Agent-local skills merge by their owner and slug using the same layer order. `outfitter list agents` shows every resolvable agent and its winning source; `outfitter list skills --agent engineer` shows its effective skill namespace; `outfitter validate` reports broken loadout slugs and shadowed definitions.
106
+
107
+ ## Agents as delegates
108
+
109
+ The same agent definition can also be selected as a [subagent](./subagents.md) in another agent's `subagents` list — a delegate the run can hand focused work to. A leader agent's loadout is where that delegation is declared.
@@ -1,27 +1,26 @@
1
1
  # Best practices
2
2
 
3
- Outfitter works best with a few stable profiles and many focused skills.
4
- Profiles define who the agent is and the boundaries it operates within. Skills
5
- define what the agent can progressively learn to do.
3
+ Outfitter works best with a few stable [agents](./agents.md) and many focused skills. An agent defines who it is, the boundaries it operates within, and — through its loadout — what it composes. Skills define what the agent can progressively learn to do.
6
4
 
7
- ## Prefer a few profiles and many skills
5
+ The target shape for a project:
8
6
 
9
- Create a profile for a durable identity or policy boundary engineering,
10
- platform operations, support, a customer persona. A profile owns model and
11
- provider controls, operating policy and safety boundaries, tools and
12
- permissions, conventions, and the short rules for selecting skills.
7
+ - zero authored profile files ([an agent and its loadout is the profile](./profiles.md));
8
+ - a small set of reusable agents;
9
+ - one [skill](./skills.md) per capability rather than one skill per trigger;
10
+ - one reusable DeepWork job per multi-step procedure where needed;
11
+ - the minimum GitHub workflow set required by trigger and permission boundaries;
12
+ - only the transitive resource closure required by the selected agent when [dumping](./dump-and-bake.md).
13
13
 
14
- Add a skill when the new behavior is a capability within an existing identity:
15
- issue planning, code review, deployment smoke testing, KPI reporting, release
16
- preparation. Adding a new situation SHOULD usually add a skill and a concise
17
- activation rule, not another profile. Reserve profile inheritance for genuine
18
- control and policy composition; do not require consumers to inherit a profile
19
- merely to access one of its skills.
14
+ ## Prefer a few agents and many skills
20
15
 
21
- Prefer one profile with many skills:
16
+ Create an agent for a durable identity or policy boundary — engineering, platform operations, support. An agent owns operating policy and safety boundaries, conventions, the short rules for selecting skills, and its loadout.
17
+
18
+ Add a skill when the new behavior is a capability within an existing identity: issue planning, code review, deployment smoke testing, KPI reporting, release preparation. Adding a new situation SHOULD usually add a skill and a concise activation rule, not another agent.
19
+
20
+ Prefer one agent with many skills:
22
21
 
23
22
  ```text
24
- platform profile
23
+ platform agent
25
24
  ├── issue-planning skill
26
25
  ├── issue-implementation skill
27
26
  ├── kpi-reporting skill
@@ -29,48 +28,23 @@ platform profile
29
28
  └── failed-deployment-triage skill
30
29
  ```
31
30
 
32
- Avoid separate `issue-planner`, `deployment-reviewer`, and `kpi-reporter`
33
- profiles when they share the same platform identity, permissions, and tools.
34
- Adding release notes later should add a `release-notes` skill to the platform
35
- profile, not a `release-notes-agent` profile with copies of the same controls.
31
+ Avoid separate `issue-planner`, `deployment-reviewer`, and `kpi-reporter` agents when they share the same platform identity, permissions, and tools. Adding release notes later should add a `release-notes` skill, not a `release-notes-agent` with copies of the same policy.
36
32
 
37
- Separate profiles are appropriate when the policy boundary differs. An
38
- engineering agent may edit code, run tests, and push branches; a customer
39
- support agent may read customer conversations and draft replies but must not
40
- modify repositories. Those are different identities with different data access,
41
- tools, and write permissions, so separate `engineering` and `support` profiles
42
- are appropriate — and each can still expose many focused skills.
33
+ Separate agents are appropriate when the policy boundary differs. An engineering agent may edit code, run tests, and push branches; a customer support agent may read customer conversations and draft replies but must not modify repositories. Those are different identities with different data access and write permissions — and each can still expose many focused skills.
43
34
 
44
35
  ## Keep skills focused
45
36
 
46
- Give each skill one recognizable capability and a description precise enough
47
- for an agent to decide when it applies. Keep common policy in the profile
48
- rather than repeating it across every skill.
37
+ Give each skill one recognizable capability and a description precise enough for an agent to decide when it applies. Keep common policy in the agent definition rather than repeating it across every skill.
49
38
 
50
- Focused does not mean tiny. Err on the side of one larger skill that
51
- [routes to different references](./skills.md#skills-as-routers) over many
52
- near-duplicate skills: split a skill only when its description can no longer
53
- say when it applies. Point references at existing human-maintained
54
- documentation rather than writing new agent-only copies, and use
55
- [profile-added references](./skills.md#profile-added-references) to specialize
56
- a shared skill instead of forking it.
39
+ Focused does not mean tiny. Err on the side of one larger skill that [routes to different references](./skills.md#skills-as-routers) over many near-duplicate skills: split a skill only when its description can no longer say when it applies. Point references at existing human-maintained documentation rather than writing new agent-only copies, and use [loadout-added references](./skills.md#loadout-added-references) to specialize a shared skill instead of forking it.
57
40
 
58
41
  ## Use references for human documentation
59
42
 
60
- Keep canonical architecture, policy, and operating documents in normal `docs/`
61
- locations where people already maintain and review them. Declare those files as
62
- skill `references` instead of copying them into skill directories, and read
63
- them only after the skill activates so every run does not pay the context cost
64
- of every possible workflow. See
65
- [External references](./skills.md#external-references) for the reference format
66
- and trust rules.
43
+ Keep canonical architecture, policy, and operating documents in normal `docs/` locations where people already maintain and review them. Declare those files as skill `references` instead of copying them into skill directories, and read them only after the skill activates so every run does not pay the context cost of every possible workflow. See [External references](./skills.md#external-references) for the reference format and trust rules.
67
44
 
68
45
  ## Keep routing concise
69
46
 
70
- A profile's system prompt can map stable runtime signals to relevant skills.
71
- Keep these activation rules short; detailed procedures belong in the selected
72
- skills and their references, never repeated in the profile prompt (see
73
- [Where context and instructions live](./skills.md#where-context-and-instructions-live)).
47
+ An agent can map stable runtime signals to relevant skills. Keep these activation rules short; detailed procedures belong in the selected skills and their references, never repeated in the agent (see [Where context and instructions live](./skills.md#where-context-and-instructions-live)).
74
48
 
75
49
  ```text
76
50
  Select only the skill relevant to the current task.
@@ -79,27 +53,15 @@ Select only the skill relevant to the current task.
79
53
  - Recurring repository activity report: use kpi-reporting.
80
54
  - Successful environment awaiting verification: use deployment-review.
81
55
  - Failed environment update: use failed-deployment-triage.
82
- Load detailed task content only after selecting the skill.
56
+ Load detailed content only after selecting the skill.
83
57
  ```
84
58
 
85
- When an integration launches the profile, pass only the trusted identifiers and
86
- runtime metadata needed to choose a skill. Keep untrusted source material out
87
- of the activation rules and let the selected skill retrieve only what it needs
88
- with trusted tools.
59
+ When an integration invokes an agent headlessly, pass only the trusted identifiers it expects. Keep untrusted source material out of inputs and let the selected skill retrieve only what it needs with trusted tools.
89
60
 
90
61
  ## Keep automation reusable
91
62
 
92
- For agentic automation, prefer a small number of reusable workflows that pass
93
- concise runtime metadata to the same stable execution profile. Let that profile
94
- activate the appropriate skill. One profile and one workflow can then support
95
- issue planning, implementation, scheduled reporting, deployment review, and
96
- future situations; adding a capability becomes a skill change instead of
97
- another near-duplicate profile and automation job.
63
+ For agentic automation, prefer a small number of reusable workflows that run [agents with structured inputs](./actions.md). Consolidate compatible agents into as few workflows as practical; separate workflows are justified only by different triggers, permissions, credentials, or isolation boundaries. Adding a capability becomes a skill change instead of another near-duplicate workflow.
98
64
 
99
65
  ## Review the trust chain
100
66
 
101
- Profiles and skills can influence agent behavior and tool use. Follow
102
- [Trust and review](./profile-repository.md#trust-and-review) for catalog
103
- sources, keep secrets out of profiles, skills, references, and prompts, and run
104
- `outfitter profile lint --strict` in CI to catch broken skill IDs and
105
- references before they reach an agent run.
67
+ Resources influence agent behavior and tool use. Follow [Trust and review](./catalogs.md#trust-and-review) for catalog sources, pin refs (full SHAs for CI), keep secrets out of agents, skills, references, and prompts, and run `outfitter validate --strict` in CI to catch broken slugs and references before they reach an agent run.
@@ -0,0 +1,126 @@
1
+ # Catalogs
2
+
3
+ A catalog is a git repository that publishes a `.agents` payload — agents, skills, tasks, knowledge, commands — so a person, team, or organization can share it. You can bootstrap a machine or project from one, or add one as an ongoing source that Outfitter keeps synchronized.
4
+
5
+ ```bash
6
+ outfitter setup https://github.com/ncrmro/.agents
7
+ ```
8
+
9
+ The repository names are discovery and distribution conventions; the payload is always the same protocol-shaped tree (pinned protocol revision [`502a9d5`](https://github.com/aj47/dotagentsprotocol-website/blob/502a9d5f886d0aad8d3da83c03354bdfa4b389e7/src/components/Structure.astro)):
10
+
11
+ | Convention | Purpose |
12
+ | --------------------------------- | -------------------------------------------------------------------------------- |
13
+ | `owner/.agents` or `owner/.agent` | A shareable personal or team catalog. |
14
+ | `owner/.outfitter` | An organization/control repository distributing org-wide resources and settings. |
15
+
16
+ ## Standalone `.agents` repositories (preferred)
17
+
18
+ The primary catalog pattern is a standalone repository whose **root is the payload** — the flat dotagents layout:
19
+
20
+ ```text
21
+ ncrmro/.agents/ # repository root
22
+ agents.md
23
+ system-prompt.md
24
+ agents/
25
+ engineer/
26
+ agent.md
27
+ skills/ # skills private to engineer
28
+ release-debug/SKILL.md
29
+ founder/agent.md
30
+ skills/
31
+ wiki/SKILL.md
32
+ research/SKILL.md
33
+ tasks/
34
+ weekly-kpis/task.md
35
+ knowledge/
36
+ settings.yml # Outfitter settings (optional; see settings.md)
37
+ settings.local.yml # gitignored machine-local overrides
38
+ ```
39
+
40
+ This is the same layout as `~/.agents/` — a standalone catalog is simply a global layer under version control. That makes it the natural home for personal dotagents development: clone it as `~/.agents` (or point your settings at the checkout), iterate locally, and open pull requests to move improvements upstream into shared catalogs. See [Local development](./local-development.md) for the full workflow.
41
+
42
+ ## Colocated `.agents/` directories (fallback)
43
+
44
+ When agent configuration should travel with a codebase, colocate the payload as a `.agents/` subdirectory beside the code:
45
+
46
+ ```text
47
+ payments-service/
48
+ .agents/
49
+ agents/
50
+ skills/
51
+ settings.yml
52
+ src/
53
+ docs/
54
+ ```
55
+
56
+ The colocated tree doubles as the protocol's workspace overlay: its resources merge by ID over the global and remote layers for anyone running in that project. Prefer the standalone pattern for anything you intend to share across projects; prefer colocation only for resources that are meaningless outside the one repository.
57
+
58
+ ## Consuming a catalog
59
+
60
+ Add the repository to `sources` in your [settings](./settings.md):
61
+
62
+ ```yaml
63
+ # ~/.agents/settings.yml
64
+ sources:
65
+ - github: my-org/.agent # owner/repo shorthand
66
+ ref: 2f9c1ab0d3e44b6f9d2c8a17e5b40c91d6f3a8e2 # pin a commit, tag, or branch
67
+ - github: my-org/payments-service
68
+ ref: v1.2.0
69
+ path: .agents # colocated payload inside the repo
70
+ - uri: git+https://git.example.com/team/agents.git # any git URI
71
+ ```
72
+
73
+ Each source entry is one of:
74
+
75
+ - `path:` — a local directory (no `ref`; read live from disk).
76
+ - `github:` — an `owner/repo` GitHub shorthand.
77
+ - `uri:` — any git-cloneable URI, for non-GitHub hosts.
78
+
79
+ Remote entries additionally accept:
80
+
81
+ - `ref:` — a tag, branch, or commit to pin. With a `ref`, `outfitter sync` fetches exactly that ref. Without one, sync fast-forwards the default branch.
82
+ - `path:` — the payload directory inside the repository, for colocated layouts.
83
+
84
+ Resources from all sources resolve by slug behind local layers, following [layer precedence](./concepts.md#layer-precedence). Agent-local skills keep their owning-agent namespace through cache and source merging. Outfitter reports shadowed IDs so consumers can see which source supplies a selected resource.
85
+
86
+ ## Organization control repositories
87
+
88
+ An `owner/.outfitter` repository distributes organization-wide resources plus shared settings that Outfitter layers below each user's local settings:
89
+
90
+ ```yaml
91
+ # ~/.agents/settings.yml
92
+ remote_settings:
93
+ - github: my-org/.outfitter
94
+ path: .agents/settings.yml # file path inside the repo
95
+ ref: 9c47d1e2b8a05f36c4d7e90a12b3f8c5d6e71a04
96
+ ```
97
+
98
+ Remote settings are cached locally and merged at lower precedence than your project and user settings, so anything you set locally wins. This is how an organization distributes shared sources, agents, and defaults without controlling each user's machine. See the [organization catalog use case](./usecases/organization-profile-catalog.md).
99
+
100
+ ## Syncing and updating
101
+
102
+ `outfitter sync` synchronizes every remote source into the local cache:
103
+
104
+ 1. Remote settings repositories are cloned or updated first, then reloaded.
105
+ 2. Remote sources (including any added by remote settings) are cloned or updated.
106
+ 3. Each synced source is validated; sync reports `updated`, `unchanged`, `skipped`, or `failed` per source.
107
+
108
+ Pinned (`ref:`) sources stay on their pinned ref until you change it; unpinned sources fast-forward on every sync.
109
+
110
+ ## Private repositories
111
+
112
+ Private GitHub catalogs are an enterprise feature. When sync detects a private GitHub repository, it asks for confirmation before use and records the decision in your user settings. Review the Outfitter Enterprise license or your enterprise agreement before enabling private catalogs. Non-GitHub `uri:` sources use whatever git credentials your environment already has; credentials embedded in URIs are redacted from sync output.
113
+
114
+ ## Trust and review
115
+
116
+ Adding a catalog source means trusting its authors with your agent runtime. A catalog's resources can shape prompts and policy (agents, `agents.md`, `system-prompt.md`), add MCP servers (`mcp.json`), and ship skills whose scripts execute on your machine.
117
+
118
+ Before adding a source, review it:
119
+
120
+ 1. Read the agent definitions, `agents.md`, and `system-prompt.md` you will compose.
121
+ 2. Read every skill you will select, including its scripts and catalog-owned `file` references (see the [trust boundary](./skills.md#trust-boundary)).
122
+ 3. Review `mcp.json` — MCP servers are code with whatever access you grant them.
123
+ 4. Check `remote_settings` targets: a settings file can add further sources you did not review.
124
+ 5. Confirm the repository's ownership and that its maintainers are who you expect.
125
+
126
+ **Pin a `ref:`** — ideally a full commit SHA — for any catalog you do not maintain yourself, and always for catalogs consumed in CI (see [Running tasks in GitHub Actions](./actions.md)). A pinned ref makes updates an explicit, reviewable action — bump the ref after reviewing the diff — instead of silently pulling whatever the catalog publishes next.
@@ -1,5 +1,7 @@
1
1
  # CLI reference
2
2
 
3
+ > **Status: RFC [#165](https://github.com/ai-outfitter/outfitter/issues/165) target.** This reference describes the dotagents end-state command surface. The currently released CLI still implements the legacy profile commands; implementation PRs replace them incrementally.
4
+
3
5
  Global options:
4
6
 
5
7
  | Option | Description |
@@ -7,68 +9,64 @@ Global options:
7
9
  | `-V, --version` | Print the Outfitter version. |
8
10
  | `-h, --help` | Show help for a command. |
9
11
 
10
- ## `outfitter run [args...]`
12
+ ## `outfitter run [agent] [args...]`
11
13
 
12
- Assemble a composite profile and launch the selected agent CLI. `run` is the default command, so plain `outfitter` and `outfitter run` are equivalent.
14
+ Resolve, compose, and launch an agent. `run` is the default command, so plain `outfitter` and `outfitter run` are equivalent.
13
15
 
14
- | Option | Description |
15
- | ------------------------- | -------------------------------------------------------------------------- |
16
- | `-p, --profile <profile>` | Outfitter profile id to run. Defaults to the settings `default_profile`. |
17
- | `--agent <agent>` | Agent adapter to launch: `pi` or `claude`. Defaults to `default_agent`. |
18
- | `--strict` | Fail instead of warning when controls cannot be translated by the adapter. |
16
+ | Argument / Option | Description |
17
+ | --------------------- | -------------------------------------------------------------------------------- |
18
+ | `[agent]` | Agent slug to run. Defaults to the settings `default_agent`. |
19
+ | `--harness <harness>` | Harness to launch in: `pi` or `claude`. Defaults to `default_harness`. |
20
+ | `--strict` | Fail instead of warning when the adapter cannot project part of the composition. |
19
21
 
20
- Any other arguments and unrecognized options are passed through to the launched agent CLI:
22
+ Any other arguments and unrecognized options are passed through to the launched harness:
21
23
 
22
24
  ```bash
23
- outfitter run --profile engineer --agent claude
24
- outfitter -p data_analyst -- --print "summarize this repo"
25
+ outfitter run engineer --harness claude
26
+ outfitter run reviewer -- --print "summarize this repo"
25
27
  ```
26
28
 
27
- On a first interactive launch with no `~/.outfitter/settings.yml`, `outfitter` starts Pi-native onboarding instead of a normal run.
28
-
29
29
  ## `outfitter setup [source]`
30
30
 
31
- Create initial Outfitter settings and a default profile. Setup launches Pi with the Outfitter onboarding extension and finishes profile selection inside the agent session (see [Getting started](./getting-started.md)).
32
-
33
- | Argument | Description |
34
- | ---------- | -------------------------------------------------------------------------------------------------------------- |
35
- | `[source]` | Optional setup source: a local path or a git URL of a [profile repository](./profile-repository.md) to import. |
31
+ Open the bundled Pi walkthrough using the original setup wording and sequence. Choose **Use the
32
+ default Outfitter profile catalog**, **Create your own profile**, or **Provide a different catalog
33
+ to import**; complete that branch; choose a home/project settings target; then choose the default
34
+ CLI agent. Pi/Outfitter is preselected. Passing `[source]` retains the original direct-source path
35
+ and starts at target selection. Pi hosts the deterministic setup UI without a model provider and
36
+ does not port or symlink harness configuration. The default picker always comes from
37
+ `ai-outfitter/default-profiles` at the immutable Release Please version tag pinned by the installed
38
+ Outfitter version; setup fetches or reuses that release through the normal source cache and writes
39
+ the same GitHub/ref pair to settings. It never reads a sibling checkout or a packaged catalog
40
+ fallback.
36
41
 
37
42
  ## `outfitter sync`
38
43
 
39
- Synchronize URI-backed profile and remote settings sources into the local cache (`~/.outfitter/cache/`). Takes no options. Reports a per-source status of `updated`, `unchanged`, `skipped`, or `failed`, and validates synced profile sources.
40
-
41
- ## `outfitter profile`
42
-
43
- List and manage Outfitter profiles.
44
+ Synchronize remote sources and remote settings into the local cache. Reports a per-source status of `updated`, `unchanged`, `skipped`, or `failed`, and validates synced sources.
44
45
 
45
- ### `outfitter profile list`
46
+ ## `outfitter list [kind]`
46
47
 
47
- List available Outfitter profiles.
48
+ List resolvable resources across all layers, with the winning source for each slug and any shadowed IDs.
48
49
 
49
- | Option | Description |
50
- | ------- | ----------------------------------------------------------------- |
51
- | `--all` | Include template profiles that are intended only for inheritance. |
50
+ | Argument | Description |
51
+ | -------- | ------------------------------------------------------------- |
52
+ | `[kind]` | Optional filter: `agents`, `skills`, `knowledge`, `commands`. |
52
53
 
53
- ### `outfitter profile create <name>`
54
+ ## `outfitter validate`
54
55
 
55
- Create a new Outfitter profile skeleton.
56
-
57
- | Argument / option | Description |
58
- | ----------------- | --------------------------------------------------------- |
59
- | `<name>` | Filesystem-safe profile name. |
60
- | `--scope <scope>` | Destination scope: `user`, `project`, or `project-local`. |
61
- | `--path <path>` | Destination profile source directory. |
62
-
63
- ### `outfitter profile lint`
64
-
65
- Validate profiles, inheritance, and typed prompt includes.
56
+ Validate the effective resource set: protocol layout, frontmatter, unresolved slugs in agent loadouts, broken or escaping skill references, and settings schema.
66
57
 
67
58
  | Option | Description |
68
59
  | ---------- | ---------------------------------------- |
69
60
  | `--strict` | Exit non-zero when warnings are present. |
70
61
  | `--json` | Print diagnostics as JSON. |
71
62
 
72
- ## `outfitter welcome`
63
+ ## `outfitter dump`
64
+
65
+ Write the composed resource tree as a self-contained `.agents/` directory for review, vendoring, or air-gapped use. Identical sources, refs, and selections produce byte-identical output; dumps never contain credentials, sessions, caches, or other mutable runtime state.
66
+
67
+ | Option | Description |
68
+ | -------------- | ---------------------------------------------------- |
69
+ | `--agent <id>` | Restrict the dump to one agent's transitive closure. |
70
+ | `--out <dir>` | Destination directory (default `./.agents`). |
73
71
 
74
- Run Outfitter welcome onboarding prompts in the terminal. This is a legacy compatibility command: current onboarding runs natively inside Pi (via `outfitter setup` or the first-run `outfitter` launch), and `welcome` remains for environments that need the older terminal prompt flow. Requires an interactive TTY. Takes no options.
72
+ > **Tasks and `outfitter task bake`** baking a task and its inputs into an immutable execution artifact are the subject of a separate upcoming RFC and are not part of this command surface yet. See [Tasks](./tasks.md).
@@ -4,51 +4,94 @@ How an `outfitter` launch goes from configuration files to a running agent:
4
4
 
5
5
  ```mermaid
6
6
  flowchart LR
7
- A[Settings] --> B[Profile sources]
8
- B --> C[Profile stack]
9
- C --> D[Composite profile]
10
- D --> E[Adapter]
11
- E --> F[Agent CLI]
7
+ A[Settings] --> B[Sources]
8
+ B --> C[.agents layers]
9
+ C --> D[Resolver]
10
+ D --> E[Composed agent]
11
+ E --> F[Adapter]
12
+ F --> G[Harness]
12
13
  ```
13
14
 
14
- Settings tell Outfitter where profiles come from; profile sources supply profile definitions; the definitions for the selected profile form an ordered stack; the merged stack is written out as a composite profile; an adapter translates that composite profile into agent-specific files, flags, and environment variables; and the agent CLI launches with the result.
15
+ Settings tell Outfitter where `.agents` resources come from; sources supply protocol resource trees; the resolver merges the layered trees into one effective resource set; the selected agent composes its loadout skills, subagents, model, and so on — from that set by slug; and an adapter projects the composed agent into harness-specific files, flags, and environment variables before launching the harness (pi or Claude Code).
16
+
17
+ ## The `.agents` protocol
18
+
19
+ Outfitter stores and exchanges all agent configuration in the vendor-neutral [Dotagents `.agents` protocol](https://dotagentsprotocol.com/) (pinned at revision [`502a9d5`](https://github.com/aj47/dotagentsprotocol-website/blob/502a9d5f886d0aad8d3da83c03354bdfa4b389e7/src/components/Structure.astro)). Outfitter does not define its own authored configuration format: a `.agents/` tree is useful without Outfitter, and any existing `.agents/` tree is usable by Outfitter without conversion.
20
+
21
+ ```text
22
+ .agents/
23
+ agents.md # shared operating context
24
+ system-prompt.md # base system prompt
25
+ mcp.json # MCP server configuration
26
+ models.json # model configuration
27
+ agents/<id>/agent.md # agent definitions (+ optional config.json)
28
+ agents/<id>/skills/ # skills private to one agent (also knowledge/, commands/)
29
+ agents/<id>/mcp.json # per-agent MCP config (discovered; projection deferred, #183)
30
+ agents/<id>/hooks/ # reserved namespace (not yet resolved)
31
+ skills/<id>/... # Agent Skills packages
32
+ tasks/<id>/task.md # named execution contracts
33
+ knowledge/... # reference documents
34
+ commands/... # slash commands
35
+ ```
36
+
37
+ ## Resources
38
+
39
+ The protocol resources Outfitter resolves and composes:
40
+
41
+ - **Agent** — a definition at `agents/<id>/agent.md` (plus optional `config.json`) describing an identity _and_ its loadout: the skills, subagents, MCP servers, extensions, plugins, model, thinking level, and tools it runs with. The agent is what you run. See [Agents](./agents.md).
42
+ - **Skill** — a capability package under catalog-wide `skills/<id>/` or agent-local `agents/<agent-id>/skills/<id>/`, with instructions, references, scripts, and assets. See [Skills](./skills.md).
43
+ - **Knowledge** and **commands** — reference documents and slash commands shared across runs.
44
+
45
+ > Tasks — `tasks/<id>/task.md` execution contracts, structured inputs, and baking — are the subject of a separate upcoming RFC and are not part of this end state. See [Tasks](./tasks.md).
15
46
 
16
- ## Profile
47
+ ## Profiles, personas, and subagents
17
48
 
18
- A profile is a named, reusable YAML definition of how an agent should be outfitted: model and provider, thinking level, system and append prompts, skills, extensions, subagents, DeepWork jobs, CLI arguments, and environment variables. Profiles can inherit from other profiles and can live as a flat `<id>.yml` file or a directory with a `profile.yml` plus bundled resources. See [Profiles](./profiles.md).
49
+ Three related terms, none of which is a settings key or a separate file format:
19
50
 
20
- ## Composite profile
51
+ - A **[profile](./profiles.md)** is just an agent and its loadout. "The engineer profile" is the `engineer` agent with everything it composes. There is no `profile.yml` and no `profiles:` map — the loadout lives on the agent.
52
+ - A **[persona](./personas.md)** is a _convention_, not a resource: a base review agent (a base prompt plus how-to-review instructions) that reads an interchangeable persona description document — for example `docs/user-personas/coyote-road-runner-chaser.md` — as input. Swapping the input document swaps the persona.
53
+ - A **[subagent](./subagents.md)** is an agent projected into the harness's native delegation mechanism, selected in another agent's `subagents` loadout. A leader agent delegates to local coding-harness subagents or to issue- and action-backed subagents.
21
54
 
22
- A composite profile is the temporary runtime configuration directory Outfitter assembles for one profile and one agent CLI run. It contains the generated files the agent needs, is created under the system temp directory, and is owned by Outfitter for the lifetime of the run — durable state is handled separately (see state persistence below).
55
+ The same agent definition can be run directly or selected as a subagent elsewhere; its loadout decides what it composes.
23
56
 
24
- ## Catalog / profile source
57
+ ## Layers
25
58
 
26
- A profile source is any place profiles are loaded from: a local directory (`path:`), a GitHub repository (`github: owner/repo`), or a git URI (`uri:`). A shared repository of profiles is called a catalog (or profile repository). Remote sources are cached under `~/.outfitter/cache/` and updated with `outfitter sync`; they support `ref` pinning and `only`/`except` filters. See [Profile repositories](./profile-repository.md).
59
+ Resources resolve across layers, following the protocol's overlay semantics:
60
+
61
+ 1. `<project>/.agents/` — the workspace layer, committed with a project.
62
+ 2. `~/.agents/` — the global layer for one developer.
63
+ 3. Remote sources — pinned `.agents` payloads from [catalog repositories](./catalogs.md), in configured order.
64
+
65
+ Resources merge **by ID**: a workspace `skills/wiki/` overrides a global or remote `skills/wiki/`. Agent-local skills merge by owner and ID, so `agents/actions/skills/debug/` is distinct from `agents/reviewer/skills/debug/`; the selected agent's local winner takes precedence over catalog-wide `skills/debug/`. JSON files such as `mcp.json` and `models.json` follow the protocol's JSON merge behavior. Standalone `.agents` repositories — where the repository root _is_ the payload — are the primary way to develop and share layers; see [Catalogs](./catalogs.md) and [Local development](./local-development.md).
27
66
 
28
67
  ## Settings scopes
29
68
 
30
- Outfitter reads `settings.yml` from three local scopes user (`~/.outfitter/settings.yml`), project (`<project>/.outfitter/settings.yml`), and project-local (`<project>/.outfitter/local/settings.yml`, for personal, uncommitted overrides) — plus cached remote settings supplied by `remote_settings` entries. Settings declare the default profile and agent, profile sources, and other launch behavior.
69
+ Outfitter's own settings live inside the `.agents` tree as `settings.yml`, with a flat, gitignored `settings.local.yml` beside it for personal machine-local overrides:
70
+
71
+ - `~/.agents/settings.yml` — user defaults, plus optional `~/.agents/settings.local.yml`.
72
+ - `<project>/.agents/settings.yml` — committed project settings.
73
+ - `<project>/.agents/settings.local.yml` — personal, uncommitted overrides for that project. This flat file replaces the old nested project-local directory scope.
31
74
 
32
- ## Controls
75
+ Settings declare the default agent and harness, resource sources, and launch behavior — not resource selection, which lives on the agent. Removing the settings files leaves a pure protocol tree. See [Settings](./settings.md).
33
76
 
34
- Controls are the generic, agent-neutral knobs a profile sets: `model`, `provider`, `thinking`, `system_prompt`, `append_system_prompt`, `skills`, `extensions`, `args`, `environment`, and more. Profiles can also nest adapter-specific overrides under `controls.pi` or `controls.claude` when one agent needs different values.
77
+ ## One resolver
78
+
79
+ Listing, validation, running, and dumping all share one resolver. What `outfitter list` shows is what `outfitter run` launches and what `outfitter dump` writes. See [Dump](./dump-and-bake.md).
35
80
 
36
81
  ## Adapters
37
82
 
38
- An adapter translates generic controls into one agent CLI's native configuration — files, command-line flags, and environment variables. Pi is the primary and most complete adapter; a Claude Code adapter is supported with gaps. When an adapter cannot honor a control it warns to stderr, or fails when `--strict` is set. See the [adapter support matrix](./support-matrix.md) for per-adapter coverage.
83
+ An adapter projects composed resources into one agent CLI's native configuration — files, command-line flags, and environment variables. Pi is the primary and most complete adapter; a Claude Code adapter is supported with gaps. When an adapter cannot honor part of a composition it warns to stderr, or fails when `--strict` is set. See the [adapter support matrix](./support-matrix.md).
39
84
 
40
85
  ## State persistence
41
86
 
42
- Agents write state during a run — auth, native settings, plugins, sessions. Each adapter declares the state paths it understands and how writes are handled (`symlink`, `discard`, `warn`, `error`, or `prompt`), so useful state survives future runs without Outfitter silently copying unknown files. See [State persistence](./state.md).
87
+ Agents write state during a run — auth, native settings, plugins, sessions. Each adapter declares the state paths it understands and how writes are handled (`symlink`, `discard`, `warn`, `error`, or `prompt`), so useful state survives future runs. See [State persistence](./state.md).
43
88
 
44
89
  ## Layer precedence
45
90
 
46
- When several layers define the same profile or setting, higher layers win:
91
+ When several layers define the same resource ID or setting, higher layers win:
47
92
 
48
- 1. Project-local (`.outfitter/local/`)
49
- 2. Project (`.outfitter/`)
50
- 3. User (`~/.outfitter/`)
93
+ 1. Project-local settings (`<project>/.agents/settings.local.yml`)
94
+ 2. Project (`<project>/.agents/`)
95
+ 3. User (`~/.agents/`, with `settings.local.yml` above `settings.yml`)
51
96
  4. Cached remote sources (in configured source order)
52
97
  5. Built-in defaults
53
-
54
- For profiles, explicitly inherited profiles slot between cached remote sources and built-in defaults, in declared order.