@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
@@ -12,14 +12,32 @@ const mergeObjectValue = (lowerPrecedence, higherPrecedence, path, options) => (
12
12
  ])),
13
13
  });
14
14
  const mergeMemberValue = (lowerPrecedence, higherPrecedence, path, options) => {
15
- if (Array.isArray(higherPrecedence)) {
16
- return mergeArrayByPolicy(isMergeableArray(lowerPrecedence) ? lowerPrecedence : undefined, higherPrecedence, options.arrayPolicyForPath?.(path) ?? 'replace');
15
+ const arrayPolicy = options.arrayPolicyForPath?.(path);
16
+ const listMergedValue = mergeListMemberValue(lowerPrecedence, higherPrecedence, arrayPolicy);
17
+ if (listMergedValue !== undefined) {
18
+ return listMergedValue;
19
+ }
20
+ const arrayMergedValue = mergeArrayMemberValue(lowerPrecedence, higherPrecedence, arrayPolicy);
21
+ if (arrayMergedValue !== undefined) {
22
+ return arrayMergedValue;
17
23
  }
18
24
  if (isPlainMergeableObject(lowerPrecedence) && isPlainMergeableObject(higherPrecedence)) {
19
25
  return mergeObjectValue(lowerPrecedence, higherPrecedence, path, options);
20
26
  }
21
27
  return cloneMergeableValue(higherPrecedence);
22
28
  };
29
+ const mergeListMemberValue = (lowerPrecedence, higherPrecedence, arrayPolicy) => {
30
+ if (arrayPolicy !== 'appendList' && arrayPolicy !== 'prependList') {
31
+ return undefined;
32
+ }
33
+ return mergeArrayByPolicy(coerceMergeableList(lowerPrecedence), coerceDefinedMergeableList(higherPrecedence), arrayPolicy === 'appendList' ? 'append' : 'prepend');
34
+ };
35
+ const mergeArrayMemberValue = (lowerPrecedence, higherPrecedence, arrayPolicy) => {
36
+ if (!Array.isArray(higherPrecedence)) {
37
+ return undefined;
38
+ }
39
+ return mergeArrayByPolicy(isMergeableArray(lowerPrecedence) ? lowerPrecedence : undefined, higherPrecedence, arrayPolicy ?? 'replace');
40
+ };
23
41
  const cloneMergeableValue = (value) => {
24
42
  if (isMergeableArray(value)) {
25
43
  return value.map(cloneMergeableValue);
@@ -31,4 +49,11 @@ const cloneMergeableValue = (value) => {
31
49
  };
32
50
  const isPlainMergeableObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
33
51
  const isMergeableArray = (value) => Array.isArray(value);
52
+ const coerceMergeableList = (value) => {
53
+ if (value === undefined) {
54
+ return undefined;
55
+ }
56
+ return coerceDefinedMergeableList(value);
57
+ };
58
+ const coerceDefinedMergeableList = (value) => isMergeableArray(value) ? value : [value];
34
59
  //# sourceMappingURL=SettingsValueMerger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsValueMerger.js","sourceRoot":"","sources":["../../src/merge/SettingsValueMerger.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAmB3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,eAA8B,EAC9B,gBAAmB,EACnB,UAA6B,EAAE,EAC5B,EAAE,CAAC,gBAAgB,CAAC,eAAe,IAAI,EAAE,EAAE,gBAAmC,EAAE,EAAE,EAAE,OAAO,CAAM,CAAC;AAEvG,MAAM,gBAAgB,GAAG,CACvB,eAAgC,EAChC,gBAAiC,EACjC,IAAe,EACf,OAA0B,EACT,EAAE,CAAC,CAAC;IACrB,GAAG,eAAe;IAClB,GAAG,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,CAAC,KAAK,EAAqC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;SAC5E,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACrB,GAAG;QACH,GAAG,IAAI,eAAe;YACpB,CAAC,CAAC,gBAAgB,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC;YACxE,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC;KAC/B,CAAC,CACL;CACF,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,CACvB,eAA2C,EAC3C,gBAAgC,EAChC,IAAe,EACf,OAA0B,EACV,EAAE;IAClB,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,OAAO,kBAAkB,CACvB,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,EAC/D,gBAAgB,EAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,IAAI,SAAS,CAChD,CAAC;IACJ,CAAC;IAED,IAAI,sBAAsB,CAAC,eAAe,CAAC,IAAI,sBAAsB,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACxF,OAAO,gBAAgB,CAAC,eAAe,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,KAAqB,EAAkB,EAAE;IACpE,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAA4B,EAAE,CAC1E,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAsC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"SettingsValueMerger.js","sourceRoot":"","sources":["../../src/merge/SettingsValueMerger.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { StatePersistenceStrategy } from '../compositeProfile/StatePersistence.js';
2
2
  export type StatePersistenceOverrides = Readonly<Record<string, StatePersistenceStrategy>>;
3
+ export type AppendSystemPromptControl = string | readonly string[];
3
4
  interface BaseProfileControls {
4
5
  readonly [controlName: string]: unknown;
5
6
  readonly model?: string;
@@ -12,7 +13,7 @@ interface BaseProfileControls {
12
13
  readonly skills?: readonly string[];
13
14
  readonly promptTemplate?: string;
14
15
  readonly systemPrompt?: string;
15
- readonly appendSystemPrompt?: string;
16
+ readonly appendSystemPrompt?: AppendSystemPromptControl;
16
17
  }
17
18
  export type AgentSpecificProfileControls = BaseProfileControls;
18
19
  export type PiProfileControls = AgentSpecificProfileControls;
@@ -24,6 +25,8 @@ export interface ProfileControls extends BaseProfileControls {
24
25
  export interface Profile {
25
26
  readonly id: string;
26
27
  readonly label?: string;
28
+ readonly description?: string;
29
+ readonly template?: boolean;
27
30
  readonly inherits: readonly string[];
28
31
  readonly controls: ProfileControls;
29
32
  readonly statePersistence?: StatePersistenceOverrides;
@@ -1 +1 @@
1
- {"version":3,"file":"Profile.js","sourceRoot":"","sources":["../../src/profiles/Profile.ts"],"names":[],"mappings":"AAqCA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,CAAC;IAC1D,EAAE;IACF,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,gBAAgB,EAAE,EAAE;CACrB,CAAC,CAAC"}
1
+ {"version":3,"file":"Profile.js","sourceRoot":"","sources":["../../src/profiles/Profile.ts"],"names":[],"mappings":"AAwCA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,CAAC;IAC1D,EAAE;IACF,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,gBAAgB,EAAE,EAAE;CACrB,CAAC,CAAC"}
@@ -24,6 +24,8 @@ export const parseProfileDocument = (document, fallbackId) => {
24
24
  return omitUndefined({
25
25
  id,
26
26
  label: readOptionalString(record.label),
27
+ description: readOptionalString(record.description),
28
+ template: readOptionalBoolean(record.template),
27
29
  inherits: readStringArray(record.inherits),
28
30
  controls: readControls(record.controls),
29
31
  statePersistence: Object.keys(statePersistence).length > 0 ? statePersistence : undefined,
@@ -91,6 +93,12 @@ const readOptionalString = (value) => {
91
93
  }
92
94
  return undefined;
93
95
  };
96
+ const readOptionalBoolean = (value) => {
97
+ if (typeof value === 'boolean') {
98
+ return value;
99
+ }
100
+ return undefined;
101
+ };
94
102
  const readStringArray = (value) => {
95
103
  if (Array.isArray(value)) {
96
104
  return value.filter((item) => typeof item === 'string');
@@ -103,6 +111,12 @@ const readOptionalStringArray = (value) => {
103
111
  }
104
112
  return undefined;
105
113
  };
114
+ const readOptionalStringOrStringArray = (value) => {
115
+ if (typeof value === 'string') {
116
+ return value;
117
+ }
118
+ return readOptionalStringArray(value);
119
+ };
106
120
  const readControls = (value) => {
107
121
  const controls = readObject(value);
108
122
  if (controls === undefined) {
@@ -120,7 +134,7 @@ const readControls = (value) => {
120
134
  skills: readOptionalStringArray(controls.skills),
121
135
  promptTemplate: readOptionalString(controls.prompt_template),
122
136
  systemPrompt: readOptionalString(controls.system_prompt),
123
- appendSystemPrompt: readOptionalString(controls.append_system_prompt),
137
+ appendSystemPrompt: readOptionalStringOrStringArray(controls.append_system_prompt),
124
138
  pi: readAgentSpecificControls(controls.pi),
125
139
  claude: readAgentSpecificControls(controls.claude),
126
140
  });
@@ -142,7 +156,7 @@ const readAgentSpecificControls = (value) => {
142
156
  skills: readOptionalStringArray(controls.skills),
143
157
  promptTemplate: readOptionalString(controls.prompt_template),
144
158
  systemPrompt: readOptionalString(controls.system_prompt),
145
- appendSystemPrompt: readOptionalString(controls.append_system_prompt),
159
+ appendSystemPrompt: readOptionalStringOrStringArray(controls.append_system_prompt),
146
160
  });
147
161
  };
148
162
  const omitUndefined = (record) => Object.fromEntries(Object.entries(record).filter((entry) => entry[1] !== undefined));
@@ -1 +1 @@
1
- {"version":3,"file":"ProfileLoader.js","sourceRoot":"","sources":["../../src/profiles/ProfileLoader.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIlE,MAAM,gBAAgB,GAAG,4CAA4C,CAAC;AAoBtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAA0C,EAAmB,EAAE,CAAC,CAAC;IACrG,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAW,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEjG,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,SAAiB,EAAE,MAA8B,EAAW,EAAE,CACtG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAiB,EAAE,UAAkB,EAA8B,EAAE;IACxG,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,qBAAqB,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAEjE,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAExE,OAAO,aAAa,CAAC;QACnB,EAAE;QACF,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC;QACvC,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC1C,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;QACvC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;KAC1F,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,UAAkB,EAA8B,EAAE;IAClG,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,OAAO,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAA8B,EAAqB,EAAE;IAC1F,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,oDAAoD,EAAE,CAAC;SAClG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACrE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,+CAA+C,EAAE,CAAC,EAAE,CAAC;IACrH,CAAC;IAED,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAEpD,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAClE,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,MAA8B,EAC9B,UAAkB,EAClB,UAAkB,EAClB,WAAmB,EACnB,QAAyB,EACzB,MAA0B,EACpB,EAAE;IACR,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IAEhF,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpF,CAAC;SAAM,IAAI,yBAAyB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,MAAyC,EAAgC,EAAE;IACxG,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAErD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAc,EAAiD,EAAE;IACnF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAA0C,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,QAAgB,EAAU,EAAE;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAsB,EAAE;IAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAc,EAAqB,EAAE;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,KAAc,EAAiC,EAAE;IAChF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAc,EAAmB,EAAE;IACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,aAAa,CAAC;QACnB,GAAG,QAAQ;QACX,KAAK,EAAE,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClD,IAAI,EAAE,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC5C,gBAAgB,EAAE,kBAAkB,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAChE,UAAU,EAAE,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC;QACxD,MAAM,EAAE,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChD,cAAc,EAAE,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC5D,YAAY,EAAE,kBAAkB,CAAC,QAAQ,CAAC,aAAa,CAAC;QACxD,kBAAkB,EAAE,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACrE,EAAE,EAAE,yBAAyB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,MAAM,CAAC;KACnD,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,KAAc,EAA4C,EAAE;IAC7F,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,aAAa,CAAC;QACnB,GAAG,QAAQ;QACX,KAAK,EAAE,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClD,IAAI,EAAE,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC5C,gBAAgB,EAAE,kBAAkB,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAChE,UAAU,EAAE,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC;QACxD,MAAM,EAAE,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChD,cAAc,EAAE,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC5D,YAAY,EAAE,kBAAkB,CAAC,QAAQ,CAAC,aAAa,CAAC;QACxD,kBAAkB,EAAE,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KACtE,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAA8C,MAAS,EAAK,EAAE,CAClF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAM,CAAC;AAE5F,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAA6B,EAAE;IACzE,MAAM,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,MAAM,CACrC,CAAC,KAAK,EAAwD,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAC9F,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAc,EAAgD,EAAE;IACvF,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEtC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CACvG,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAU,EAAE;IACzD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC,CAAC"}
1
+ {"version":3,"file":"ProfileLoader.js","sourceRoot":"","sources":["../../src/profiles/ProfileLoader.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,6 @@ export interface ProfileResolutionInput {
5
5
  /** Profiles ordered from lowest precedence to highest precedence. */
6
6
  readonly profiles: readonly LoadedProfile[];
7
7
  readonly profileId: string;
8
- readonly defaultProfileId?: string;
9
8
  }
10
9
  export interface ProfileResolutionIssue {
11
10
  readonly path: string;
@@ -2,7 +2,14 @@ import { mergeObjectsWithPolicy } from '../merge/SettingsValueMerger.js';
2
2
  import { normalizeExtensionResourceIdentity, normalizeLaunchResourceIdentity } from '../agents/ResourceIdentity.js';
3
3
  export const mergeProfileStack = (profileStack) => {
4
4
  const [baseProfile, ...higherPrecedenceProfiles] = profileStack;
5
- return higherPrecedenceProfiles.reduce((mergedProfile, profile) => mergeObjectsWithPolicy(mergedProfile, profile, { arrayPolicyForPath: profileArrayPolicy }), baseProfile);
5
+ const mergedProfile = higherPrecedenceProfiles.reduce((mergedProfile, profile) => mergeObjectsWithPolicy(mergedProfile, profile, { arrayPolicyForPath: profileArrayPolicy }), baseProfile);
6
+ return withProfileTemplateFromTopProfile(mergedProfile, profileStack[profileStack.length - 1]);
7
+ };
8
+ const withProfileTemplateFromTopProfile = (profile, topProfile) => {
9
+ if (topProfile.template === true) {
10
+ return { ...profile, template: true };
11
+ }
12
+ return Object.fromEntries(Object.entries(profile).filter(([key]) => key !== 'template'));
6
13
  };
7
14
  const profileArrayPolicy = (path) => {
8
15
  const pathKey = path.join('.');
@@ -12,6 +19,9 @@ const profileArrayPolicy = (path) => {
12
19
  if (['controls.args', 'controls.pi.args', 'controls.claude.args'].includes(pathKey)) {
13
20
  return 'prepend';
14
21
  }
22
+ if (isAppendSystemPromptPath(pathKey)) {
23
+ return 'prependList';
24
+ }
15
25
  if (['controls.extensions', 'controls.pi.extensions', 'controls.claude.extensions'].includes(pathKey)) {
16
26
  return {
17
27
  mode: 'uniqueBy',
@@ -30,17 +40,18 @@ const profileArrayPolicy = (path) => {
30
40
  }
31
41
  return undefined;
32
42
  };
43
+ const isAppendSystemPromptPath = (pathKey) => [
44
+ 'controls.appendSystemPrompt',
45
+ 'controls.append_system_prompt',
46
+ 'controls.pi.appendSystemPrompt',
47
+ 'controls.pi.append_system_prompt',
48
+ 'controls.claude.appendSystemPrompt',
49
+ 'controls.claude.append_system_prompt',
50
+ ].includes(pathKey);
33
51
  export const resolveProfile = (input) => {
34
52
  const definitions = createProfileDefinitions(input.profiles);
35
53
  const issues = [];
36
- const explicitStack = resolveProfileStack(input.profileId, definitions, [], issues);
37
- const defaultStack = input.defaultProfileId === undefined || input.defaultProfileId === input.profileId
38
- ? []
39
- : resolveProfileStack(input.defaultProfileId, definitions, [], issues);
40
- const profileStack = uniqueProfileStack([
41
- ...defaultStack.filter((profile) => profile.id !== input.profileId),
42
- ...explicitStack,
43
- ]);
54
+ const profileStack = uniqueProfileStack(resolveProfileStack(input.profileId, definitions, [], issues));
44
55
  return {
45
56
  profile: issues.length === 0 && profileStack.length > 0
46
57
  ? mergeProfileStack(profileStack)
@@ -1 +1 @@
1
- {"version":3,"file":"ProfileMerger.js","sourceRoot":"","sources":["../../src/profiles/ProfileMerger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProfileMerger.js","sourceRoot":"","sources":["../../src/profiles/ProfileMerger.ts"],"names":[],"mappings":"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"}
@@ -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
  }
@@ -362,6 +362,8 @@ profiles/
362
362
  prompts/
363
363
  skills/
364
364
  extensions/
365
+ deepwork/
366
+ jobs/
365
367
  cli_specific/
366
368
  pi/
367
369
  claude/
@@ -372,6 +374,8 @@ Example `profile.yml`:
372
374
  ```yaml
373
375
  id: engineering
374
376
  label: Engineering
377
+ description: General software engineering profile for coding, tests, reviews, and repo navigation.
378
+ template: false
375
379
  inherits:
376
380
  - base-typescript
377
381
 
@@ -396,10 +400,14 @@ Rules:
396
400
 
397
401
  - Every `profile.yml` MUST validate against `profile.schema.json`.
398
402
  - `inherits` is an ordered array of profile names.
399
- - `cli_specific/<cli-name>/` contains files copied or translated directly into the generated composite profile for that CLI.
400
- - Pi profiles may provide `cli_specific/pi/.mcp.json`; Outfitter merges contributing profile fragments into the composite profile with unique array entries by identity and last writer wins for duplicate identities.
401
- - Pi profiles may provide DeepWork jobs under `cli_specific/pi/deepwork/jobs/`; Outfitter appends contributing job folders to `DEEPWORK_ADDITIONAL_JOBS_FOLDERS` when launching Pi so DeepWork can discover those profile-owned workflows.
403
+ - `template: true` marks a profile as inheritance-only: it may contribute controls to runnable profiles through `inherits`, but `outfitter run --profile <id>` and `default_profile: <id>` launches reject it directly.
404
+ - `skills/` contains profile-bundled Agent Skills. Outfitter exposes valid skills from contributing profile folders when launching Pi.
405
+ - `deepwork/jobs/` contains profile-bundled DeepWork jobs. Outfitter appends contributing profile job folders to `DEEPWORK_ADDITIONAL_JOBS_FOLDERS` when launching Pi so DeepWork can discover profile-owned workflows.
402
406
  Profile-bundled jobs are isolated by default: inherited `DEEPWORK_ADDITIONAL_JOBS_FOLDERS` entries are included only when the profile sets `controls.pi.allow_external_deepwork_jobs: true`.
407
+ - `cli_specific/<cli-name>/` contains files copied or translated directly into the generated composite profile for that CLI, plus resources that intentionally apply only to one adapter.
408
+ - Pi profiles may provide `cli_specific/pi/.mcp.json`; Outfitter merges contributing profile fragments into the composite profile with unique array entries by identity and last writer wins for duplicate identities.
409
+ - Pi-specific skills and DeepWork jobs may also live under `cli_specific/pi/skills/` and `cli_specific/pi/deepwork/jobs/` when they should not be exposed to other adapters.
410
+ - `append_system_prompt` accepts a string or an ordered string array. When multiple resolved profile layers provide it, Outfitter composes the values into repeated agent append-prompt inputs in profile precedence order so shared prompt profiles do not need to use raw CLI `args`.
403
411
  - CLI-specific configuration wins over generic controls when both apply to the same generated artifact.
404
412
 
405
413
  ### Profile Directory Examples
@@ -435,12 +443,23 @@ controls:
435
443
  NODE_ENV: development
436
444
  ```
437
445
 
446
+ ```yaml
447
+ # ~/.outfitter/profiles/shared-prose/profile.yml
448
+ id: shared-prose
449
+ label: Shared Prose
450
+ template: true
451
+
452
+ controls:
453
+ append_system_prompt: ./prompts/prose.md
454
+ ```
455
+
438
456
  ```yaml
439
457
  # ~/.outfitter/profiles/personal-engineering/profile.yml
440
458
  id: personal-engineering
441
459
  label: Personal Engineering
442
460
  inherits:
443
461
  - base-typescript
462
+ - shared-prose
444
463
 
445
464
  controls:
446
465
  append_system_prompt: ./prompts/system.md
@@ -696,15 +715,16 @@ Responsibilities:
696
715
 
697
716
  - create `~/.outfitter/settings.yml` when missing;
698
717
  - accept an optional setup source URI, for example `outfitter setup https://github.com/example/outfitter-config`, and clone/update it under `~/.outfitter/cache/repos/<encoded-uri-and-ref>/`;
699
- - when a setup source is provided, use its root `settings.yml` or `.outfitter/settings.yml` and `profiles/` or `.outfitter/profiles/` as the initial non-overwriting user setup starting point;
718
+
719
+ - when a setup source is provided, use its root `settings.yml` or `.outfitter/settings.yml` and `profiles/` or `.outfitter/profiles/` as the initial non-overwriting setup starting point for the selected import target;
720
+ - during interactive setup-source onboarding, show the Outfitter welcome first, explain the source being imported, ask whether to install into user home or the current project, then ask exactly one source-profile/default prompt;
700
721
  - require an interactive TTY on both stdin and stdout before running setup prompts;
701
722
  - create a default profile when missing;
702
723
  - validate all discovered settings files and any starter settings file;
703
724
  - run `outfitter sync` behavior for URI profile sources before profile selection;
704
- - on initial interactive first-run setup, skip the older setup default-profile prompt and let welcome onboarding choose the generated local default profile;
705
- - outside that initial welcome handoff, show a setup wizard with synced profile choices, preserve display labels where available, validate the selected profile ID, and write the selected default profile to user settings;
725
+
726
+ - outside that initial welcome handoff and outside setup-source import onboarding, show a setup wizard with synced profile choices, preserve display labels where available, validate the selected profile ID, and write the selected default profile to user settings;
706
727
  - create any missing fallback default profile file for the final selected default profile;
707
- - run welcome onboarding after interactive setup completes;
708
728
  - report actionable next steps.
709
729
 
710
730
  ### `outfitter welcome`
@@ -745,6 +765,8 @@ Responsibilities:
745
765
 
746
766
  - read and validate settings;
747
767
  - load configured local and cached remote profile sources;
768
+ - hide template profiles by default because they are inheritance-only;
769
+ - include template profiles when `--all` is requested and mark them as templates in output;
748
770
  - report unique profile IDs deterministically;
749
771
  - use the highest-precedence loaded definition when duplicate profile IDs exist.
750
772
 
@@ -10,6 +10,8 @@ Outfitter is organized around clear TypeScript source boundaries, requirement do
10
10
  ```text
11
11
  . # repository root
12
12
  ├── .deepreview # root DeepWork review rules for project-wide checks
13
+ ├── .dockerignore # container build context exclusions
14
+ ├── Dockerfile # local and release Outfitter container image definition
13
15
  ├── .deepwork/ # DeepWork schemas and generated review instruction scratch files
14
16
  │ └── schemas/ # project-specific DeepSchema definitions
15
17
  ├── .github/ # GitHub automation configuration
@@ -35,8 +37,11 @@ Outfitter is organized around clear TypeScript source boundaries, requirement do
35
37
  ├── .prettierignore # Prettier ignore rules
36
38
  ├── .prettierrc.json # Prettier formatting configuration
37
39
  ├── .snapperrc.toml # Snapper Markdown formatting configuration
38
- ├── plan.md # implementation plan
39
40
  ├── CONTRIBUTING.md # local install and contributor workflow guide
41
+ ├── bin/ # local executable development helpers
42
+ │ ├── dev-container-setup # clean container helper for setup smoke tests
43
+ │ ├── dev-setup-source # local build helper for real setup-source targets
44
+ │ └── dev-tmp-home # isolated temporary HOME launch helper
40
45
  ├── src/ # production TypeScript source
41
46
  │ ├── cli.ts # executable CLI entry point
42
47
  │ ├── cli/ # CLI parser construction and command registration
@@ -100,6 +105,9 @@ Outfitter is organized around clear TypeScript source boundaries, requirement do
100
105
  ├── scripts/ # local development and formatting helper scripts
101
106
  │ ├── .deepreview # script-specific DeepWork review rules
102
107
  │ └── run-snapper.mjs # pinned Snapper binary downloader/runner
108
+ ├── skills/ # Pi package skills published with Outfitter
109
+ │ └── outfitter/ # default /outfitter setup guidance skill
110
+ │ └── SKILL.md
103
111
  ├── tests/ # automated tests
104
112
  │ ├── fixtures/ # reusable test fixtures
105
113
  │ │ ├── integration/ # fixture-backed integration scenarios, catalog, and local .deepreview
@@ -101,6 +101,14 @@ state_paths:
101
101
  default_strategy: symlink
102
102
  allowed_strategies: [symlink, warn, error, prompt]
103
103
 
104
+ models.json:
105
+ default_strategy: symlink
106
+ allowed_strategies: [symlink, warn, error, prompt]
107
+
108
+ trust.json:
109
+ default_strategy: symlink
110
+ allowed_strategies: [symlink, warn, error, prompt]
111
+
104
112
  plugins/:
105
113
  default_strategy: symlink
106
114
  allowed_strategies: [symlink, discard, warn, error, prompt]
package/package.json CHANGED
@@ -1,13 +1,22 @@
1
1
  {
2
2
  "name": "@ai-outfitter/outfitter",
3
- "version": "0.3.0",
3
+ "version": "0.6.1",
4
4
  "description": "Profile-oriented wrapper for launching pi, Claude Code, and future agent CLIs with reproducible configuration.",
5
5
  "type": "module",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/ai-outfitter/outfitter.git"
9
+ },
10
+ "bugs": {
11
+ "url": "https://github.com/ai-outfitter/outfitter/issues"
12
+ },
13
+ "homepage": "https://github.com/ai-outfitter/outfitter#readme",
6
14
  "bin": {
7
15
  "outfitter": "dist/cli.js"
8
16
  },
9
17
  "files": [
10
18
  "dist",
19
+ "skills",
11
20
  "requirements",
12
21
  "src/schemas",
13
22
  "doc",
@@ -63,9 +72,15 @@
63
72
  "keywords": [
64
73
  "agent",
65
74
  "cli",
75
+ "pi-package",
66
76
  "pi",
67
77
  "profiles"
68
78
  ],
79
+ "pi": {
80
+ "skills": [
81
+ "./skills"
82
+ ]
83
+ },
69
84
  "license": "BUSL-1.1",
70
85
  "publishConfig": {
71
86
  "access": "public"
@@ -22,7 +22,7 @@ This document specifies the baseline runtime, language, test, lint, and document
22
22
  1. The project MUST use Vitest as its test framework before implementing substantial runtime behavior.
23
23
  2. The test command MUST be runnable from package scripts.
24
24
  3. The coverage command MUST use `@vitest/coverage-v8`.
25
- 4. The test configuration MUST enforce 100% global coverage for statements, branches, functions, and lines.
25
+ 4. The test configuration MUST enforce at least 99% global coverage for statements, branches, functions, and lines.
26
26
  5. The coverage configuration MUST include all `src/**/*.ts` files even when a source file is not imported by any test.
27
27
  6. Tests that validate formal requirements MUST follow the traceability format required by OFTR-008.3.
28
28
 
@@ -12,7 +12,7 @@ Outfitter resolves profile definitions across settings scopes, explicit sources,
12
12
  1. A profile MUST be represented by a folder with a required `profile.yml` file.
13
13
  2. Outfitter MUST provide a JSON Schema for `profile.yml`.
14
14
  3. Outfitter MUST validate every loaded `profile.yml` file against the profile JSON Schema.
15
- 4. A profile folder MAY contain conventional resource folders such as `skills`, `prompts`, and `extensions`.
15
+ 4. A profile folder MAY contain conventional resource folders such as `skills`, `prompts`, `extensions`, and `deepwork/jobs`.
16
16
  5. A profile folder MAY contain `cli_specific/<cli-name>/` folders for agent-specific resources and overrides.
17
17
 
18
18
  ### OFTR-003.2: Profile Identity
@@ -21,6 +21,7 @@ Outfitter resolves profile definitions across settings scopes, explicit sources,
21
21
  2. Profile IDs MUST match the regex `^[a-z0-9][a-z0-9._-]*[a-z0-9]$|^[a-z0-9]$`.
22
22
  3. Outfitter MUST reject profile IDs that cannot be safely referenced from the CLI.
23
23
  4. Outfitter SHOULD support a separate display label if human-readable names need spaces or punctuation.
24
+ 5. Profiles MAY include a short `description` for interactive prompts and profile discovery surfaces.
24
25
 
25
26
  ### OFTR-003.3: Profile Scope Precedence
26
27
 
@@ -37,11 +38,11 @@ Outfitter resolves profile definitions across settings scopes, explicit sources,
37
38
  4. Outfitter MUST detect inheritance cycles and report them as validation errors.
38
39
  5. Outfitter MUST preserve inherited profile order when building the profile stack.
39
40
 
40
- ### OFTR-003.5: Implicit Default Profile
41
+ ### OFTR-003.5: Default Profile Selection
41
42
 
42
- 1. The default profile from user settings MUST be included as an implicit bottom profile when running any explicit profile.
43
- 2. Profiles inherited by the implicit default profile MUST be included recursively below the default profile according to the inheritance rules.
44
- 3. Outfitter MUST avoid duplicating a profile in the resolved stack when the same profile appears explicitly and implicitly.
43
+ 1. Outfitter MUST use the configured `default_profile` only when no explicit profile is selected.
44
+ 2. When an explicit profile is selected, Outfitter MUST resolve only that profile and its declared `inherits` chain.
45
+ 3. Outfitter MUST NOT include the configured `default_profile` as an implicit base layer for an explicit profile.
45
46
 
46
47
  ### OFTR-003.6: Profile Merging
47
48
 
@@ -49,3 +50,11 @@ Outfitter resolves profile definitions across settings scopes, explicit sources,
49
50
  2. YAML object values SHOULD be merged with `defu` or an equivalent controlled deep-merge utility.
50
51
  3. Array merge behavior MUST be documented per profile key before that key is treated as stable.
51
52
  4. CLI-specific profile content MUST take precedence over generic controls when both generate the same agent-specific artifact.
53
+ 5. Outfitter MUST compose `append_system_prompt` values from multiple resolved profile layers into repeated agent append-prompt inputs without requiring profiles to use raw CLI `args` for prompt composition.
54
+
55
+ ### OFTR-003.7: Template Profiles
56
+
57
+ 1. A profile MAY set top-level `template: true` to indicate it is intended for inheritance by runnable profiles rather than direct launch.
58
+ 2. Outfitter MUST allow template profiles to contribute controls through `inherits` without marking the inheriting profile as a template.
59
+ 3. Outfitter MUST reject direct launches of template profiles, including launches selected through `default_profile`.
60
+ 4. `outfitter profile list` SHOULD hide template profiles by default and MUST expose them when the user explicitly requests all profiles.
@@ -14,13 +14,23 @@ Outfitter provides setup and maintenance commands that create initial configurat
14
14
  4. The `setup` command MUST validate discovered settings files.
15
15
  5. The `setup` command MUST run sync behavior for URI-based profile sources.
16
16
  6. The `setup` command SHOULD avoid overwriting existing user files unless a future explicit force option authorizes replacement.
17
- 7. When provided a setup source URI, the `setup` command MUST use that source repository's Outfitter `settings.yml` and profiles as the initial user setup starting point.
17
+ 7. When provided a setup source URI, the `setup` command MUST use that source repository's Outfitter `settings.yml` and profiles as the initial setup starting point for the selected import target.
18
18
  8. The interactive `setup` command MUST require interactive TTY streams on both stdin and stdout before prompting.
19
19
  9. The interactive `setup` command MUST synchronize remote profile sources before any setup profile choice prompt.
20
20
  10. Initial interactive first-run setup MUST NOT ask a separate default-profile choice before welcome onboarding; the welcome role selection determines the generated local default profile.
21
21
  11. When the interactive `setup` command presents setup profile choices outside the initial welcome handoff, it MUST present discovered profile IDs as default-profile choices and preserve available display labels in the prompt choices.
22
22
  12. When the interactive `setup` command presents setup profile choices outside the initial welcome handoff, it MUST validate the selected default profile ID before writing it to `settings.yml`.
23
23
  13. After the interactive `setup` command writes a selected default profile, any newly-created fallback default profile file MUST correspond to the final selected default profile.
24
+ 14. When interactive `setup <source>` presents setup profile choices, it MUST limit those choices to profiles from the passed setup source and MUST NOT include default profile sources from pre-existing effective settings.
25
+ 15. When interactive `setup <source>` presents setup profile choices and the setup source declares an explicit `default_profile` that exists among those source choices, it MUST make that profile the prompt default and first displayed choice; pre-existing user defaults MUST NOT override that source default for the setup-source prompt.
26
+ 16. Interactive `setup <source>` MUST NOT present a default-profile choice before the setup-source welcome/import explanation.
27
+ 17. Interactive `setup <source>` MUST explain which setup source is being imported and MUST let the user choose whether to install profiles into user home or the current project before writing setup-source profiles/settings.
28
+ 18. Interactive `setup <source>` MUST present exactly one setup-source profile/default choice after the import target choice when setup-source profiles are available.
29
+ 19. When the interactive setup-source import target is user home, setup MUST copy missing source profiles into `~/.outfitter/profiles`, write the selected default profile to `~/.outfitter/settings.yml`, and preserve non-overwrite copy behavior.
30
+ 20. When the interactive setup-source import target is the current project, setup MUST copy missing source profiles into `<project>/.outfitter/profiles`, write the selected default profile to `<project>/.outfitter/settings.yml`, ensure that project settings expose `./profiles`, and preserve any existing user default profile.
31
+ 21. After interactive `setup <source>` imports the selected default profile, setup MUST offer to start Outfitter with that selected profile.
32
+ 22. When the user declines the post-import start offer, setup MUST exit without launching and show both `outfitter` for starting the configured default profile and `outfitter --profile <selected-profile>` for starting it explicitly.
33
+ 23. Non-interactive `setup <source>` completion MUST NOT launch Outfitter and MUST show the same default and explicit start command guidance.
24
34
 
25
35
  ### OFTR-004.2: Sync Command
26
36
 
@@ -37,6 +37,8 @@ Pi is the default and primary supported adapter; Claude Code is also supported t
37
37
  9. The pi adapter SHOULD support pi model, provider, and thinking controls where native pi flags exist.
38
38
  10. The pi adapter MUST merge `.mcp.json` files from contributing `cli_specific/pi/` profile folders into the composite profile, adding unique array entries by identity while keeping the last entry for duplicate identities.
39
39
  11. The pi adapter MUST make native Pi `models.json` available inside the composite profile so custom providers and model definitions are visible before Pi resolves `--provider` and `--model` flags.
40
+ 12. The pi adapter MUST expose valid Agent Skills from contributing profile `skills/` folders as `--skill` arguments, and MAY also expose Pi-specific skills from `cli_specific/pi/skills/`.
41
+ 13. The pi adapter MUST expose DeepWork jobs from contributing profile `deepwork/jobs/` folders through `DEEPWORK_ADDITIONAL_JOBS_FOLDERS`, and MAY also expose Pi-specific jobs from `cli_specific/pi/deepwork/jobs/`.
40
42
 
41
43
  ### OFTR-006.4: Pi Startup Boundary
42
44