@ai-outfitter/outfitter 0.4.0 → 0.7.0
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/LICENSE.md +20 -50
- package/README.md +36 -247
- package/code/enterprise/LICENSE +35 -0
- package/code/enterprise/README.md +5 -0
- package/dist/agents/AdapterProfileControls.d.ts +2 -2
- package/dist/agents/AdapterProfileControls.js +8 -1
- package/dist/agents/AdapterProfileControls.js.map +1 -1
- package/dist/agents/AgentAdapter.d.ts +10 -0
- package/dist/agents/AgentLaunch.d.ts +6 -0
- package/dist/agents/AgentLaunch.js +89 -0
- package/dist/agents/AgentLaunch.js.map +1 -0
- package/dist/agents/claude/ClaudeAdapter.js +18 -3
- package/dist/agents/claude/ClaudeAdapter.js.map +1 -1
- package/dist/agents/pi/PiAdapter.js +159 -15
- package/dist/agents/pi/PiAdapter.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.d.ts +8 -2
- package/dist/cli/commands/PiLoginLaunch.js +739 -30
- package/dist/cli/commands/PiLoginLaunch.js.map +1 -1
- package/dist/cli/commands/RunCommand.d.ts +20 -3
- package/dist/cli/commands/RunCommand.js +102 -20
- package/dist/cli/commands/RunCommand.js.map +1 -1
- package/dist/cli/commands/SetupCommand.d.ts +12 -2
- package/dist/cli/commands/SetupCommand.js +267 -70
- package/dist/cli/commands/SetupCommand.js.map +1 -1
- package/dist/cli/commands/SyncCommand.d.ts +8 -1
- package/dist/cli/commands/SyncCommand.js +2 -1
- package/dist/cli/commands/SyncCommand.js.map +1 -1
- package/dist/cli/commands/WelcomeCommand.d.ts +2 -1
- package/dist/cli/commands/WelcomeCommand.js +77 -70
- package/dist/cli/commands/WelcomeCommand.js.map +1 -1
- package/dist/cli/commands/assets/outfitter-ascii.txt +5 -0
- package/dist/cli/commands/profile/Command.d.ts +1 -0
- package/dist/cli/commands/profile/Command.js +3 -0
- package/dist/cli/commands/profile/Command.js.map +1 -1
- package/dist/cli/commands/profile/LintCommand.d.ts +19 -0
- package/dist/cli/commands/profile/LintCommand.js +123 -0
- package/dist/cli/commands/profile/LintCommand.js.map +1 -0
- package/dist/cli.js +8 -2
- package/dist/cli.js.map +1 -1
- package/dist/compositeProfile/StatePersistence.js +3 -0
- package/dist/compositeProfile/StatePersistence.js.map +1 -1
- package/dist/merge/ArrayMergePolicy.js.map +1 -1
- package/dist/merge/SettingsValueMerger.js.map +1 -1
- package/dist/profiles/Profile.d.ts +14 -1
- package/dist/profiles/Profile.js.map +1 -1
- package/dist/profiles/ProfileLoader.d.ts +4 -0
- package/dist/profiles/ProfileLoader.js +118 -17
- package/dist/profiles/ProfileLoader.js.map +1 -1
- package/dist/profiles/ProfileMerger.js +3 -0
- package/dist/profiles/ProfileMerger.js.map +1 -1
- package/dist/profiles/PromptIncludes.d.ts +32 -0
- package/dist/profiles/PromptIncludes.js +147 -0
- package/dist/profiles/PromptIncludes.js.map +1 -0
- package/dist/prompts/SystemPromptExport.d.ts +16 -0
- package/dist/prompts/SystemPromptExport.js +81 -0
- package/dist/prompts/SystemPromptExport.js.map +1 -0
- package/dist/schemas/profile.schema.json +38 -2
- package/dist/schemas/settings.schema.json +12 -0
- package/dist/settings/Settings.d.ts +5 -0
- package/dist/settings/Settings.js.map +1 -1
- package/dist/settings/SettingsLoader.js +3 -0
- package/dist/settings/SettingsLoader.js.map +1 -1
- package/dist/settings/SettingsMerger.js +8 -0
- package/dist/settings/SettingsMerger.js.map +1 -1
- package/package.json +23 -11
- package/skills/outfitter/SKILL.md +68 -0
- package/src/schemas/profile.schema.json +38 -2
- package/src/schemas/settings.schema.json +12 -0
- package/doc/.deepreview +0 -30
- package/doc/architecture.md +0 -855
- package/doc/controllable-elements.md +0 -162
- package/doc/file_structure.md +0 -133
- package/doc/integration_test_system.md +0 -214
- package/doc/specs/validating_requirements_with_rules.md +0 -55
- package/doc/state_writeback_strategy.md +0 -334
- package/requirements/OFTR-001-project-foundation.md +0 -53
- package/requirements/OFTR-002-settings.md +0 -65
- package/requirements/OFTR-003-profiles.md +0 -59
- package/requirements/OFTR-004-sync-and-setup.md +0 -67
- package/requirements/OFTR-005-run-and-composite-profile.md +0 -60
- package/requirements/OFTR-006-agent-adapters.md +0 -66
- package/requirements/OFTR-007-controllable-elements.md +0 -32
- package/requirements/OFTR-008-requirements-governance.md +0 -42
- package/requirements/OFTR-009-release-publishing.md +0 -34
- package/requirements/OFTR-010-onboarding-welcome.md +0 -39
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// Resolves typed append-system-prompt file includes against declaring profile source roots.
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { basename, dirname, isAbsolute, join, normalize, resolve } from 'node:path';
|
|
5
|
+
export const isPromptFileInclude = (value) => value !== null &&
|
|
6
|
+
typeof value === 'object' &&
|
|
7
|
+
!Array.isArray(value) &&
|
|
8
|
+
Object.keys(value).length === 1 &&
|
|
9
|
+
typeof value.file === 'string';
|
|
10
|
+
export const isPromptRepoFileInclude = (value) => value !== null &&
|
|
11
|
+
typeof value === 'object' &&
|
|
12
|
+
!Array.isArray(value) &&
|
|
13
|
+
Object.keys(value).length === 1 &&
|
|
14
|
+
typeof value.repo_file === 'string';
|
|
15
|
+
export const normalizeAppendSystemPromptEntries = (value) => {
|
|
16
|
+
if (value === undefined) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return typeof value === 'string' || isPromptFileInclude(value) || isPromptRepoFileInclude(value) ? [value] : value;
|
|
20
|
+
};
|
|
21
|
+
export const inferProfileIncludeSourceRoot = (input) => {
|
|
22
|
+
const conventionalRoot = findConventionalOutfitterRoot(input.profilePath);
|
|
23
|
+
return conventionalRoot ?? input.sourceRootPath;
|
|
24
|
+
};
|
|
25
|
+
export const resolveAppendSystemPromptControl = (input) => {
|
|
26
|
+
const layeredEntries = collectLayeredPromptEntries(input.profileLayers ?? [], input.agentKey);
|
|
27
|
+
if (layeredEntries.length === 0) {
|
|
28
|
+
return resolvePromptEntries({
|
|
29
|
+
entries: normalizeAppendSystemPromptEntries(input.fallback) ?? [],
|
|
30
|
+
projectDirectory: input.projectDirectory,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const diagnostics = [];
|
|
34
|
+
const prompts = [];
|
|
35
|
+
for (const entry of layeredEntries) {
|
|
36
|
+
const resolved = resolvePromptEntries({
|
|
37
|
+
entries: [entry.value],
|
|
38
|
+
layer: entry.layer,
|
|
39
|
+
projectDirectory: input.projectDirectory,
|
|
40
|
+
});
|
|
41
|
+
diagnostics.push(...resolved.diagnostics);
|
|
42
|
+
prompts.push(...resolved.prompts);
|
|
43
|
+
}
|
|
44
|
+
return { prompts, diagnostics };
|
|
45
|
+
};
|
|
46
|
+
export const createPromptIncludeDiagnostics = (profileLayers, projectDirectory) => profileLayers.flatMap((layer) => {
|
|
47
|
+
const launchLayer = toLaunchLayer(layer);
|
|
48
|
+
return [
|
|
49
|
+
...resolvePromptEntries({
|
|
50
|
+
entries: readPromptEntries(layer.profile.controls.appendSystemPrompt),
|
|
51
|
+
layer: launchLayer,
|
|
52
|
+
projectDirectory,
|
|
53
|
+
}).diagnostics,
|
|
54
|
+
...resolvePromptEntries({
|
|
55
|
+
entries: readPromptEntries(layer.profile.controls.pi?.appendSystemPrompt),
|
|
56
|
+
layer: launchLayer,
|
|
57
|
+
projectDirectory,
|
|
58
|
+
}).diagnostics,
|
|
59
|
+
...resolvePromptEntries({
|
|
60
|
+
entries: readPromptEntries(layer.profile.controls.claude?.appendSystemPrompt),
|
|
61
|
+
layer: launchLayer,
|
|
62
|
+
projectDirectory,
|
|
63
|
+
}).diagnostics,
|
|
64
|
+
];
|
|
65
|
+
});
|
|
66
|
+
const collectLayeredPromptEntries = (profileLayers, agentKey) => [...profileLayers]
|
|
67
|
+
.reverse()
|
|
68
|
+
.flatMap((layer) => readPromptEntries(selectLayerAppendPrompt(layer, agentKey)).map((value) => ({ layer, value })));
|
|
69
|
+
const selectLayerAppendPrompt = (layer, agentKey) => {
|
|
70
|
+
const agentPrompt = agentKey === undefined ? undefined : layer.profile.controls[agentKey]?.appendSystemPrompt;
|
|
71
|
+
return agentPrompt ?? layer.profile.controls.appendSystemPrompt;
|
|
72
|
+
};
|
|
73
|
+
const resolvePromptEntries = (input) => {
|
|
74
|
+
const diagnostics = [];
|
|
75
|
+
const prompts = [];
|
|
76
|
+
for (const [index, entry] of input.entries.entries()) {
|
|
77
|
+
if (isPromptFileInclude(entry) || isPromptRepoFileInclude(entry)) {
|
|
78
|
+
const declaredFile = isPromptFileInclude(entry) ? entry.file : entry.repo_file;
|
|
79
|
+
const resolvedFile = isPromptFileInclude(entry)
|
|
80
|
+
? resolvePromptIncludePath(input.layer, declaredFile)
|
|
81
|
+
: resolveRepoPromptIncludePath(input.projectDirectory, declaredFile);
|
|
82
|
+
const includeType = isPromptFileInclude(entry) ? 'file' : 'repo_file';
|
|
83
|
+
if (resolvedFile === undefined || !existsSync(resolvedFile)) {
|
|
84
|
+
diagnostics.push(createDiagnostic(input.layer, index, `Prompt ${includeType} include '${declaredFile}' was not found.`));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
prompts.push(readFileSync(resolvedFile, 'utf8'));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
if (looksLikePromptFilePath(entry)) {
|
|
92
|
+
diagnostics.push(createDiagnostic(input.layer, index, `Raw append_system_prompt entry looks like a file path; use { file: '${entry}' }.`));
|
|
93
|
+
}
|
|
94
|
+
prompts.push(entry);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return { prompts, diagnostics };
|
|
98
|
+
};
|
|
99
|
+
const readPromptEntries = (value) => normalizeAppendSystemPromptEntries(value) ?? [];
|
|
100
|
+
const resolvePromptIncludePath = (layer, filePath) => {
|
|
101
|
+
if (isAbsolute(filePath)) {
|
|
102
|
+
return normalize(filePath);
|
|
103
|
+
}
|
|
104
|
+
const sourceRoot = layer?.sourceRootPath === undefined ? undefined : inferProfileIncludeSourceRoot(layer);
|
|
105
|
+
return sourceRoot === undefined ? undefined : resolve(sourceRoot, filePath);
|
|
106
|
+
};
|
|
107
|
+
const resolveRepoPromptIncludePath = (projectDirectory, filePath) => {
|
|
108
|
+
if (isAbsolute(filePath)) {
|
|
109
|
+
return normalize(filePath);
|
|
110
|
+
}
|
|
111
|
+
return projectDirectory === undefined ? undefined : resolve(projectDirectory, filePath);
|
|
112
|
+
};
|
|
113
|
+
const createDiagnostic = (layer, index, message) => ({
|
|
114
|
+
severity: 'warning',
|
|
115
|
+
profileId: layer?.profile.id ?? '<merged>',
|
|
116
|
+
path: `${layer?.profilePath ?? '<profile>'}#/controls/append_system_prompt/${index}`,
|
|
117
|
+
message,
|
|
118
|
+
});
|
|
119
|
+
export const looksLikePromptFilePath = (value) => {
|
|
120
|
+
const trimmed = value.trim();
|
|
121
|
+
if (trimmed.includes('\n') || trimmed.includes(' ')) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
return /^(\.?\.?\/|~\/).+/u.test(trimmed) || /.+\/.+\.(md|markdown|txt|prompt)$/iu.test(trimmed);
|
|
125
|
+
};
|
|
126
|
+
const findConventionalOutfitterRoot = (profilePath) => {
|
|
127
|
+
let current = dirname(profilePath);
|
|
128
|
+
while (current !== dirname(current)) {
|
|
129
|
+
const name = basename(current);
|
|
130
|
+
if (name === '.outfitter') {
|
|
131
|
+
return normalize(current) === normalize(join(homedir(), '.outfitter')) ? current : dirname(current);
|
|
132
|
+
}
|
|
133
|
+
if (name === 'outfitter') {
|
|
134
|
+
return dirname(current);
|
|
135
|
+
}
|
|
136
|
+
current = dirname(current);
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
};
|
|
140
|
+
const toLaunchLayer = (loadedProfile) => ({
|
|
141
|
+
profile: loadedProfile.profile,
|
|
142
|
+
profilePath: loadedProfile.profilePath,
|
|
143
|
+
sourceRootPath: loadedProfile.sourceRootPath,
|
|
144
|
+
resourceRootPath: loadedProfile.resourceRootPath,
|
|
145
|
+
layout: loadedProfile.layout,
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=PromptIncludes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PromptIncludes.js","sourceRoot":"","sources":["../../src/profiles/PromptIncludes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Profile } from '../profiles/Profile.js';
|
|
2
|
+
import type { LoadedProfile } from '../profiles/ProfileLoader.js';
|
|
3
|
+
import type { Settings } from '../settings/Settings.js';
|
|
4
|
+
export interface SystemPromptExportInput {
|
|
5
|
+
readonly profile: Profile;
|
|
6
|
+
readonly settings: Settings;
|
|
7
|
+
readonly profileLayers: readonly LoadedProfile[];
|
|
8
|
+
readonly cacheDirectory: string;
|
|
9
|
+
readonly warn: (message: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface SystemPromptExportResult {
|
|
12
|
+
readonly outputPath?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const exportSystemPromptIfEnabled: (input: SystemPromptExportInput) => SystemPromptExportResult;
|
|
15
|
+
export declare const isSystemPromptExportEnabled: (profile: Profile, settings: Settings) => boolean;
|
|
16
|
+
export declare const renderGeneratedSystemPrompt: (profile: Profile) => string;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Prepares opt-in generated Pi system prompt snapshots next to the selected profile.
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { mergeAgentSpecificControls } from '../agents/AdapterProfileControls.js';
|
|
5
|
+
import { normalizeAppendSystemPromptEntries } from '../profiles/PromptIncludes.js';
|
|
6
|
+
/* v8 ignore start -- rare skip/error branches are defensive around external profile ownership; main export behavior is unit covered. */
|
|
7
|
+
export const exportSystemPromptIfEnabled = (input) => {
|
|
8
|
+
if (!isSystemPromptExportEnabled(input.profile, input.settings)) {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
const owner = findSelectedProfileOwner(input.profile, input.profileLayers);
|
|
12
|
+
if (owner === undefined) {
|
|
13
|
+
input.warn(`System prompt export skipped for profile '${input.profile.id}' because no source profile was found.`);
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
if (isCacheBackedProfile(owner, input.cacheDirectory)) {
|
|
17
|
+
input.warn(`System prompt export skipped for profile '${input.profile.id}' because its source is cache-backed. ` +
|
|
18
|
+
'Copy or symlink the profile into a local profile source to export generated prompts.');
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
const outputPath = resolveSystemPromptExportPath(input.profile, owner);
|
|
22
|
+
mkdirSync(dirname(outputPath), { recursive: true });
|
|
23
|
+
writeFileSync(outputPath, renderGeneratedSystemPrompt(input.profile));
|
|
24
|
+
return { outputPath };
|
|
25
|
+
};
|
|
26
|
+
/* v8 ignore stop */
|
|
27
|
+
/* v8 ignore next -- fallback precedence is schema-level behavior; enabled/disabled outcomes are covered. */
|
|
28
|
+
export const isSystemPromptExportEnabled = (profile, settings) => profile.profileExport ?? settings.profileExport ?? false;
|
|
29
|
+
export const renderGeneratedSystemPrompt = (profile) => {
|
|
30
|
+
const controls = mergeAgentSpecificControls(profile.controls, 'pi');
|
|
31
|
+
const appendPrompts = normalizeAppendSystemPrompt(controls.appendSystemPrompt);
|
|
32
|
+
return [
|
|
33
|
+
'<!-- Generated by Outfitter before Pi runtime capture. The Pi launch extension overwrites this with ctx.getSystemPrompt(). -->',
|
|
34
|
+
'# Generated Pi prompt fallback',
|
|
35
|
+
'',
|
|
36
|
+
`Profile: ${profile.id}`,
|
|
37
|
+
'Prompt source: Pi launch controls',
|
|
38
|
+
'',
|
|
39
|
+
'## system_prompt',
|
|
40
|
+
'',
|
|
41
|
+
controls.systemPrompt ?? '(none)',
|
|
42
|
+
'',
|
|
43
|
+
...appendPrompts.flatMap((prompt, index) => [`## append_system_prompt[${index}]`, '', prompt, '']),
|
|
44
|
+
...(appendPrompts.length === 0 ? ['## append_system_prompt', '', '(none)', ''] : []),
|
|
45
|
+
].join('\n');
|
|
46
|
+
};
|
|
47
|
+
const normalizeAppendSystemPrompt = (value) => {
|
|
48
|
+
if (value === undefined) {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
return (normalizeAppendSystemPromptEntries(value) ?? []).filter((entry) => typeof entry === 'string');
|
|
52
|
+
};
|
|
53
|
+
const findSelectedProfileOwner = (profile, profileLayers) => profileLayers.filter((layer) => layer.profile.id === profile.id).at(-1);
|
|
54
|
+
const resolveSystemPromptExportPath = (profile, owner) => {
|
|
55
|
+
const root = owner.resourceRootPath ?? dirname(owner.profilePath);
|
|
56
|
+
const outputPath = owner.layout === 'flat-file'
|
|
57
|
+
? join(root, `${profile.id}.generated-system-prompt.md`)
|
|
58
|
+
: join(root, 'generated-system-prompt.md');
|
|
59
|
+
return assertInsideRoot(root, outputPath);
|
|
60
|
+
};
|
|
61
|
+
/* v8 ignore start -- path escape protection is defensive; normal generated output path behavior is unit covered. */
|
|
62
|
+
const assertInsideRoot = (root, path) => {
|
|
63
|
+
const resolvedRoot = resolve(root);
|
|
64
|
+
const resolvedPath = resolve(path);
|
|
65
|
+
const relativePath = relative(resolvedRoot, resolvedPath);
|
|
66
|
+
if (relativePath === '' || !isRelativePathInsideRoot(relativePath)) {
|
|
67
|
+
throw new Error(`System prompt export path '${resolvedPath}' must stay inside profile root '${resolvedRoot}'.`);
|
|
68
|
+
}
|
|
69
|
+
return resolvedPath;
|
|
70
|
+
};
|
|
71
|
+
const isRelativePathInsideRoot = (relativePath) => relativePath !== '..' && !relativePath.startsWith(`..${sep}`) && !isAbsolute(relativePath);
|
|
72
|
+
/* v8 ignore stop */
|
|
73
|
+
const isCacheBackedProfile = (owner, cacheDirectory) => {
|
|
74
|
+
/* v8 ignore next -- remote-source ownership is a defensive skip path for generated prompt export. */
|
|
75
|
+
if (owner.source.uri !== undefined || owner.source.github !== undefined) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
const relativePath = relative(resolve(cacheDirectory), resolve(owner.profilePath));
|
|
79
|
+
return relativePath !== '' && isRelativePathInsideRoot(relativePath);
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=SystemPromptExport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemPromptExport.js","sourceRoot":"","sources":["../../src/prompts/SystemPromptExport.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@
|
|
|
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" },
|
|
12
13
|
"template": { "type": "boolean" },
|
|
13
14
|
"inherits": {
|
|
14
15
|
"type": "array",
|
|
@@ -17,6 +18,7 @@
|
|
|
17
18
|
"pattern": "^[a-z0-9][a-z0-9._-]*[a-z0-9]$|^[a-z0-9]$"
|
|
18
19
|
}
|
|
19
20
|
},
|
|
21
|
+
"profile_export": { "type": "boolean" },
|
|
20
22
|
"state_persistence": {
|
|
21
23
|
"type": "object",
|
|
22
24
|
"additionalProperties": {
|
|
@@ -49,6 +51,19 @@
|
|
|
49
51
|
"type": "object",
|
|
50
52
|
"additionalProperties": { "type": "string" }
|
|
51
53
|
},
|
|
54
|
+
"deepwork": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"properties": {
|
|
57
|
+
"jobs": {
|
|
58
|
+
"type": "array",
|
|
59
|
+
"items": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"pattern": "^[a-z][a-z0-9_]*$"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"additionalProperties": true
|
|
66
|
+
},
|
|
52
67
|
"pi": {
|
|
53
68
|
"type": "object",
|
|
54
69
|
"properties": {
|
|
@@ -114,12 +129,33 @@
|
|
|
114
129
|
},
|
|
115
130
|
"additionalProperties": true,
|
|
116
131
|
"$defs": {
|
|
117
|
-
"
|
|
132
|
+
"appendSystemPromptEntry": {
|
|
118
133
|
"oneOf": [
|
|
119
134
|
{ "type": "string" },
|
|
135
|
+
{
|
|
136
|
+
"type": "object",
|
|
137
|
+
"required": ["file"],
|
|
138
|
+
"properties": {
|
|
139
|
+
"file": { "type": "string" }
|
|
140
|
+
},
|
|
141
|
+
"additionalProperties": false
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"type": "object",
|
|
145
|
+
"required": ["repo_file"],
|
|
146
|
+
"properties": {
|
|
147
|
+
"repo_file": { "type": "string" }
|
|
148
|
+
},
|
|
149
|
+
"additionalProperties": false
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
},
|
|
153
|
+
"appendSystemPrompt": {
|
|
154
|
+
"oneOf": [
|
|
155
|
+
{ "$ref": "#/$defs/appendSystemPromptEntry" },
|
|
120
156
|
{
|
|
121
157
|
"type": "array",
|
|
122
|
-
"items": { "
|
|
158
|
+
"items": { "$ref": "#/$defs/appendSystemPromptEntry" }
|
|
123
159
|
}
|
|
124
160
|
]
|
|
125
161
|
}
|
|
@@ -7,6 +7,18 @@
|
|
|
7
7
|
"default_profile": { "type": "string", "minLength": 1 },
|
|
8
8
|
"default_agent": { "enum": ["pi", "claude"] },
|
|
9
9
|
"cache_directory": { "type": "string", "minLength": 1 },
|
|
10
|
+
"profile_export": { "type": "boolean" },
|
|
11
|
+
"startup": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"description": "Controls Outfitter startup presentation inside launched agents.",
|
|
14
|
+
"properties": {
|
|
15
|
+
"ascii_art": {
|
|
16
|
+
"type": "boolean",
|
|
17
|
+
"description": "Show the Outfitter ASCII/brand header on Pi startup. Defaults to true."
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"additionalProperties": false
|
|
21
|
+
},
|
|
10
22
|
"profile_sources": {
|
|
11
23
|
"type": "array",
|
|
12
24
|
"items": { "$ref": "profile-source.schema.json" }
|
|
@@ -6,6 +6,9 @@ export type SettingsValue = string | number | boolean | null | readonly Settings
|
|
|
6
6
|
readonly [key: string]: SettingsValue;
|
|
7
7
|
};
|
|
8
8
|
export type CustomSettings = Readonly<Record<string, SettingsValue>>;
|
|
9
|
+
export interface StartupSettings {
|
|
10
|
+
readonly asciiArt?: boolean;
|
|
11
|
+
}
|
|
9
12
|
export interface Settings {
|
|
10
13
|
readonly defaultProfile?: string;
|
|
11
14
|
readonly defaultAgent?: string;
|
|
@@ -13,5 +16,7 @@ export interface Settings {
|
|
|
13
16
|
readonly remoteSettings?: readonly RemoteSettingsReference[];
|
|
14
17
|
readonly cacheDirectory?: string;
|
|
15
18
|
readonly customSettings?: CustomSettings;
|
|
19
|
+
readonly profileExport?: boolean;
|
|
20
|
+
readonly startup?: StartupSettings;
|
|
16
21
|
}
|
|
17
22
|
export declare const emptySettings: () => Settings;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/settings/Settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/settings/Settings.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,aAAa,GAAG,GAAa,EAAE,CAAC,CAAC;IAC5C,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE,EAAE;CACnB,CAAC,CAAC"}
|
|
@@ -99,7 +99,10 @@ const convertSettingsDocument = (document, settingsDirectory) => ({
|
|
|
99
99
|
? undefined
|
|
100
100
|
: resolveConfigDirectory(document.cache_directory, settingsDirectory),
|
|
101
101
|
customSettings: document.custom_settings,
|
|
102
|
+
profileExport: document.profile_export,
|
|
103
|
+
startup: convertStartupSettings(document.startup),
|
|
102
104
|
});
|
|
105
|
+
const convertStartupSettings = (startup) => startup === undefined ? undefined : { asciiArt: startup.ascii_art };
|
|
103
106
|
const convertRemoteSettingsSource = (source) => {
|
|
104
107
|
if (source.uri !== undefined) {
|
|
105
108
|
return { uri: source.uri, ref: source.ref, path: source.path };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsLoader.js","sourceRoot":"","sources":["../../src/settings/SettingsLoader.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/D,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAG9G,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"SettingsLoader.js","sourceRoot":"","sources":["../../src/settings/SettingsLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable complexity */
|
|
1
2
|
// Provides deterministic Settings merge scaffolding.
|
|
2
3
|
import { mergeObjectsWithPolicy } from '../merge/SettingsValueMerger.js';
|
|
3
4
|
import { emptySettings } from './Settings.js';
|
|
@@ -8,6 +9,8 @@ export const mergeSettingsStack = (settingsStack) => {
|
|
|
8
9
|
let remoteSettings;
|
|
9
10
|
let cacheDirectory;
|
|
10
11
|
let customSettings;
|
|
12
|
+
let profileExport;
|
|
13
|
+
let startup;
|
|
11
14
|
for (const settings of settingsStack) {
|
|
12
15
|
defaultProfile = settings.defaultProfile ?? defaultProfile;
|
|
13
16
|
defaultAgent = settings.defaultAgent ?? defaultAgent;
|
|
@@ -15,6 +18,8 @@ export const mergeSettingsStack = (settingsStack) => {
|
|
|
15
18
|
remoteSettings = settings.remoteSettings ?? remoteSettings;
|
|
16
19
|
cacheDirectory = settings.cacheDirectory ?? cacheDirectory;
|
|
17
20
|
customSettings = mergeOptionalCustomSettings(customSettings, settings.customSettings);
|
|
21
|
+
profileExport = mergeOptionalBoolean(profileExport, settings.profileExport);
|
|
22
|
+
startup = settings.startup === undefined ? startup : { ...startup, ...settings.startup };
|
|
18
23
|
}
|
|
19
24
|
return {
|
|
20
25
|
...emptySettings(),
|
|
@@ -24,8 +29,11 @@ export const mergeSettingsStack = (settingsStack) => {
|
|
|
24
29
|
remoteSettings: remoteSettings ?? [],
|
|
25
30
|
cacheDirectory,
|
|
26
31
|
customSettings: customSettings ?? {},
|
|
32
|
+
profileExport,
|
|
33
|
+
startup: startup ?? {},
|
|
27
34
|
};
|
|
28
35
|
};
|
|
36
|
+
const mergeOptionalBoolean = (lowerPrecedence, higherPrecedence) => higherPrecedence ?? lowerPrecedence;
|
|
29
37
|
const mergeOptionalCustomSettings = (lowerPrecedence, higherPrecedence) => higherPrecedence === undefined ? lowerPrecedence : mergeCustomSettings(lowerPrecedence, higherPrecedence);
|
|
30
38
|
const mergeCustomSettings = (lowerPrecedence, higherPrecedence) => mergeObjectsWithPolicy(lowerPrecedence, higherPrecedence);
|
|
31
39
|
//# sourceMappingURL=SettingsMerger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsMerger.js","sourceRoot":"","sources":["../../src/settings/SettingsMerger.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,aAAkC,EAAY,EAAE;IACjF,IAAI,cAAkC,CAAC;IACvC,IAAI,YAAgC,CAAC;IACrC,IAAI,cAA0C,CAAC;IAC/C,IAAI,cAA0C,CAAC;IAC/C,IAAI,cAAkC,CAAC;IACvC,IAAI,cAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"SettingsMerger.js","sourceRoot":"","sources":["../../src/settings/SettingsMerger.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,qDAAqD;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,aAAkC,EAAY,EAAE;IACjF,IAAI,cAAkC,CAAC;IACvC,IAAI,YAAgC,CAAC;IACrC,IAAI,cAA0C,CAAC;IAC/C,IAAI,cAA0C,CAAC;IAC/C,IAAI,cAAkC,CAAC;IACvC,IAAI,cAA0C,CAAC;IAC/C,IAAI,aAAkC,CAAC;IACvC,IAAI,OAA4B,CAAC;IAEjC,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,cAAc,CAAC;QAC3D,YAAY,GAAG,QAAQ,CAAC,YAAY,IAAI,YAAY,CAAC;QAErD,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,cAAc,CAAC;QAC3D,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,cAAc,CAAC;QAC3D,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,cAAc,CAAC;QAC3D,cAAc,GAAG,2BAA2B,CAAC,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;QACtF,aAAa,GAAG,oBAAoB,CAAC,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC5E,OAAO,GAAG,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3F,CAAC;IAED,OAAO;QACL,GAAG,aAAa,EAAE;QAClB,cAAc;QACd,YAAY;QACZ,cAAc,EAAE,cAAc,IAAI,EAAE;QACpC,cAAc,EAAE,cAAc,IAAI,EAAE;QACpC,cAAc;QACd,cAAc,EAAE,cAAc,IAAI,EAAE;QACpC,aAAa;QACb,OAAO,EAAE,OAAO,IAAI,EAAE;KACvB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,eAAoC,EACpC,gBAAqC,EAChB,EAAE,CAAC,gBAAgB,IAAI,eAAe,CAAC;AAE9D,MAAM,2BAA2B,GAAG,CAClC,eAA2C,EAC3C,gBAA4C,EAChB,EAAE,CAC9B,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAE5G,MAAM,mBAAmB,GAAG,CAC1B,eAA2C,EAC3C,gBAAgC,EAChB,EAAE,CAAC,sBAAsB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,36 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-outfitter/outfitter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
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",
|
|
23
|
+
"code/enterprise/LICENSE",
|
|
24
|
+
"code/enterprise/README.md",
|
|
14
25
|
"README.md",
|
|
15
26
|
"LICENSE.md"
|
|
16
27
|
],
|
|
17
28
|
"scripts": {
|
|
18
|
-
"build": "tsc -p tsconfig.build.json && shx rm -rf dist/schemas && shx mkdir -p dist/schemas && shx cp src/schemas/*.json dist/schemas/ && shx chmod +x dist/cli.js",
|
|
29
|
+
"build": "tsc -p tsconfig.build.json && shx rm -rf dist/schemas && shx mkdir -p dist/schemas && shx cp src/schemas/*.json dist/schemas/ && shx mkdir -p dist/cli/commands/assets && shx cp src/cli/commands/assets/*.txt dist/cli/commands/assets/ && shx chmod +x dist/cli.js",
|
|
19
30
|
"prepare": "npm run build",
|
|
31
|
+
"prepack": "node scripts/sync-package-assets.mjs",
|
|
20
32
|
"dev_install": "node scripts/dev-install.mjs",
|
|
21
|
-
"docs:dev": "npm --prefix doc_site run dev --",
|
|
22
|
-
"docs:build": "npm --prefix doc_site run build",
|
|
23
|
-
"docs:start": "npm --prefix doc_site run start --",
|
|
24
|
-
"docs:lint": "eslint doc_site --config doc_site/eslint.config.js",
|
|
25
|
-
"docs:ci": "npm --prefix doc_site ci && npm run docs:lint && npm run docs:build",
|
|
26
33
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
27
34
|
"lint": "eslint .",
|
|
28
35
|
"lint:fix": "eslint . --fix",
|
|
29
36
|
"test": "vitest --run",
|
|
30
37
|
"coverage": "vitest --run --coverage",
|
|
31
|
-
"
|
|
32
|
-
"check": "
|
|
33
|
-
"check-ci": "prettier --check . && npm run lint && npm run coverage && npm run docs:ci"
|
|
38
|
+
"check": "npm run lint:fix && npm run coverage",
|
|
39
|
+
"check-ci": "prettier --check . && npm run lint && npm run coverage"
|
|
34
40
|
},
|
|
35
41
|
"dependencies": {
|
|
36
42
|
"@earendil-works/pi-coding-agent": "^0.78.1",
|
|
@@ -63,10 +69,16 @@
|
|
|
63
69
|
"keywords": [
|
|
64
70
|
"agent",
|
|
65
71
|
"cli",
|
|
72
|
+
"pi-package",
|
|
66
73
|
"pi",
|
|
67
74
|
"profiles"
|
|
68
75
|
],
|
|
69
|
-
"
|
|
76
|
+
"pi": {
|
|
77
|
+
"skills": [
|
|
78
|
+
"./skills"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
70
82
|
"publishConfig": {
|
|
71
83
|
"access": "public"
|
|
72
84
|
}
|
|
@@ -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.
|