@ai-outfitter/outfitter 0.10.0 → 0.11.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.
@@ -280,10 +280,24 @@ export default function outfitter(pi) {
280
280
  await exportRuntimeSystemPrompt(ctx);
281
281
  if (ctx.mode !== "tui") return;
282
282
  ctx.ui.setHeader((_tui, theme) => {
283
- const lines = createStartupHeaderLines(theme, event.reason === "startup" && OUTFITTER_AUTO_OPEN);
283
+ const firstRun = event.reason === "startup" && OUTFITTER_AUTO_OPEN;
284
+ let cachedWidth;
285
+ let cachedLines;
284
286
  return {
285
- render: () => lines,
286
- invalidate: () => undefined,
287
+ // Pi-tui rejects render output wider than the terminal, so the header
288
+ // re-fits its lines to every width pi hands it instead of rendering once.
289
+ render: (width) => {
290
+ const maxWidth = typeof width === "number" && width > 0 ? width : 120;
291
+ if (cachedLines === undefined || cachedWidth !== maxWidth) {
292
+ cachedLines = createStartupHeaderLines(theme, firstRun, maxWidth);
293
+ cachedWidth = maxWidth;
294
+ }
295
+ return cachedLines;
296
+ },
297
+ invalidate: () => {
298
+ cachedWidth = undefined;
299
+ cachedLines = undefined;
300
+ },
287
301
  };
288
302
  });
289
303
  updateModeStatus(ctx);
@@ -334,33 +348,37 @@ export default function outfitter(pi) {
334
348
  });
335
349
  }
336
350
 
