@ai-outfitter/outfitter 0.3.0 → 0.6.1
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/README.md +48 -9
- package/dist/agents/AdapterProfileControls.d.ts +1 -0
- package/dist/agents/AdapterProfileControls.js +6 -0
- package/dist/agents/AdapterProfileControls.js.map +1 -1
- package/dist/agents/claude/ClaudeAdapter.js +2 -2
- package/dist/agents/claude/ClaudeAdapter.js.map +1 -1
- package/dist/agents/pi/PiAdapter.js +21 -13
- package/dist/agents/pi/PiAdapter.js.map +1 -1
- package/dist/cli/OutfitterCli.js +7 -2
- package/dist/cli/OutfitterCli.js.map +1 -1
- package/dist/cli/commands/FirstRunWelcomeProfile.js +8 -5
- package/dist/cli/commands/FirstRunWelcomeProfile.js.map +1 -1
- package/dist/cli/commands/PiLoginLaunch.js +67 -9
- package/dist/cli/commands/PiLoginLaunch.js.map +1 -1
- package/dist/cli/commands/RunCommand.js +4 -1
- package/dist/cli/commands/RunCommand.js.map +1 -1
- package/dist/cli/commands/SetupCommand.d.ts +16 -0
- package/dist/cli/commands/SetupCommand.js +340 -34
- package/dist/cli/commands/SetupCommand.js.map +1 -1
- package/dist/cli/commands/WelcomeCommand.d.ts +3 -1
- package/dist/cli/commands/WelcomeCommand.js +87 -77
- package/dist/cli/commands/WelcomeCommand.js.map +1 -1
- package/dist/cli/commands/profile/ListCommand.d.ts +2 -0
- package/dist/cli/commands/profile/ListCommand.js +9 -3
- package/dist/cli/commands/profile/ListCommand.js.map +1 -1
- package/dist/compositeProfile/StatePersistence.js +3 -0
- package/dist/compositeProfile/StatePersistence.js.map +1 -1
- package/dist/merge/ArrayMergePolicy.d.ts +2 -1
- package/dist/merge/ArrayMergePolicy.js +14 -11
- package/dist/merge/ArrayMergePolicy.js.map +1 -1
- package/dist/merge/SettingsValueMerger.js +27 -2
- package/dist/merge/SettingsValueMerger.js.map +1 -1
- package/dist/profiles/Profile.d.ts +4 -1
- package/dist/profiles/Profile.js.map +1 -1
- package/dist/profiles/ProfileLoader.js +16 -2
- package/dist/profiles/ProfileLoader.js.map +1 -1
- package/dist/profiles/ProfileMerger.d.ts +0 -1
- package/dist/profiles/ProfileMerger.js +20 -9
- package/dist/profiles/ProfileMerger.js.map +1 -1
- package/dist/schemas/profile.schema.json +17 -4
- package/doc/architecture.md +29 -7
- package/doc/file_structure.md +9 -1
- package/doc/state_writeback_strategy.md +8 -0
- package/package.json +16 -1
- package/requirements/OFTR-001-project-foundation.md +1 -1
- package/requirements/OFTR-003-profiles.md +14 -5
- package/requirements/OFTR-004-sync-and-setup.md +11 -1
- package/requirements/OFTR-006-agent-adapters.md +2 -0
- package/requirements/OFTR-009-release-publishing.md +13 -3
- package/requirements/OFTR-010-onboarding-welcome.md +27 -17
- package/skills/outfitter/SKILL.md +68 -0
- package/src/schemas/profile.schema.json +17 -4
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
Outfitter release publishing prepares package metadata from
|
|
5
|
+
Outfitter release publishing prepares package metadata from Conventional Commit release PRs and GitHub release tags, then publishes the `@ai-outfitter/outfitter` npm package through GitHub Actions using npm trusted publishing / OIDC.
|
|
6
6
|
|
|
7
7
|
## Requirements
|
|
8
8
|
|
|
@@ -13,7 +13,8 @@ Outfitter release publishing prepares package metadata from a GitHub release tag
|
|
|
13
13
|
3. The release metadata synchronization script MUST reject invalid Semantic Versioning values before mutating package metadata.
|
|
14
14
|
4. The release metadata synchronization script MUST update the root `package.json` version, root `package-lock.json` version, and `package-lock.json` root package entry version to the same normalized release version.
|
|
15
15
|
5. The release metadata synchronization script MUST verify that the root package metadata it prepares belongs to the `@ai-outfitter/outfitter` npm package.
|
|
16
|
-
6. The release metadata synchronization script MUST
|
|
16
|
+
6. The release metadata synchronization script MUST verify that `package.json` and the package-lock root metadata declare `repository.url` as `https://github.com/ai-outfitter/outfitter.git` so npm provenance validation can match the publishing repository.
|
|
17
|
+
7. The release metadata synchronization script MUST fail with an actionable error when required package-lock root package metadata is missing.
|
|
17
18
|
|
|
18
19
|
### OFTR-009.2: Npm Release Workflow
|
|
19
20
|
|
|
@@ -22,4 +23,13 @@ Outfitter release publishing prepares package metadata from a GitHub release tag
|
|
|
22
23
|
3. The npm release workflow MUST synchronize package metadata from the GitHub release tag before publishing.
|
|
23
24
|
4. The npm release workflow MUST run CI checks before publishing.
|
|
24
25
|
5. The npm release workflow MUST build the package before publishing.
|
|
25
|
-
6. The npm release workflow MUST publish the public `@ai-outfitter/outfitter` package to the npm registry
|
|
26
|
+
6. The npm release workflow MUST request `id-token: write`, use the `npm-publish` GitHub environment, and publish the public `@ai-outfitter/outfitter` package to the npm registry with provenance through npm trusted publishing / OIDC rather than `NPM_TOKEN` or `NODE_AUTH_TOKEN`.
|
|
27
|
+
|
|
28
|
+
### OFTR-009.3: Conventional Commit Release Automation
|
|
29
|
+
|
|
30
|
+
1. The Release Please workflow MUST run on pushes to `main`.
|
|
31
|
+
2. The Release Please workflow MUST use `googleapis/release-please-action@v4` with the upstream example-style token input from `secrets.RELEASE_PLEASE_TOKEN`.
|
|
32
|
+
3. The Release Please workflow MUST use `release-type: node` for the root `@ai-outfitter/outfitter` npm package.
|
|
33
|
+
4. The Release Please workflow MUST derive version bumps from Conventional Commits.
|
|
34
|
+
5. The Release Please workflow MUST update npm package metadata and changelog through a release PR before publishing.
|
|
35
|
+
6. The Release Please workflow MUST use GitHub repository write auth capable of triggering release PR CI and the release-published npm workflow, not the default `GITHUB_TOKEN`.
|
|
@@ -2,33 +2,38 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
Outfitter welcome onboarding
|
|
5
|
+
Outfitter welcome onboarding gets a new user to a productive Pi session in one question. The
|
|
6
|
+
recommended path installs the founder profile automatically; declining opens `/outfitter` inside Pi
|
|
7
|
+
so the user can configure a profile interactively.
|
|
6
8
|
|
|
7
9
|
## Requirements
|
|
8
10
|
|
|
9
11
|
### OFTR-010.1: Welcome Text
|
|
10
12
|
|
|
11
|
-
1. Welcome text MUST be shown to the user explaining what Outfitter and Pi are.
|
|
13
|
+
1. Welcome text MUST be shown to the user explaining what Outfitter and Pi are and what the founder profile provides.
|
|
14
|
+
2. Welcome text MUST use Outfitter-branded ASCII/text.
|
|
15
|
+
3. Welcome text MUST reference `/outfitter` as the way to customize the profile after installation.
|
|
12
16
|
|
|
13
|
-
> Pi is a
|
|
14
|
-
> The
|
|
17
|
+
> Pi is a fully extensible agentic coding harness.
|
|
18
|
+
> The founder profile brings Pi to feature parity with dedicated agentic coding tools.
|
|
19
|
+
> Press Y to install it now. Run /outfitter inside Pi at any time to customize your profile.
|
|
15
20
|
|
|
16
|
-
### OFTR-010.2:
|
|
21
|
+
### OFTR-010.2: Profile Installation
|
|
17
22
|
|
|
18
|
-
1. The welcome onboarding flow MUST
|
|
19
|
-
2.
|
|
20
|
-
3. The role
|
|
21
|
-
4.
|
|
22
|
-
5. If the selected role cannot be mapped to an available standard profile for the selected agent adapter, Outfitter MUST warn the user and choose a deterministic fallback role rather than silently ignoring the selection.
|
|
23
|
+
1. The welcome onboarding flow MUST present a single accept/decline prompt for the founder profile.
|
|
24
|
+
2. Accepting (default) MUST install the founder role and the full recommended loadout without further prompts.
|
|
25
|
+
3. The founder role MUST be the default and fallback selection. Outfitter's built-in role catalog also includes `engineer` and `data_analyst`; these are accessible via `/outfitter` after first run.
|
|
26
|
+
4. If the accepted role cannot be mapped to an available standard profile, Outfitter MUST warn the user and choose a deterministic fallback role rather than silently ignoring the selection.
|
|
23
27
|
|
|
24
|
-
### OFTR-010.3: Loadout
|
|
28
|
+
### OFTR-010.3: Loadout
|
|
25
29
|
|
|
26
|
-
1.
|
|
27
|
-
2.
|
|
28
|
-
3.
|
|
29
|
-
4.
|
|
30
|
-
5.
|
|
31
|
-
6.
|
|
30
|
+
1. On acceptance, the full recommended loadout MUST be installed automatically with no item-level selection prompt.
|
|
31
|
+
2. The default recommended loadout MUST include `git:github.com/ai-outfitter/deepwork`, `npm:@juicesharp/rpiv-ask-user-question`, `git:github.com/applepi-ai/ulta-tasklist`, `npm:pi-nolo`, `npm:pi-browser-harness`, `npm:@mjakl/pi-subagent`, `npm:@narumitw/pi-btw`, `npm:pi-must-have-extension`, `npm:pi-interactive-shell`, and `npm:pi-mcp-adapter` while those packages remain available.
|
|
32
|
+
3. Loadout installation MUST be captured as structured onboarding data so profile creation can install the selected extensions deterministically.
|
|
33
|
+
4. On acceptance, Outfitter MUST display a message directing users to `/outfitter` inside Pi and `outfitter profile list` in the terminal for post-install management.
|
|
34
|
+
5. If a loadout item is unavailable or unsupported by the selected agent adapter, Outfitter MUST warn the user and continue with the remaining loadout items unless strict onboarding validation is enabled.
|
|
35
|
+
6. The Outfitter npm package MUST publish a default Pi skill named `outfitter` for profile setup guidance from inside Pi.
|
|
36
|
+
7. The Pi adapter MUST load the default Outfitter skill for normal profile launches.
|
|
32
37
|
|
|
33
38
|
### OFTR-010.4: Pi Login Setup
|
|
34
39
|
|
|
@@ -36,3 +41,8 @@ Outfitter welcome onboarding guides a new user through the minimum choices neede
|
|
|
36
41
|
2. If Pi is not logged in after the welcome flow, Outfitter MUST automatically invoke Pi's `/login` flow when Pi starts.
|
|
37
42
|
3. When Outfitter launches Pi outside the welcome flow and Pi does not appear to be logged in, Outfitter MUST inform the user to run `/login` inside Pi.
|
|
38
43
|
4. Pi login setup MUST NOT ask Outfitter to collect, echo, or persist provider API keys.
|
|
44
|
+
|
|
45
|
+
### OFTR-010.5: Decline Path
|
|
46
|
+
|
|
47
|
+
1. If the user declines the welcome profile, Outfitter MUST launch Pi with `/outfitter` prefilled and auto-submitted so the user can configure a profile interactively on first session start.
|
|
48
|
+
2. The profile install target MUST always be the user home directory (`~/.outfitter`); no installation scope prompt MUST be shown.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: outfitter
|
|
3
|
+
description: Help users create, inspect, and maintain Outfitter profiles, settings, setup sources, and Pi launch loadouts. Use when a user invokes /outfitter or asks for help setting up Outfitter-managed profiles, profile.yml files, profile sources, default profiles, skills, extensions, prompts, or setup repositories.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Outfitter
|
|
7
|
+
|
|
8
|
+
Use this skill to guide profile setup for Outfitter-managed Pi sessions.
|
|
9
|
+
|
|
10
|
+
## Default behavior
|
|
11
|
+
|
|
12
|
+
If the user invokes `/outfitter` without a specific request:
|
|
13
|
+
|
|
14
|
+
1. Run `outfitter profile list` to show available profiles.
|
|
15
|
+
2. Summarize the profiles by name, scope/source when visible, and default status when visible.
|
|
16
|
+
3. Ask whether the user wants to create a new profile.
|
|
17
|
+
4. If they do, ask for the intended profile ID and scope before running `outfitter profile create`.
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
|
|
21
|
+
1. Inspect the current directory and home configuration before editing:
|
|
22
|
+
- `.outfitter/settings.yml`
|
|
23
|
+
- `.outfitter/local/settings.yml`
|
|
24
|
+
- `.outfitter/profiles/*/profile.yml`
|
|
25
|
+
- `~/.outfitter/settings.yml`
|
|
26
|
+
2. Identify the intended scope:
|
|
27
|
+
- user profile: reusable across projects
|
|
28
|
+
- project profile: checked into the repository
|
|
29
|
+
- project-local profile: private machine-specific overrides
|
|
30
|
+
3. Prefer existing commands before manual file edits:
|
|
31
|
+
- `outfitter setup <source>` to import setup sources
|
|
32
|
+
- `outfitter sync` to refresh remote profile sources
|
|
33
|
+
- `outfitter profile list` to inspect available profiles
|
|
34
|
+
- `outfitter profile create <id> --scope user|project|project-local` to scaffold profiles
|
|
35
|
+
- `outfitter run --profile <id>` to verify launch behavior
|
|
36
|
+
4. Keep profile changes focused:
|
|
37
|
+
- put reusable resources under `skills/`, `prompts/`, `extensions/`, or `deepwork/jobs/`
|
|
38
|
+
- put Pi-only resources under `cli_specific/pi/`
|
|
39
|
+
- put Claude-only resources under `cli_specific/claude/`
|
|
40
|
+
5. Validate profile YAML against the current schema and run a smoke test with `outfitter run --profile <id> -- --help` when possible.
|
|
41
|
+
|
|
42
|
+
## Profile skeleton
|
|
43
|
+
|
|
44
|
+
```yaml
|
|
45
|
+
id: engineer
|
|
46
|
+
label: Engineer
|
|
47
|
+
|
|
48
|
+
controls:
|
|
49
|
+
provider: openai-codex
|
|
50
|
+
model: gpt-5.5
|
|
51
|
+
thinking: xhigh
|
|
52
|
+
append_system_prompt:
|
|
53
|
+
- ./prompts/engineering.md
|
|
54
|
+
skills:
|
|
55
|
+
- ./skills/review
|
|
56
|
+
pi:
|
|
57
|
+
extensions:
|
|
58
|
+
- git:github.com/ai-outfitter/ulta-tasklist
|
|
59
|
+
- git:github.com/ai-outfitter/deepwork
|
|
60
|
+
skills:
|
|
61
|
+
- ./cli_specific/pi/skills/outfitter
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Notes
|
|
65
|
+
|
|
66
|
+
- Use profile IDs matching lowercase letters, digits, `.`, `_`, and `-`.
|
|
67
|
+
- Use `template: true` only for inheritance-only profiles.
|
|
68
|
+
- Do not store provider secrets in profile files; use Pi login, environment variables, or the user's private agent state.
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
"pattern": "^[a-z0-9][a-z0-9._-]*[a-z0-9]$|^[a-z0-9]$"
|
|
10
10
|
},
|
|
11
11
|
"label": { "type": "string" },
|
|
12
|
+
"description": { "type": "string" },
|
|
13
|
+
"template": { "type": "boolean" },
|
|
12
14
|
"inherits": {
|
|
13
15
|
"type": "array",
|
|
14
16
|
"items": {
|
|
@@ -43,7 +45,7 @@
|
|
|
43
45
|
},
|
|
44
46
|
"prompt_template": { "type": "string" },
|
|
45
47
|
"system_prompt": { "type": "string" },
|
|
46
|
-
"append_system_prompt": { "
|
|
48
|
+
"append_system_prompt": { "$ref": "#/$defs/appendSystemPrompt" },
|
|
47
49
|
"environment": {
|
|
48
50
|
"type": "object",
|
|
49
51
|
"additionalProperties": { "type": "string" }
|
|
@@ -69,7 +71,7 @@
|
|
|
69
71
|
},
|
|
70
72
|
"prompt_template": { "type": "string" },
|
|
71
73
|
"system_prompt": { "type": "string" },
|
|
72
|
-
"append_system_prompt": { "
|
|
74
|
+
"append_system_prompt": { "$ref": "#/$defs/appendSystemPrompt" },
|
|
73
75
|
"allow_external_deepwork_jobs": { "type": "boolean" },
|
|
74
76
|
"environment": {
|
|
75
77
|
"type": "object",
|
|
@@ -99,7 +101,7 @@
|
|
|
99
101
|
},
|
|
100
102
|
"prompt_template": { "type": "string" },
|
|
101
103
|
"system_prompt": { "type": "string" },
|
|
102
|
-
"append_system_prompt": { "
|
|
104
|
+
"append_system_prompt": { "$ref": "#/$defs/appendSystemPrompt" },
|
|
103
105
|
"environment": {
|
|
104
106
|
"type": "object",
|
|
105
107
|
"additionalProperties": { "type": "string" }
|
|
@@ -111,5 +113,16 @@
|
|
|
111
113
|
"additionalProperties": true
|
|
112
114
|
}
|
|
113
115
|
},
|
|
114
|
-
"additionalProperties": true
|
|
116
|
+
"additionalProperties": true,
|
|
117
|
+
"$defs": {
|
|
118
|
+
"appendSystemPrompt": {
|
|
119
|
+
"oneOf": [
|
|
120
|
+
{ "type": "string" },
|
|
121
|
+
{
|
|
122
|
+
"type": "array",
|
|
123
|
+
"items": { "type": "string" }
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
}
|
|
115
128
|
}
|