@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,30 @@
1
+ # Dump
2
+
3
+ `outfitter dump` is an output of Outfitter's resolver — the same resolver that backs `list`, `validate`, and `run`, so what you inspect is exactly what executes.
4
+
5
+ ## Dump
6
+
7
+ `outfitter dump` writes the composed resource tree as a plain `.agents/` directory you can commit, diff, and review through a normal pull request:
8
+
9
+ ```bash
10
+ outfitter dump --out ./review
11
+ outfitter dump --agent engineer --out ./engineer # one agent's transitive closure only
12
+ ```
13
+
14
+ Use dumps to:
15
+
16
+ - **Review** exactly what an organization or project composition resolves to before approving a source bump.
17
+ - **Vendor** a self-contained tree into a repository for air-gapped or provenance-sensitive environments.
18
+ - **Debug** layer and merge behavior by diffing dumps before and after a change.
19
+
20
+ ## Guarantees
21
+
22
+ - **Deterministic** — identical sources, refs, and selections produce byte-identical output.
23
+ - **Self-contained** — the dumped tree resolves with no remote sources and no cache.
24
+ - **Safe** — a dump may include reviewable source provenance, but never credentials, auth state, sessions, transcripts, caches, backups, mutable harness state, or symlinks escaping the tree.
25
+ - **Protocol-shaped** — the output is a valid `.agents` payload usable by any protocol consumer, not just Outfitter. Any Outfitter-specific provenance metadata is namespaced, JSON-based, and removable without losing the underlying resources.
26
+ - **Harness-discoverable** — selected agent-local skills are flattened into top-level `skills/<id>/` in the closure output, with their packaged references, scripts, and assets intact.
27
+
28
+ ## Bake
29
+
30
+ > **Status: future RFC.** Baking a repeatable unit of work and its structured inputs into an immutable execution artifact for headless runs is part of the [tasks](./tasks.md) design, which is being specified separately. Dump above already gives a deterministic, self-contained tree for an agent; the additional guarantees baking adds around inputs and task contracts are deferred to that RFC.
@@ -14,7 +14,7 @@ You may inspect files, edit code, and run project tests.
14
14
  Ask before deleting files, changing dependencies, touching credentials, or publishing anything.
15
15
  ```
16
16
 
17
- Permissions are the safety boundary. A good session says what the agent may do, what it must ask about, and what evidence proves the job is done. Outfitter’s default profile catalog is meant to provide useful defaults, but you still own the trust decision for each project and command.
17
+ Permissions are the safety boundary. A good session says what the agent may do, what it must ask about, and what evidence proves the job is done. Outfitter’s default catalog is meant to provide useful defaults, but you still own the trust decision for each project and command.
18
18
 
19
19
  Good first permission rules:
20
20
 
@@ -45,11 +45,11 @@ Read AGENTS.md, the README, package scripts, and the failing test before editing
45
45
  Then propose a three-step plan with acceptance criteria.
46
46
  ```
47
47
 
