@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
|
@@ -12,14 +12,32 @@ const mergeObjectValue = (lowerPrecedence, higherPrecedence, path, options) => (
|
|
|
12
12
|
])),
|
|
13
13
|
});
|
|
14
14
|
const mergeMemberValue = (lowerPrecedence, higherPrecedence, path, options) => {
|
|
15
|
-
|
|
16
|
-
|
|
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,
|
|
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?:
|
|
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":"
|
|
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:
|
|
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:
|
|
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":"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
|
|
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
|
-
|
|
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
|
|
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":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,kCAAkC,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;
|
|
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": { "
|
|
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
|
}
|
package/doc/architecture.md
CHANGED
|
@@ -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
|
-
- `
|
|
400
|
-
-
|
|
401
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/doc/file_structure.md
CHANGED
|
@@ -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
|
+
"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
|
|
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 `
|
|
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:
|
|
41
|
+
### OFTR-003.5: Default Profile Selection
|
|
41
42
|
|
|
42
|
-
1.
|
|
43
|
-
2.
|
|
44
|
-
3. Outfitter MUST
|
|
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
|
|
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
|
|