@ai-outfitter/outfitter 0.3.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 (156) hide show
  1. package/LICENSE.md +58 -0
  2. package/README.md +256 -0
  3. package/dist/agents/AdapterProfileControls.d.ts +20 -0
  4. package/dist/agents/AdapterProfileControls.js +63 -0
  5. package/dist/agents/AdapterProfileControls.js.map +1 -0
  6. package/dist/agents/AdapterStatePaths.d.ts +12 -0
  7. package/dist/agents/AdapterStatePaths.js +44 -0
  8. package/dist/agents/AdapterStatePaths.js.map +1 -0
  9. package/dist/agents/AgentAdapter.d.ts +32 -0
  10. package/dist/agents/AgentAdapter.js +2 -0
  11. package/dist/agents/AgentAdapter.js.map +1 -0
  12. package/dist/agents/AgentRegistry.d.ts +6 -0
  13. package/dist/agents/AgentRegistry.js +17 -0
  14. package/dist/agents/AgentRegistry.js.map +1 -0
  15. package/dist/agents/LaunchResources.d.ts +13 -0
  16. package/dist/agents/LaunchResources.js +35 -0
  17. package/dist/agents/LaunchResources.js.map +1 -0
  18. package/dist/agents/ResourceIdentity.d.ts +2 -0
  19. package/dist/agents/ResourceIdentity.js +51 -0
  20. package/dist/agents/ResourceIdentity.js.map +1 -0
  21. package/dist/agents/claude/ClaudeAdapter.d.ts +2 -0
  22. package/dist/agents/claude/ClaudeAdapter.js +117 -0
  23. package/dist/agents/claude/ClaudeAdapter.js.map +1 -0
  24. package/dist/agents/claude/ClaudeCompositeProfileWriter.d.ts +5 -0
  25. package/dist/agents/claude/ClaudeCompositeProfileWriter.js +7 -0
  26. package/dist/agents/claude/ClaudeCompositeProfileWriter.js.map +1 -0
  27. package/dist/agents/pi/PiAdapter.d.ts +2 -0
  28. package/dist/agents/pi/PiAdapter.js +229 -0
  29. package/dist/agents/pi/PiAdapter.js.map +1 -0
  30. package/dist/agents/pi/PiCompositeProfileWriter.d.ts +5 -0
  31. package/dist/agents/pi/PiCompositeProfileWriter.js +7 -0
  32. package/dist/agents/pi/PiCompositeProfileWriter.js.map +1 -0
  33. package/dist/agents/pi/PiMcpConfig.d.ts +2 -0
  34. package/dist/agents/pi/PiMcpConfig.js +114 -0
  35. package/dist/agents/pi/PiMcpConfig.js.map +1 -0
  36. package/dist/agents/pi/PiSettingsMergePolicy.d.ts +17 -0
  37. package/dist/agents/pi/PiSettingsMergePolicy.js +59 -0
  38. package/dist/agents/pi/PiSettingsMergePolicy.js.map +1 -0
  39. package/dist/cli/OutfitterCli.d.ts +4 -0
  40. package/dist/cli/OutfitterCli.js +32 -0
  41. package/dist/cli/OutfitterCli.js.map +1 -0
  42. package/dist/cli/commands/CommandObject.d.ts +11 -0
  43. package/dist/cli/commands/CommandObject.js +5 -0
  44. package/dist/cli/commands/CommandObject.js.map +1 -0
  45. package/dist/cli/commands/FirstRunWelcomeProfile.d.ts +11 -0
  46. package/dist/cli/commands/FirstRunWelcomeProfile.js +107 -0
  47. package/dist/cli/commands/FirstRunWelcomeProfile.js.map +1 -0
  48. package/dist/cli/commands/PiLoginLaunch.d.ts +10 -0
  49. package/dist/cli/commands/PiLoginLaunch.js +76 -0
  50. package/dist/cli/commands/PiLoginLaunch.js.map +1 -0
  51. package/dist/cli/commands/RunCommand.d.ts +30 -0
  52. package/dist/cli/commands/RunCommand.js +299 -0
  53. package/dist/cli/commands/RunCommand.js.map +1 -0
  54. package/dist/cli/commands/SetupCommand.d.ts +34 -0
  55. package/dist/cli/commands/SetupCommand.js +379 -0
  56. package/dist/cli/commands/SetupCommand.js.map +1 -0
  57. package/dist/cli/commands/SyncCommand.d.ts +28 -0
  58. package/dist/cli/commands/SyncCommand.js +178 -0
  59. package/dist/cli/commands/SyncCommand.js.map +1 -0
  60. package/dist/cli/commands/WelcomeCommand.d.ts +54 -0
  61. package/dist/cli/commands/WelcomeCommand.js +214 -0
  62. package/dist/cli/commands/WelcomeCommand.js.map +1 -0
  63. package/dist/cli/commands/profile/Command.d.ts +6 -0
  64. package/dist/cli/commands/profile/Command.js +21 -0
  65. package/dist/cli/commands/profile/Command.js.map +1 -0
  66. package/dist/cli/commands/profile/CreateCommand.d.ts +19 -0
  67. package/dist/cli/commands/profile/CreateCommand.js +115 -0
  68. package/dist/cli/commands/profile/CreateCommand.js.map +1 -0
  69. package/dist/cli/commands/profile/ListCommand.d.ts +17 -0
  70. package/dist/cli/commands/profile/ListCommand.js +85 -0
  71. package/dist/cli/commands/profile/ListCommand.js.map +1 -0
  72. package/dist/cli/commands/profile/Shared.d.ts +9 -0
  73. package/dist/cli/commands/profile/Shared.js +10 -0
  74. package/dist/cli/commands/profile/Shared.js.map +1 -0
  75. package/dist/cli.d.ts +3 -0
  76. package/dist/cli.js +22 -0
  77. package/dist/cli.js.map +1 -0
  78. package/dist/compositeProfile/CompositeProfile.d.ts +8 -0
  79. package/dist/compositeProfile/CompositeProfile.js +6 -0
  80. package/dist/compositeProfile/CompositeProfile.js.map +1 -0
  81. package/dist/compositeProfile/CompositeProfileAssembler.d.ts +12 -0
  82. package/dist/compositeProfile/CompositeProfileAssembler.js +32 -0
  83. package/dist/compositeProfile/CompositeProfileAssembler.js.map +1 -0
  84. package/dist/compositeProfile/CompositeProfileFile.d.ts +16 -0
  85. package/dist/compositeProfile/CompositeProfileFile.js +16 -0
  86. package/dist/compositeProfile/CompositeProfileFile.js.map +1 -0
  87. package/dist/compositeProfile/CompositeProfileTemplate.d.ts +15 -0
  88. package/dist/compositeProfile/CompositeProfileTemplate.js +65 -0
  89. package/dist/compositeProfile/CompositeProfileTemplate.js.map +1 -0
  90. package/dist/compositeProfile/CompositeProfileWatcher.d.ts +18 -0
  91. package/dist/compositeProfile/CompositeProfileWatcher.js +46 -0
  92. package/dist/compositeProfile/CompositeProfileWatcher.js.map +1 -0
  93. package/dist/compositeProfile/StatePersistence.d.ts +24 -0
  94. package/dist/compositeProfile/StatePersistence.js +224 -0
  95. package/dist/compositeProfile/StatePersistence.js.map +1 -0
  96. package/dist/merge/ArrayMergePolicy.d.ts +8 -0
  97. package/dist/merge/ArrayMergePolicy.js +45 -0
  98. package/dist/merge/ArrayMergePolicy.js.map +1 -0
  99. package/dist/merge/SettingsValueMerger.d.ts +11 -0
  100. package/dist/merge/SettingsValueMerger.js +34 -0
  101. package/dist/merge/SettingsValueMerger.js.map +1 -0
  102. package/dist/profiles/Profile.d.ts +32 -0
  103. package/dist/profiles/Profile.js +7 -0
  104. package/dist/profiles/Profile.js.map +1 -0
  105. package/dist/profiles/ProfileCache.d.ts +8 -0
  106. package/dist/profiles/ProfileCache.js +36 -0
  107. package/dist/profiles/ProfileCache.js.map +1 -0
  108. package/dist/profiles/ProfileLoader.d.ts +24 -0
  109. package/dist/profiles/ProfileLoader.js +169 -0
  110. package/dist/profiles/ProfileLoader.js.map +1 -0
  111. package/dist/profiles/ProfileMerger.d.ts +20 -0
  112. package/dist/profiles/ProfileMerger.js +97 -0
  113. package/dist/profiles/ProfileMerger.js.map +1 -0
  114. package/dist/profiles/ProfileSource.d.ts +35 -0
  115. package/dist/profiles/ProfileSource.js +13 -0
  116. package/dist/profiles/ProfileSource.js.map +1 -0
  117. package/dist/schemas/profile-source.schema.json +29 -0
  118. package/dist/schemas/profile.schema.json +115 -0
  119. package/dist/schemas/settings.schema.json +37 -0
  120. package/dist/settings/Settings.d.ts +17 -0
  121. package/dist/settings/Settings.js +5 -0
  122. package/dist/settings/Settings.js.map +1 -0
  123. package/dist/settings/SettingsLoader.d.ts +33 -0
  124. package/dist/settings/SettingsLoader.js +129 -0
  125. package/dist/settings/SettingsLoader.js.map +1 -0
  126. package/dist/settings/SettingsMerger.d.ts +2 -0
  127. package/dist/settings/SettingsMerger.js +31 -0
  128. package/dist/settings/SettingsMerger.js.map +1 -0
  129. package/dist/validation/SchemaValidator.d.ts +11 -0
  130. package/dist/validation/SchemaValidator.js +36 -0
  131. package/dist/validation/SchemaValidator.js.map +1 -0
  132. package/dist/validation/YamlDocument.d.ts +13 -0
  133. package/dist/validation/YamlDocument.js +11 -0
  134. package/dist/validation/YamlDocument.js.map +1 -0
  135. package/doc/.deepreview +30 -0
  136. package/doc/architecture.md +834 -0
  137. package/doc/controllable-elements.md +162 -0
  138. package/doc/file_structure.md +133 -0
  139. package/doc/integration_test_system.md +214 -0
  140. package/doc/specs/validating_requirements_with_rules.md +55 -0
  141. package/doc/state_writeback_strategy.md +334 -0
  142. package/package.json +73 -0
  143. package/requirements/OFTR-001-project-foundation.md +53 -0
  144. package/requirements/OFTR-002-settings.md +65 -0
  145. package/requirements/OFTR-003-profiles.md +51 -0
  146. package/requirements/OFTR-004-sync-and-setup.md +57 -0
  147. package/requirements/OFTR-005-run-and-composite-profile.md +60 -0
  148. package/requirements/OFTR-006-agent-adapters.md +64 -0
  149. package/requirements/OFTR-007-controllable-elements.md +32 -0
  150. package/requirements/OFTR-008-requirements-governance.md +42 -0
  151. package/requirements/OFTR-009-release-publishing.md +25 -0
  152. package/requirements/OFTR-010-onboarding-welcome.md +38 -0
  153. package/src/schemas/SchemaDocument.ts +20 -0
  154. package/src/schemas/profile-source.schema.json +29 -0
  155. package/src/schemas/profile.schema.json +115 -0
  156. package/src/schemas/settings.schema.json +37 -0