48
- Outfitter profiles can store reusable personal context, while `AGENTS.md` keeps project context in the repo. Pi also supports extension-provided tools and skills; the default profile catalog may include skills that add project-governance, review, or browser/testing instructions to the session.
48
+ Your `~/.agents` tree stores reusable personal context, while `AGENTS.md` (or a project's `.agents/agents.md`) keeps project context in the repo. Pi also supports extension-provided tools and skills; the default catalog may include skills that add project-governance, review, or browser/testing instructions to the session.
49
49
 
50
50
  ## Planning mode
51
51
 
52
- Planning mode is provided by the plan Pi extension installed in the current Outfitter profile. In the default Outfitter Pi setup, use the plan-mode keybinding (`Shift+Tab`) to toggle from build mode into plan mode before broad changes. Plan mode keeps the agent in an investigation/design posture: read, inspect, and propose; do not write the implementation yet.
52
+ Planning mode is provided by the plan Pi extension installed in the current Outfitter composition. In the default Outfitter Pi setup, use the plan-mode keybinding (`Shift+Tab`) to toggle from build mode into plan mode before broad changes. Plan mode keeps the agent in an investigation/design posture: read, inspect, and propose; do not write the implementation yet.
53
53
 
54
54
  Use the plan-mode keybinding when:
55
55
 
@@ -92,7 +92,7 @@ Subagents are useful for:
92
92
  - comparing approaches;
93
93
  - keeping risky experiments away from the main checkout.
94
94
 
95
- Whether subagents are available depends on the active Pi/Outfitter profile and extensions. The default profile catalog may include subagent definitions or guidance; vanilla agent CLIs differ in what they provide out of the box.
95
+ Whether subagents are available depends on the active composition and extensions — see [Subagents](./subagents.md). The default catalog may include subagent definitions or guidance; vanilla agent CLIs differ in what they provide out of the box.
96
96
 
97
97
  ## Skills
98
98
 
@@ -104,13 +104,13 @@ Try inside Pi:
104
104
  /skill:generated-daily-report
105
105
  ```
106
106
 
107
- Then provide the goal or inputs the skill asks for. Other examples might be project review, browser testing, release notes, or incident summaries, depending on what the active profile installed.
107
+ Then provide the goal or inputs the skill asks for. Other examples might be project review, browser testing, release notes, or incident summaries, depending on what the active agent installed.
108
108
 
109
- Skills may come from Pi packages, from the Outfitter default profile catalog, or from a project-local `.outfitter` profile. If a skill is not active, ask Pi what skills it can see before relying on it.
109
+ Skills may come from Pi packages, from the Outfitter default catalog, or from a project's `.agents/skills/` directory. If a skill is not active, ask Pi what skills it can see before relying on it.
110
110
 
111
111
  ## Extensions and tools
112
112
 
113
- Extensions add tools and UI affordances to Pi. For example, an extension can expose a browser tool, a structured question UI, a GitHub helper, or an Outfitter setup command. These are not all vanilla Pi features; they appear when the active profile loads the relevant Pi package or extension.
113
+ Extensions add tools and UI affordances to Pi. For example, an extension can expose a browser tool, a structured question UI, a GitHub helper, or an Outfitter setup command. These are not all vanilla Pi features; they appear when the active composition loads the relevant Pi package or extension.
114
114
 
115
115
  Ask:
116
116
 
@@ -134,4 +134,4 @@ You may read files and run non-destructive discovery commands.
134
134
  Ask before deleting files, changing dependencies, pushing, publishing, or touching credentials.
135
135
  ```
136
136
 
137
- After a few sessions, move the reusable parts into an Outfitter profile so every launch starts with your preferred operating style.
137
+ After a few sessions, move the reusable parts into an [agent](./agents.md) definition in your `~/.agents` tree so every launch starts with your preferred operating style.
@@ -9,30 +9,44 @@ outfitter --help
9
9
 
10
10
  Outfitter launches agent CLIs; install the agents you plan to use separately.
11
11
 
12
+ ## Already have a `.agents/` directory?
13
+
14
+ You're most of the way there. Outfitter reads the [Dotagents `.agents` protocol](./concepts.md#the-agents-protocol) directly — your existing agents, skills, knowledge, and commands are usable by slug with no conversion:
15
+
16
+ ```bash
17
+ outfitter list # see what resolves from ~/.agents and <project>/.agents
18
+ outfitter run # launch with your defaults
19
+ ```
20
+
21
+ Set `default_agent` in `.agents/settings.yml` to one of your [agent](./agents.md) slugs; that agent's own loadout selects the skills, subagents, model, and so on it runs with. You're done.
22
+
23
+ If your configuration lives in `~/.claude` instead, `outfitter setup` can port it into `~/.agents/` and symlink it back so Claude Code keeps working natively — see [Porting a Claude Code setup](./porting-claude.md).
24
+
12
25
  ## First-time setup
13
26
 
14
- Set up profiles from the Outfitter [default profiles repo](https://github.com/ai-outfitter/default-profiles), then launch the default profile:
27
+ Bootstrap from the Outfitter [default catalog](https://github.com/ai-outfitter/.agent), then launch the default agent:
15
28
 
16
29
  ```bash
17
30
  outfitter setup
18
31
  outfitter
19
32
  ```
20
33
 
21
- If you are new to Claude Code, Codex, Pi, and agent CLIs, start with [First-time CLI agent users](./first-time-cli-agent-users.md) for YOLO mode, permissions, context engineering, planning mode, subagents, skills, and extension basics. If you already have an agent workflow, use [Switching to Outfitter](./switching-to-outfitter.md) to migrate the smallest durable set of habits first.
34
+ If you are new to Claude Code, Codex, Pi, and agent CLIs, start with [First-time CLI agent users](./first-time-cli-agent-users.md). If you already have an agent workflow, use [Switching to Outfitter](./switching-to-outfitter.md) to adopt the smallest durable set first.
22
35
 
23
- Learn how shared setup sources work in [Profile repositories](./profile-repository.md), then see [Profiles](./profiles.md) for profile composition, inheritance, and prompt examples.
36
+ Learn how shared sources work in [Catalogs](./catalogs.md), then see [Agents](./agents.md), [Agent profiles](./profiles.md), and [Personas](./personas.md) for composition.
24
37
 
25
38
  ## Common commands
26
39
 
27
40
  ```bash
28
- outfitter run --profile engineering-default
29
- outfitter run --agent claude --profile support
41
+ outfitter run engineer
42
+ outfitter run reviewer --harness claude
30
43
  outfitter sync
31
- outfitter profile list
32
- outfitter profile create regulated --scope user
44
+ outfitter list agents
45
+ outfitter validate
46
+ outfitter dump --out ./review
33
47
  ```
34
48
 
35
- See the [CLI reference](./cli.md) for every command and flag, and [Concepts](./concepts.md) for how settings, profiles, and adapters fit together. (`outfitter welcome` also exists as a legacy compatibility command for the older terminal onboarding prompts; current onboarding runs inside Pi via `outfitter setup`.)
49
+ See the [CLI reference](./cli.md) for every command and flag, and [Concepts](./concepts.md) for how settings, resources, and adapters fit together.
36
50
 
37
51
  ## Other install options
38
52
 
@@ -47,3 +61,9 @@ Try without a global install:
47
61
  ```bash
48
62
  npx --yes @ai-outfitter/outfitter@latest --help
49
63
  ```
64
+
65
+ Run directly from the repository's Nix flake:
66
+
67
+ ```bash
68
+ nix run github:ai-outfitter/outfitter -- --help
69
+ ```
@@ -0,0 +1,20 @@
1
+ # Hooks
2
+
3
+ Hooks let deterministic code run at fixed points in an agent session — before tool calls, after edits, at session start — independent of what the model decides. The `.agents` protocol does not yet define a hooks resource, so hook wiring is harness-specific today. This page documents what works per adapter and where this is heading.
4
+
5
+ ## Claude Code
6
+
7
+ Claude Code hooks live in its native `settings.json` (`hooks` key), matching tool events to shell commands. Outfitter projects hook configuration into the composite `settings.json` it generates for a Claude launch, so a composition can ship hooks the same way it ships skills:
8
+
9
+ - Keep hook scripts in a skill's `scripts/` directory or under `commands/`, so they travel with the tree and pass through the same [trust review](./catalogs.md#trust-and-review) as other executable content.
10
+ - Machine-specific hook wiring stays in your local layer and is projected as harness-native config (the Claude `settings.json` Outfitter composes for that launch), not in a `settings.yml` key — the protocol schema defines no hooks field. Keep it out of shared catalogs.
11
+
12
+ See the [Claude Code hooks documentation](https://code.claude.com/docs/en/hooks) for event types and matcher syntax.
13
+
14
+ ## Pi
15
+
16
+ Pi supports a bootstrap hook via its extension mechanism: an extension passed with `--extension` runs at session start and can register tools, providers, and runtime behavior. Outfitter's own onboarding flow uses this channel. For recurring per-event behavior, Pi extensions are the native surface.
17
+
18
+ ## Roadmap
19
+
20
+ > **TODO (protocol gap):** hooks are the one behavioral surface the pinned protocol revision does not model, which means hook definitions cannot yet be expressed portably in a `.agents` tree and projected per harness. The path `agents/<agent-id>/hooks/<hook-id>/` is reserved for a future agent-local hook entity and deliberately has no resolution or projection behavior today. Outfitter may need to ship its own hooks extension that adapters translate to Claude `settings.json` hooks and Pi extensions respectively, or drive the concept into a future protocol revision. Until one of those lands, treat hooks as harness-native configuration and keep them thin: call scripts that live in the tree rather than embedding logic in hook definitions.
@@ -1,109 +1,95 @@
1
- # Iterating on local and worktree profiles
1
+ # Iterating on an agent
2
2
 
3
- This guide covers the edit-run-inspect loop for profiles: switching to a profile you can edit, iterating on it locally or in a git worktree of a profile catalog, and verifying the result.
4
- It is written for people and for Outfitter-managed agents — if you are an agent reading this, the "Improving your own profile" section describes how to modify the profile you were launched with.
3
+ This guide covers the edit-run-inspect loop for an [agent profile](./profiles.md): switching to an agent you can edit, iterating on its loadout and the resources it selects — locally or in a git worktree of a catalog and verifying the result.
5
4
 
6
- ## Where editable profiles live
5
+ It is written for people and for Outfitter-managed agents — if you are an agent reading this, see [For Outfitter-managed agents](./local-development.md#for-outfitter-managed-agents) for how to improve the configuration you were launched with.
7
6
 
8
- Outfitter resolves profiles from every configured `profile_sources` entry.
9
- Three scopes are directly editable on the current machine:
7
+ ## Where editable resources live
10
8
 
11
- | Scope | Profiles | Settings | Use for |
12
- | ------------- | -------------------------------------- | ----------------------------------------- | ----------------------------------------- |
13
- | user | `~/.outfitter/profiles/` | `~/.outfitter/settings.yml` | Personal defaults shared across projects |
14
- | project | `<project>/.outfitter/profiles/` | `<project>/.outfitter/settings.yml` | Checked-in behavior the whole team gets |
15
- | project-local | `<project>/.outfitter/local/profiles/` | `<project>/.outfitter/local/settings.yml` | Machine-private overrides and experiments |
9
+ Outfitter resolves resources from every configured layer. Two are directly editable on the current machine:
16
10
 
17
- Profiles synced from a remote catalog (`github:` or `uri:` profile sources) land in the Outfitter cache.
18
- Do not edit the cache `outfitter sync` overwrites it.
19
- To iterate on a catalog profile, work in a local checkout of the catalog instead (see the worktree section below).
11
+ | Scope | Resources | Settings | Use for |
12
+ | ------- | -------------------- | --------------------------------------------------------- | ---------------------------------------- |
13
+ | user | `~/.agents/` | `~/.agents/settings.yml` (+ `settings.local.yml`) | Personal defaults shared across projects |
14
+ | project | `<project>/.agents/` | `<project>/.agents/settings.yml` (+ `settings.local.yml`) | Checked-in behavior the whole team gets |
20
15
 
21
- ## Switching profiles
16
+ An agent and its loadout live in `agents/<id>/` in one of those layers. Machine-private launch choices — which agent runs by default, where sources resolve from — belong in the flat, gitignored `settings.local.yml` of either scope; it overlays its sibling with the same schema.
22
17
 
23
- - One launch: `outfitter run --profile <id> [-- <agent args>]`
24
- - Future launches: set `default_profile: <id>` in the settings scope you want it to apply to.
25
- - List what is resolvable right now: `outfitter profile list` (add `--all` to include inheritance-only templates).
18
+ Resources synced from a remote catalog land in the Outfitter cache. Do not edit the cache — `outfitter sync` overwrites it. To iterate on a catalog resource, work in a local checkout of the catalog instead (see the worktree section below).
26
19
 
27
- Profile changes apply on the next launch.
28
- A running session keeps the composite profile it started with, so after editing a profile you must restart `outfitter` to load the result.
20
+ ## Switching agents
21
+
22
+ - One launch: `outfitter run <id> [-- <agent args>]`
23
+ - Future launches: set `default_agent: <id>` in the settings scope you want it to apply to.
24
+ - List what is resolvable right now: `outfitter list agents`.
25
+
26
+ Changes apply on the next launch. A running session keeps the composition it started with, so after editing you must restart `outfitter` to load the result.
29
27
 
30
28
  ## The iteration loop
31
29
 
32
- 1. Create or locate an editable profile:
30
+ 1. Create or copy an experimental agent in a layer you can edit, and trim its loadout to what you are testing:
33
31
 
34
- ```sh
35
- outfitter profile create my_experiment --scope project-local
32
+ ```
33
+ <!-- .agents/agents/experiment/agent.md -->
34
+ ---
35
+ name: experiment
36
+ description: Behavior I am trying out.
37
+ skills: [wiki]
38
+ model: gpt-5.2
39
+ thinking: high
40
+ ---
41
+
42
+ <the behavior you are trying out>
36
43
  ```
37
44
 
38
- To iterate on an existing profile without touching it, create a new profile that inherits from it:
45
+ Point your next launch at it either way:
39
46
 
40
- ```yaml
41
- # .outfitter/local/profiles/my_experiment/profile.yml
42
- id: my_experiment
43
- label: My Experiment
44
- inherits:
45
- - engineer
46
- controls:
47
- append_system_prompt:
48
- - |
49
- <the behavior you are trying out>
50
- ```
47
+ ```yaml
48
+ # .agents/settings.local.yml
49
+ default_agent: experiment
50
+ ```
51
51
 
52
- 2. Point your next launch at it, either with `outfitter run --profile my_experiment` or by setting `default_profile: my_experiment` in `.outfitter/local/settings.yml`.
52
+ 2. Launch it: `outfitter run experiment`, or rely on the `default_agent` override above.
53
53
 
54
54
  3. Validate before launching:
55
55
 
56
56
  ```sh
57
- outfitter profile lint --strict
57
+ outfitter validate --strict
58
58
  ```
59
59
 
60
- This reports schema and inheritance errors, missing typed prompt include files, and raw append-prompt strings that look like file paths.
60
+ This reports protocol layout errors, unresolved loadout slugs, and broken skill references.
61
+
62
+ 4. Inspect what the agent actually received:
61
63
 
62
- 4. Inspect what the agent actually received.
63
- With `profile_export: true` in the active settings, Outfitter writes the composed system prompt next to the profile (`generated-system-prompt.md` in a directory profile, `<id>.generated-system-prompt.md` beside a flat profile).
64
- Diff it between iterations to confirm a change landed.
64
+ ```sh
65
+ outfitter dump --agent experiment --out /tmp/inspect
66
+ ```
65
67
 
66
- 5. Restart and test the behavior, then fold the settled changes back into the profile the experiment inherited from.
68
+ Diff dumps between iterations to confirm a change landed the dump is exactly what run composes.
67
69
 
68
- ## Iterating on a catalog profile in a git worktree
70
+ 5. Restart and test the behavior, then fold the settled changes back into the agent or skill you were iterating on, and remove the experiment.
69
71
 
70
- Shared profiles usually come from a catalog repository (see [Profile repositories](./profile-repository.md)) referenced as a `github:` source.
71
- To change one:
72
+ ## Iterating on a catalog resource in a git worktree
73
+
74
+ Shared resources usually come from a [catalog](./catalogs.md) referenced as a pinned `github:` source. To change one:
72
75
 
73
76
  1. Clone the catalog, or add a worktree to an existing clone so the iteration branch stays isolated:
74
77
 
75
78
  ```sh
76
- cd ~/repos/acme/profile-catalog/main
79
+ cd ~/repos/acme/agents-catalog/main
77
80
  git worktree add ../worktrees/feat/sharper-review-prompts -b feat/sharper-review-prompts
78
81
  ```
79
82
 
80
- 2. Point a machine-private profile source at the worktree in `.outfitter/local/settings.yml` (or `~/.outfitter/settings.yml`).
81
- Local `path:` sources take the same layout as the catalog:
83
+ 2. Point a machine-private source at the worktree in `settings.local.yml` (project or user scope):
82
84
 
83
85
  ```yaml
84
- # .outfitter/local/settings.yml
85
- profile_sources:
86
- - path: ~/repos/acme/profile-catalog/worktrees/feat/sharper-review-prompts/profiles
86
+ # .agents/settings.local.yml
87
+ sources:
88
+ - path: ~/repos/acme/agents-catalog/worktrees/feat/sharper-review-prompts
87
89
  ```
88
90
 
89
- 3. Iterate with the loop above: edit in the worktree, `outfitter profile lint --strict`, relaunch, inspect the prompt export.
90
-
91
- 4. Commit in the worktree, push, and open a pull request against the catalog.
92
- After it merges, remove the local `path:` override, run `outfitter sync` to refresh the cached catalog, and remove the worktree.
93
-
94
- Because the override lives in project-local settings, teammates and CI keep resolving the published catalog while you iterate.
95
-
96
- ## Improving your own profile (for Outfitter-managed agents)
97
-
98
- If you are an agent launched by Outfitter, your instructions, tools, skills, and extensions came from a profile, and you can improve that profile the same way you improve code — but the change only takes effect for future sessions, never the current one.
91
+ 3. Iterate with the loop above: edit in the worktree, `outfitter validate --strict`, relaunch, diff the dump.
99
92
 
100
- 1. Identify your active profile.
101
- The launch header and `outfitter profile list` show profile ids; your composite profile directory contains `outfitter/profile.json` with the id, label, and merged controls you were launched with.
102
- 2. Find the editable source for that profile with the scope table above.
103
- If the profile comes from a remote catalog, do not edit the cache — use the worktree flow above, or create a local profile that `inherits` from it and layer the improvement on top.
104
- 3. Make the smallest change that captures the improvement: a new `append_system_prompt` entry for a behavior correction, a `skills` entry for a reusable procedure, or a control override (model, thinking level, environment) for launch mechanics.
105
- 4. Validate with `outfitter profile lint --strict`, and review the `profile_export` prompt output when prompt text changed.
106
- 5. Tell the user what you changed and why, and that the change applies when they restart `outfitter` (or launch `outfitter run --profile <id>`).
107
- You cannot reload your own profile mid-session.
93
+ 4. Commit in the worktree, push, and open a pull request against the catalog. After it merges, remove the local `path:` override, bump the pinned `ref:`, run `outfitter sync`, and remove the worktree.
108
94
 
109
- Prefer durable, reviewable improvements: put team-relevant changes in the project or catalog profile through a pull request, and keep personal or experimental changes in user or project-local scope.
95
+ Because the override lives in `settings.local.yml`, teammates and CI keep resolving the published catalog while you iterate. This is the same trickle-up workflow as [Local development](./local-development.md), applied to one change.
@@ -0,0 +1,84 @@
1
+ # Local dotagents development
2
+
3
+ The recommended way to develop agent configuration is a **personal standalone `.agents` repository** — a repo whose root is the protocol payload (for example [`ncrmro/.agents`](https://github.com/ncrmro/.agents)). You iterate there with full git history, point your machine at local checkouts while you work, and open pull requests to move settled improvements upstream into shared catalogs. Changes trickle up instead of living forever in one person's home directory.
4
+
5
+ ## The repository
6
+
7
+ ```text
8
+ ncrmro/.agents/
9
+ agents.md
10
+ agents/
11
+ founder/agent.md
12
+ engineer/agent.md
13
+ skills/
14
+ settings.yml # committed: pinned upstream sources, default agent
15
+ settings.local.yml # gitignored: this machine's overrides
16
+ .gitignore # settings.local.yml, *.generated-*
17
+ ```
18
+
19
+ Clone it as your global layer, or point your user settings at the checkout:
20
+
21
+ ```bash
22
+ git clone git@github.com:ncrmro/.agents.git ~/.agents
23
+ ```
24
+
25
+ ## Committed settings: pin upstream
26
+
27
+ The committed `settings.yml` consumes shared catalogs **pinned to exact commits**, so the repository is reproducible on any machine:
28
+
29
+ ```yaml
30
+ # settings.yml (committed)
31
+ default_agent: founder
32
+
33
+ sources:
34
+ - github: ai-outfitter/.agent
35
+ ref: 2f9c1ab0d3e44b6f9d2c8a17e5b40c91d6f3a8e2
36
+ - github: ai-outfitter/community-profiles
37
+ ref: 8d04c7a1f2e94b3c6a5d80e17f4b29c3d1e6a075
38
+ - path: . # this repository's own resources win last
39
+ ```
40
+
41
+ Bumping a pin is an ordinary reviewed commit: sync, diff the upstream change, update the SHA.
42
+
43
+ ## Local settings: point at checkouts
44
+
45
+ When you are changing an upstream catalog itself, override its source in the gitignored `settings.local.yml` to an absolute path of your local checkout:
46
+
47
+ ```yaml
48
+ # settings.local.yml (gitignored — machine-specific absolute paths)
49
+ sources:
50
+ - path: /home/ncrmro/repos/unsupervised/ai-outfitters/default-profiles
51
+ - path: /home/ncrmro/repos/unsupervised/ai-outfitters/worktrees/actions/main
52
+ - path: /home/ncrmro/repos/ncrmro/.agents
53
+ ```
54
+
55
+ Because `settings.local.yml` overlays its sibling with higher [precedence](./settings.md#precedence), your machine resolves live working trees while every other consumer of the repo keeps resolving the pinned SHAs. Worktrees keep an iteration branch isolated:
56
+
57
+ ```sh
58
+ cd ~/repos/acme/agents-catalog/main
59
+ git worktree add ../worktrees/feat/sharper-review -b feat/sharper-review
60
+ ```
61
+
62
+ ## The loop
63
+
64
+ 1. Edit resources — an `agent.md`, a skill — in whichever checkout owns them.
65
+ 2. Validate: `outfitter validate --strict`.
66
+ 3. Inspect what a run would actually receive: `outfitter dump --agent founder --out /tmp/inspect` and diff between iterations.
67
+ 4. Relaunch `outfitter` and test the behavior (a running session keeps the composition it started with).
68
+ 5. Fold settled changes back to their home:
69
+ - personal → commit to your `.agents` repo;
70
+ - shared → commit in the upstream checkout, push, and open a PR against the catalog (`ai-outfitter/default-profiles`, `ai-outfitter/actions`, your org's `.outfitter`, …).
71
+ 6. After the upstream PR merges: remove the local `path:` override, bump the pinned `ref:` in `settings.yml`, and `outfitter sync`.
72
+
73
+ ## Consuming your repo from projects
74
+
75
+ A project that wants your personal layer doesn't need anything special — `~/.agents` _is_ the global layer. For project-specific wiring, a project's `.agents/settings.local.yml` can also point a source at your checkout, keeping teammates and CI on the published pins while you iterate.
76
+
77
+ ## For Outfitter-managed agents
78
+
79
+ If you are an agent launched by Outfitter, your instructions, skills, and subagents came from resolved `.agents` layers, and you can improve them like code — the change takes effect for future sessions, never the current one:
80
+
81
+ 1. `outfitter list` shows each resolved resource and its winning source.
82
+ 2. Never edit the sync cache — it is overwritten. Edit the checkout the source points at, or the user/workspace layer that shadows it.
83
+ 3. Make the smallest change that captures the improvement, run `outfitter validate --strict`, and tell the user what you changed, why, and that it applies on restart.
84
+ 4. Put team-relevant changes in the upstream catalog through a pull request; keep personal or experimental changes in the personal repo or `settings.local.yml` scope.
@@ -0,0 +1,39 @@
1
+ # Migration from legacy profiles
2
+
3
+ Earlier Outfitter versions used an authored profile system: `.outfitter/` directories, `profile.yml` files, profile inheritance, and `--profile` pointing at profile definitions. [RFC #165](https://github.com/ai-outfitter/outfitter/issues/165) replaces that system with the Dotagents `.agents` protocol as a hard cut: the end-state runtime has **no knowledge of the old format** — no compatibility reader, no migration command, no deprecated aliases. (These docs describe that target; the released CLI still runs the legacy profile format during the transition.) This page is the manual migration reference, and the bundled Outfitter skill can walk an agent session through it interactively.
4
+
5
+ ## Mapping
6
+
7
+ | Legacy | End state |
8
+ | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
9
+ | `.outfitter/profiles/<id>/profile.yml` (or `<id>.yml`) | Split into resources: identity → `agents/<id>/agent.md`, procedures → `skills/`; the loadout lives in that [agent](./profiles.md)'s frontmatter / `config.json` — there is no separate selection |
10
+ | `controls.system_prompt` / `append_system_prompt` | `system-prompt.md`, `agents.md`, and the agent's `agent.md` body |
11
+ | `controls.model`, `provider`, `thinking` | `models.json` (and per-agent `config.json`) |
12
+ | `controls.skills` | The agent's `skills:` loadout; skills live at `skills/<id>/` |
13
+ | `controls.extensions`, `args`, `environment` | Harness configuration projected by adapters; MCP servers → `mcp.json` |
14
+ | Profile inheritance (`inherits:`) | Layer merge-by-ID, plus shared context in `system-prompt.md` / `agents.md` |
15
+ | `template: true` base profiles | A base agent whose shared context lives in `system-prompt.md` / `agents.md` (or a base agent selected as a delegate) |
16
+ | `~/.outfitter/settings.yml` | `~/.agents/settings.yml` |
17
+ | `<project>/.outfitter/settings.yml` | `<project>/.agents/settings.yml` |
18
+ | `<project>/.outfitter/local/settings.yml` (nested dir) | `<project>/.agents/settings.local.yml` (flat, gitignored) |
19
+ | `profile_sources` | `sources` supplying `.agents` payloads ([catalogs](./catalogs.md)) |
20
+ | `default_profile` | `default_agent` naming an agent slug |
21
+ | `outfitter run --profile <file-based id>` | `outfitter run <agent-id>` (choose the harness with `--harness pi\|claude`) |
22
+ | `outfitter profile list` / `create` / `lint` | `outfitter list agents` / author files directly / `outfitter validate` |
23
+ | `profile_export` / `generated-system-prompt.md` | `outfitter dump` ([Dump and bake](./dump-and-bake.md)) |
24
+ | Free-form CI prompt + profile in `ai-outfitter/actions` | An agent run with structured inputs ([Actions](./actions.md)); the task/bake surface is a [future RFC](./tasks.md) |
25
+
26
+ ## Procedure
27
+
28
+ 1. **Inventory** your `.outfitter/profiles`. For each profile, separate what it contains: identity/policy prose, capability procedures, model/provider config, tool wiring.
29
+ 2. **Create resources**: one `agents/<id>/agent.md` per durable identity; one `skills/<id>/` per capability (most `append_system_prompt` procedure text belongs in skills); shared context into `agents.md`; model config into `models.json`; MCP into `mcp.json`.
30
+ 3. **Rebuild as agents**: for each profile people actually ran, create an `agents/<id>/agent.md` whose frontmatter (or `config.json`) loadout selects the new resources by slug. Set `default_agent` to the one you run most. Inheritance chains become shared context in `system-prompt.md` / `agents.md` (or a base agent selected as a delegate), not an ordered selection.
31
+ 4. **Move settings**: relocate `~/.outfitter/settings.yml` content into `~/.agents/settings.yml`, project settings into `<project>/.agents/settings.yml`, and anything under `.outfitter/local/` into a flat `.agents/settings.local.yml` (gitignore it). Rename `profile_sources` to `sources`; sources must now publish `.agents` payloads.
32
+ 5. **Validate**: `outfitter validate --strict`, then `outfitter dump` and review the tree.
33
+ 6. **Delete** the `.outfitter/` directory once the dump matches expectations.
34
+
35
+ A remote repository _named_ `.outfitter` remains a supported convention for organization control repos — but only when it publishes the new protocol payload. The name is supported; the previous profile layout inside it is not.
36
+
37
+ ## Claude Code users
38
+
39
+ If your pre-Outfitter configuration lives in `~/.claude` rather than `.outfitter/`, skip this page — use [Porting a Claude Code setup](./porting-claude.md) instead.
@@ -0,0 +1,41 @@
1
+ # Personas
2
+
3
+ A persona is not a resource or a settings key — it is a **convention** built from ordinary pieces:
4
+
5
+ 1. A **base review agent** — a normal [agent](./agents.md) whose prompt says how to review something (an app, docs, a UX flow): what to look at, what evidence to cite, what output shape to return.
6
+ 2. Interchangeable **persona description documents** — plain markdown files with attributes in frontmatter and a short bio underneath. They come in two kinds you **mix and match**: a **role** (a reusable job archetype — goals, anxieties, buying triggers shared across a customer segment) and an **individual** (a named person with demographics — birthdate, income, education, hobbies, skills — who inherits one or more roles and adds their own voice). Give each the concreteness a [Lean Canvas](https://leanstack.com/lean-canvas) customer segment gets.
7
+
8
+ You run the base agent and feed it the persona files to adopt: a role, refined by an individual. Swapping the files swaps the persona; the base agent — the review rules — stays fixed. Nothing new is added to the protocol: it is one agent plus a folder of description files. See [Persona reviews](./usecases/persona-reviews.md) for the full shape.
9
+
10
+ ```text
11
+ customer-review/
12
+ agents/
13
+ reviewer/agent.md # base: how to review, what to return
14
+ settings.yml
15
+ docs/user-personas/
16
+ roles/ # reusable job archetypes
17
+ staff-engineer.md
18
+ founder-operator.md
19
+ individuals/ # named people, each naming one or more roles
20
+ marcus-bell.md
21
+ dana-okafor.md
22
+ ```
23
+
24
+ ## Why a convention, not a key
25
+
26
+ Modeling personas as their own resource — or as a `personas:` list you compose in order — duplicates what an agent already is and grows the surface area of the system. Agents are exactly what that machinery was reaching for. Keeping personas as "base agent + description document" means a team maintains one review agent and a directory of cheap markdown files, instead of a fleet of near-identical agents.
27
+
28
+ ## Running a persona review
29
+
30
+ Point the base agent at the artifact and name the persona files to adopt — a role refined by an individual:
31
+
32
+ ```bash
33
+ outfitter run reviewer -- --print \
34
+ "Adopt docs/user-personas/roles/founder-operator.md refined by \
35
+ docs/user-personas/individuals/dana-okafor.md. Review README.md and \
36
+ docs/getting-started.md and return the standard review shape."
37
+ ```
38
+
39
+ Because the base agent fixes the output shape, feedback from different persona documents stays directly comparable.
40
+
41
+ See [Persona reviews](./usecases/persona-reviews.md) for a complete catalog example.
@@ -0,0 +1,54 @@
1
+ # Porting a Claude Code setup
2
+
3
+ If your agent configuration lives in `~/.claude`, Outfitter can port it into `~/.agents/` — the protocol's global layer — and symlink it back so Claude Code keeps working natively while the `.agents` tree becomes the source of truth.
4
+
5
+ ```bash
6
+ outfitter setup
7
+ ```
8
+
9
+ Setup detects an existing `~/.claude` directory (when no `~/.agents/` tree exists yet) and offers the port. Nothing is destroyed: originals are moved, not copied-and-diverged, and the symlinks keep native Claude Code behavior identical.
10
+
11
+ ## What gets ported
12
+
13
+ | `~/.claude` content | `~/.agents/` destination | Symlinked back? |
14
+ | ------------------------ | ------------------------ | --------------- |
15
+ | `agents/<id>.md` | `agents/<id>/agent.md` | Yes |
16
+ | `skills/<id>/` | `skills/<id>/` | Yes |
17
+ | `commands/` | `commands/` | Yes |
18
+ | `CLAUDE.md` | `agents.md` | Yes |
19
+ | MCP server configuration | `mcp.json` | Yes |
20
+
21
+ After the port, `~/.claude/skills` is a symlink into `~/.agents/skills`, and so on — Claude Code reads exactly what it read before, from the protocol tree. Editing either view edits the same files.
22
+
23
+ ## What stays native
24
+
25
+ Runtime and account state is not configuration and stays in `~/.claude` untouched:
26
+
27
+ - auth and account state
28
+ - sessions and project history (`projects/`)
29
+ - plugins, caches, debug output
30
+ - `settings.json` — permissions, model, and hooks remain harness-native; see [Hooks](./hooks.md) for how hook wiring relates to the tree
31
+
32
+ This is the same boundary [state persistence](./state.md) enforces at run time: configuration lives in the tree, mutable state lives with the harness.
33
+
34
+ ## After porting
35
+
36
+ Your resources are now protocol resources. Reference them by slug from an agent's loadout like anything else:
37
+
38
+ ```
39
+ <!-- ~/.agents/agents/daily/agent.md -->
40
+ ---
41
+ name: daily
42
+ skills: [wiki, code-review] # formerly ~/.claude/skills/*
43
+ ---
44
+ ```
45
+
46
+ - `outfitter list` shows everything that resolved from the ported tree.
47
+ - `outfitter run daily --harness claude` launches Claude Code through Outfitter with the same material, now composable with catalogs and other layers.
48
+ - Plain `claude` continues to work as before, through the symlinks.
49
+
50
+ Consider putting `~/.agents` under version control as a standalone repository — see [Local development](./local-development.md).
51
+
52
+ ## Projects
53
+
54
+ The same port applies per project: a `<repo>/.claude` directory ports to `<repo>/.agents/` (the workspace layer) with symlinks back, and a `CLAUDE.md` at the repo root can become `.agents/agents.md`. Commit the `.agents/` tree; gitignore `.agents/settings.local.yml`.