337
- const createStartupHeaderLines = (theme, firstRun) => {
338
- const brandLine = theme.bold(theme.fg("accent", "Outfitter")) + theme.fg("dim", " + pi");
339
- const commandHelp = theme.fg("muted", "/ commands · ! bash · shift+tab mode · ctrl+shift+t thinking · ctrl+o more");
351
+ // Every emitted line must fit maxWidth: pi-tui throws on over-wide render output,
352
+ // which crashed startup in narrow (e.g. 80x24 tmux) terminals. Prose wraps so no
353
+ // words are lost; ASCII art and the brand line truncate because wrapping them is noise.
354
+ const createStartupHeaderLines = (theme, firstRun, maxWidth) => {
340
355
  const lines = [];
356
+ const addTruncated = (line) => lines.push(visibleWidth(line) > maxWidth ? truncateToWidth(line, maxWidth) : line);
357
+ const addWrapped = (line) => {
358
+ for (const wrappedLine of wrapTextWithAnsi(line, Math.max(1, maxWidth))) addTruncated(wrappedLine);
359
+ };
341
360
 
342
361
  if (OUTFITTER_STARTUP_ASCII_ART) {
343
- lines.push(
344
- ...OUTFITTER_ASCII_ART.split("\n").map((line, index) => theme.fg(OUTFITTER_ASCII_GRADIENT[index] ?? "accent", line)),
345
- "",
362
+ OUTFITTER_ASCII_ART.split("\n").forEach((line, index) =>
363
+ addTruncated(theme.fg(OUTFITTER_ASCII_GRADIENT[index] ?? "accent", line)),
346
364
  );
365
+ lines.push("");
347
366
  }
348
367
 
349
- lines.push(brandLine, commandHelp);
368
+ addTruncated(theme.bold(theme.fg("accent", "Outfitter")) + theme.fg("dim", " + pi"));
369
+ addWrapped(theme.fg("muted", "/ commands · ! bash · shift+tab mode · ctrl+shift+t thinking · ctrl+o more"));
350
370
 
351
371
  if (firstRun) {
352
- lines.push(
353
- "",
354
- theme.fg("dim", "Outfitter turns Pi into a configured working environment:"),
355
- theme.fg("dim", "• profiles define model, tools, prompts, skills, and extensions"),
356
- theme.fg("dim", "• settings can live in your home folder or this project"),
357
- theme.fg("dim", "• catalogs let teams share setups through GitHub"),
358
- );
372
+ lines.push("");
373
+ addWrapped(theme.fg("dim", "Outfitter turns Pi into a configured working environment:"));
374
+ addWrapped(theme.fg("dim", " profiles define model, tools, prompts, skills, and extensions"));
375
+ addWrapped(theme.fg("dim", "• settings can live in your home folder or this project"));
376
+ addWrapped(theme.fg("dim", "• catalogs let teams share setups through GitHub"));
359
377
  return lines;
360
378
  }
361
379
 
362
- lines.push(
363
- "",
380
+ lines.push("");
381
+ addWrapped(
364
382
  theme.fg(
365
383
  "dim",
366
384
  "Outfitter + Pi can explain its own features and look up its docs. Ask it how to use or extend Pi or outfitter profiles.",
@@ -1,5 +1,5 @@
1
1
  // Resolves selected skill IDs, validates references, and materializes generated skills.
2
- import { copyFileSync, cpSync, existsSync, mkdirSync, realpathSync, statSync } from 'node:fs';
2
+ import { copyFileSync, cpSync, existsSync, globSync, mkdirSync, readdirSync, realpathSync, statSync, } from 'node:fs';
3
3
  import { basename, isAbsolute, join, relative, sep } from 'node:path';
4
4
  import { isSkillDocumentIssue, isValidSkillId, readSkillDocument, skillMaterializationSections, } from './SkillDocument.js';
5
5
  export const resolveSkillEntries = (input) => {
@@ -108,8 +108,16 @@ const resolveCatalogSkill = (input) => {
108
108
  for (const materialization of materializations) {
109
109
  const sectionDirectory = join(generatedDirectory, materialization.section);
110
110
  mkdirSync(sectionDirectory, { recursive: true });
111
- // copyFileSync preserves the source mode, so materialized scripts stay executable.
112
- copyFileSync(materialization.sourcePath, join(sectionDirectory, materialization.destinationName));
111
+ const destinationPath = join(sectionDirectory, materialization.destinationName);
112
+ // Both copies preserve the source mode, so materialized scripts stay
113
+ // executable. Directory targets dereference symlinks that the contained
114
+ // scan already validated, so the generated skill is self-contained.
115
+ if (materialization.kind === 'directory') {
116
+ copyDirectoryDereferenced(materialization.sourcePath, destinationPath);
117
+ }
118
+ else {
119
+ copyFileSync(materialization.sourcePath, destinationPath);
120
+ }
113
121
  }
114
122
  return { generatedDirectory, diagnostics };
115
123
  };
@@ -132,71 +140,215 @@ const planSkillMaterializations = (input, document, diagnostics) => {
132
140
  };
133
141
  const planSectionMaterializations = (input, section, entries, diagnostics) => {
134
142
  const materializations = [];
135
- const destinationNames = new Set();
143
+ const destinationSources = new Map();
136
144
  for (const { reference, fileRoot } of entries) {
137
- const resolved = resolveReferenceMaterialization({
145
+ const outcomes = resolveReferenceMaterializations({
138
146
  reference,
139
147
  section,
140
148
  fileRoot,
141
149
  projectDirectory: input.projectDirectory,
142
150
  skillPath: input.catalogEntry.skillPath,
143
151
  });
144
- if (resolved === undefined) {
145
- continue;
146
- }
147
- if ('message' in resolved) {
148
- diagnostics.push(resolved);
149
- continue;
152
+ for (const resolved of outcomes) {
153
+ if ('message' in resolved) {
154
+ diagnostics.push(resolved);
155
+ continue;
156
+ }
157
+ const collision = describeDestinationCollision(input, section, resolved, destinationSources);
158
+ if (collision !== undefined) {
159
+ diagnostics.push({ severity: 'error', path: input.catalogEntry.skillPath, message: collision });
160
+ continue;
161
+ }
162
+ destinationSources.set(resolved.destinationName, resolved.sourcePath);
163
+ materializations.push(resolved);
150
164
  }
151
- if (destinationNames.has(resolved.destinationName)) {
152
- diagnostics.push({
153
- severity: 'error',
154
- path: input.catalogEntry.skillPath,
155
- message: `Destination '${section}/${resolved.destinationName}' is declared more than once.`,
156
- });
157
- continue;
158
- }
159
- // Checked against the source skill directory during planning so lint reports
160
- // shipped-file collisions without materializing anything.
161
- if (existsSync(join(input.catalogEntry.directory, section, resolved.destinationName))) {
162
- diagnostics.push({
163
- severity: 'error',
164
- path: input.catalogEntry.skillPath,
165
- message: `Destination '${section}/${resolved.destinationName}' collides with a file ` +
166
- `already shipped by skill '${input.catalogEntry.id}'.`,
167
- });
168
- continue;
169
- }
170
- destinationNames.add(resolved.destinationName);
171
- materializations.push(resolved);
172
165
  }
173
166
  return materializations;
174
167
  };
168
+ /** Reports a destination claimed twice or already shipped inside the skill directory. */
169
+ const describeDestinationCollision = (input, section, resolved, destinationSources) => {
170
+ const previousSource = destinationSources.get(resolved.destinationName);
171
+ if (previousSource !== undefined) {
172
+ return (`Destination '${section}/${resolved.destinationName}' is declared more than once ` +
173
+ `(by '${previousSource}' and '${resolved.sourcePath}').`);
174
+ }
175
+ // Checked against the source skill directory during planning so lint reports
176
+ // shipped-file collisions without materializing anything.
177
+ if (existsSync(join(input.catalogEntry.directory, section, resolved.destinationName))) {
178
+ return (`Destination '${section}/${resolved.destinationName}' collides with a file ` +
179
+ `already shipped by skill '${input.catalogEntry.id}'.`);
180
+ }
181
+ return undefined;
182
+ };
175
183
  const describeReference = (reference, fileRoot, projectDirectory) => 'repo_file' in reference
176
184
  ? { declaredPath: reference.repo_file, root: projectDirectory, kind: 'repo_file', rootLabel: 'project' }
177
185
  : { declaredPath: reference.file, root: fileRoot, kind: 'file', rootLabel: 'catalog' };
178
- const resolveReferenceMaterialization = (input) => {
186
+ const targetError = (skillPath, message) => ({
187
+ severity: 'error',
188
+ path: skillPath,
189
+ message,
190
+ });
191
+ /**
192
+ * Resolves one reference entry to its materializations: one for a literal
193
+ * target, one per match for a glob target, and none for an omitted missing
194
+ * `repo_file` target.
195
+ */
196
+ const resolveReferenceMaterializations = (input) => {
179
197
  const { declaredPath, root, kind, rootLabel } = describeReference(input.reference, input.fileRoot, input.projectDirectory);
180
- const error = (message) => ({
181
- severity: 'error',
182
- path: input.skillPath,
183
- message,
184
- });
185
198
  if (root === undefined) {
186
- return error(`Reference ${kind} '${declaredPath}' has no ${rootLabel} root to resolve from.`);
199
+ return [
200
+ targetError(input.skillPath, `Reference ${kind} '${declaredPath}' has no ${rootLabel} root to resolve from.`),
201
+ ];
202
+ }
203
+ const context = { root, kind, rootLabel, section: input.section, skillPath: input.skillPath };
204
+ if (isGlobPattern(declaredPath)) {
205
+ return expandGlobMaterializations(declaredPath, context);
206
+ }
207
+ const resolved = resolveTargetMaterialization(declaredPath, context);
208
+ return resolved === undefined ? [] : [resolved];
209
+ };
210
+ /**
211
+ * Matches when a target uses glob syntax instead of naming one literal path.
212
+ * Only the gitignore-style metacharacters count; braces are literal path
213
+ * characters, so a braced filename resolves as a literal target.
214
+ */
215
+ const isGlobPattern = (declaredPath) => /[*?[]/u.test(declaredPath);
216
+ /**
217
+ * Expands a glob target against its root. Each match then follows the same
218
+ * rules as a literal target, so a matched directory materializes recursively
219
+ * while an escaping or special match fails validation individually.
220
+ */
221
+ const expandGlobMaterializations = (pattern, context) => {
222
+ // Braces are literal path characters in this contract, but globSync
223
+ // brace-expands them textually and offers no escape, so mixing them with
224
+ // glob syntax fails validation rather than silently matching other paths.
225
+ if (/[{}]/u.test(pattern)) {
226
+ return [
227
+ targetError(context.skillPath, `Reference ${context.kind} glob '${pattern}' must not contain braces; ` +
228
+ `braces are literal path characters, not glob syntax.`),
229
+ ];
230
+ }
231
+ // Sorted so diagnostics and collisions are deterministic across platforms.
232
+ const matches = globSync(pattern, { cwd: context.root }).sort();
233
+ if (matches.length === 0) {
234
+ // A consuming project may not contain repo_file matches; the reference is omitted.
235
+ return context.kind === 'repo_file'
236
+ ? []
237
+ : [targetError(context.skillPath, `Reference file glob '${pattern}' matched no files under '${context.root}'.`)];
187
238
  }
188
- const sourcePath = isAbsolute(declaredPath) ? declaredPath : join(root, declaredPath);
239
+ const resolved = [];
240
+ for (const match of matches) {
241
+ const outcome = resolveTargetMaterialization(match, context);
242
+ if (outcome !== undefined) {
243
+ resolved.push(outcome);
244
+ }
245
+ }
246
+ return resolved;
247
+ };
248
+ /** Validates one concrete target path — a literal target or a single glob match. */
249
+ const resolveTargetMaterialization = (targetPath, context) => {
250
+ const { root, kind, rootLabel, skillPath } = context;
251
+ const error = (message) => targetError(skillPath, message);
252
+ const sourcePath = isAbsolute(targetPath) ? targetPath : join(root, targetPath);
189
253
  if (!existsSync(sourcePath)) {
190
254
  // A consuming project may not contain a repo_file target; the reference is omitted.
191
- return kind === 'repo_file' ? undefined : error(`Reference file '${declaredPath}' was not found under '${root}'.`);
255
+ return kind === 'repo_file' ? undefined : error(`Reference file '${targetPath}' was not found under '${root}'.`);
192
256
  }
193
- if (!statSync(sourcePath).isFile()) {
194
- return error(`Reference ${kind} '${declaredPath}' must be a regular file.`);
257
+ const stats = statSync(sourcePath);
258
+ if (!stats.isFile() && !stats.isDirectory()) {
259
+ return error(`Reference ${kind} '${targetPath}' must be a regular file or directory.`);
195
260
  }
196
261
  if (escapesRoot(sourcePath, root)) {
197
- return error(`Reference ${kind} '${declaredPath}' resolves outside its ${rootLabel} root '${root}'.`);
262
+ return error(`Reference ${kind} '${targetPath}' resolves outside its ${rootLabel} root '${root}'.`);
263
+ }
264
+ const directoryIssue = describeDirectoryTargetIssue(stats, sourcePath, targetPath, context);
265
+ if (directoryIssue !== undefined) {
266
+ return error(directoryIssue);
267
+ }
268
+ return {
269
+ section: context.section,
270
+ sourcePath,
271
+ destinationName: basename(targetPath),
272
+ kind: stats.isDirectory() ? 'directory' : 'file',
273
+ };
274
+ };
275
+ /** Describes the first escaping, cyclic, or special path inside a directory target, if any. */
276
+ const describeDirectoryTargetIssue = (stats, sourcePath, targetPath, context) => {
277
+ if (!stats.isDirectory()) {
278
+ return undefined;
279
+ }
280
+ const issue = scanDirectoryTarget(sourcePath, context.root, [realpathSync(sourcePath)], new Set());
281
+ if (issue === undefined) {
282
+ return undefined;
283
+ }
284
+ const containedPath = relative(sourcePath, issue.path);
285
+ const problemDescriptions = {
286
+ escaping: `which resolves outside its ${context.rootLabel} root '${context.root}'`,
287
+ cyclic: 'which creates a symlink cycle',
288
+ special: 'which is not a regular file or directory',
289
+ };
290
+ return (`Reference ${context.kind} '${targetPath}' contains ` + `'${containedPath}', ${problemDescriptions[issue.problem]}.`);
291
+ };
292
+ /**
293
+ * Finds the first path inside a directory target whose realpath escapes the
294
+ * reference root, a symlink that cycles back into an ancestor directory, or an
295
+ * entry that is neither a regular file nor a directory. Directory
296
+ * materialization dereferences symlinks recursively, so an escaping link would
297
+ * smuggle outside content into the generated skill, a cyclic link would never
298
+ * finish copying, and a special file such as a FIFO could block the copy.
299
+ */
300
+ const scanDirectoryTarget = (directory, root,
301
+ /** Realpaths of the directories on the current descent, for cycle detection. */
302
+ ancestry,
303
+ /** Realpaths of fully scanned directories, so shared subtrees scan once. */
304
+ scanned) => {
305
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
306
+ const entryPath = join(directory, entry.name);
307
+ if (escapesRoot(entryPath, root)) {
308
+ return { path: entryPath, problem: 'escaping' };
309
+ }
310
+ // statSync follows symlinks, so in-root symlinked subdirectories are
311
+ // scanned too and a link to a special file is rejected like the file itself.
312
+ const entryStats = statSync(entryPath);
313
+ if (!entryStats.isFile() && !entryStats.isDirectory()) {
314
+ return { path: entryPath, problem: 'special' };
315
+ }
316
+ if (!entryStats.isDirectory()) {
317
+ continue;
318
+ }
319
+ const resolvedEntryPath = realpathSync(entryPath);
320
+ if (ancestry.includes(resolvedEntryPath)) {
321
+ return { path: entryPath, problem: 'cyclic' };
322
+ }
323
+ if (!scanned.has(resolvedEntryPath)) {
324
+ scanned.add(resolvedEntryPath);
325
+ const issue = scanDirectoryTarget(entryPath, root, [...ancestry, resolvedEntryPath], scanned);
326
+ if (issue !== undefined) {
327
+ return issue;
328
+ }
329
+ }
330
+ }
331
+ return undefined;
332
+ };
333
+ /**
334
+ * Copies a directory target while dereferencing symlinks, so the generated
335
+ * skill has no links back into catalog or project checkouts. cpSync's
336
+ * dereference option only follows the top-level source path, so nested entries
337
+ * are walked explicitly; copyFileSync preserves each file's mode.
338
+ */
339
+ const copyDirectoryDereferenced = (source, destination) => {
340
+ mkdirSync(destination, { recursive: true });
341
+ for (const entry of readdirSync(source, { withFileTypes: true })) {
342
+ const sourcePath = join(source, entry.name);
343
+ const destinationPath = join(destination, entry.name);
344
+ // statSync follows symlinks; scanDirectoryTarget already rejected cycles.
345
+ if (statSync(sourcePath).isDirectory()) {
346
+ copyDirectoryDereferenced(sourcePath, destinationPath);
347
+ }
348
+ else {
349
+ copyFileSync(sourcePath, destinationPath);
350
+ }
198
351
  }
199
- return { section: input.section, sourcePath, destinationName: basename(declaredPath) };
200
352
  };
201
353
  /** Targets must remain within their root after following symlinks. */
202
354
  const escapesRoot = (sourcePath, root) => {
@@ -1 +1 @@
1
- {"version":3,"file":"SkillResolution.js","sourceRoot":"","sources":["../../src/skills/SkillResolution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SkillResolution.js","sourceRoot":"","sources":["../../src/skills/SkillResolution.ts"],"names":[],"mappings":"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"}
@@ -317,13 +317,41 @@ the skill is later published: `file` follows the skill into its profile
317
317
  repository, while `repo_file` continues to target whichever project consumes
318
318
  the skill.
319
319
 
320
- References are regular files. They are not interpolated or added to the system
321
- prompt. Materializing a reference makes it available to the skill but does not
322
- load its contents into model context.
323
-
324
- Each reference materializes as `references/<source basename>`. Two references
325
- whose sources share a basename fail validation; rename one of the source
326
- documents to resolve the collision.
320
+ ### Target kinds
321
+
322
+ A `file` or `repo_file` target names a regular file, a directory, or a glob;
323
+ `references`, `scripts`, and `assets` entries share this contract. Targets are
324
+ not interpolated or added to the system prompt. Materializing a target makes
325
+ it available to the skill but does not load its contents into model context.
326
+
327
+ - **File.** A regular file materializes as `<section>/<source basename>`.
328
+ - **Directory.** A directory materializes recursively as
329
+ `<section>/<source basename>/`, preserving the nested layout and file modes.
330
+ Symlinks inside the directory are dereferenced so the generated skill is
331
+ self-contained.
332
+ - **Glob.** A target containing `*`, `?`, or `[` is a glob in the familiar
333
+ gitignore and GitHub Actions path-filter style: `*` matches within a path
334
+ segment, `**` matches across segments, `?` matches one character, and
335
+ `[...]` matches a character range — nothing more. Braces are literal path
336
+ characters, not glob syntax, so a glob pattern must not contain them. Globs
337
+ expand at resolution time against their root — the profile-repository
338
+ checkout for `file`, the active project root for `repo_file`:
339
+
340
+ ```yaml
341
+ references:
342
+ - file: docs/*.md
343
+ ```
344
+
345
+ Each match materializes by basename exactly as if listed individually, and a
346
+ matched directory materializes recursively like a declared directory target.
347
+ A `file` glob matching zero files fails validation, like a broken `file`
348
+ target; a `repo_file` glob matching zero files is omitted, like a missing
349
+ `repo_file` target. Matches MUST remain within their root after symlink
350
+ normalization, per [Trust boundary](#trust-boundary).
351
+
352
+ Every materialized target lands at `<section>/<source basename>`. Two targets
353
+ or glob matches whose sources share a basename fail validation; rename one of
354
+ the sources to resolve the collision.
327
355
 
328
356
  ### Scripts and assets
329
357
 
@@ -345,6 +373,22 @@ assets:
345
373
  ---
346
374
  ```
347
375
 
376
+ A directory target ships an entire tree with the skill. For example, a profile
377
+ repository can publish a scaffolding skill beside the project template it
378
+ instantiates:
379
+
380
+ ```yaml
381
+ ---
382
+ name: project-scaffolding
383
+ assets:
384
+ - file: code/project-repo-template # assets/project-repo-template/
385
+ ---
386
+ ```
387
+
388
+ The generated skill contains `assets/project-repo-template/` with the
389
+ template's full contents — nested scripts keep their executable mode — so the
390
+ skill body can copy the template into the consuming project.
391
+
348
392
  Files already inside the skill directory (`scripts/`, `references/`, `assets/`)
349
393
  ship with the skill as before; frontmatter entries add external files beside
350
394
  them, and a destination that collides with a shipped file fails validation.
@@ -385,9 +429,14 @@ boundaries, or the user's request.
385
429
 
386
430
  Outfitter resolves and normalizes reference targets before launch. Targets MUST
387
431
  remain within their Outfitter, profile-repository, or project root after
388
- following symlinks. Escaping, non-file, colliding, and broken `file` references
389
- fail validation; a missing `repo_file` target is omitted rather than failing,
390
- as described above.
432
+ following symlinks, and every glob match is validated individually under the
433
+ same rules. A directory target is additionally scanned recursively: a
434
+ contained symlink that resolves outside that root fails validation, so a
435
+ directory cannot smuggle outside content into the generated skill, and a
436
+ contained entry that is not a regular file or directory (such as a FIFO or
437
+ socket) also fails validation. Escaping, colliding, and broken `file`
438
+ references fail validation; a missing `repo_file` target is omitted rather
439
+ than failing, as described above.
391
440
 
392
441
  ## Resolution and launch
393
442
 
@@ -397,15 +446,15 @@ For each selected skill, Outfitter:
397
446
  directories, contributing directory profiles, and catalog `skills/`
398
447
  directories — following [layer precedence](./concepts.md#layer-precedence).
399
448
  2. Validates `SKILL.md` and confirms `name` matches the directory name.
400
- 3. Resolves `file` and `repo_file` reference entries.
449
+ 3. Resolves `file` and `repo_file` reference entries, expanding glob targets.
401
450
  4. Creates a generated skill directory for the run.
402
451
  5. Materializes references under that directory's `references/` folder.
403
452
  6. Passes the generated skill to the selected agent adapter.
404
453
  7. Removes the generated skill with the temporary composite profile.
405
454
 
406
455
  Run `outfitter profile lint` to diagnose unresolved skill IDs, invalid
407
- frontmatter, missing `file` references, escaping paths, and destination
408
- collisions before launch.
456
+ frontmatter, missing or zero-match `file` references, escaping paths, and
457
+ destination collisions before launch.
409
458
 
410
459
  ## Progressive disclosure
411
460
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-outfitter/outfitter",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "Profile-oriented wrapper for launching pi, Claude Code, and future agent CLIs with reproducible configuration.",
5
5
  "type": "module",
6
6
  "repository": {