@@ -0,0 +1,51 @@
1
+ // Normalizes launch resource identities so semantically equivalent entries can be deduplicated.
2
+ import { resolve } from 'node:path';
3
+ export const normalizeExtensionResourceIdentity = (source) => {
4
+ const trimmed = source.trim();
5
+ if (trimmed.startsWith('npm:')) {
6
+ return `npm:${normalizeNpmPackageName(trimmed.slice('npm:'.length))}`;
7
+ }
8
+ if (trimmed.startsWith('github:')) {
9
+ return normalizeGitResourceIdentity(`https://github.com/${trimmed.slice('github:'.length)}.git`);
10
+ }
11
+ if (trimmed.startsWith('git:')) {
12
+ return normalizeGitResourceIdentity(trimmed.slice('git:'.length));
13
+ }
14
+ if (trimmed.startsWith('git+')) {
15
+ return normalizeGitResourceIdentity(trimmed.slice('git+'.length));
16
+ }
17
+ if (trimmed.startsWith('https://') || trimmed.startsWith('http://') || trimmed.startsWith('ssh://')) {
18
+ return normalizeGitResourceIdentity(trimmed);
19
+ }
20
+ return normalizePathResourceIdentity(trimmed);
21
+ };
22
+ export const normalizeLaunchResourceIdentity = (source) => normalizePathResourceIdentity(source.trim());
23
+ const normalizeNpmPackageName = (source) => {
24
+ const withoutRange = source.split('#', 1)[0];
25
+ if (withoutRange.startsWith('@')) {
26
+ const separatorIndex = withoutRange.indexOf('@', 1);
27
+ return (separatorIndex === -1 ? withoutRange : withoutRange.slice(0, separatorIndex)).toLowerCase();
28
+ }
29
+ const separatorIndex = withoutRange.indexOf('@');
30
+ return (separatorIndex === -1 ? withoutRange : withoutRange.slice(0, separatorIndex)).toLowerCase();
31
+ };
32
+ const normalizeGitResourceIdentity = (source) => {
33
+ const withoutRef = source.split('#', 1)[0];
34
+ const urlLike = withoutRef.startsWith('github.com/') ? `https://${withoutRef}` : withoutRef;
35
+ try {
36
+ const url = new URL(urlLike);
37
+ const host = url.hostname.toLowerCase();
38
+ const path = url.pathname.replace(/\/$/u, '').replace(/\.git$/u, '');
39
+ return `git:${url.protocol}//${host}${path}.git`;
40
+ }
41
+ catch {
42
+ return `git:${urlLike.replace(/\/$/u, '').replace(/\.git$/u, '')}.git`;
43
+ }
44
+ };
45
+ const normalizePathResourceIdentity = (source) => {
46
+ if (source.startsWith('.') || source.startsWith('/')) {
47
+ return `path:${resolve(source)}`;
48
+ }
49
+ return `resource:${source}`;
50
+ };
51
+ //# sourceMappingURL=ResourceIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceIdentity.js","sourceRoot":"","sources":["../../src/agents/ResourceIdentity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { AgentAdapter } from '../AgentAdapter.js';
2
+ export declare const createClaudeAdapter: () => AgentAdapter;
@@ -0,0 +1,117 @@
1
+ // Provides the Claude Code adapter for composite profile generation and native launch plans.
2
+ import { join } from 'node:path';
3
+ import { findUnsupportedControlNames, flagValue, mergeAgentSpecificControls, repeatFlag, supportedControlNames, } from '../AdapterProfileControls.js';
4
+ import { createDeclaredStatePaths, findProfileStateSource } from '../AdapterStatePaths.js';
5
+ import { createCompositeProfile } from '../../compositeProfile/CompositeProfile.js';
6
+ import { createCompositeProfileFile } from '../../compositeProfile/CompositeProfileFile.js';
7
+ const supportedClaudeGenericControls = new Set([
8
+ 'model',
9
+ 'thinking',
10
+ 'environment',
11
+ 'args',
12
+ 'sessionDirectory',
13
+ 'session_directory',
14
+ 'extensions',
15
+ 'systemPrompt',
16
+ 'system_prompt',
17
+ 'appendSystemPrompt',
18
+ 'append_system_prompt',
19
+ 'pi',
20
+ 'claude',
21
+ ]);
22
+ const claudeControlNames = new Set([
23
+ 'model',
24
+ 'thinking',
25
+ 'environment',
26
+ 'args',
27
+ 'sessionDirectory',
28
+ 'session_directory',
29
+ 'extensions',
30
+ 'systemPrompt',
31
+ 'system_prompt',
32
+ 'appendSystemPrompt',
33
+ 'append_system_prompt',
34
+ ]);
35
+ const claudeStatePathDeclarations = {
36
+ 'settings.json': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'warn', 'error', 'prompt'] },
37
+ 'agents/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error', 'prompt'] },
38
+ 'skills/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error', 'prompt'] },
39
+ 'commands/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error', 'prompt'] },
40
+ 'plugins/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error', 'prompt'] },
41
+ 'projects/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error'] },
42
+ 'debug/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error'] },
43
+ unknown: { defaultStrategy: 'warn', allowedStrategies: ['discard', 'warn', 'error', 'prompt'] },
44
+ };
45
+ export const createClaudeAdapter = () => ({
46
+ id: 'claude',
47
+ supportedControls: supportedControlNames(supportedClaudeGenericControls),
48
+ statePaths: claudeStatePathDeclarations,
49
+ createCompositeProfile(profile, input) {
50
+ const compositeProfile = createCompositeProfile(input.rootDirectory, [
51
+ createCompositeProfileFile({
52
+ rootDirectory: input.rootDirectory,
53
+ relativePath: 'outfitter/profile.json',
54
+ content: `${JSON.stringify({ id: profile.id, label: profile.label, controls: profile.controls }, null, 2)}\n`,
55
+ sourceInputs: input.profilePaths,
56
+ strategy: 'transform',
57
+ }),
58
+ ], createClaudeStatePaths(profile, input));
59
+ return {
60
+ compositeProfile,
61
+ warnings: this.getUnsupportedControls(profile).map((controlName) => `claude adapter cannot translate requested control '${controlName}'.`),
62
+ };
63
+ },
64
+ createLaunchPlan(compositeProfile, profile, passThroughArgs = []) {
65
+ const controls = mergeClaudeControls(profile?.controls ?? {});
66
+ return {
67
+ command: 'claude',
68
+ args: [...createClaudeArgs(controls), ...passThroughArgs],
69
+ env: {
70
+ ...controls.environment,
71
+ CLAUDE_CONFIG_DIR: compositeProfile.rootDirectory,
72
+ },
73
+ };
74
+ },
75
+ getUnsupportedControls(profile) {
76
+ return findUnsupportedControls(profile.controls);
77
+ },
78
+ });
79
+ const createClaudeStatePaths = (profile, input) => {
80
+ const controls = mergeClaudeControls(profile.controls);
81
+ return createDeclaredStatePaths({
82
+ adapterId: 'claude',
83
+ declarations: claudeStatePathDeclarations,
84
+ profile,
85
+ resolveSourcePath: (relativePath, directory) => resolveClaudeStateSourcePath(input.profileFolders ?? [], input.homeDirectory, relativePath, directory, controls.sessionDirectory),
86
+ });
87
+ };
88
+ const resolveClaudeStateSourcePath = (profileFolders, homeDirectory, relativePath, directory, sessionDirectory) => {
89
+ const normalizedRelativePath = directory ? relativePath.slice(0, -1) : relativePath;
90
+ if (relativePath === 'projects/' && sessionDirectory !== undefined) {
91
+ return sessionDirectory;
92
+ }
93
+ const profileSource = findProfileStateSource(profileFolders, 'claude', relativePath, directory);
94
+ if (profileSource !== undefined) {
95
+ return profileSource;
96
+ }
97
+ return join(
98
+ /* v8 ignore next -- run command always passes homeDirectory; environment fallbacks are defensive. */
99
+ homeDirectory ?? process.env.HOME ?? '.', '.claude', normalizedRelativePath);
100
+ };
101
+ const mergeClaudeControls = (controls) => mergeAgentSpecificControls(controls, 'claude');
102
+ const createClaudeArgs = (controls) => [
103
+ ...flagValue('--model', controls.model),
104
+ ...flagValue('--effort', controls.thinking),
105
+ ...flagValue('--system-prompt', controls.systemPrompt),
106
+ ...flagValue('--append-system-prompt', controls.appendSystemPrompt),
107
+ ...repeatFlag('--plugin-dir', controls.extensions),
108
+ ...(controls.args ?? []),
109
+ ];
110
+ const findUnsupportedControls = (controls) => {
111
+ const unsupported = findUnsupportedControlNames(controls, supportedClaudeGenericControls);
112
+ if (controls.claude !== undefined) {
113
+ unsupported.push(...findUnsupportedControlNames(controls.claude, claudeControlNames).map((controlName) => `claude.${controlName}`));
114
+ }
115
+ return unsupported;
116
+ };
117
+ //# sourceMappingURL=ClaudeAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeAdapter.js","sourceRoot":"","sources":["../../../src/agents/claude/ClaudeAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface ClaudeCompositeProfilePaths {
2
+ readonly configDirectory: string;
3
+ readonly profileMetadataPath: string;
4
+ }
5
+ export declare const createClaudeCompositeProfilePaths: (configDirectory: string) => ClaudeCompositeProfilePaths;
@@ -0,0 +1,7 @@
1
+ // Defines Claude Code-specific compositeProfile path metadata.
2
+ import { join } from 'node:path';
3
+ export const createClaudeCompositeProfilePaths = (configDirectory) => ({
4
+ configDirectory,
5
+ profileMetadataPath: join(configDirectory, 'outfitter', 'profile.json'),
6
+ });
7
+ //# sourceMappingURL=ClaudeCompositeProfileWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeCompositeProfileWriter.js","sourceRoot":"","sources":["../../../src/agents/claude/ClaudeCompositeProfileWriter.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,eAAuB,EAA+B,EAAE,CAAC,CAAC;IAC1G,eAAe;IACf,mBAAmB,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,cAAc,CAAC;CACxE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { AgentAdapter } from '../AgentAdapter.js';
2
+ export declare const createPiAdapter: () => AgentAdapter;
@@ -0,0 +1,229 @@
1
+ // Provides the pi adapter for composite profile generation and native pi launch plans.
2
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
3
+ import { delimiter, join } from 'node:path';
4
+ import { flagValue, genericControlNames, mergeAgentSpecificControls, repeatFlag, supportedControlNames, } from '../AdapterProfileControls.js';
5
+ import { createDeclaredStatePaths, findProfileStateSource } from '../AdapterStatePaths.js';
6
+ import { filterPiSettingsPackagesDuplicatingExtensions } from './PiSettingsMergePolicy.js';
7
+ import { createCompositeProfile } from '../../compositeProfile/CompositeProfile.js';
8
+ import { createCompositeProfileFile } from '../../compositeProfile/CompositeProfileFile.js';
9
+ import { createPiMcpConfigFile } from './PiMcpConfig.js';
10
+ const piControlNames = new Set([
11
+ ...[...genericControlNames].filter((controlName) => controlName !== 'pi' && controlName !== 'claude'),
12
+ 'allowExternalDeepWorkJobs',
13
+ 'allow_external_deepwork_jobs',
14
+ ]);
15
+ const piStatePathDeclarations = {
16
+ 'auth.json': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'error', 'prompt'] },
17
+ 'settings.json': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'warn', 'error', 'prompt'] },
18
+ 'mcp.json': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'warn', 'error', 'prompt'] },
19
+ 'models.json': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'warn', 'error', 'prompt'] },
20
+ 'plugins/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error', 'prompt'] },
21
+ 'cache/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error'] },
22
+ 'sessions/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error'] },
23
+ // Pi installs npm-sourced packages here for user-scoped `pi install npm:...` entries.
24
+ // Persisting it keeps package updates across Outfitter's temporary composite profile directories.
25
+ 'npm/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error'] },
26
+ // Pi clones git-sourced packages here for user-scoped `pi install git:...` entries.
27
+ // Persisting it prevents every Outfitter run from re-cloning or using stale temporary checkouts.
28
+ 'git/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error'] },
29
+ // Pi expands git-sourced extensions and other temporary runtime artifacts here.
30
+ // Persisting it avoids noisy unknown-write diagnostics and lets pi reuse the native tmp tree.
31
+ 'tmp/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard'] },
32
+ 'utilities/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error'] },
33
+ 'bin/': { defaultStrategy: 'symlink', allowedStrategies: ['symlink', 'discard', 'warn', 'error'] },
34
+ unknown: { defaultStrategy: 'warn', allowedStrategies: ['discard', 'warn', 'error', 'prompt'] },
35
+ };
36
+ export const createPiAdapter = () => ({
37
+ id: 'pi',
38
+ supportedControls: supportedControlNames(genericControlNames),
39
+ statePaths: piStatePathDeclarations,
40
+ createCompositeProfile(profile, input) {
41
+ const statePaths = createPiStatePaths(profile, input);
42
+ const transformedSettingsFile = createPiSettingsTransformFile(profile, input, statePaths);
43
+ const compositeProfile = createCompositeProfile(input.rootDirectory, [
44
+ createCompositeProfileFile({
45
+ rootDirectory: input.rootDirectory,
46
+ relativePath: 'outfitter/profile.json',
47
+ content: `${JSON.stringify({ id: profile.id, label: profile.label, controls: profile.controls }, null, 2)}\n`,
48
+ sourceInputs: input.profilePaths,
49
+ strategy: 'transform',
50
+ }),
51
+ createPiMcpConfigFile(input.rootDirectory, input.profileFolders),
52
+ transformedSettingsFile,
53
+ ].filter((file) => file !== undefined), transformedSettingsFile === undefined ? statePaths : markPiSettingsStatePathDiscarded(statePaths));
54
+ return {
55
+ compositeProfile,
56
+ warnings: this.getUnsupportedControls(profile).map((controlName) => `pi adapter cannot translate requested control '${controlName}'.`),
57
+ };
58
+ },
59
+ createLaunchPlan(compositeProfile, profile, passThroughArgs = [], context = {}) {
60
+ const controls = mergePiControls(profile?.controls ?? {});
61
+ const profileFolders = context.profileFolders ?? [];
62
+ const deepWorkJobsFolders = createDeepWorkAdditionalJobsFolders(controls, profileFolders);
63
+ const skillSources = createPiSkillSources(controls, profileFolders);
64
+ return {
65
+ command: 'pi',
66
+ args: [...createPiArgs({ ...controls, skills: skillSources }), ...passThroughArgs],
67
+ env: {
68
+ ...controls.environment,
69
+ ...(deepWorkJobsFolders === undefined ? {} : { DEEPWORK_ADDITIONAL_JOBS_FOLDERS: deepWorkJobsFolders }),
70
+ PI_CODING_AGENT_DIR: compositeProfile.rootDirectory,
71
+ },
72
+ };
73
+ },
74
+ getUnsupportedControls(profile) {
75
+ return findUnsupportedControls(profile.controls);
76
+ },
77
+ });
78
+ const markPiSettingsStatePathDiscarded = (statePaths) => statePaths.map((statePath) => statePath.relativePath === 'settings.json'
79
+ ? { relativePath: statePath.relativePath, strategy: 'discard', directory: statePath.directory }
80
+ : statePath);
81
+ const createPiSettingsTransformFile = (profile, input, statePaths) => {
82
+ if (input.homeDirectory === undefined) {
83
+ return undefined;
84
+ }
85
+ const controls = mergePiControls(profile.controls);
86
+ const extensionSources = controls.extensions ?? [];
87
+ if (extensionSources.length === 0) {
88
+ return undefined;
89
+ }
90
+ const settingsStatePath = statePaths.find((statePath) => statePath.relativePath === 'settings.json');
91
+ if (settingsStatePath?.sourcePath === undefined || !existsSync(settingsStatePath.sourcePath)) {
92
+ return undefined;
93
+ }
94
+ const settings = readPiSettingsDocument(settingsStatePath.sourcePath);
95
+ if (settings === undefined || !Array.isArray(settings.packages)) {
96
+ return undefined;
97
+ }
98
+ const filteredPackages = filterPiSettingsPackagesDuplicatingExtensions(settings.packages, extensionSources);
99
+ if (filteredPackages.length === settings.packages.length) {
100
+ return undefined;
101
+ }
102
+ return createCompositeProfileFile({
103
+ rootDirectory: input.rootDirectory,
104
+ relativePath: 'settings.json',
105
+ content: `${JSON.stringify({ ...settings, packages: filteredPackages }, null, 2)}\n`,
106
+ sourceInputs: [settingsStatePath.sourcePath, ...input.profilePaths],
107
+ strategy: 'transform',
108
+ });
109
+ };
110
+ const readPiSettingsDocument = (settingsPath) => {
111
+ let content;
112
+ try {
113
+ content = readFileSync(settingsPath, 'utf8');
114
+ }
115
+ catch (error) {
116
+ throw new Error(`Could not read pi settings file '${settingsPath}': ${String(error)}`, { cause: error });
117
+ }
118
+ try {
119
+ const parsed = JSON.parse(content);
120
+ return isPiSettingsDocument(parsed) ? parsed : undefined;
121
+ }
122
+ catch {
123
+ return undefined;
124
+ }
125
+ };
126
+ const isPiSettingsDocument = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
127
+ const createPiStatePaths = (profile, input) => {
128
+ return createDeclaredStatePaths({
129
+ adapterId: 'pi',
130
+ declarations: piStatePathDeclarations,
131
+ profile,
132
+ resolveSourcePath: (relativePath, directory) => resolvePiStateSourcePath(input.profileFolders ?? [], input.homeDirectory, input.cacheDirectory, relativePath, directory),
133
+ });
134
+ };
135
+ const resolvePiStateSourcePath = (profileFolders, homeDirectory, cacheDirectory, relativePath, directory) => {
136
+ const normalizedRelativePath = directory ? relativePath.slice(0, -1) : relativePath;
137
+ const configuredCacheDirectory = cacheDirectory ??
138
+ join(
139
+ /* v8 ignore next -- run command always passes homeDirectory; environment fallbacks are defensive. */
140
+ homeDirectory ?? process.env.HOME ?? '.', '.outfitter', 'cache');
141
+ if (relativePath === 'utilities/' || relativePath === 'bin/') {
142
+ return join(configuredCacheDirectory, 'utilities');
143
+ }
144
+ const profileSource = findProfileStateSource(profileFolders, 'pi', relativePath, directory);
145
+ if (profileSource !== undefined) {
146
+ return profileSource;
147
+ }
148
+ return join(
149
+ /* v8 ignore next -- run command always passes homeDirectory; environment fallbacks are defensive. */
150
+ homeDirectory ?? process.env.HOME ?? '.', '.pi', 'agent', normalizedRelativePath);
151
+ };
152
+ const deepWorkAdditionalJobsFoldersEnv = 'DEEPWORK_ADDITIONAL_JOBS_FOLDERS';
153
+ const createPiSkillSources = (controls, profileFolders) => [
154
+ ...new Set([...(controls.skills ?? []), ...profileFolders.flatMap(piSkillSourcesForProfile)]),
155
+ ];
156
+ const piSkillSourcesForProfile = (profileFolder) => {
157
+ const skillsFolder = join(profileFolder, 'cli_specific', 'pi', 'skills');
158
+ return readOptionalDirectoryEntries(skillsFolder, 'profile Pi skills folder')
159
+ .filter(isPiSkillEntry(skillsFolder))
160
+ .map((entry) => join(skillsFolder, entry.name))
161
+ .sort();
162
+ };
163
+ const isPiSkillEntry = (folderPath) => (entry) => entry.isDirectory() && isFile(join(folderPath, entry.name, 'SKILL.md'));
164
+ const createDeepWorkAdditionalJobsFolders = (controls, profileFolders) => {
165
+ const profileJobFolders = [
166
+ ...new Set(profileFolders.map(deepWorkJobsFolderForProfile).filter(isExistingDeepWorkJobsFolder)),
167
+ ];
168
+ if (profileJobFolders.length === 0) {
169
+ return undefined;
170
+ }
171
+ const existingValue = allowExternalDeepWorkJobs(controls)
172
+ ? (controls.environment?.[deepWorkAdditionalJobsFoldersEnv] ?? process.env[deepWorkAdditionalJobsFoldersEnv])
173
+ : undefined;
174
+ return [...splitPathList(existingValue), ...profileJobFolders].join(delimiter);
175
+ };
176
+ const allowExternalDeepWorkJobs = (controls) => controls.allowExternalDeepWorkJobs === true || controls.allow_external_deepwork_jobs === true;
177
+ const deepWorkJobsFolderForProfile = (profileFolder) => join(profileFolder, 'cli_specific', 'pi', 'deepwork', 'jobs');
178
+ const isExistingDeepWorkJobsFolder = (folderPath) => readOptionalDirectoryEntries(folderPath, 'profile DeepWork jobs folder').some(isDeepWorkJobEntry(folderPath));
179
+ const isDeepWorkJobEntry = (folderPath) => (entry) => entry.isDirectory() && isFile(join(folderPath, entry.name, 'job.yml'));
180
+ const readOptionalDirectoryEntries = (folderPath, description) => {
181
+ try {
182
+ return readdirSync(folderPath, { withFileTypes: true });
183
+ }
184
+ catch (error) {
185
+ if (isMissingPathError(error)) {
186
+ return [];
187
+ }
188
+ throw new Error(`Could not read ${description} '${folderPath}': ${formatFilesystemError(error)}`, {
189
+ cause: error,
190
+ });
191
+ }
192
+ };
193
+ const isFile = (path) => {
194
+ try {
195
+ return statSync(path).isFile();
196
+ }
197
+ catch (error) {
198
+ if (isMissingPathError(error)) {
199
+ return false;
200
+ }
201
+ throw new Error(`Could not inspect file '${path}': ${formatFilesystemError(error)}`, { cause: error });
202
+ }
203
+ };
204
+ const isMissingPathError = (error) => error !== null && typeof error === 'object' && 'code' in error && error.code === 'ENOENT';
205
+ const formatFilesystemError = (error) => String(error);
206
+ const splitPathList = (value) => value === undefined || value === '' ? [] : value.split(delimiter).filter((entry) => entry !== '');
207
+ const mergePiControls = (controls) => mergeAgentSpecificControls(controls, 'pi');
208
+ const createPiArgs = (controls) => [
209
+ ...flagValue('--model', controls.model),
210
+ ...flagValue('--provider', controls.provider),
211
+ ...flagValue('--thinking', controls.thinking),
212
+ ...flagValue('--session-dir', controls.sessionDirectory),
213
+ ...flagValue('--prompt-template', controls.promptTemplate),
214
+ ...flagValue('--system-prompt', controls.systemPrompt),
215
+ ...flagValue('--append-system-prompt', controls.appendSystemPrompt),
216
+ ...repeatFlag('--extension', controls.extensions),
217
+ ...repeatFlag('--skill', controls.skills),
218
+ ...(controls.args ?? []),
219
+ ];
220
+ const findUnsupportedControls = (controls) => {
221
+ const unsupported = Object.keys(controls).filter((controlName) => !genericControlNames.has(controlName));
222
+ if (controls.pi !== undefined) {
223
+ unsupported.push(...Object.keys(controls.pi)
224
+ .filter((controlName) => !piControlNames.has(controlName))
225
+ .map((controlName) => `pi.${controlName}`));
226
+ }
227
+ return unsupported;
228
+ };
229
+ //# sourceMappingURL=PiAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PiAdapter.js","sourceRoot":"","sources":["../../../src/agents/pi/PiAdapter.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAe,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,0BAA0B,EAC1B,UAAU,EACV,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,EAAE,6CAA6C,EAAE,MAAM,4BAA4B,CAAC;AAG3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AAE5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,QAAQ,CAAC;IACrG,2BAA2B;IAC3B,8BAA8B;CAC/B,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG;IAC9B,WAAW,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;IAC9F,eAAe,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;IAC1G,UAAU,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;IACrG,aAAa,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;IACxG,UAAU,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;IAChH,QAAQ,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IACpG,WAAW,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IACvG,sFAAsF;IACtF,kGAAkG;IAClG,MAAM,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAClG,oFAAoF;IACpF,iGAAiG;IACjG,MAAM,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAClG,gFAAgF;IAChF,8FAA8F;IAC9F,MAAM,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;IACjF,YAAY,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IACxG,MAAM,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAClG,OAAO,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;CAC9B,CAAC;AAEpE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAiB,EAAE,CAAC,CAAC;IAClD,EAAE,EAAE,IAAI;IACR,iBAAiB,EAAE,qBAAqB,CAAC,mBAAmB,CAAC;IAC7D,UAAU,EAAE,uBAAuB;IACnC,sBAAsB,CAAC,OAAgB,EAAE,KAAK;QAC5C,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,uBAAuB,GAAG,6BAA6B,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAC1F,MAAM,gBAAgB,GAAG,sBAAsB,CAC7C,KAAK,CAAC,aAAa,EACnB;YACE,0BAA0B,CAAC;gBACzB,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,YAAY,EAAE,wBAAwB;gBACtC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;gBAC7G,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,QAAQ,EAAE,WAAW;aACtB,CAAC;YACF,qBAAqB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC;YAChE,uBAAuB;SACxB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,EACtC,uBAAuB,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gCAAgC,CAAC,UAAU,CAAC,CAClG,CAAC;QAEF,OAAO;YACL,gBAAgB;YAChB,QAAQ,EAAE,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,GAAG,CAChD,CAAC,WAAW,EAAE,EAAE,CAAC,kDAAkD,WAAW,IAAI,CACnF;SACF,CAAC;IACJ,CAAC;IACD,gBAAgB,CACd,gBAAkC,EAClC,OAAiB,EACjB,kBAAqC,EAAE,EACvC,UAA8B,EAAE;QAEhC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;QACpD,MAAM,mBAAmB,GAAG,mCAAmC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC1F,MAAM,YAAY,GAAG,oBAAoB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAEpE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC;YAClF,GAAG,EAAE;gBACH,GAAG,QAAQ,CAAC,WAAW;gBACvB,GAAG,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,CAAC;gBACvG,mBAAmB,EAAE,gBAAgB,CAAC,aAAa;aACpD;SACF,CAAC;IACJ,CAAC;IACD,sBAAsB,CAAC,OAAgB;QACrC,OAAO,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;CACF,CAAC,CAAC;AAMH,MAAM,gCAAgC,GAAG,CACvC,UAAgD,EACV,EAAE,CACxC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC3B,SAAS,CAAC,YAAY,KAAK,eAAe;IACxC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE;IAC/F,CAAC,CAAC,SAAS,CACd,CAAC;AAEJ,MAAM,6BAA6B,GAAG,CACpC,OAAgB,EAChB,KAIC,EACD,UAAgD,EACW,EAAE;IAC7D,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;IAEnD,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,KAAK,eAAe,CAAC,CAAC;IAErG,IAAI,iBAAiB,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAEtE,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,gBAAgB,GAAG,6CAA6C,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAE5G,IAAI,gBAAgB,CAAC,MAAM,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACzD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,0BAA0B,CAAC;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,YAAY,EAAE,eAAe;QAC7B,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;QACpF,YAAY,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;QACnE,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,YAAoB,EAAkC,EAAE;IACtF,IAAI,OAAe,CAAC;IAEpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oCAAoC,YAAY,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAA+B,EAAE,CAC3E,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,kBAAkB,GAAG,CACzB,OAAgB,EAChB,KAIC,EACqC,EAAE;IACxC,OAAO,wBAAwB,CAAC;QAC9B,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,uBAAuB;QACrC,OAAO;QACP,iBAAiB,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAC7C,wBAAwB,CACtB,KAAK,CAAC,cAAc,IAAI,EAAE,EAC1B,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,YAAY,EACZ,SAAS,CACV;KACJ,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAC/B,cAAiC,EACjC,aAAiC,EACjC,cAAkC,EAClC,YAAoB,EACpB,SAAkB,EACV,EAAE;IACV,MAAM,sBAAsB,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACpF,MAAM,wBAAwB,GAC5B,cAAc;QACd,IAAI;QACF,qGAAqG;QACrG,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EACxC,YAAY,EACZ,OAAO,CACR,CAAC;IAEJ,IAAI,YAAY,KAAK,YAAY,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,aAAa,GAAG,sBAAsB,CAAC,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IAE5F,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,IAAI;IACT,qGAAqG;IACrG,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EACxC,KAAK,EACL,OAAO,EACP,sBAAsB,CACvB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,gCAAgC,GAAG,kCAAkC,CAAC;AAE5E,MAAM,oBAAoB,GAAG,CAAC,QAA2B,EAAE,cAAiC,EAAqB,EAAE,CAAC;IAClH,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC;CAC9F,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,aAAqB,EAAqB,EAAE;IAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEzE,OAAO,4BAA4B,CAAC,YAAY,EAAE,0BAA0B,CAAC;SAC1E,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;SACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;SAC9C,IAAI,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,cAAc,GAClB,CAAC,UAAkB,EAAE,EAAE,CACvB,CAAC,KAAa,EAAW,EAAE,CACzB,KAAK,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;AAE5E,MAAM,mCAAmC,GAAG,CAC1C,QAA2B,EAC3B,cAAiC,EACb,EAAE;IACtB,MAAM,iBAAiB,GAAG;QACxB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;KAClG,CAAC;IAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,yBAAyB,CAAC,QAAQ,CAAC;QACvD,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,gCAAgC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC7G,CAAC,CAAC,SAAS,CAAC;IACd,OAAO,CAAC,GAAG,aAAa,CAAC,aAAa,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,QAA2B,EAAW,EAAE,CACzE,QAAQ,CAAC,yBAAyB,KAAK,IAAI,IAAI,QAAQ,CAAC,4BAA4B,KAAK,IAAI,CAAC;AAEhG,MAAM,4BAA4B,GAAG,CAAC,aAAqB,EAAU,EAAE,CACrE,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AAEhE,MAAM,4BAA4B,GAAG,CAAC,UAAkB,EAAW,EAAE,CACnE,4BAA4B,CAAC,UAAU,EAAE,8BAA8B,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;AAEhH,MAAM,kBAAkB,GACtB,CAAC,UAAkB,EAAE,EAAE,CACvB,CAAC,KAAa,EAAW,EAAE,CACzB,KAAK,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;AAE3E,MAAM,4BAA4B,GAAG,CAAC,UAAkB,EAAE,WAAmB,EAAqB,EAAE;IAClG,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,kBAAkB,WAAW,KAAK,UAAU,MAAM,qBAAqB,CAAC,KAAK,CAAC,EAAE,EAAE;YAChG,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAW,EAAE;IACvC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,MAAM,qBAAqB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACzG,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAW,EAAE,CACrD,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAE5F,MAAM,qBAAqB,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAExE,MAAM,aAAa,GAAG,CAAC,KAAyB,EAAqB,EAAE,CACrE,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;AAEpG,MAAM,eAAe,GAAG,CAAC,QAAyB,EAAqB,EAAE,CACvE,0BAA0B,CAAoB,QAAQ,EAAE,IAAI,CAAC,CAAC;AAEhE,MAAM,YAAY,GAAG,CAAC,QAA2B,EAAqB,EAAE,CAAC;IACvE,GAAG,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC;IACvC,GAAG,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC7C,GAAG,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC7C,GAAG,SAAS,CAAC,eAAe,EAAE,QAAQ,CAAC,gBAAgB,CAAC;IACxD,GAAG,SAAS,CAAC,mBAAmB,EAAE,QAAQ,CAAC,cAAc,CAAC;IAC1D,GAAG,SAAS,CAAC,iBAAiB,EAAE,QAAQ,CAAC,YAAY,CAAC;IACtD,GAAG,SAAS,CAAC,wBAAwB,EAAE,QAAQ,CAAC,kBAAkB,CAAC;IACnE,GAAG,UAAU,CAAC,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC;IACjD,GAAG,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC;IACzC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,QAAyB,EAAqB,EAAE;IAC/E,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAEzG,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC9B,WAAW,CAAC,IAAI,CACd,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;aACxB,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;aACzD,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,WAAW,EAAE,CAAC,CAC7C,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface PiCompositeProfilePaths {
2
+ readonly agentDirectory: string;
3
+ readonly profileMetadataPath: string;
4
+ }
5
+ export declare const createPiCompositeProfilePaths: (agentDirectory: string) => PiCompositeProfilePaths;
@@ -0,0 +1,7 @@
1
+ // Defines pi-specific compositeProfile path metadata.
2
+ import { join } from 'node:path';
3
+ export const createPiCompositeProfilePaths = (agentDirectory) => ({
4
+ agentDirectory,
5
+ profileMetadataPath: join(agentDirectory, 'outfitter', 'profile.json'),
6
+ });
7
+ //# sourceMappingURL=PiCompositeProfileWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PiCompositeProfileWriter.js","sourceRoot":"","sources":["../../../src/agents/pi/PiCompositeProfileWriter.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,cAAsB,EAA2B,EAAE,CAAC,CAAC;IACjG,cAAc;IACd,mBAAmB,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,cAAc,CAAC;CACvE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type CompositeProfileFile } from '../../compositeProfile/CompositeProfileFile.js';
2
+ export declare const createPiMcpConfigFile: (rootDirectory: string, profileFolders?: readonly string[]) => CompositeProfileFile | undefined;
@@ -0,0 +1,114 @@
1
+ // Merges profile-provided Pi MCP configuration fragments into a composite profile file.
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { createCompositeProfileFile } from '../../compositeProfile/CompositeProfileFile.js';
5
+ import { mergeArrayByPolicy } from '../../merge/ArrayMergePolicy.js';
6
+ const piMcpConfigPath = '.mcp.json';
7
+ export const createPiMcpConfigFile = (rootDirectory, profileFolders = []) => {
8
+ const sourceInputs = findPiMcpConfigSources(profileFolders);
9
+ if (sourceInputs.length === 0) {
10
+ return undefined;
11
+ }
12
+ const mergedConfig = sourceInputs
13
+ .map(readPiMcpConfigSource)
14
+ .reduce((mergedConfig, config) => mergePiMcpConfigObjects(mergedConfig, config), {});
15
+ return createCompositeProfileFile({
16
+ rootDirectory,
17
+ relativePath: piMcpConfigPath,
18
+ content: `${JSON.stringify(mergedConfig, null, 2)}\n`,
19
+ sourceInputs,
20
+ strategy: 'merge',
21
+ });
22
+ };
23
+ const findPiMcpConfigSources = (profileFolders) => profileFolders
24
+ .map((profileFolder) => join(profileFolder, 'cli_specific', 'pi', piMcpConfigPath))
25
+ .filter((candidate) => existsSync(candidate));
26
+ const readPiMcpConfigSource = (sourcePath) => {
27
+ const parsed = parsePiMcpConfigJson(sourcePath);
28
+ if (!isJsonObject(parsed)) {
29
+ throw new Error(`Pi MCP config '${sourcePath}' must contain a JSON object.`);
30
+ }
31
+ return parsed;
32
+ };
33
+ const parsePiMcpConfigJson = (sourcePath) => {
34
+ const content = readPiMcpConfigContent(sourcePath);
35
+ try {
36
+ return JSON.parse(content);
37
+ }
38
+ catch (error) {
39
+ throw new Error(`Pi MCP config '${sourcePath}' must contain valid JSON.`, { cause: error });
40
+ }
41
+ };
42
+ const readPiMcpConfigContent = (sourcePath) => {
43
+ try {
44
+ return readFileSync(sourcePath, 'utf8');
45
+ }
46
+ catch (error) {
47
+ throw new Error(`Could not read Pi MCP config '${sourcePath}': ${String(error)}`, { cause: error });
48
+ }
49
+ };
50
+ const mergePiMcpConfigObjects = (lowerPrecedence, higherPrecedence, path = []) => ({
51
+ ...lowerPrecedence,
52
+ ...Object.fromEntries(Object.entries(higherPrecedence)
53
+ .filter((entry) => entry[1] !== undefined)
54
+ .map(([key, value]) => [
55
+ key,
56
+ key in lowerPrecedence
57
+ ? mergePiMcpConfigValue(lowerPrecedence[key], value, [...path, key])
58
+ : clonePiMcpConfigValue(value),
59
+ ])),
60
+ });
61
+ const mergePiMcpConfigValue = (lowerPrecedence, higherPrecedence, path) => {
62
+ if (Array.isArray(higherPrecedence)) {
63
+ return mergeArrayByPolicy(isMergeableArray(lowerPrecedence) ? lowerPrecedence : undefined, higherPrecedence, {
64
+ mode: 'uniqueBy',
65
+ order: 'append',
66
+ winner: 'last',
67
+ key: piMcpArrayItemIdentity,
68
+ });
69
+ }
70
+ if (isJsonObject(lowerPrecedence) && isJsonObject(higherPrecedence) && !isMcpServerDefinitionPath(path)) {
71
+ return mergePiMcpConfigObjects(lowerPrecedence, higherPrecedence, path);
72
+ }
73
+ return clonePiMcpConfigValue(higherPrecedence);
74
+ };
75
+ const isMcpServerDefinitionPath = (path) => path.length === 2 && path[0] === 'mcpServers';
76
+ const piMcpArrayItemIdentity = (item) => {
77
+ if (isJsonObject(item)) {
78
+ const explicitIdentity = item.identity ?? item.name ?? item.id;
79
+ return explicitIdentity === undefined
80
+ ? `anonymous:${stableJsonStringify(item)}`
81
+ : `explicit:${stringifyExplicitIdentity(explicitIdentity)}`;
82
+ }
83
+ return `anonymous:${stableJsonStringify(item)}`;
84
+ };
85
+ const stringifyExplicitIdentity = (value) => {
86
+ if (typeof value === 'string') {
87
+ return value;
88
+ }
89
+ return stableJsonStringify(value);
90
+ };
91
+ const stableJsonStringify = (value) => JSON.stringify(sortJsonObjectKeys(value));
92
+ const sortJsonObjectKeys = (value) => {
93
+ if (isMergeableArray(value)) {
94
+ return value.map(sortJsonObjectKeys);
95
+ }
96
+ if (isJsonObject(value)) {
97
+ return Object.fromEntries(Object.keys(value)
98
+ .sort()
99
+ .map((key) => [key, sortJsonObjectKeys(value[key])]));
100
+ }
101
+ return value;
102
+ };
103
+ const clonePiMcpConfigValue = (value) => {
104
+ if (isMergeableArray(value)) {
105
+ return value.map(clonePiMcpConfigValue);
106
+ }
107
+ if (isJsonObject(value)) {
108
+ return mergePiMcpConfigObjects({}, value);
109
+ }
110
+ return value;
111
+ };
112
+ const isJsonObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
113
+ const isMergeableArray = (value) => Array.isArray(value);
114
+ //# sourceMappingURL=PiMcpConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PiMcpConfig.js","sourceRoot":"","sources":["../../../src/agents/pi/PiMcpConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ArrayMergePolicy } from '../../merge/ArrayMergePolicy.js';
2
+ export type PiSettingsArrayName = 'packages' | 'extensions' | 'skills' | 'prompts' | 'themes';
3
+ export declare const piSettingsArrayPolicies: {
4
+ readonly packages: {
5
+ readonly mode: "uniqueBy";
6
+ readonly order: "append";
7
+ readonly winner: "last";
8
+ readonly key: (entry: unknown) => string;
9
+ };
10
+ readonly extensions: ArrayMergePolicy<unknown>;
11
+ readonly skills: ArrayMergePolicy<unknown>;
12
+ readonly prompts: ArrayMergePolicy<unknown>;
13
+ readonly themes: ArrayMergePolicy<unknown>;
14
+ };
15
+ export declare const filterPiSettingsPackagesDuplicatingExtensions: (packages: readonly unknown[], extensionSources: readonly string[]) => readonly unknown[];
16
+ export declare const normalizePiSettingsPackageResourceIdentity: (entry: unknown) => string | undefined;
17
+ export declare const readPiSettingsPackageSource: (entry: unknown) => string | undefined;