@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
|
|
283
|
+
const firstRun = event.reason === "startup" && OUTFITTER_AUTO_OPEN;
|
|
284
|
+
let cachedWidth;
|
|
285
|
+
let cachedLines;
|
|
284
286
|
return {
|
|
285
|
-
render
|
|
286
|
-
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
-
|
|
344
|
-
|
|
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
|
-
|
|
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
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
|
|
112
|
-
|
|
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
|
|
143
|
+
const destinationSources = new Map();
|
|
136
144
|
for (const { reference, fileRoot } of entries) {
|
|
137
|
-
const
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
|
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
|
|
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
|
|
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 '${
|
|
255
|
+
return kind === 'repo_file' ? undefined : error(`Reference file '${targetPath}' was not found under '${root}'.`);
|
|
192
256
|
}
|
|
193
|
-
|
|
194
|
-
|
|
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} '${
|
|
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
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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
|
|
389
|
-
|
|
390
|
-
|
|
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
|
|
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