@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.
Files changed (87) hide show
  1. package/LICENSE.md +20 -50
  2. package/README.md +36 -247
  3. package/code/enterprise/LICENSE +35 -0
  4. package/code/enterprise/README.md +5 -0
  5. package/dist/agents/AdapterProfileControls.d.ts +2 -2
  6. package/dist/agents/AdapterProfileControls.js +8 -1
  7. package/dist/agents/AdapterProfileControls.js.map +1 -1
  8. package/dist/agents/AgentAdapter.d.ts +10 -0
  9. package/dist/agents/AgentLaunch.d.ts +6 -0
  10. package/dist/agents/AgentLaunch.js +89 -0
  11. package/dist/agents/AgentLaunch.js.map +1 -0
  12. package/dist/agents/claude/ClaudeAdapter.js +18 -3
  13. package/dist/agents/claude/ClaudeAdapter.js.map +1 -1
  14. package/dist/agents/pi/PiAdapter.js +159 -15
  15. package/dist/agents/pi/PiAdapter.js.map +1 -1
  16. package/dist/cli/commands/FirstRunWelcomeProfile.js +8 -5
  17. package/dist/cli/commands/FirstRunWelcomeProfile.js.map +1 -1
  18. package/dist/cli/commands/PiLoginLaunch.d.ts +8 -2
  19. package/dist/cli/commands/PiLoginLaunch.js +739 -30
  20. package/dist/cli/commands/PiLoginLaunch.js.map +1 -1
  21. package/dist/cli/commands/RunCommand.d.ts +20 -3
  22. package/dist/cli/commands/RunCommand.js +102 -20
  23. package/dist/cli/commands/RunCommand.js.map +1 -1
  24. package/dist/cli/commands/SetupCommand.d.ts +12 -2
  25. package/dist/cli/commands/SetupCommand.js +267 -70
  26. package/dist/cli/commands/SetupCommand.js.map +1 -1
  27. package/dist/cli/commands/SyncCommand.d.ts +8 -1
  28. package/dist/cli/commands/SyncCommand.js +2 -1
  29. package/dist/cli/commands/SyncCommand.js.map +1 -1
  30. package/dist/cli/commands/WelcomeCommand.d.ts +2 -1
  31. package/dist/cli/commands/WelcomeCommand.js +77 -70
  32. package/dist/cli/commands/WelcomeCommand.js.map +1 -1
  33. package/dist/cli/commands/assets/outfitter-ascii.txt +5 -0
  34. package/dist/cli/commands/profile/Command.d.ts +1 -0
  35. package/dist/cli/commands/profile/Command.js +3 -0
  36. package/dist/cli/commands/profile/Command.js.map +1 -1
  37. package/dist/cli/commands/profile/LintCommand.d.ts +19 -0
  38. package/dist/cli/commands/profile/LintCommand.js +123 -0
  39. package/dist/cli/commands/profile/LintCommand.js.map +1 -0
  40. package/dist/cli.js +8 -2
  41. package/dist/cli.js.map +1 -1
  42. package/dist/compositeProfile/StatePersistence.js +3 -0
  43. package/dist/compositeProfile/StatePersistence.js.map +1 -1
  44. package/dist/merge/ArrayMergePolicy.js.map +1 -1
  45. package/dist/merge/SettingsValueMerger.js.map +1 -1
  46. package/dist/profiles/Profile.d.ts +14 -1
  47. package/dist/profiles/Profile.js.map +1 -1
  48. package/dist/profiles/ProfileLoader.d.ts +4 -0
  49. package/dist/profiles/ProfileLoader.js +118 -17
  50. package/dist/profiles/ProfileLoader.js.map +1 -1
  51. package/dist/profiles/ProfileMerger.js +3 -0
  52. package/dist/profiles/ProfileMerger.js.map +1 -1
  53. package/dist/profiles/PromptIncludes.d.ts +32 -0
  54. package/dist/profiles/PromptIncludes.js +147 -0
  55. package/dist/profiles/PromptIncludes.js.map +1 -0
  56. package/dist/prompts/SystemPromptExport.d.ts +16 -0
  57. package/dist/prompts/SystemPromptExport.js +81 -0
  58. package/dist/prompts/SystemPromptExport.js.map +1 -0
  59. package/dist/schemas/profile.schema.json +38 -2
  60. package/dist/schemas/settings.schema.json +12 -0
  61. package/dist/settings/Settings.d.ts +5 -0
  62. package/dist/settings/Settings.js.map +1 -1
  63. package/dist/settings/SettingsLoader.js +3 -0
  64. package/dist/settings/SettingsLoader.js.map +1 -1
  65. package/dist/settings/SettingsMerger.js +8 -0
  66. package/dist/settings/SettingsMerger.js.map +1 -1
  67. package/package.json +23 -11
  68. package/skills/outfitter/SKILL.md +68 -0
  69. package/src/schemas/profile.schema.json +38 -2
  70. package/src/schemas/settings.schema.json +12 -0
  71. package/doc/.deepreview +0 -30
  72. package/doc/architecture.md +0 -855
  73. package/doc/controllable-elements.md +0 -162
  74. package/doc/file_structure.md +0 -133
  75. package/doc/integration_test_system.md +0 -214
  76. package/doc/specs/validating_requirements_with_rules.md +0 -55
  77. package/doc/state_writeback_strategy.md +0 -334
  78. package/requirements/OFTR-001-project-foundation.md +0 -53
  79. package/requirements/OFTR-002-settings.md +0 -65
  80. package/requirements/OFTR-003-profiles.md +0 -59
  81. package/requirements/OFTR-004-sync-and-setup.md +0 -67
  82. package/requirements/OFTR-005-run-and-composite-profile.md +0 -60
  83. package/requirements/OFTR-006-agent-adapters.md +0 -66
  84. package/requirements/OFTR-007-controllable-elements.md +0 -32
  85. package/requirements/OFTR-008-requirements-governance.md +0 -42
  86. package/requirements/OFTR-009-release-publishing.md +0 -34
  87. 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":"AAAA,4FAA4F;AAC5F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAsC,EAAE,CACxF,KAAK,KAAK,IAAI;IACd,OAAO,KAAK,KAAK,QAAQ;IACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;IAC/B,OAAQ,KAAqC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAElE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAc,EAA2C,EAAE,CACjG,KAAK,KAAK,IAAI;IACd,OAAO,KAAK,KAAK,QAAQ;IACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;IAC/B,OAAQ,KAA0C,CAAC,SAAS,KAAK,QAAQ,CAAC;AAE5E,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAChD,KAA4C,EACI,EAAE;IAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACrH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,KAG7C,EAAsB,EAAE;IACvB,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAE1E,OAAO,gBAAgB,IAAI,KAAK,CAAC,cAAc,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,KAKhD,EAA8B,EAAE;IAC/B,MAAM,cAAc,GAAG,2BAA2B,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE9F,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,oBAAoB,CAAC;YAC1B,OAAO,EAAE,kCAAkC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;YACjE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;SACzC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAA8B,EAAE,CAAC;IAClD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,oBAAoB,CAAC;YACpC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;SACzC,CAAC,CAAC;QACH,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,aAAuC,EACvC,gBAAyB,EACW,EAAE,CACtC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;IAC9B,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO;QACL,GAAG,oBAAoB,CAAC;YACtB,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YACrE,KAAK,EAAE,WAAW;YAClB,gBAAgB;SACjB,CAAC,CAAC,WAAW;QACd,GAAG,oBAAoB,CAAC;YACtB,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,kBAAkB,CAAC;YACzE,KAAK,EAAE,WAAW;YAClB,gBAAgB;SACjB,CAAC,CAAC,WAAW;QACd,GAAG,oBAAoB,CAAC;YACtB,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;YAC7E,KAAK,EAAE,WAAW;YAClB,gBAAgB;SACjB,CAAC,CAAC,WAAW;KACf,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,MAAM,2BAA2B,GAAG,CAClC,aAAiD,EACjD,QAAqC,EAC4D,EAAE,CACnG,CAAC,GAAG,aAAa,CAAC;KACf,OAAO,EAAE;KACT,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAExH,MAAM,uBAAuB,GAAG,CAC9B,KAA8B,EAC9B,QAAqC,EACE,EAAE;IACzC,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAE9G,OAAO,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAI7B,EAA8B,EAAE;IAC/B,MAAM,WAAW,GAA8B,EAAE,CAAC;IAClD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;YACjE,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;YAC/E,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC;gBAC7C,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC;gBACrD,CAAC,CAAC,4BAA4B,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACvE,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;YAEtE,IAAI,YAAY,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC5D,WAAW,CAAC,IAAI,CACd,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,WAAW,aAAa,YAAY,kBAAkB,CAAC,CACvG,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,WAAW,CAAC,IAAI,CACd,gBAAgB,CACd,KAAK,CAAC,KAAK,EACX,KAAK,EACL,uEAAuE,KAAK,MAAM,CACnF,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAA4C,EAAsC,EAAE,CAC7G,kCAAkC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAElD,MAAM,wBAAwB,GAAG,CAAC,KAA0C,EAAE,QAAgB,EAAsB,EAAE;IACpH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,EAAE,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;IAE1G,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,CAAC,gBAAoC,EAAE,QAAgB,EAAsB,EAAE;IAClH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AAC1F,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACvB,KAA0C,EAC1C,KAAa,EACb,OAAe,EACU,EAAE,CAAC,CAAC;IAC7B,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,UAAU;IAC1C,IAAI,EAAE,GAAG,KAAK,EAAE,WAAW,IAAI,WAAW,mCAAmC,KAAK,EAAE;IACpF,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAa,EAAW,EAAE;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,qCAAqC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnG,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,WAAmB,EAAsB,EAAE;IAChF,IAAI,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnC,OAAO,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE/B,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtG,CAAC;QAED,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,aAA4B,EAA2B,EAAE,CAAC,CAAC;IAChF,OAAO,EAAE,aAAa,CAAC,OAAO;IAC9B,WAAW,EAAE,aAAa,CAAC,WAAW;IACtC,cAAc,EAAE,aAAa,CAAC,cAAc;IAC5C,gBAAgB,EAAE,aAAa,CAAC,gBAAgB;IAChD,MAAM,EAAE,aAAa,CAAC,MAAM;CAC7B,CAAC,CAAC"}
@@ -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
- "appendSystemPrompt": {
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": { "type": "string" }
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":"AAsBA,MAAM,CAAC,MAAM,aAAa,GAAG,GAAa,EAAE,CAAC,CAAC;IAC5C,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE,EAAE;CACnB,CAAC,CAAC"}
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":"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"}
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;IAE/C,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;IACxF,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;KACrC,CAAC;AACJ,CAAC,CAAC;AAEF,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"}
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.4.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
- "snapper:format": "node scripts/run-snapper.mjs --git-md -i",
32
- "check": "npm run snapper:format && prettier --write . && npm run lint:fix && npm run coverage",
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
- "license": "BUSL-1.1",
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.