@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.
- package/.outfitter/skills/outfitter/SKILL.md +67 -37
- package/README.md +63 -35
- package/code/enterprise/cli/privateCatalogSettings.cjs +2 -2
- package/code/enterprise/pi-extension/privateCatalogOnboarding.js +5 -8
- package/code/enterprise/shared/privateCatalogPolicy.cjs +5 -5
- package/code/pi-extension/src/outfitter-extension.js +353 -553
- package/code/pi-extension/src/outfitter-runtime-extension.js +160 -0
- package/dist/agents/AgentLaunch.d.ts +9 -1
- package/dist/agents/AgentLaunch.js +19 -0
- package/dist/agents/AgentLaunch.js.map +1 -1
- package/dist/agents/PiCredentialPersistence.d.ts +6 -0
- package/dist/agents/PiCredentialPersistence.js +33 -0
- package/dist/agents/PiCredentialPersistence.js.map +1 -0
- package/dist/cli/OutfitterCli.js +10 -18
- package/dist/cli/OutfitterCli.js.map +1 -1
- package/dist/cli/commands/CommandObject.d.ts +0 -5
- package/dist/cli/commands/CommandObject.js +1 -4
- package/dist/cli/commands/CommandObject.js.map +1 -1
- package/dist/cli/commands/DumpCommand.d.ts +19 -0
- package/dist/cli/commands/DumpCommand.js +54 -0
- package/dist/cli/commands/DumpCommand.js.map +1 -0
- package/dist/cli/commands/ListCommand.d.ts +17 -0
- package/dist/cli/commands/ListCommand.js +77 -0
- package/dist/cli/commands/ListCommand.js.map +1 -0
- package/dist/cli/commands/PiRuntimeLaunch.d.ts +8 -0
- package/dist/cli/commands/PiRuntimeLaunch.js +47 -0
- package/dist/cli/commands/PiRuntimeLaunch.js.map +1 -0
- package/dist/cli/commands/ProcessDefaults.d.ts +2 -0
- package/dist/cli/commands/ProcessDefaults.js +5 -0
- package/dist/cli/commands/ProcessDefaults.js.map +1 -0
- package/dist/cli/commands/RunAgentCommand.d.ts +46 -0
- package/dist/cli/commands/RunAgentCommand.js +176 -0
- package/dist/cli/commands/RunAgentCommand.js.map +1 -0
- package/dist/cli/commands/SetupCommand.d.ts +38 -6
- package/dist/cli/commands/SetupCommand.js +194 -232
- package/dist/cli/commands/SetupCommand.js.map +1 -1
- package/dist/cli/commands/ValidateCommand.d.ts +20 -0
- package/dist/cli/commands/ValidateCommand.js +54 -0
- package/dist/cli/commands/ValidateCommand.js.map +1 -0
- package/dist/composer/Composer.d.ts +11 -0
- package/dist/composer/Composer.js +72 -0
- package/dist/composer/Composer.js.map +1 -0
- package/dist/composer/Composition.d.ts +33 -0
- package/dist/composer/Composition.js +2 -0
- package/dist/composer/Composition.js.map +1 -0
- package/dist/dump/Containment.d.ts +8 -0
- package/dist/dump/Containment.js +22 -0
- package/dist/dump/Containment.js.map +1 -0
- package/dist/dump/Dump.d.ts +8 -0
- package/dist/dump/Dump.js +182 -0
- package/dist/dump/Dump.js.map +1 -0
- package/dist/extensions/PiExtensionCache.d.ts +30 -0
- package/dist/extensions/PiExtensionCache.js +92 -0
- package/dist/extensions/PiExtensionCache.js.map +1 -0
- package/dist/fs/TypeConflict.d.ts +6 -0
- package/dist/fs/TypeConflict.js +21 -0
- package/dist/fs/TypeConflict.js.map +1 -0
- package/dist/paths/OutfitterCache.d.ts +6 -0
- package/dist/paths/OutfitterCache.js +17 -0
- package/dist/paths/OutfitterCache.js.map +1 -0
- package/dist/projection/Materialize.d.ts +24 -0
- package/dist/projection/Materialize.js +83 -0
- package/dist/projection/Materialize.js.map +1 -0
- package/dist/projection/ProjectHarness.d.ts +5 -0
- package/dist/projection/ProjectHarness.js +77 -0
- package/dist/projection/ProjectHarness.js.map +1 -0
- package/dist/projection/Projection.d.ts +23 -0
- package/dist/projection/Projection.js +2 -0
- package/dist/projection/Projection.js.map +1 -0
- package/dist/resolver/AgentDefinition.d.ts +30 -0
- package/dist/resolver/AgentDefinition.js +123 -0
- package/dist/resolver/AgentDefinition.js.map +1 -0
- package/dist/resolver/Layer.d.ts +12 -0
- package/dist/resolver/Layer.js +30 -0
- package/dist/resolver/Layer.js.map +1 -0
- package/dist/resolver/Resolver.d.ts +3 -0
- package/dist/resolver/Resolver.js +163 -0
- package/dist/resolver/Resolver.js.map +1 -0
- package/dist/resolver/ResolverContext.d.ts +15 -0
- package/dist/resolver/ResolverContext.js +11 -0
- package/dist/resolver/ResolverContext.js.map +1 -0
- package/dist/resolver/ResolverValidation.d.ts +11 -0
- package/dist/resolver/ResolverValidation.js +112 -0
- package/dist/resolver/ResolverValidation.js.map +1 -0
- package/dist/resolver/Resource.d.ts +88 -0
- package/dist/resolver/Resource.js +34 -0
- package/dist/resolver/Resource.js.map +1 -0
- package/dist/schemas/agent.schema.json +48 -0
- package/dist/schemas/settings.schema.json +32 -9
- package/dist/settings/Settings.d.ts +34 -5
- package/dist/settings/Settings.js +3 -1
- package/dist/settings/Settings.js.map +1 -1
- package/dist/settings/SettingsLoader.d.ts +1 -1
- package/dist/settings/SettingsLoader.js +23 -22
- package/dist/settings/SettingsLoader.js.map +1 -1
- package/dist/settings/SettingsMerger.js +12 -10
- package/dist/settings/SettingsMerger.js.map +1 -1
- package/dist/setup/DefaultCatalog.d.ts +20 -0
- package/dist/setup/DefaultCatalog.js +89 -0
- package/dist/setup/DefaultCatalog.js.map +1 -0
- package/dist/setup/Setup.d.ts +43 -0
- package/dist/setup/Setup.js +261 -0
- package/dist/setup/Setup.js.map +1 -0
- package/dist/skills/SkillDocument.d.ts +6 -1
- package/dist/skills/SkillDocument.js.map +1 -1
- package/dist/sources/SourceCache.d.ts +19 -0
- package/dist/{profiles/ProfileCache.js → sources/SourceCache.js} +22 -18
- package/dist/sources/SourceCache.js.map +1 -0
- package/dist/validation/SchemaValidator.d.ts +1 -1
- package/dist/validation/SchemaValidator.js +4 -13
- package/dist/validation/SchemaValidator.js.map +1 -1
- package/docs/architecture/state_writeback_strategy.md +54 -122
- package/docs/documentation/README.md +33 -12
- package/docs/documentation/actions.md +35 -52
- package/docs/documentation/agents.md +109 -0
- package/docs/documentation/best-practices.md +25 -63
- package/docs/documentation/catalogs.md +126 -0
- package/docs/documentation/cli.md +39 -41
- package/docs/documentation/concepts.md +66 -23
- package/docs/documentation/dump-and-bake.md +30 -0
- package/docs/documentation/first-time-cli-agent-users.md +8 -8
- package/docs/documentation/getting-started.md +28 -8
- package/docs/documentation/hooks.md +20 -0
- package/docs/documentation/iterating-on-profiles.md +56 -70
- package/docs/documentation/local-development.md +84 -0
- package/docs/documentation/migration.md +39 -0
- package/docs/documentation/personas.md +41 -0
- package/docs/documentation/porting-claude.md +54 -0
- package/docs/documentation/profiles.md +16 -169
- package/docs/documentation/settings.md +61 -0
- package/docs/documentation/skills.md +93 -334
- package/docs/documentation/state.md +24 -62
- package/docs/documentation/subagents.md +37 -0
- package/docs/documentation/support-matrix.md +40 -35
- package/docs/documentation/switching-to-outfitter.md +75 -81
- package/docs/documentation/tasks.md +13 -0
- package/docs/documentation/usecases/engineering.md +67 -84
- package/docs/documentation/usecases/organization-profile-catalog.md +83 -111
- package/docs/documentation/usecases/persona-reviews.md +133 -139
- package/docs/philosophy.md +2 -2
- package/package.json +3 -3
- package/src/schemas/agent.schema.json +48 -0
- package/src/schemas/settings.schema.json +32 -9
- package/dist/agents/AdapterProfileControls.d.ts +0 -21
- package/dist/agents/AdapterProfileControls.js +0 -76
- package/dist/agents/AdapterProfileControls.js.map +0 -1
- package/dist/agents/AdapterStatePaths.d.ts +0 -12
- package/dist/agents/AdapterStatePaths.js +0 -46
- package/dist/agents/AdapterStatePaths.js.map +0 -1
- package/dist/agents/AgentAdapter.d.ts +0 -44
- package/dist/agents/AgentAdapter.js +0 -2
- package/dist/agents/AgentAdapter.js.map +0 -1
- package/dist/agents/AgentRegistry.d.ts +0 -6
- package/dist/agents/AgentRegistry.js +0 -17
- package/dist/agents/AgentRegistry.js.map +0 -1
- package/dist/agents/LaunchResources.d.ts +0 -17
- package/dist/agents/LaunchResources.js +0 -61
- package/dist/agents/LaunchResources.js.map +0 -1
- package/dist/agents/OutfitterSkill.d.ts +0 -11
- package/dist/agents/OutfitterSkill.js +0 -128
- package/dist/agents/OutfitterSkill.js.map +0 -1
- package/dist/agents/ResourceIdentity.d.ts +0 -2
- package/dist/agents/ResourceIdentity.js +0 -51
- package/dist/agents/ResourceIdentity.js.map +0 -1
- package/dist/agents/claude/ClaudeAdapter.d.ts +0 -2
- package/dist/agents/claude/ClaudeAdapter.js +0 -148
- package/dist/agents/claude/ClaudeAdapter.js.map +0 -1
- package/dist/agents/claude/ClaudeCompositeProfileWriter.d.ts +0 -5
- package/dist/agents/claude/ClaudeCompositeProfileWriter.js +0 -7
- package/dist/agents/claude/ClaudeCompositeProfileWriter.js.map +0 -1
- package/dist/agents/pi/PiAdapter.d.ts +0 -2
- package/dist/agents/pi/PiAdapter.js +0 -363
- package/dist/agents/pi/PiAdapter.js.map +0 -1
- package/dist/agents/pi/PiArgs.d.ts +0 -2
- package/dist/agents/pi/PiArgs.js +0 -15
- package/dist/agents/pi/PiArgs.js.map +0 -1
- package/dist/agents/pi/PiCompositeProfileWriter.d.ts +0 -5
- package/dist/agents/pi/PiCompositeProfileWriter.js +0 -7
- package/dist/agents/pi/PiCompositeProfileWriter.js.map +0 -1
- package/dist/agents/pi/PiExtensionCache.d.ts +0 -12
- package/dist/agents/pi/PiExtensionCache.js +0 -195
- package/dist/agents/pi/PiExtensionCache.js.map +0 -1
- package/dist/agents/pi/PiMcpConfig.d.ts +0 -2
- package/dist/agents/pi/PiMcpConfig.js +0 -114
- package/dist/agents/pi/PiMcpConfig.js.map +0 -1
- package/dist/agents/pi/PiSettingsMergePolicy.d.ts +0 -17
- package/dist/agents/pi/PiSettingsMergePolicy.js +0 -59
- package/dist/agents/pi/PiSettingsMergePolicy.js.map +0 -1
- package/dist/agents/pi/PiSkillSources.d.ts +0 -8
- package/dist/agents/pi/PiSkillSources.js +0 -73
- package/dist/agents/pi/PiSkillSources.js.map +0 -1
- package/dist/cli/commands/FirstRunWelcomeProfile.d.ts +0 -11
- package/dist/cli/commands/FirstRunWelcomeProfile.js +0 -110
- package/dist/cli/commands/FirstRunWelcomeProfile.js.map +0 -1
- package/dist/cli/commands/PiLoginLaunch.d.ts +0 -22
- package/dist/cli/commands/PiLoginLaunch.js +0 -170
- package/dist/cli/commands/PiLoginLaunch.js.map +0 -1
- package/dist/cli/commands/RunCommand.d.ts +0 -36
- package/dist/cli/commands/RunCommand.js +0 -345
- package/dist/cli/commands/RunCommand.js.map +0 -1
- package/dist/cli/commands/SyncCommand.d.ts +0 -46
- package/dist/cli/commands/SyncCommand.js +0 -244
- package/dist/cli/commands/SyncCommand.js.map +0 -1
- package/dist/cli/commands/WelcomeCommand.d.ts +0 -56
- package/dist/cli/commands/WelcomeCommand.js +0 -224
- package/dist/cli/commands/WelcomeCommand.js.map +0 -1
- package/dist/cli/commands/assets/outfitter-ascii.txt +0 -5
- package/dist/cli/commands/profile/Command.d.ts +0 -7
- package/dist/cli/commands/profile/Command.js +0 -24
- package/dist/cli/commands/profile/Command.js.map +0 -1
- package/dist/cli/commands/profile/CreateCommand.d.ts +0 -19
- package/dist/cli/commands/profile/CreateCommand.js +0 -115
- package/dist/cli/commands/profile/CreateCommand.js.map +0 -1
- package/dist/cli/commands/profile/LintCommand.d.ts +0 -19
- package/dist/cli/commands/profile/LintCommand.js +0 -155
- package/dist/cli/commands/profile/LintCommand.js.map +0 -1
- package/dist/cli/commands/profile/ListCommand.d.ts +0 -19
- package/dist/cli/commands/profile/ListCommand.js +0 -91
- package/dist/cli/commands/profile/ListCommand.js.map +0 -1
- package/dist/cli/commands/profile/Shared.d.ts +0 -9
- package/dist/cli/commands/profile/Shared.js +0 -10
- package/dist/cli/commands/profile/Shared.js.map +0 -1
- package/dist/cli/commands/run/RunFirstRunOnboarding.d.ts +0 -7
- package/dist/cli/commands/run/RunFirstRunOnboarding.js +0 -52
- package/dist/cli/commands/run/RunFirstRunOnboarding.js.map +0 -1
- package/dist/cli/commands/run/RunLaunchSummary.d.ts +0 -2
- package/dist/cli/commands/run/RunLaunchSummary.js +0 -35
- package/dist/cli/commands/run/RunLaunchSummary.js.map +0 -1
- package/dist/cli/commands/run/RunProfileResolution.d.ts +0 -39
- package/dist/cli/commands/run/RunProfileResolution.js +0 -128
- package/dist/cli/commands/run/RunProfileResolution.js.map +0 -1
- package/dist/cli/commands/run/RunStateWritePrompt.d.ts +0 -2
- package/dist/cli/commands/run/RunStateWritePrompt.js +0 -29
- package/dist/cli/commands/run/RunStateWritePrompt.js.map +0 -1
- package/dist/cli/commands/setup/SetupPrompts.d.ts +0 -14
- package/dist/cli/commands/setup/SetupPrompts.js +0 -296
- package/dist/cli/commands/setup/SetupPrompts.js.map +0 -1
- package/dist/cli/commands/setup/SetupSourceImport.d.ts +0 -5
- package/dist/cli/commands/setup/SetupSourceImport.js +0 -177
- package/dist/cli/commands/setup/SetupSourceImport.js.map +0 -1
- package/dist/cli/commands/setup/SetupSourceLaunch.d.ts +0 -4
- package/dist/cli/commands/setup/SetupSourceLaunch.js +0 -65
- package/dist/cli/commands/setup/SetupSourceLaunch.js.map +0 -1
- package/dist/cli/commands/setup/SetupStarterSource.d.ts +0 -21
- package/dist/cli/commands/setup/SetupStarterSource.js +0 -133
- package/dist/cli/commands/setup/SetupStarterSource.js.map +0 -1
- package/dist/cli/commands/setup/SetupTypes.d.ts +0 -91
- package/dist/cli/commands/setup/SetupTypes.js +0 -26
- package/dist/cli/commands/setup/SetupTypes.js.map +0 -1
- package/dist/compositeProfile/CompositeProfile.d.ts +0 -8
- package/dist/compositeProfile/CompositeProfile.js +0 -6
- package/dist/compositeProfile/CompositeProfile.js.map +0 -1
- package/dist/compositeProfile/CompositeProfileAssembler.d.ts +0 -12
- package/dist/compositeProfile/CompositeProfileAssembler.js +0 -32
- package/dist/compositeProfile/CompositeProfileAssembler.js.map +0 -1
- package/dist/compositeProfile/CompositeProfileCleanup.d.ts +0 -9
- package/dist/compositeProfile/CompositeProfileCleanup.js +0 -87
- package/dist/compositeProfile/CompositeProfileCleanup.js.map +0 -1
- package/dist/compositeProfile/CompositeProfileFile.d.ts +0 -16
- package/dist/compositeProfile/CompositeProfileFile.js +0 -16
- package/dist/compositeProfile/CompositeProfileFile.js.map +0 -1
- package/dist/compositeProfile/CompositeProfileTemplate.d.ts +0 -15
- package/dist/compositeProfile/CompositeProfileTemplate.js +0 -65
- package/dist/compositeProfile/CompositeProfileTemplate.js.map +0 -1
- package/dist/compositeProfile/CompositeProfileWatcher.d.ts +0 -18
- package/dist/compositeProfile/CompositeProfileWatcher.js +0 -46
- package/dist/compositeProfile/CompositeProfileWatcher.js.map +0 -1
- package/dist/compositeProfile/StatePersistence.d.ts +0 -39
- package/dist/compositeProfile/StatePersistence.js +0 -249
- package/dist/compositeProfile/StatePersistence.js.map +0 -1
- package/dist/fs/SafeSymlink.d.ts +0 -13
- package/dist/fs/SafeSymlink.js +0 -50
- package/dist/fs/SafeSymlink.js.map +0 -1
- package/dist/profiles/Profile.d.ts +0 -60
- package/dist/profiles/Profile.js +0 -7
- package/dist/profiles/Profile.js.map +0 -1
- package/dist/profiles/ProfileCache.d.ts +0 -8
- package/dist/profiles/ProfileCache.js.map +0 -1
- package/dist/profiles/ProfileLoader.d.ts +0 -28
- package/dist/profiles/ProfileLoader.js +0 -299
- package/dist/profiles/ProfileLoader.js.map +0 -1
- package/dist/profiles/ProfileMerger.d.ts +0 -19
- package/dist/profiles/ProfileMerger.js +0 -112
- package/dist/profiles/ProfileMerger.js.map +0 -1
- package/dist/profiles/ProfileSource.d.ts +0 -35
- package/dist/profiles/ProfileSource.js +0 -13
- package/dist/profiles/ProfileSource.js.map +0 -1
- package/dist/profiles/PromptIncludes.d.ts +0 -32
- package/dist/profiles/PromptIncludes.js +0 -147
- package/dist/profiles/PromptIncludes.js.map +0 -1
- package/dist/prompts/SystemPromptExport.d.ts +0 -16
- package/dist/prompts/SystemPromptExport.js +0 -81
- package/dist/prompts/SystemPromptExport.js.map +0 -1
- package/dist/schemas/profile-source.schema.json +0 -29
- package/dist/schemas/profile.schema.json +0 -200
- package/dist/skills/ProfileSkillResolution.d.ts +0 -21
- package/dist/skills/ProfileSkillResolution.js +0 -88
- package/dist/skills/ProfileSkillResolution.js.map +0 -1
- package/dist/skills/SkillCatalog.d.ts +0 -41
- package/dist/skills/SkillCatalog.js +0 -119
- package/dist/skills/SkillCatalog.js.map +0 -1
- package/dist/skills/SkillResolution.d.ts +0 -34
- package/dist/skills/SkillResolution.js +0 -369
- package/dist/skills/SkillResolution.js.map +0 -1
- package/docs/documentation/profile-repository.md +0 -179
- package/src/schemas/SchemaDocument.ts +0 -20
- package/src/schemas/profile-source.schema.json +0 -29
- 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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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)
|
|
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
|
|
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
|
|
29
|
-
outfitter run --
|
|
41
|
+
outfitter run engineer
|
|
42
|
+
outfitter run reviewer --harness claude
|
|
30
43
|
outfitter sync
|
|
31
|
-
outfitter
|
|
32
|
-
outfitter
|
|
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,
|
|
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
|
|
1
|
+
# Iterating on an agent
|
|
2
2
|
|
|
3
|
-
This guide covers the edit-run-inspect loop for profiles: switching to
|
|
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
|
-
|
|
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
|
-
|
|
9
|
-
Three scopes are directly editable on the current machine:
|
|
7
|
+
## Where editable resources live
|
|
10
8
|
|
|
11
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
|
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
|
-
```
|
|
35
|
-
|
|
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
|
-
|
|
45
|
+
Point your next launch at it either way:
|
|
39
46
|
|
|
40
|
-
```yaml
|
|
41
|
-
# .
|
|
42
|
-
|
|
43
|
-
|
|
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.
|
|
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
|
|
57
|
+
outfitter validate --strict
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
This reports
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
```sh
|
|
65
|
+
outfitter dump --agent experiment --out /tmp/inspect
|
|
66
|
+
```
|
|
65
67
|
|
|
66
|
-
|
|
68
|
+
Diff dumps between iterations to confirm a change landed — the dump is exactly what run composes.
|
|
67
69
|
|
|
68
|
-
|
|
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
|
-
|
|
71
|
-
|
|
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/
|
|
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
|
|
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
|
-
# .
|
|
85
|
-
|
|
86
|
-
- path: ~/repos/acme/
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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`.
|