@ai-outfitter/outfitter 1.5.0 → 1.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/README.md +11 -2
- package/code/pi-extension/src/outfitter-extension.js +9 -1
- package/dist/agents/AgentLaunch.d.ts +2 -2
- package/dist/agents/AgentLaunch.js +4 -3
- package/dist/agents/AgentLaunch.js.map +1 -1
- package/dist/agents/ClaudeStatePersistence.d.ts +18 -0
- package/dist/agents/ClaudeStatePersistence.js +225 -0
- package/dist/agents/ClaudeStatePersistence.js.map +1 -0
- package/dist/cli/OutfitterCli.js +1 -1
- package/dist/cli/OutfitterCli.js.map +1 -1
- package/dist/cli/commands/DumpCommand.d.ts +1 -0
- package/dist/cli/commands/DumpCommand.js +11 -1
- package/dist/cli/commands/DumpCommand.js.map +1 -1
- package/dist/cli/commands/ListCommand.d.ts +2 -0
- package/dist/cli/commands/ListCommand.js +15 -4
- package/dist/cli/commands/ListCommand.js.map +1 -1
- package/dist/cli/commands/RunAgentCommand.js +85 -17
- package/dist/cli/commands/RunAgentCommand.js.map +1 -1
- package/dist/cli/commands/SyncCommand.d.ts +8 -3
- package/dist/cli/commands/SyncCommand.js +126 -21
- package/dist/cli/commands/SyncCommand.js.map +1 -1
- package/dist/cli/commands/ValidateCommand.js +1 -1
- package/dist/cli/commands/ValidateCommand.js.map +1 -1
- package/dist/projection/CodexMcp.d.ts +11 -0
- package/dist/projection/CodexMcp.js +143 -0
- package/dist/projection/CodexMcp.js.map +1 -0
- package/dist/projection/Materialize.d.ts +3 -1
- package/dist/projection/Materialize.js +7 -3
- package/dist/projection/Materialize.js.map +1 -1
- package/dist/projection/ProjectHarness.js +66 -29
- package/dist/projection/ProjectHarness.js.map +1 -1
- package/dist/projection/Projection.d.ts +2 -0
- package/dist/resolver/AmbiguityWarnings.d.ts +7 -0
- package/dist/resolver/AmbiguityWarnings.js +86 -0
- package/dist/resolver/AmbiguityWarnings.js.map +1 -0
- package/dist/resolver/Layer.d.ts +8 -2
- package/dist/resolver/Layer.js +48 -8
- package/dist/resolver/Layer.js.map +1 -1
- package/dist/resolver/ResolverContext.d.ts +3 -1
- package/dist/resolver/ResolverContext.js +11 -2
- package/dist/resolver/ResolverContext.js.map +1 -1
- package/dist/resolver/ResolverValidation.d.ts +12 -1
- package/dist/resolver/ResolverValidation.js +30 -20
- package/dist/resolver/ResolverValidation.js.map +1 -1
- package/dist/schemas/settings.schema.json +1 -1
- package/dist/schemas/system-extension-hook.schema.json +38 -0
- package/dist/settings/Settings.d.ts +1 -1
- package/dist/settings/Settings.js +1 -1
- package/dist/settings/Settings.js.map +1 -1
- package/dist/settings/SettingsLoader.js.map +1 -1
- package/dist/setup/DefaultCatalog.d.ts +18 -0
- package/dist/setup/DefaultCatalog.js +74 -13
- package/dist/setup/DefaultCatalog.js.map +1 -1
- package/dist/sources/SourceCache.d.ts +20 -0
- package/dist/sources/SourceCache.js +31 -1
- package/dist/sources/SourceCache.js.map +1 -1
- package/dist/sources/TransitiveSources.d.ts +45 -0
- package/dist/sources/TransitiveSources.js +179 -0
- package/dist/sources/TransitiveSources.js.map +1 -0
- package/dist/system/SystemExtensionHook.d.ts +34 -0
- package/dist/system/SystemExtensionHook.js +190 -0
- package/dist/system/SystemExtensionHook.js.map +1 -0
- package/dist/validation/SchemaValidator.d.ts +1 -1
- package/dist/validation/SchemaValidator.js +2 -0
- package/dist/validation/SchemaValidator.js.map +1 -1
- package/docs/architecture/state_writeback_strategy.md +15 -3
- package/docs/documentation/README.md +14 -1
- package/docs/documentation/catalogs.md +61 -2
- package/docs/documentation/cli.md +2 -1
- package/docs/documentation/concepts.md +2 -2
- package/docs/documentation/hooks.md +33 -0
- package/docs/documentation/in-cluster.md +2 -0
- package/docs/documentation/migration.md +1 -1
- package/docs/documentation/personas.md +1 -1
- package/docs/documentation/settings.md +1 -1
- package/docs/documentation/state.md +27 -0
- package/docs/documentation/support-matrix.md +34 -23
- package/docs/documentation/usecases/org-onboarding-sdlc-report.md +143 -0
- package/docs/documentation/usecases/persona-reviews.md +1 -1
- package/docs/philosophy.md +20 -0
- package/package.json +1 -1
- package/src/schemas/settings.schema.json +1 -1
- package/src/schemas/system-extension-hook.schema.json +38 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Outfitter
|
|
2
2
|
|
|
3
|
-
Outfitter is the toolchain for [`.agents`](./docs/documentation/concepts.md#the-agents-protocol): it resolves agent configuration from local and remote `.agents` trees, composes agents, skills, and knowledge by slug, and launches the result through wrapped agent CLIs like [`pi`](https://github.com/earendil-works/pi-coding-agent) and
|
|
3
|
+
Outfitter is the toolchain for [`.agents`](./docs/documentation/concepts.md#the-agents-protocol): it resolves agent configuration from local and remote `.agents` trees, composes agents, skills, and knowledge by slug, and launches the result through wrapped agent CLIs like [`pi`](https://github.com/earendil-works/pi-coding-agent), Claude Code, and Codex CLI.
|
|
4
4
|
|
|
5
5
|
Outfitter does not own a configuration format. Your `.agents/` directory is the source of truth — useful without Outfitter, committed and reviewed like any other code.
|
|
6
6
|
|
|
@@ -34,7 +34,15 @@ outfitter
|
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
Pi is bundled and also hosts Outfitter's setup walkthrough. Install other runtime harnesses, such as
|
|
37
|
-
Claude Code, separately. For the full walkthrough, see [Getting started](./docs/documentation/getting-started.md).
|
|
37
|
+
Claude Code and Codex CLI, separately. For the full walkthrough, see [Getting started](./docs/documentation/getting-started.md).
|
|
38
|
+
|
|
39
|
+
## Climb the ramp
|
|
40
|
+
|
|
41
|
+
Three runbooks, one per rung of [the adoption ramp](./docs/philosophy.md#the-ramp-to-an-autonomous-lifecycle). Each starts where the previous one ended and closes with the one concrete step that begins the next rung. Their success checks are the signals an [SDLC assessment](./docs/documentation/usecases/org-onboarding-sdlc-report.md) reports, so "done" is something you run rather than something you judge.
|
|
42
|
+
|
|
43
|
+
1. [**Share one catalog**](./docs/runbooks/share-one-catalog.md) — one pinned catalog the organization shares, instead of per-laptop configuration. → **delegated**
|
|
44
|
+
2. [**Run it without your laptop**](./docs/runbooks/run-without-your-laptop.md) — an event triggers the workflow, its output lands through review, and the session is captured. → **automated**
|
|
45
|
+
3. [**Give the agent a residence**](./docs/runbooks/give-the-agent-a-residence.md) — a named, assignable agent with an account and somewhere to live. → **governed**
|
|
38
46
|
|
|
39
47
|
## Already have a `.agents/` directory?
|
|
40
48
|
|
|
@@ -82,6 +90,7 @@ Layers merge by ID: `<project>/.agents/` over `~/.agents/` over pinned remote [c
|
|
|
82
90
|
|
|
83
91
|
The [documentation index](./docs/documentation/README.md) follows the same arc — set up your own, understand the pieces, share across your org, automate more surfaces, contribute back:
|
|
84
92
|
|
|
93
|
+
- **Climb:** [Share one catalog](./docs/runbooks/share-one-catalog.md) · [Run it without your laptop](./docs/runbooks/run-without-your-laptop.md) · [Give the agent a residence](./docs/runbooks/give-the-agent-a-residence.md)
|
|
85
94
|
- **Start:** [Getting started](./docs/documentation/getting-started.md) · [First-time CLI agent users](./docs/documentation/first-time-cli-agent-users.md) · [Switching to Outfitter](./docs/documentation/switching-to-outfitter.md)
|
|
86
95
|
- **Understand:** [Concepts](./docs/documentation/concepts.md) · [Agents](./docs/documentation/agents.md) · [Skills](./docs/documentation/skills.md) · [Personas](./docs/documentation/personas.md) · [Subagents and delegation](./docs/documentation/subagents.md)
|
|
87
96
|
- **Share:** [Catalogs](./docs/documentation/catalogs.md) · [Conventions](./docs/documentation/conventions.md) · [Organization catalog](./docs/documentation/usecases/organization-profile-catalog.md) · [Best practices](./docs/documentation/best-practices.md)
|
|
@@ -126,6 +126,12 @@ export default function outfitter(pi) {
|
|
|
126
126
|
label: 'Claude Code',
|
|
127
127
|
description: "Use Anthropic's separately installed Claude Code CLI.",
|
|
128
128
|
},
|
|
129
|
+
{
|
|
130
|
+
value: 'codex',
|
|
131
|
+
label: 'Codex CLI',
|
|
132
|
+
description:
|
|
133
|
+
"Use OpenAI's separately installed Codex CLI. Projects model and MCP servers only; agent identity is not projected yet.",
|
|
134
|
+
},
|
|
129
135
|
];
|
|
130
136
|
return selectFromItems(ctx, ['Which CLI agent should Outfitter use by default?'], items, 'pi');
|
|
131
137
|
},
|
|
@@ -458,7 +464,9 @@ const selectFromItems = async (ctx, titleLines, items, initialValue) => {
|
|
|
458
464
|
items.map((item) => item.label),
|
|
459
465
|
);
|
|
460
466
|
if (selected === undefined) return undefined;
|
|
461
|
-
return items.some((item) => item.value === selected)
|
|
467
|
+
return items.some((item) => item.value === selected)
|
|
468
|
+
? selected
|
|
469
|
+
: items.find((item) => item.label === selected)?.value;
|
|
462
470
|
};
|
|
463
471
|
|
|
464
472
|
const selectDescribedOption = (ctx, titleLines, items, initialValue) =>
|
|
@@ -24,8 +24,8 @@ export declare const attachSignalForwarding: (child: {
|
|
|
24
24
|
export declare const spawnLauncher: AgentProcessLauncher;
|
|
25
25
|
/**
|
|
26
26
|
* Launches a resolved plan through the given spawn boundary. The install-hint agentId is derived
|
|
27
|
-
* from the logical launch command ('pi' | 'claude') so a missing-CLI failure always names
|
|
28
|
-
* harness actually being launched, regardless of how the harness was selected (flag, settings
|
|
27
|
+
* from the logical launch command ('pi' | 'claude' | 'codex') so a missing-CLI failure always names
|
|
28
|
+
* the harness actually being launched, regardless of how the harness was selected (flag, settings
|
|
29
29
|
* default, or built-in fallback).
|
|
30
30
|
*/
|
|
31
31
|
export declare const launchThroughSpawn: (spawn: AgentProcessLauncher, plan: AgentLaunchPlan) => Promise<number>;
|
|
@@ -104,15 +104,16 @@ export const spawnLauncher = {
|
|
|
104
104
|
/* v8 ignore stop */
|
|
105
105
|
/**
|
|
106
106
|
* Launches a resolved plan through the given spawn boundary. The install-hint agentId is derived
|
|
107
|
-
* from the logical launch command ('pi' | 'claude') so a missing-CLI failure always names
|
|
108
|
-
* harness actually being launched, regardless of how the harness was selected (flag, settings
|
|
107
|
+
* from the logical launch command ('pi' | 'claude' | 'codex') so a missing-CLI failure always names
|
|
108
|
+
* the harness actually being launched, regardless of how the harness was selected (flag, settings
|
|
109
109
|
* default, or built-in fallback).
|
|
110
110
|
*/
|
|
111
111
|
export const launchThroughSpawn = (spawn, plan) => launchAgentProcess(spawn, resolveAgentLaunchExecutable(plan), plan.command);
|
|
112
112
|
const isCommandNotFoundError = (error) => error !== null && typeof error === 'object' && 'code' in error && error.code === 'ENOENT';
|
|
113
113
|
const agentCliInstallHints = {
|
|
114
114
|
pi: 'Install Pi with `npm install -g @earendil-works/pi-coding-agent` (see https://pi.dev).',
|
|
115
|
-
claude: 'Install Claude Code from https://claude.com/claude-code, then rerun with `--
|
|
115
|
+
claude: 'Install Claude Code from https://claude.com/claude-code, then rerun with `--harness claude`.',
|
|
116
|
+
codex: 'Install Codex CLI from https://developers.openai.com/codex/cli, then rerun with `--harness codex`.',
|
|
116
117
|
};
|
|
117
118
|
const formatMissingAgentCliMessage = (agentId, command) => {
|
|
118
119
|
const installHint = agentCliInstallHints[agentId];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentLaunch.js","sourceRoot":"","sources":["../../src/agents/AgentLaunch.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"AgentLaunch.js","sourceRoot":"","sources":["../../src/agents/AgentLaunch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ClaudeSessionSeed {
|
|
2
|
+
readonly hashes: ReadonlyMap<string, string>;
|
|
3
|
+
readonly warning?: string;
|
|
4
|
+
}
|
|
5
|
+
/** Claude replaces every non-alphanumeric character in an absolute project path with `-`. */
|
|
6
|
+
export declare const resolveClaudeProjectSlug: (workingDirectory: string) => string;
|
|
7
|
+
/** Seeds only the current working directory's durable Claude session history. */
|
|
8
|
+
export declare const seedClaudeSessions: (projectionRoot: string, homeDirectory: string, workingDirectory: string) => ClaudeSessionSeed;
|
|
9
|
+
/** Recursively merges projected Claude session artifacts without deleting durable files. */
|
|
10
|
+
export declare const persistClaudeSessions: (projectionRoot: string, homeDirectory: string, seededHashes?: ReadonlyMap<string, string>) => string | undefined;
|
|
11
|
+
/** Seeds credentials, onboarding/account state, and the current workspace's trust decision. */
|
|
12
|
+
export declare const seedClaudeCredentials: (projectionRoot: string, homeDirectory: string, workingDirectory: string) => string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Copies changed credentials back and atomically merges account metadata into durable state.
|
|
15
|
+
* Returns a warning when a concurrent writer changed the durable credentials during the run, in
|
|
16
|
+
* which case the copy-back is skipped so the newer concurrent refresh is not overwritten.
|
|
17
|
+
*/
|
|
18
|
+
export declare const persistClaudeCredentials: (projectionRoot: string, homeDirectory: string, seededCredentialsHash?: string) => string | undefined;
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// Persists Claude Code credentials and sessions across runs. CLAUDE_CONFIG_DIR points Claude at an
|
|
2
|
+
// ephemeral projection root, but its durable Claude and MCP OAuth credentials normally live in
|
|
3
|
+
// ~/.claude/.credentials.json while account metadata, onboarding state, and workspace trust live in
|
|
4
|
+
// ~/.claude.json. Seed only the required top-level state and the current workspace's existing trust
|
|
5
|
+
// decision; merge credential and project-session changes back without exposing or replacing the
|
|
6
|
+
// rest of Claude's machine-local state.
|
|
7
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
8
|
+
import { chmodSync, copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
|
|
9
|
+
import { dirname, join, relative } from 'node:path';
|
|
10
|
+
const CREDENTIALS_FILE = '.credentials.json';
|
|
11
|
+
const STATE_FILE = '.claude.json';
|
|
12
|
+
const CREDENTIAL_MODE = 0o600;
|
|
13
|
+
const PROJECTS_DIRECTORY = 'projects';
|
|
14
|
+
const hashFile = (path) => {
|
|
15
|
+
try {
|
|
16
|
+
return createHash('sha256').update(readFileSync(path)).digest('hex');
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const isJsonObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
23
|
+
const readJsonObject = (path) => {
|
|
24
|
+
try {
|
|
25
|
+
const value = JSON.parse(readFileSync(path, 'utf8'));
|
|
26
|
+
return isJsonObject(value) ? value : undefined;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const atomicReplace = (destinationPath, fillTemporary) => {
|
|
33
|
+
const destinationDirectory = dirname(destinationPath);
|
|
34
|
+
mkdirSync(destinationDirectory, { recursive: true });
|
|
35
|
+
const temporaryPath = join(destinationDirectory, `.outfitter-${randomUUID()}`);
|
|
36
|
+
try {
|
|
37
|
+
fillTemporary(temporaryPath);
|
|
38
|
+
renameSync(temporaryPath, destinationPath);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
rmSync(temporaryPath, { force: true });
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const atomicCopy = (sourcePath, destinationPath) => {
|
|
45
|
+
if (!existsSync(sourcePath))
|
|
46
|
+
return;
|
|
47
|
+
atomicReplace(destinationPath, (temporaryPath) => {
|
|
48
|
+
copyFileSync(sourcePath, temporaryPath);
|
|
49
|
+
chmodSync(temporaryPath, CREDENTIAL_MODE);
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
const atomicCopyIfUnchanged = (sourcePath, destinationPath, expectedDestinationHash) => {
|
|
53
|
+
const destinationDirectory = dirname(destinationPath);
|
|
54
|
+
mkdirSync(destinationDirectory, { recursive: true });
|
|
55
|
+
const temporaryPath = join(destinationDirectory, `.outfitter-${randomUUID()}`);
|
|
56
|
+
try {
|
|
57
|
+
copyFileSync(sourcePath, temporaryPath);
|
|
58
|
+
chmodSync(temporaryPath, CREDENTIAL_MODE);
|
|
59
|
+
if (hashFile(destinationPath) !== expectedDestinationHash)
|
|
60
|
+
return false;
|
|
61
|
+
renameSync(temporaryPath, destinationPath);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
rmSync(temporaryPath, { force: true });
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const atomicWriteJson = (path, value) => {
|
|
69
|
+
atomicReplace(path, (temporaryPath) => {
|
|
70
|
+
writeFileSync(temporaryPath, `${JSON.stringify(value, null, 2)}\n`, { mode: CREDENTIAL_MODE });
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
/** Claude replaces every non-alphanumeric character in an absolute project path with `-`. */
|
|
74
|
+
export const resolveClaudeProjectSlug = (workingDirectory) => workingDirectory.replace(/[^a-zA-Z0-9]/g, '-');
|
|
75
|
+
const summarizePaths = (kind, paths) => paths.length === 0
|
|
76
|
+
? undefined
|
|
77
|
+
: `Warning: Claude session persistence ${kind === 'conflicts' ? 'skipped concurrently changed files' : 'failed for files'}: ${paths.join(', ')}.`;
|
|
78
|
+
const walkRegularFiles = (root, visit, failures, current = root) => {
|
|
79
|
+
let entries;
|
|
80
|
+
try {
|
|
81
|
+
entries = readdirSync(current, { withFileTypes: true });
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
failures.push(relative(root, current) || '.');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
for (const entry of entries) {
|
|
88
|
+
const path = join(current, entry.name);
|
|
89
|
+
const relativePath = relative(root, path);
|
|
90
|
+
if (entry.isDirectory())
|
|
91
|
+
walkRegularFiles(root, visit, failures, path);
|
|
92
|
+
else if (entry.isFile()) {
|
|
93
|
+
try {
|
|
94
|
+
visit(path, relativePath);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
failures.push(relativePath);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
/** Seeds only the current working directory's durable Claude session history. */
|
|
103
|
+
export const seedClaudeSessions = (projectionRoot, homeDirectory, workingDirectory) => {
|
|
104
|
+
const slug = resolveClaudeProjectSlug(workingDirectory);
|
|
105
|
+
const source = join(resolveClaudeUserConfigDirectory(homeDirectory), PROJECTS_DIRECTORY, slug);
|
|
106
|
+
const destination = join(projectionRoot, PROJECTS_DIRECTORY, slug);
|
|
107
|
+
const hashes = new Map();
|
|
108
|
+
const failures = [];
|
|
109
|
+
if (existsSync(source)) {
|
|
110
|
+
walkRegularFiles(source, (sourcePath, relativePath) => {
|
|
111
|
+
const hash = hashFile(sourcePath);
|
|
112
|
+
if (hash === undefined)
|
|
113
|
+
throw new Error('unreadable session artifact');
|
|
114
|
+
atomicCopy(sourcePath, join(destination, relativePath));
|
|
115
|
+
hashes.set(join(slug, relativePath), hash);
|
|
116
|
+
}, failures);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
hashes,
|
|
120
|
+
warning: summarizePaths('failures', failures.map((path) => join(slug, path))),
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
/** Recursively merges projected Claude session artifacts without deleting durable files. */
|
|
124
|
+
export const persistClaudeSessions = (projectionRoot, homeDirectory, seededHashes = new Map()) => {
|
|
125
|
+
const projectionProjects = join(projectionRoot, PROJECTS_DIRECTORY);
|
|
126
|
+
if (!existsSync(projectionProjects))
|
|
127
|
+
return undefined;
|
|
128
|
+
const durableProjects = join(resolveClaudeUserConfigDirectory(homeDirectory), PROJECTS_DIRECTORY);
|
|
129
|
+
const conflicts = [];
|
|
130
|
+
const failures = [];
|
|
131
|
+
let slugs;
|
|
132
|
+
try {
|
|
133
|
+
slugs = readdirSync(projectionProjects, { withFileTypes: true });
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return summarizePaths('failures', ['.']);
|
|
137
|
+
}
|
|
138
|
+
for (const slug of slugs) {
|
|
139
|
+
if (!slug.isDirectory())
|
|
140
|
+
continue;
|
|
141
|
+
const slugFailures = [];
|
|
142
|
+
walkRegularFiles(join(projectionProjects, slug.name), (projectionPath, nestedPath) => {
|
|
143
|
+
const relativePath = join(slug.name, nestedPath);
|
|
144
|
+
const projectedHash = hashFile(projectionPath);
|
|
145
|
+
if (projectedHash === undefined)
|
|
146
|
+
throw new Error('unreadable session artifact');
|
|
147
|
+
const seededHash = seededHashes.get(relativePath);
|
|
148
|
+
if (projectedHash === seededHash)
|
|
149
|
+
return;
|
|
150
|
+
const durablePath = join(durableProjects, relativePath);
|
|
151
|
+
const durableHash = hashFile(durablePath);
|
|
152
|
+
if (durableHash !== seededHash) {
|
|
153
|
+
conflicts.push(relativePath);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (!atomicCopyIfUnchanged(projectionPath, durablePath, durableHash))
|
|
157
|
+
conflicts.push(relativePath);
|
|
158
|
+
}, slugFailures);
|
|
159
|
+
failures.push(...slugFailures.map((path) => join(slug.name, path)));
|
|
160
|
+
}
|
|
161
|
+
return ([summarizePaths('conflicts', conflicts), summarizePaths('failures', failures)].filter(Boolean).join(' ') ||
|
|
162
|
+
undefined);
|
|
163
|
+
};
|
|
164
|
+
/** Claude's durable configuration directory (`~/.claude`). */
|
|
165
|
+
const resolveClaudeUserConfigDirectory = (homeDirectory) => join(homeDirectory, '.claude');
|
|
166
|
+
/** Claude's durable machine-local state file (`~/.claude.json`). */
|
|
167
|
+
const resolveClaudeUserStatePath = (homeDirectory) => join(homeDirectory, STATE_FILE);
|
|
168
|
+
const persistCredentialFile = (projectionRoot, homeDirectory, seededCredentialsHash) => {
|
|
169
|
+
const projectionCredentialsPath = join(projectionRoot, CREDENTIALS_FILE);
|
|
170
|
+
const projectedCredentialsHash = hashFile(projectionCredentialsPath);
|
|
171
|
+
if (projectedCredentialsHash === undefined || projectedCredentialsHash === seededCredentialsHash)
|
|
172
|
+
return undefined;
|
|
173
|
+
const durableCredentialsPath = join(resolveClaudeUserConfigDirectory(homeDirectory), CREDENTIALS_FILE);
|
|
174
|
+
if (hashFile(durableCredentialsPath) !== seededCredentialsHash) {
|
|
175
|
+
// Both this run and another process changed the credentials since seeding. The durable copy
|
|
176
|
+
// is the newer refresh; overwriting it with this projection would revert it.
|
|
177
|
+
return 'Warning: durable Claude credentials changed during the run; skipped the credential copy-back to preserve the concurrent refresh.';
|
|
178
|
+
}
|
|
179
|
+
atomicCopy(projectionCredentialsPath, durableCredentialsPath);
|
|
180
|
+
return undefined;
|
|
181
|
+
};
|
|
182
|
+
/** Seeds credentials, onboarding/account state, and the current workspace's trust decision. */
|
|
183
|
+
export const seedClaudeCredentials = (projectionRoot, homeDirectory, workingDirectory) => {
|
|
184
|
+
const projectionCredentialsPath = join(projectionRoot, CREDENTIALS_FILE);
|
|
185
|
+
atomicCopy(join(resolveClaudeUserConfigDirectory(homeDirectory), CREDENTIALS_FILE), projectionCredentialsPath);
|
|
186
|
+
const seededCredentialsHash = hashFile(projectionCredentialsPath);
|
|
187
|
+
const durableState = readJsonObject(resolveClaudeUserStatePath(homeDirectory));
|
|
188
|
+
if (durableState === undefined)
|
|
189
|
+
return seededCredentialsHash;
|
|
190
|
+
const seededState = {};
|
|
191
|
+
if (Object.hasOwn(durableState, 'oauthAccount'))
|
|
192
|
+
seededState.oauthAccount = durableState.oauthAccount;
|
|
193
|
+
if (Object.hasOwn(durableState, 'hasCompletedOnboarding')) {
|
|
194
|
+
seededState.hasCompletedOnboarding = durableState.hasCompletedOnboarding;
|
|
195
|
+
}
|
|
196
|
+
const projects = durableState.projects;
|
|
197
|
+
const project = isJsonObject(projects) ? projects[workingDirectory] : undefined;
|
|
198
|
+
if (isJsonObject(project) && project.hasTrustDialogAccepted === true) {
|
|
199
|
+
seededState.projects = { [workingDirectory]: { hasTrustDialogAccepted: true } };
|
|
200
|
+
}
|
|
201
|
+
if (Object.keys(seededState).length > 0) {
|
|
202
|
+
atomicWriteJson(join(projectionRoot, STATE_FILE), seededState);
|
|
203
|
+
}
|
|
204
|
+
return seededCredentialsHash;
|
|
205
|
+
};
|
|
206
|
+
/**
|
|
207
|
+
* Copies changed credentials back and atomically merges account metadata into durable state.
|
|
208
|
+
* Returns a warning when a concurrent writer changed the durable credentials during the run, in
|
|
209
|
+
* which case the copy-back is skipped so the newer concurrent refresh is not overwritten.
|
|
210
|
+
*/
|
|
211
|
+
export const persistClaudeCredentials = (projectionRoot, homeDirectory, seededCredentialsHash) => {
|
|
212
|
+
const warning = persistCredentialFile(projectionRoot, homeDirectory, seededCredentialsHash);
|
|
213
|
+
const projectionState = readJsonObject(join(projectionRoot, STATE_FILE));
|
|
214
|
+
if (projectionState === undefined || !Object.hasOwn(projectionState, 'oauthAccount'))
|
|
215
|
+
return warning;
|
|
216
|
+
const durableStatePath = resolveClaudeUserStatePath(homeDirectory);
|
|
217
|
+
const durableState = readJsonObject(durableStatePath);
|
|
218
|
+
if (durableState === undefined && existsSync(durableStatePath))
|
|
219
|
+
return warning;
|
|
220
|
+
if (JSON.stringify(projectionState.oauthAccount) === JSON.stringify(durableState?.oauthAccount))
|
|
221
|
+
return warning;
|
|
222
|
+
atomicWriteJson(durableStatePath, { ...(durableState ?? {}), oauthAccount: projectionState.oauthAccount });
|
|
223
|
+
return warning;
|
|
224
|
+
};
|
|
225
|
+
//# sourceMappingURL=ClaudeStatePersistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeStatePersistence.js","sourceRoot":"","sources":["../../src/agents/ClaudeStatePersistence.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/OutfitterCli.js
CHANGED
|
@@ -19,7 +19,7 @@ export const createOutfitterProgram = (commands = createDefaultCommands()) => {
|
|
|
19
19
|
const program = new Command();
|
|
20
20
|
program
|
|
21
21
|
.name('outfitter')
|
|
22
|
-
.description('Resolve, compose, and launch .agents agents in pi, Claude Code, and
|
|
22
|
+
.description('Resolve, compose, and launch .agents agents in pi, Claude Code, and Codex CLI.')
|
|
23
23
|
.version(readOutfitterVersion());
|
|
24
24
|
for (const command of commands) {
|
|
25
25
|
command.register(program);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OutfitterCli.js","sourceRoot":"","sources":["../../src/cli/OutfitterCli.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAoB,EAAE,CAAC;IAC1D,qBAAqB,EAAE;IACvB,kBAAkB,EAAE;IACpB,iBAAiB,EAAE;IACnB,iBAAiB,EAAE;IACnB,qBAAqB,EAAE;IACvB,iBAAiB,EAAE;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,WAAqC,qBAAqB,EAAE,EAAW,EAAE;IAC9G,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"OutfitterCli.js","sourceRoot":"","sources":["../../src/cli/OutfitterCli.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAoB,EAAE,CAAC;IAC1D,qBAAqB,EAAE;IACvB,kBAAkB,EAAE;IACpB,iBAAiB,EAAE;IACnB,iBAAiB,EAAE;IACnB,qBAAqB,EAAE;IACvB,iBAAiB,EAAE;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,WAAqC,qBAAqB,EAAE,EAAW,EAAE;IAC9G,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,gFAAgF,CAAC;SAC7F,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAEnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Provides `outfitter dump --agent <id> --out <dir>` over the effective resource set.
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { dumpAgent } from '../../dump/Dump.js';
|
|
4
|
+
import { strictAmbiguityFailureMessage } from '../../resolver/AmbiguityWarnings.js';
|
|
4
5
|
import { resolveEffectiveSet } from '../../resolver/ResolverContext.js';
|
|
5
6
|
import { resolveHomeDirectory, resolveProjectDirectory } from './ProcessDefaults.js';
|
|
6
7
|
const resolveAgentSlug = (settings, requested) => {
|
|
@@ -13,11 +14,18 @@ const resolveAgentSlug = (settings, requested) => {
|
|
|
13
14
|
return settings.defaultAgent;
|
|
14
15
|
};
|
|
15
16
|
export const executeDumpCommand = (input) => {
|
|
16
|
-
const { set, settings, settingsIssues, warnings } = resolveEffectiveSet(input);
|
|
17
|
+
const { set, settings, settingsIssues, warnings, ambiguityWarnings } = resolveEffectiveSet(input);
|
|
17
18
|
if (settingsIssues.length > 0) {
|
|
18
19
|
throw new Error(`Cannot dump with invalid settings: ${settingsIssues.map((issue) => issue.message).join('; ')}`);
|
|
19
20
|
}
|
|
20
21
|
const syncWarnings = warnings.map((warning) => `warning: ${warning}`);
|
|
22
|
+
if (input.strict === true && ambiguityWarnings.length > 0) {
|
|
23
|
+
return {
|
|
24
|
+
writtenPaths: [],
|
|
25
|
+
messages: [...syncWarnings, `error: ${strictAmbiguityFailureMessage}`],
|
|
26
|
+
ok: false,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
21
29
|
const agentSlug = resolveAgentSlug(settings, input.agent);
|
|
22
30
|
const result = dumpAgent(set, agentSlug, input.out, input.projectDirectory);
|
|
23
31
|
const ok = result.errors.length === 0;
|
|
@@ -38,6 +46,7 @@ export const createDumpCommand = (dependencies = {}) => ({
|
|
|
38
46
|
.description('Write the composed .agents tree for an agent to a directory.')
|
|
39
47
|
.option('--agent <id>', 'Agent slug to dump (default: settings default_agent).')
|
|
40
48
|
.option('--out <dir>', 'Output directory.', './outfitter-dump')
|
|
49
|
+
.option('--strict', 'Treat ambiguous source resolution as fatal.')
|
|
41
50
|
.action((options) => {
|
|
42
51
|
const result = executeDumpCommand({
|
|
43
52
|
/* v8 ignore next 2 -- process defaults are exercised by the CLI entrypoint, not unit tests. */
|
|
@@ -45,6 +54,7 @@ export const createDumpCommand = (dependencies = {}) => ({
|
|
|
45
54
|
projectDirectory: resolveProjectDirectory(dependencies.projectDirectory),
|
|
46
55
|
agent: options.agent,
|
|
47
56
|
out: options.out,
|
|
57
|
+
strict: options.strict,
|
|
48
58
|
});
|
|
49
59
|
for (const message of result.messages) {
|
|
50
60
|
/* v8 ignore next -- console fallback is direct CLI behavior; tests inject a writer. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DumpCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/DumpCommand.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAGxE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"DumpCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/DumpCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,10 @@ export interface ListInput {
|
|
|
4
4
|
readonly projectDirectory: string;
|
|
5
5
|
readonly kind?: string;
|
|
6
6
|
readonly agent?: string;
|
|
7
|
+
readonly strict?: boolean;
|
|
7
8
|
}
|
|
8
9
|
export interface ListResult {
|
|
10
|
+
readonly exitCode: number;
|
|
9
11
|
readonly messages: readonly string[];
|
|
10
12
|
}
|
|
11
13
|
export interface ListCommandDependencies {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Provides `outfitter list [kind]` over the effective resource set.
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
+
import { strictAmbiguityFailureMessage } from '../../resolver/AmbiguityWarnings.js';
|
|
3
4
|
import { agentLocalKinds, compareSlugs, findResource, listAgentResources, listResources, resourceKinds, } from '../../resolver/Resource.js';
|
|
4
5
|
import { resolveEffectiveSet } from '../../resolver/ResolverContext.js';
|
|
5
6
|
import { formatSettingsIssue } from '../../settings/SettingsLoader.js';
|
|
@@ -26,16 +27,22 @@ const resolveKindFilter = (kind) => {
|
|
|
26
27
|
}
|
|
27
28
|
return [resolved];
|
|
28
29
|
};
|
|
30
|
+
const assertKnownAgent = (set, agent) => {
|
|
31
|
+
if (agent !== undefined && findResource(set, 'agent', agent) === undefined) {
|
|
32
|
+
throw new Error(`Unknown agent '${agent}'. Run 'outfitter list agents' to see resolvable agents.`);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
29
35
|
export const executeListCommand = (input) => {
|
|
30
|
-
const { set, settingsIssues, warnings } = resolveEffectiveSet(input);
|
|
36
|
+
const { set, settingsIssues, warnings, ambiguityWarnings } = resolveEffectiveSet(input);
|
|
31
37
|
if (settingsIssues.length > 0) {
|
|
32
38
|
const detail = settingsIssues.map(formatSettingsIssue).join('; ');
|
|
33
39
|
throw new Error(`Cannot list resources with invalid settings: ${detail}`);
|
|
34
40
|
}
|
|
35
41
|
const messages = warnings.map((warning) => `warning: ${warning}`);
|
|
36
|
-
if (input.
|
|
37
|
-
|
|
42
|
+
if (input.strict === true && ambiguityWarnings.length > 0) {
|
|
43
|
+
return { exitCode: 1, messages: [...messages, `error: ${strictAmbiguityFailureMessage}`] };
|
|
38
44
|
}
|
|
45
|
+
assertKnownAgent(set, input.agent);
|
|
39
46
|
for (const kind of resolveKindFilter(input.kind)) {
|
|
40
47
|
const hasAgentContext = input.agent !== undefined && agentLocalKinds.includes(kind);
|
|
41
48
|
const globalResources = listResources(set, kind);
|
|
@@ -50,7 +57,7 @@ export const executeListCommand = (input) => {
|
|
|
50
57
|
.sort((left, right) => compareSlugs(left.slug, right.slug))
|
|
51
58
|
.map((resource) => ` ${resource.slug} [${resource.winner.layer.label}${resource.winner.ownerAgent === undefined ? '' : '; agent-local'}]`)));
|
|
52
59
|
}
|
|
53
|
-
return { messages };
|
|
60
|
+
return { exitCode: 0, messages };
|
|
54
61
|
};
|
|
55
62
|
export const createListCommand = (dependencies = {}) => ({
|
|
56
63
|
name: 'list',
|
|
@@ -59,6 +66,7 @@ export const createListCommand = (dependencies = {}) => ({
|
|
|
59
66
|
program.addCommand(new Command('list')
|
|
60
67
|
.description('List resolvable resources (agents, skills, knowledge, commands).')
|
|
61
68
|
.argument('[kind]', 'Restrict to one kind: agents, skills, knowledge, or commands.')
|
|
69
|
+
.option('--strict', 'Treat ambiguous source resolution as fatal.')
|
|
62
70
|
.option('--agent <id>', 'Resolve resources in an agent context, including its agent-local skills/knowledge/commands.')
|
|
63
71
|
.action((kind, options) => {
|
|
64
72
|
const result = executeListCommand({
|
|
@@ -67,11 +75,14 @@ export const createListCommand = (dependencies = {}) => ({
|
|
|
67
75
|
projectDirectory: resolveProjectDirectory(dependencies.projectDirectory),
|
|
68
76
|
kind,
|
|
69
77
|
agent: options.agent,
|
|
78
|
+
strict: options.strict,
|
|
70
79
|
});
|
|
71
80
|
for (const message of result.messages) {
|
|
72
81
|
/* v8 ignore next -- console fallback is direct CLI behavior; tests inject a writer. */
|
|
73
82
|
(dependencies.writeLine ?? console.log)(message);
|
|
74
83
|
}
|
|
84
|
+
if (result.exitCode !== 0)
|
|
85
|
+
process.exitCode = result.exitCode;
|
|
75
86
|
}));
|
|
76
87
|
},
|
|
77
88
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/ListCommand.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ListCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/ListCommand.ts"],"names":[],"mappings":"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"}
|