@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.
Files changed (52) hide show
  1. package/README.md +48 -9
  2. package/dist/agents/AdapterProfileControls.d.ts +1 -0
  3. package/dist/agents/AdapterProfileControls.js +6 -0
  4. package/dist/agents/AdapterProfileControls.js.map +1 -1
  5. package/dist/agents/claude/ClaudeAdapter.js +2 -2
  6. package/dist/agents/claude/ClaudeAdapter.js.map +1 -1
  7. package/dist/agents/pi/PiAdapter.js +21 -13
  8. package/dist/agents/pi/PiAdapter.js.map +1 -1
  9. package/dist/cli/OutfitterCli.js +7 -2
  10. package/dist/cli/OutfitterCli.js.map +1 -1
  11. package/dist/cli/commands/FirstRunWelcomeProfile.js +8 -5
  12. package/dist/cli/commands/FirstRunWelcomeProfile.js.map +1 -1
  13. package/dist/cli/commands/PiLoginLaunch.js +67 -9
  14. package/dist/cli/commands/PiLoginLaunch.js.map +1 -1
  15. package/dist/cli/commands/RunCommand.js +4 -1
  16. package/dist/cli/commands/RunCommand.js.map +1 -1
  17. package/dist/cli/commands/SetupCommand.d.ts +16 -0
  18. package/dist/cli/commands/SetupCommand.js +340 -34
  19. package/dist/cli/commands/SetupCommand.js.map +1 -1
  20. package/dist/cli/commands/WelcomeCommand.d.ts +3 -1
  21. package/dist/cli/commands/WelcomeCommand.js +87 -77
  22. package/dist/cli/commands/WelcomeCommand.js.map +1 -1
  23. package/dist/cli/commands/profile/ListCommand.d.ts +2 -0
  24. package/dist/cli/commands/profile/ListCommand.js +9 -3
  25. package/dist/cli/commands/profile/ListCommand.js.map +1 -1
  26. package/dist/compositeProfile/StatePersistence.js +3 -0
  27. package/dist/compositeProfile/StatePersistence.js.map +1 -1
  28. package/dist/merge/ArrayMergePolicy.d.ts +2 -1
  29. package/dist/merge/ArrayMergePolicy.js +14 -11
  30. package/dist/merge/ArrayMergePolicy.js.map +1 -1
  31. package/dist/merge/SettingsValueMerger.js +27 -2
  32. package/dist/merge/SettingsValueMerger.js.map +1 -1
  33. package/dist/profiles/Profile.d.ts +4 -1
  34. package/dist/profiles/Profile.js.map +1 -1
  35. package/dist/profiles/ProfileLoader.js +16 -2
  36. package/dist/profiles/ProfileLoader.js.map +1 -1
  37. package/dist/profiles/ProfileMerger.d.ts +0 -1
  38. package/dist/profiles/ProfileMerger.js +20 -9
  39. package/dist/profiles/ProfileMerger.js.map +1 -1
  40. package/dist/schemas/profile.schema.json +17 -4
  41. package/doc/architecture.md +29 -7
  42. package/doc/file_structure.md +9 -1
  43. package/doc/state_writeback_strategy.md +8 -0
  44. package/package.json +16 -1
  45. package/requirements/OFTR-001-project-foundation.md +1 -1
  46. package/requirements/OFTR-003-profiles.md +14 -5
  47. package/requirements/OFTR-004-sync-and-setup.md +11 -1
  48. package/requirements/OFTR-006-agent-adapters.md +2 -0
  49. package/requirements/OFTR-009-release-publishing.md +13 -3
  50. package/requirements/OFTR-010-onboarding-welcome.md +27 -17
  51. package/skills/outfitter/SKILL.md +68 -0
  52. 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 a GitHub release tag and publishes the `@ai-outfitter/outfitter` npm package through GitHub Actions.
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 fail with an actionable error when required package-lock root package metadata is missing.
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 using an npm token secret.
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 guides a new user through the minimum choices needed to start productive Pi sessions, including an initial role and a recommended loadout of extensions and skills.
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 heavily customizable coding harness.
14
- > The next few questions will configure Outfitter to best suit your workflow.
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: Role Selection
21
+ ### OFTR-010.2: Profile Installation
17
22
 
18
- 1. The welcome onboarding flow MUST ask the user to choose an initial role for the Outfitter-managed agent session.
19
- 2. Role choices MUST align with Outfitter's built-in standard role catalog, not DeepWork review personas or a remote default profile source.
20
- 3. The role selection prompt MUST include the currently available built-in standard profile roles, including `engineer` and `data_analyst` while those roles remain supported.
21
- 4. The selected role MUST be captured as structured onboarding data so profile creation or profile selection can map it to the matching standard profile ID.
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 Selection
28
+ ### OFTR-010.3: Loadout
25
29
 
26
- 1. The welcome onboarding flow MUST recommend at least one default loadout for the selected role.
27
- 2. A loadout MUST be represented as a named set of Pi extensions, skills, or package resources that Outfitter can translate into profile controls or profile-managed Pi configuration.
28
- 3. The welcome onboarding flow MUST allow the user to accept the recommended loadout, select individual loadout items, or skip loadout installation.
29
- 4. The default recommended loadout MUST include `git:github.com/ai-outfitter/ulta-tasklist`, `git:github.com/ai-outfitter/deepwork`, `npm:pi-subagents`, and `npm:pi-mcp-adapter` while those packages remain available.
30
- 5. Loadout installation MUST be captured as structured onboarding data so future profile creation can install the selected extensions, skills, or package resources deterministically.
31
- 6. If a loadout item is unavailable or unsupported by the selected agent adapter, Outfitter MUST warn the user and continue with the remaining selected loadout items unless strict onboarding validation is enabled.
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": { "type": "string" },
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": { "type": "string" },
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": { "type": "string" },
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
  }