@agentworkforce/persona-kit 0.19.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 +93 -0
- package/dist/config-files.d.ts +21 -0
- package/dist/config-files.d.ts.map +1 -0
- package/dist/config-files.js +81 -0
- package/dist/config-files.js.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +78 -0
- package/dist/constants.js.map +1 -0
- package/dist/detect.d.ts +28 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +63 -0
- package/dist/detect.js.map +1 -0
- package/dist/env-refs.d.ts +56 -0
- package/dist/env-refs.d.ts.map +1 -0
- package/dist/env-refs.js +105 -0
- package/dist/env-refs.js.map +1 -0
- package/dist/env-refs.test.d.ts +2 -0
- package/dist/env-refs.test.d.ts.map +1 -0
- package/dist/env-refs.test.js +84 -0
- package/dist/env-refs.test.js.map +1 -0
- package/dist/execute.d.ts +47 -0
- package/dist/execute.d.ts.map +1 -0
- package/dist/execute.js +68 -0
- package/dist/execute.js.map +1 -0
- package/dist/execute.test.d.ts +2 -0
- package/dist/execute.test.d.ts.map +1 -0
- package/dist/execute.test.js +255 -0
- package/dist/execute.test.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +234 -0
- package/dist/index.test.js.map +1 -0
- package/dist/inputs.d.ts +13 -0
- package/dist/inputs.d.ts.map +1 -0
- package/dist/inputs.js +57 -0
- package/dist/inputs.js.map +1 -0
- package/dist/inputs.test.d.ts +2 -0
- package/dist/inputs.test.d.ts.map +1 -0
- package/dist/inputs.test.js +51 -0
- package/dist/inputs.test.js.map +1 -0
- package/dist/interactive-spec.d.ts +117 -0
- package/dist/interactive-spec.d.ts.map +1 -0
- package/dist/interactive-spec.js +260 -0
- package/dist/interactive-spec.js.map +1 -0
- package/dist/interactive-spec.test.d.ts +2 -0
- package/dist/interactive-spec.test.d.ts.map +1 -0
- package/dist/interactive-spec.test.js +308 -0
- package/dist/interactive-spec.test.js.map +1 -0
- package/dist/mcp.d.ts +35 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +86 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mount.d.ts +44 -0
- package/dist/mount.d.ts.map +1 -0
- package/dist/mount.js +51 -0
- package/dist/mount.js.map +1 -0
- package/dist/parse.d.ts +47 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +475 -0
- package/dist/parse.js.map +1 -0
- package/dist/plan.d.ts +118 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +150 -0
- package/dist/plan.js.map +1 -0
- package/dist/plan.test.d.ts +2 -0
- package/dist/plan.test.d.ts.map +1 -0
- package/dist/plan.test.js +191 -0
- package/dist/plan.test.js.map +1 -0
- package/dist/sidecars.d.ts +17 -0
- package/dist/sidecars.d.ts.map +1 -0
- package/dist/sidecars.js +101 -0
- package/dist/sidecars.js.map +1 -0
- package/dist/skill-runner.d.ts +30 -0
- package/dist/skill-runner.d.ts.map +1 -0
- package/dist/skill-runner.js +94 -0
- package/dist/skill-runner.js.map +1 -0
- package/dist/skills.d.ts +41 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +322 -0
- package/dist/skills.js.map +1 -0
- package/dist/types.d.ts +321 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +37 -0
package/dist/parse.js
ADDED
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
import { CODEX_APPROVAL_POLICIES, CODEX_SANDBOX_MODES, HARNESS_VALUES, PERMISSION_MODES, PERSONA_INTENTS, PERSONA_TAGS, PERSONA_TIERS, SIDECAR_MD_MODES } from './constants.js';
|
|
2
|
+
export function isObject(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null;
|
|
4
|
+
}
|
|
5
|
+
export function isHarness(value) {
|
|
6
|
+
return typeof value === 'string' && HARNESS_VALUES.includes(value);
|
|
7
|
+
}
|
|
8
|
+
export function isTier(value) {
|
|
9
|
+
return typeof value === 'string' && PERSONA_TIERS.includes(value);
|
|
10
|
+
}
|
|
11
|
+
export function isIntent(value) {
|
|
12
|
+
return typeof value === 'string' && PERSONA_INTENTS.includes(value);
|
|
13
|
+
}
|
|
14
|
+
export function isTag(value) {
|
|
15
|
+
return typeof value === 'string' && PERSONA_TAGS.includes(value);
|
|
16
|
+
}
|
|
17
|
+
export function isSidecarMode(value) {
|
|
18
|
+
return typeof value === 'string' && SIDECAR_MD_MODES.includes(value);
|
|
19
|
+
}
|
|
20
|
+
export function parseTags(value, context) {
|
|
21
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
22
|
+
throw new Error(`${context} must be a non-empty array of tags`);
|
|
23
|
+
}
|
|
24
|
+
const out = [];
|
|
25
|
+
for (const [idx, entry] of value.entries()) {
|
|
26
|
+
if (!isTag(entry)) {
|
|
27
|
+
throw new Error(`${context}[${idx}] must be one of: ${PERSONA_TAGS.join(', ')}`);
|
|
28
|
+
}
|
|
29
|
+
if (!out.includes(entry))
|
|
30
|
+
out.push(entry);
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
export function assertSidecarPath(value, context) {
|
|
35
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
36
|
+
throw new Error(`${context} must be a non-empty string`);
|
|
37
|
+
}
|
|
38
|
+
if (value.startsWith('/')) {
|
|
39
|
+
throw new Error(`${context} must be a relative POSIX path; got absolute "${value}"`);
|
|
40
|
+
}
|
|
41
|
+
const segments = value.split(/[\\/]+/);
|
|
42
|
+
if (segments.some((s) => s === '..')) {
|
|
43
|
+
throw new Error(`${context} must not contain ".." segments`);
|
|
44
|
+
}
|
|
45
|
+
if (!value.toLowerCase().endsWith('.md')) {
|
|
46
|
+
throw new Error(`${context} must end with .md`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function parseHarnessSettings(value, context) {
|
|
50
|
+
if (!isObject(value)) {
|
|
51
|
+
throw new Error(`${context} must be an object`);
|
|
52
|
+
}
|
|
53
|
+
const { reasoning, timeoutSeconds, sandboxMode, approvalPolicy, workspaceWriteNetworkAccess, webSearch } = value;
|
|
54
|
+
if (!['low', 'medium', 'high'].includes(String(reasoning))) {
|
|
55
|
+
throw new Error(`${context}.reasoning must be low|medium|high`);
|
|
56
|
+
}
|
|
57
|
+
if (typeof timeoutSeconds !== 'number' || !Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0) {
|
|
58
|
+
throw new Error(`${context}.timeoutSeconds must be a positive number`);
|
|
59
|
+
}
|
|
60
|
+
const out = {
|
|
61
|
+
reasoning: reasoning,
|
|
62
|
+
timeoutSeconds
|
|
63
|
+
};
|
|
64
|
+
if (sandboxMode !== undefined) {
|
|
65
|
+
if (!CODEX_SANDBOX_MODES.includes(sandboxMode)) {
|
|
66
|
+
throw new Error(`${context}.sandboxMode must be one of: ${CODEX_SANDBOX_MODES.join(', ')}`);
|
|
67
|
+
}
|
|
68
|
+
out.sandboxMode = sandboxMode;
|
|
69
|
+
}
|
|
70
|
+
if (approvalPolicy !== undefined) {
|
|
71
|
+
if (!CODEX_APPROVAL_POLICIES.includes(approvalPolicy)) {
|
|
72
|
+
throw new Error(`${context}.approvalPolicy must be one of: ${CODEX_APPROVAL_POLICIES.join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
out.approvalPolicy = approvalPolicy;
|
|
75
|
+
}
|
|
76
|
+
if (workspaceWriteNetworkAccess !== undefined) {
|
|
77
|
+
if (typeof workspaceWriteNetworkAccess !== 'boolean') {
|
|
78
|
+
throw new Error(`${context}.workspaceWriteNetworkAccess must be a boolean`);
|
|
79
|
+
}
|
|
80
|
+
out.workspaceWriteNetworkAccess = workspaceWriteNetworkAccess;
|
|
81
|
+
}
|
|
82
|
+
if (webSearch !== undefined) {
|
|
83
|
+
if (typeof webSearch !== 'boolean') {
|
|
84
|
+
throw new Error(`${context}.webSearch must be a boolean`);
|
|
85
|
+
}
|
|
86
|
+
out.webSearch = webSearch;
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
export function parseRuntime(value, context) {
|
|
91
|
+
if (!isObject(value)) {
|
|
92
|
+
throw new Error(`${context} must be an object`);
|
|
93
|
+
}
|
|
94
|
+
const { harness, model, systemPrompt, harnessSettings, claudeMd, claudeMdMode, agentsMd, agentsMdMode, claudeMdContent, agentsMdContent } = value;
|
|
95
|
+
if (!isHarness(harness)) {
|
|
96
|
+
throw new Error(`${context}.harness must be one of: ${HARNESS_VALUES.join(', ')}`);
|
|
97
|
+
}
|
|
98
|
+
if (typeof model !== 'string' || !model.trim()) {
|
|
99
|
+
throw new Error(`${context}.model must be a non-empty string`);
|
|
100
|
+
}
|
|
101
|
+
if (typeof systemPrompt !== 'string' || !systemPrompt.trim()) {
|
|
102
|
+
throw new Error(`${context}.systemPrompt must be a non-empty string`);
|
|
103
|
+
}
|
|
104
|
+
const parsedHarnessSettings = parseHarnessSettings(harnessSettings, `${context}.harnessSettings`);
|
|
105
|
+
if (claudeMd !== undefined)
|
|
106
|
+
assertSidecarPath(claudeMd, `${context}.claudeMd`);
|
|
107
|
+
if (agentsMd !== undefined)
|
|
108
|
+
assertSidecarPath(agentsMd, `${context}.agentsMd`);
|
|
109
|
+
if (claudeMdMode !== undefined && !isSidecarMode(claudeMdMode)) {
|
|
110
|
+
throw new Error(`${context}.claudeMdMode must be one of: ${SIDECAR_MD_MODES.join(', ')}`);
|
|
111
|
+
}
|
|
112
|
+
if (agentsMdMode !== undefined && !isSidecarMode(agentsMdMode)) {
|
|
113
|
+
throw new Error(`${context}.agentsMdMode must be one of: ${SIDECAR_MD_MODES.join(', ')}`);
|
|
114
|
+
}
|
|
115
|
+
// Mode is allowed without a same-level path: a tier may declare just
|
|
116
|
+
// `claudeMdMode` and inherit the path from the spec top-level (or vice
|
|
117
|
+
// versa). The cascade validates that a path/content actually exists at
|
|
118
|
+
// runtime — a stranded mode with no path anywhere becomes a no-op.
|
|
119
|
+
if (claudeMdContent !== undefined && (typeof claudeMdContent !== 'string' || !claudeMdContent.length)) {
|
|
120
|
+
throw new Error(`${context}.claudeMdContent must be a non-empty string`);
|
|
121
|
+
}
|
|
122
|
+
if (agentsMdContent !== undefined && (typeof agentsMdContent !== 'string' || !agentsMdContent.length)) {
|
|
123
|
+
throw new Error(`${context}.agentsMdContent must be a non-empty string`);
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
harness,
|
|
127
|
+
model,
|
|
128
|
+
systemPrompt,
|
|
129
|
+
harnessSettings: parsedHarnessSettings,
|
|
130
|
+
...(typeof claudeMd === 'string' ? { claudeMd } : {}),
|
|
131
|
+
...(claudeMdMode ? { claudeMdMode: claudeMdMode } : {}),
|
|
132
|
+
...(typeof agentsMd === 'string' ? { agentsMd } : {}),
|
|
133
|
+
...(agentsMdMode ? { agentsMdMode: agentsMdMode } : {}),
|
|
134
|
+
...(typeof claudeMdContent === 'string' ? { claudeMdContent } : {}),
|
|
135
|
+
...(typeof agentsMdContent === 'string' ? { agentsMdContent } : {})
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
export function parseSkills(value, context) {
|
|
139
|
+
if (value === undefined) {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
if (!Array.isArray(value)) {
|
|
143
|
+
throw new Error(`${context} must be an array if provided`);
|
|
144
|
+
}
|
|
145
|
+
return value.map((entry, idx) => {
|
|
146
|
+
const entryContext = `${context}[${idx}]`;
|
|
147
|
+
if (!isObject(entry)) {
|
|
148
|
+
throw new Error(`${entryContext} must be an object`);
|
|
149
|
+
}
|
|
150
|
+
const { id, source, description } = entry;
|
|
151
|
+
if (typeof id !== 'string' || !id.trim()) {
|
|
152
|
+
throw new Error(`${entryContext}.id must be a non-empty string`);
|
|
153
|
+
}
|
|
154
|
+
if (typeof source !== 'string' || !source.trim()) {
|
|
155
|
+
throw new Error(`${entryContext}.source must be a non-empty string`);
|
|
156
|
+
}
|
|
157
|
+
if (typeof description !== 'string' || !description.trim()) {
|
|
158
|
+
throw new Error(`${entryContext}.description must be a non-empty string`);
|
|
159
|
+
}
|
|
160
|
+
return { id, source, description };
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
export function parseStringList(value, context) {
|
|
164
|
+
if (value === undefined)
|
|
165
|
+
return undefined;
|
|
166
|
+
if (!Array.isArray(value)) {
|
|
167
|
+
throw new Error(`${context} must be an array if provided`);
|
|
168
|
+
}
|
|
169
|
+
const parsed = value.map((entry, idx) => {
|
|
170
|
+
if (typeof entry !== 'string' || !entry.trim()) {
|
|
171
|
+
throw new Error(`${context}[${idx}] must be a non-empty string`);
|
|
172
|
+
}
|
|
173
|
+
return entry;
|
|
174
|
+
});
|
|
175
|
+
return parsed.length > 0 ? parsed : undefined;
|
|
176
|
+
}
|
|
177
|
+
export function parseMount(value, context) {
|
|
178
|
+
if (value === undefined)
|
|
179
|
+
return undefined;
|
|
180
|
+
if (!isObject(value)) {
|
|
181
|
+
throw new Error(`${context} must be an object if provided`);
|
|
182
|
+
}
|
|
183
|
+
const ignoredPatterns = parseStringList(value.ignoredPatterns, `${context}.ignoredPatterns`);
|
|
184
|
+
const readonlyPatterns = parseStringList(value.readonlyPatterns, `${context}.readonlyPatterns`);
|
|
185
|
+
return ignoredPatterns || readonlyPatterns
|
|
186
|
+
? {
|
|
187
|
+
...(ignoredPatterns ? { ignoredPatterns } : {}),
|
|
188
|
+
...(readonlyPatterns ? { readonlyPatterns } : {})
|
|
189
|
+
}
|
|
190
|
+
: undefined;
|
|
191
|
+
}
|
|
192
|
+
export const INPUT_NAME_RE = /^[A-Z_][A-Z0-9_]*$/;
|
|
193
|
+
export function assertInputName(name, context) {
|
|
194
|
+
if (!INPUT_NAME_RE.test(name)) {
|
|
195
|
+
throw new Error(`${context} must be an env-style name matching ${INPUT_NAME_RE.source}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export function parseInputs(value, context) {
|
|
199
|
+
if (value === undefined)
|
|
200
|
+
return undefined;
|
|
201
|
+
if (!isObject(value)) {
|
|
202
|
+
throw new Error(`${context} must be an object if provided`);
|
|
203
|
+
}
|
|
204
|
+
const out = {};
|
|
205
|
+
for (const [name, raw] of Object.entries(value)) {
|
|
206
|
+
assertInputName(name, `${context}.${name}`);
|
|
207
|
+
if (typeof raw === 'string') {
|
|
208
|
+
if (!raw) {
|
|
209
|
+
throw new Error(`${context}.${name} default must be non-empty`);
|
|
210
|
+
}
|
|
211
|
+
out[name] = { default: raw };
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (!isObject(raw)) {
|
|
215
|
+
throw new Error(`${context}.${name} must be a string default or an object`);
|
|
216
|
+
}
|
|
217
|
+
const { description, env, default: defaultValue, optional } = raw;
|
|
218
|
+
const parsed = {};
|
|
219
|
+
if (description !== undefined) {
|
|
220
|
+
if (typeof description !== 'string' || !description.trim()) {
|
|
221
|
+
throw new Error(`${context}.${name}.description must be a non-empty string if provided`);
|
|
222
|
+
}
|
|
223
|
+
parsed.description = description;
|
|
224
|
+
}
|
|
225
|
+
if (env !== undefined) {
|
|
226
|
+
if (typeof env !== 'string' || !env.trim()) {
|
|
227
|
+
throw new Error(`${context}.${name}.env must be a non-empty string if provided`);
|
|
228
|
+
}
|
|
229
|
+
assertInputName(env, `${context}.${name}.env`);
|
|
230
|
+
parsed.env = env;
|
|
231
|
+
}
|
|
232
|
+
if (defaultValue !== undefined) {
|
|
233
|
+
if (typeof defaultValue !== 'string' || !defaultValue) {
|
|
234
|
+
throw new Error(`${context}.${name}.default must be a non-empty string if provided`);
|
|
235
|
+
}
|
|
236
|
+
parsed.default = defaultValue;
|
|
237
|
+
}
|
|
238
|
+
if (optional !== undefined) {
|
|
239
|
+
if (typeof optional !== 'boolean') {
|
|
240
|
+
throw new Error(`${context}.${name}.optional must be a boolean if provided`);
|
|
241
|
+
}
|
|
242
|
+
if (optional && parsed.default !== undefined) {
|
|
243
|
+
throw new Error(`${context}.${name} cannot set both 'optional: true' and 'default' — pick one (defaults already make an input always-resolved)`);
|
|
244
|
+
}
|
|
245
|
+
parsed.optional = optional;
|
|
246
|
+
}
|
|
247
|
+
out[name] = parsed;
|
|
248
|
+
}
|
|
249
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
250
|
+
}
|
|
251
|
+
export function parsePermissions(value, context) {
|
|
252
|
+
if (value === undefined)
|
|
253
|
+
return undefined;
|
|
254
|
+
if (!isObject(value)) {
|
|
255
|
+
throw new Error(`${context} must be an object if provided`);
|
|
256
|
+
}
|
|
257
|
+
const out = {};
|
|
258
|
+
const { allow, deny, mode } = value;
|
|
259
|
+
if (allow !== undefined) {
|
|
260
|
+
if (!Array.isArray(allow) || allow.some((s) => typeof s !== 'string' || !s.trim())) {
|
|
261
|
+
throw new Error(`${context}.allow must be an array of non-empty strings`);
|
|
262
|
+
}
|
|
263
|
+
out.allow = allow;
|
|
264
|
+
}
|
|
265
|
+
if (deny !== undefined) {
|
|
266
|
+
if (!Array.isArray(deny) || deny.some((s) => typeof s !== 'string' || !s.trim())) {
|
|
267
|
+
throw new Error(`${context}.deny must be an array of non-empty strings`);
|
|
268
|
+
}
|
|
269
|
+
out.deny = deny;
|
|
270
|
+
}
|
|
271
|
+
if (mode !== undefined) {
|
|
272
|
+
if (!PERMISSION_MODES.includes(mode)) {
|
|
273
|
+
throw new Error(`${context}.mode must be one of: ${PERMISSION_MODES.join(', ')}`);
|
|
274
|
+
}
|
|
275
|
+
out.mode = mode;
|
|
276
|
+
}
|
|
277
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
278
|
+
}
|
|
279
|
+
export function parseStringMap(value, context) {
|
|
280
|
+
if (value === undefined)
|
|
281
|
+
return undefined;
|
|
282
|
+
if (!isObject(value)) {
|
|
283
|
+
throw new Error(`${context} must be an object if provided`);
|
|
284
|
+
}
|
|
285
|
+
const out = {};
|
|
286
|
+
for (const [key, v] of Object.entries(value)) {
|
|
287
|
+
if (typeof v !== 'string') {
|
|
288
|
+
throw new Error(`${context}.${key} must be a string`);
|
|
289
|
+
}
|
|
290
|
+
out[key] = v;
|
|
291
|
+
}
|
|
292
|
+
return out;
|
|
293
|
+
}
|
|
294
|
+
export function parseMcpServers(value, context) {
|
|
295
|
+
if (value === undefined)
|
|
296
|
+
return undefined;
|
|
297
|
+
if (!isObject(value)) {
|
|
298
|
+
throw new Error(`${context} must be an object if provided`);
|
|
299
|
+
}
|
|
300
|
+
const out = {};
|
|
301
|
+
for (const [name, raw] of Object.entries(value)) {
|
|
302
|
+
if (!isObject(raw)) {
|
|
303
|
+
throw new Error(`${context}.${name} must be an object`);
|
|
304
|
+
}
|
|
305
|
+
const type = raw.type;
|
|
306
|
+
if (type === 'http' || type === 'sse') {
|
|
307
|
+
if (typeof raw.url !== 'string' || !raw.url.trim()) {
|
|
308
|
+
throw new Error(`${context}.${name}.url must be a non-empty string for type=${type}`);
|
|
309
|
+
}
|
|
310
|
+
const headers = parseStringMap(raw.headers, `${context}.${name}.headers`);
|
|
311
|
+
out[name] = { type, url: raw.url, ...(headers ? { headers } : {}) };
|
|
312
|
+
}
|
|
313
|
+
else if (type === 'stdio') {
|
|
314
|
+
if (typeof raw.command !== 'string' || !raw.command.trim()) {
|
|
315
|
+
throw new Error(`${context}.${name}.command must be a non-empty string for type=stdio`);
|
|
316
|
+
}
|
|
317
|
+
const args = raw.args;
|
|
318
|
+
if (args !== undefined && (!Array.isArray(args) || args.some((a) => typeof a !== 'string'))) {
|
|
319
|
+
throw new Error(`${context}.${name}.args must be an array of strings`);
|
|
320
|
+
}
|
|
321
|
+
const env = parseStringMap(raw.env, `${context}.${name}.env`);
|
|
322
|
+
out[name] = {
|
|
323
|
+
type: 'stdio',
|
|
324
|
+
command: raw.command,
|
|
325
|
+
...(args ? { args: args } : {}),
|
|
326
|
+
...(env ? { env } : {})
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
throw new Error(`${context}.${name}.type must be one of: http, sse, stdio`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return out;
|
|
334
|
+
}
|
|
335
|
+
export function parsePersonaSpec(value, expectedIntent) {
|
|
336
|
+
if (!isObject(value)) {
|
|
337
|
+
throw new Error(`persona[${expectedIntent}] must be an object`);
|
|
338
|
+
}
|
|
339
|
+
const { id, intent, tags, description, tiers, defaultTier, skills, inputs, env, mcpServers, permissions, mount, claudeMd, claudeMdMode, agentsMd, agentsMdMode, claudeMdContent, agentsMdContent } = value;
|
|
340
|
+
if (typeof id !== 'string' || !id.trim()) {
|
|
341
|
+
throw new Error(`persona[${expectedIntent}].id must be a non-empty string`);
|
|
342
|
+
}
|
|
343
|
+
if (!isIntent(intent)) {
|
|
344
|
+
throw new Error(`persona[${expectedIntent}].intent is invalid`);
|
|
345
|
+
}
|
|
346
|
+
if (intent !== expectedIntent) {
|
|
347
|
+
throw new Error(`persona[${expectedIntent}] intent mismatch: got ${intent}`);
|
|
348
|
+
}
|
|
349
|
+
const parsedTags = parseTags(tags, `persona[${expectedIntent}].tags`);
|
|
350
|
+
if (typeof description !== 'string' || !description.trim()) {
|
|
351
|
+
throw new Error(`persona[${expectedIntent}].description must be a non-empty string`);
|
|
352
|
+
}
|
|
353
|
+
if (!isObject(tiers)) {
|
|
354
|
+
throw new Error(`persona[${expectedIntent}].tiers must be an object`);
|
|
355
|
+
}
|
|
356
|
+
const parsedTiers = {};
|
|
357
|
+
for (const tier of PERSONA_TIERS) {
|
|
358
|
+
parsedTiers[tier] = parseRuntime(tiers[tier], `persona[${expectedIntent}].tiers.${tier}`);
|
|
359
|
+
}
|
|
360
|
+
let parsedDefaultTier;
|
|
361
|
+
if (defaultTier !== undefined) {
|
|
362
|
+
if (!isTier(defaultTier)) {
|
|
363
|
+
throw new Error(`persona[${expectedIntent}].defaultTier must be one of: ${PERSONA_TIERS.join(', ')}`);
|
|
364
|
+
}
|
|
365
|
+
parsedDefaultTier = defaultTier;
|
|
366
|
+
}
|
|
367
|
+
const parsedSkills = parseSkills(skills, `persona[${expectedIntent}].skills`);
|
|
368
|
+
const parsedInputs = parseInputs(inputs, `persona[${expectedIntent}].inputs`);
|
|
369
|
+
const parsedEnv = parseStringMap(env, `persona[${expectedIntent}].env`);
|
|
370
|
+
const parsedMcpServers = parseMcpServers(mcpServers, `persona[${expectedIntent}].mcpServers`);
|
|
371
|
+
const parsedPermissions = parsePermissions(permissions, `persona[${expectedIntent}].permissions`);
|
|
372
|
+
const parsedMount = parseMount(mount, `persona[${expectedIntent}].mount`);
|
|
373
|
+
if (claudeMd !== undefined)
|
|
374
|
+
assertSidecarPath(claudeMd, `persona[${expectedIntent}].claudeMd`);
|
|
375
|
+
if (agentsMd !== undefined)
|
|
376
|
+
assertSidecarPath(agentsMd, `persona[${expectedIntent}].agentsMd`);
|
|
377
|
+
if (claudeMdMode !== undefined && !isSidecarMode(claudeMdMode)) {
|
|
378
|
+
throw new Error(`persona[${expectedIntent}].claudeMdMode must be one of: ${SIDECAR_MD_MODES.join(', ')}`);
|
|
379
|
+
}
|
|
380
|
+
if (agentsMdMode !== undefined && !isSidecarMode(agentsMdMode)) {
|
|
381
|
+
throw new Error(`persona[${expectedIntent}].agentsMdMode must be one of: ${SIDECAR_MD_MODES.join(', ')}`);
|
|
382
|
+
}
|
|
383
|
+
// Spec-level mode without a spec-level path is allowed — a tier may
|
|
384
|
+
// supply the path while inheriting the mode here. See parseRuntime.
|
|
385
|
+
if (claudeMdContent !== undefined &&
|
|
386
|
+
(typeof claudeMdContent !== 'string' || !claudeMdContent.length)) {
|
|
387
|
+
throw new Error(`persona[${expectedIntent}].claudeMdContent must be a non-empty string`);
|
|
388
|
+
}
|
|
389
|
+
if (agentsMdContent !== undefined &&
|
|
390
|
+
(typeof agentsMdContent !== 'string' || !agentsMdContent.length)) {
|
|
391
|
+
throw new Error(`persona[${expectedIntent}].agentsMdContent must be a non-empty string`);
|
|
392
|
+
}
|
|
393
|
+
return {
|
|
394
|
+
id,
|
|
395
|
+
intent,
|
|
396
|
+
tags: parsedTags,
|
|
397
|
+
description,
|
|
398
|
+
skills: parsedSkills,
|
|
399
|
+
...(parsedInputs ? { inputs: parsedInputs } : {}),
|
|
400
|
+
tiers: parsedTiers,
|
|
401
|
+
...(parsedDefaultTier ? { defaultTier: parsedDefaultTier } : {}),
|
|
402
|
+
...(parsedEnv ? { env: parsedEnv } : {}),
|
|
403
|
+
...(parsedMcpServers ? { mcpServers: parsedMcpServers } : {}),
|
|
404
|
+
...(parsedPermissions ? { permissions: parsedPermissions } : {}),
|
|
405
|
+
...(parsedMount ? { mount: parsedMount } : {}),
|
|
406
|
+
...(typeof claudeMd === 'string' ? { claudeMd } : {}),
|
|
407
|
+
...(claudeMdMode ? { claudeMdMode: claudeMdMode } : {}),
|
|
408
|
+
...(typeof agentsMd === 'string' ? { agentsMd } : {}),
|
|
409
|
+
...(agentsMdMode ? { agentsMdMode: agentsMdMode } : {}),
|
|
410
|
+
...(typeof claudeMdContent === 'string' ? { claudeMdContent } : {}),
|
|
411
|
+
...(typeof agentsMdContent === 'string' ? { agentsMdContent } : {})
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Resolve the effective sidecar config for a (spec, tier) pair.
|
|
416
|
+
*
|
|
417
|
+
* Path-or-content resolution: each sidecar (`claude*`, `agents*`) is a
|
|
418
|
+
* single "channel" — its `*Md` and `*MdContent` fields are tied together
|
|
419
|
+
* and travel as a unit through the cascade. If the tier-level runtime
|
|
420
|
+
* declares EITHER `claudeMd` or `claudeMdContent`, the tier owns the
|
|
421
|
+
* channel and the top-level path/content is ignored (otherwise a tier
|
|
422
|
+
* path override would silently lose to inherited inlined content, since
|
|
423
|
+
* downstream consumers prefer Content over a path).
|
|
424
|
+
*
|
|
425
|
+
* Mode resolution: independent — a tier can set just `claudeMdMode` and
|
|
426
|
+
* inherit the top-level path. Defaults to `overwrite` if neither layer
|
|
427
|
+
* sets a mode. Modes are only meaningful when a path/content is present.
|
|
428
|
+
*/
|
|
429
|
+
export function resolveSidecar(spec, tier) {
|
|
430
|
+
const runtime = spec.tiers[tier];
|
|
431
|
+
const tierOwnsClaude = runtime.claudeMd !== undefined || runtime.claudeMdContent !== undefined;
|
|
432
|
+
const tierOwnsAgents = runtime.agentsMd !== undefined || runtime.agentsMdContent !== undefined;
|
|
433
|
+
const claudePath = tierOwnsClaude ? runtime.claudeMd : spec.claudeMd;
|
|
434
|
+
const claudeContent = tierOwnsClaude ? runtime.claudeMdContent : spec.claudeMdContent;
|
|
435
|
+
const agentsPath = tierOwnsAgents ? runtime.agentsMd : spec.agentsMd;
|
|
436
|
+
const agentsContent = tierOwnsAgents ? runtime.agentsMdContent : spec.agentsMdContent;
|
|
437
|
+
return {
|
|
438
|
+
...(claudePath ? { claudeMd: claudePath } : {}),
|
|
439
|
+
...(claudeContent ? { claudeMdContent: claudeContent } : {}),
|
|
440
|
+
claudeMdMode: runtime.claudeMdMode ?? spec.claudeMdMode ?? 'overwrite',
|
|
441
|
+
...(agentsPath ? { agentsMd: agentsPath } : {}),
|
|
442
|
+
...(agentsContent ? { agentsMdContent: agentsContent } : {}),
|
|
443
|
+
agentsMdMode: runtime.agentsMdMode ?? spec.agentsMdMode ?? 'overwrite'
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
export function sidecarSelectionFields(sidecar) {
|
|
447
|
+
return {
|
|
448
|
+
...(sidecar.claudeMd ? { claudeMd: sidecar.claudeMd } : {}),
|
|
449
|
+
...(sidecar.claudeMdContent ? { claudeMdContent: sidecar.claudeMdContent } : {}),
|
|
450
|
+
...(sidecar.claudeMd || sidecar.claudeMdContent
|
|
451
|
+
? { claudeMdMode: sidecar.claudeMdMode }
|
|
452
|
+
: {}),
|
|
453
|
+
...(sidecar.agentsMd ? { agentsMd: sidecar.agentsMd } : {}),
|
|
454
|
+
...(sidecar.agentsMdContent ? { agentsMdContent: sidecar.agentsMdContent } : {}),
|
|
455
|
+
...(sidecar.agentsMd || sidecar.agentsMdContent
|
|
456
|
+
? { agentsMdMode: sidecar.agentsMdMode }
|
|
457
|
+
: {})
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
export function deepFreeze(value) {
|
|
461
|
+
if (value === null || value === undefined || typeof value !== 'object') {
|
|
462
|
+
return value;
|
|
463
|
+
}
|
|
464
|
+
if (Array.isArray(value)) {
|
|
465
|
+
for (const entry of value) {
|
|
466
|
+
deepFreeze(entry);
|
|
467
|
+
}
|
|
468
|
+
return Object.freeze(value);
|
|
469
|
+
}
|
|
470
|
+
for (const nested of Object.values(value)) {
|
|
471
|
+
deepFreeze(nested);
|
|
472
|
+
}
|
|
473
|
+
return Object.freeze(value);
|
|
474
|
+
}
|
|
475
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
|
package/dist/plan.d.ts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { type InteractiveConfigFile } from './interactive-spec.js';
|
|
2
|
+
import type { Harness, PersonaSelection, SidecarMdMode, SkillMaterializationPlan } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Alias of {@link PersonaSelection}. The orchestration API names the
|
|
5
|
+
* fully-resolved persona "ResolvedPersona" because callers think of a
|
|
6
|
+
* spawn plan as "what runs", not "what was selected from the catalog".
|
|
7
|
+
*/
|
|
8
|
+
export type ResolvedPersona = PersonaSelection;
|
|
9
|
+
/**
|
|
10
|
+
* Mount policy resolved against any caller dotfiles / extra patterns.
|
|
11
|
+
* The plan carries this through verbatim; the executor passes it to the
|
|
12
|
+
* mount provider (e.g. {@link import('./mount.js').applyPersonaMount}).
|
|
13
|
+
*/
|
|
14
|
+
export interface ResolvedMountPolicy {
|
|
15
|
+
ignoredPatterns: string[];
|
|
16
|
+
readonlyPatterns: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Sidecar markdown the executor must write into the harness cwd. The body
|
|
20
|
+
* is supplied either inline (built-in personas, where the catalog generator
|
|
21
|
+
* already inlined the markdown) or by absolute path (local/pack personas
|
|
22
|
+
* that ship the sidecar as a sibling file). The path form keeps the plan
|
|
23
|
+
* JSON-serializable; the executor reads the file at write time.
|
|
24
|
+
*/
|
|
25
|
+
export type ResolvedSidecarWrite = {
|
|
26
|
+
/** Filename inside the cwd: `CLAUDE.md` (claude) or `AGENTS.md` (opencode/codex). */
|
|
27
|
+
filename: 'CLAUDE.md' | 'AGENTS.md';
|
|
28
|
+
/**
|
|
29
|
+
* `overwrite` writes verbatim; `extend` appends a `\n\n---\n\n`-joined
|
|
30
|
+
* suffix onto whatever already exists at the destination at execute time.
|
|
31
|
+
*/
|
|
32
|
+
mode: SidecarMdMode;
|
|
33
|
+
} & ({
|
|
34
|
+
/** Inlined body. */
|
|
35
|
+
contents: string;
|
|
36
|
+
sourcePath?: never;
|
|
37
|
+
} | {
|
|
38
|
+
/** Absolute path to read at execute time. */
|
|
39
|
+
sourcePath: string;
|
|
40
|
+
contents?: never;
|
|
41
|
+
});
|
|
42
|
+
/** Per-input env binding to merge into the spawn env. */
|
|
43
|
+
export interface ResolvedInputBinding {
|
|
44
|
+
name: string;
|
|
45
|
+
/** Env-var name to bind under. Falls back to `name` when the spec omits one. */
|
|
46
|
+
envName: string;
|
|
47
|
+
value: string;
|
|
48
|
+
}
|
|
49
|
+
export interface PersonaSpawnPlan {
|
|
50
|
+
/** The fully resolved persona this plan was built from. */
|
|
51
|
+
persona: ResolvedPersona;
|
|
52
|
+
/** Which CLI to spawn (`claude` | `codex` | `opencode`). */
|
|
53
|
+
cli: Harness;
|
|
54
|
+
/** argv (excluding the cli itself) that the harness should be spawned with. */
|
|
55
|
+
args: string[];
|
|
56
|
+
/** Optional initial prompt — used by codex's argv-driven prompt mode. */
|
|
57
|
+
initialPrompt?: string;
|
|
58
|
+
/** MCP / harness config files to materialize before spawn (and restore after). */
|
|
59
|
+
configFiles: InteractiveConfigFile[];
|
|
60
|
+
/** Pure skills install plan (from {@link materializeSkills}). */
|
|
61
|
+
skills: SkillMaterializationPlan;
|
|
62
|
+
/** Resolved mount policy, or undefined if the persona declares none. */
|
|
63
|
+
mount?: ResolvedMountPolicy;
|
|
64
|
+
/** Sidecar markdown writes (claudeMd / agentsMd) staged for the run. */
|
|
65
|
+
sidecars: ResolvedSidecarWrite[];
|
|
66
|
+
/** Inputs as resolved env bindings, ready to merge into spawn env. */
|
|
67
|
+
inputs: ResolvedInputBinding[];
|
|
68
|
+
/**
|
|
69
|
+
* Final env (process.env merged with input bindings + persona env, with
|
|
70
|
+
* persona env winning on conflict). Always materialized so callers do not
|
|
71
|
+
* need to re-merge by hand.
|
|
72
|
+
*/
|
|
73
|
+
env: Record<string, string>;
|
|
74
|
+
}
|
|
75
|
+
export interface PlanOptions {
|
|
76
|
+
/**
|
|
77
|
+
* Stage skills under this absolute directory instead of the repo's
|
|
78
|
+
* `.claude/skills/`. Claude harness only — throws otherwise (matching the
|
|
79
|
+
* existing {@link materializeSkills} behavior).
|
|
80
|
+
*/
|
|
81
|
+
installRoot?: string;
|
|
82
|
+
/** Extra env bindings to merge in. Persona env wins on conflict. */
|
|
83
|
+
envOverrides?: Record<string, string>;
|
|
84
|
+
/**
|
|
85
|
+
* Process env to read input env-var fallbacks from (default: process.env).
|
|
86
|
+
* **Captured into `plan.env`.** The plan is JSON-serializable, so passing
|
|
87
|
+
* `process.env` here will inline ambient values (potentially including
|
|
88
|
+
* secrets) into the serialized plan — set `includeProcessEnv` only when
|
|
89
|
+
* you intend to forward ambient env to the harness, and prefer supplying
|
|
90
|
+
* a curated snapshot via {@link processEnv}.
|
|
91
|
+
*/
|
|
92
|
+
processEnv?: NodeJS.ProcessEnv;
|
|
93
|
+
/**
|
|
94
|
+
* Opt in to capturing ambient {@link processEnv} into `plan.env`. Default
|
|
95
|
+
* `false`: when omitted, `plan.env` contains only persona-author env,
|
|
96
|
+
* resolved input bindings, and {@link envOverrides}. When `true` and no
|
|
97
|
+
* explicit {@link processEnv} is supplied, `process.env` is captured.
|
|
98
|
+
*/
|
|
99
|
+
includeProcessEnv?: boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Caller-supplied input values (highest precedence over env/default). Same
|
|
102
|
+
* shape as {@link import('./inputs.js').resolvePersonaInputs}'s `provided`.
|
|
103
|
+
*/
|
|
104
|
+
inputValues?: Record<string, string | number | boolean | null | undefined>;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Pure plan builder. Composes existing persona-kit helpers
|
|
108
|
+
* ({@link buildInteractiveSpec}, {@link materializeSkills},
|
|
109
|
+
* {@link resolvePersonaInputs}) into a single inspectable
|
|
110
|
+
* {@link PersonaSpawnPlan}. Does **no** filesystem writes and spawns no
|
|
111
|
+
* subprocesses.
|
|
112
|
+
*
|
|
113
|
+
* The returned plan is JSON-serializable: every field is a plain value or
|
|
114
|
+
* primitive array. Callers can stamp it into launch metadata, send it across
|
|
115
|
+
* a wire, or hand it to {@link import('./execute.js').executePersonaSpawnPlan}.
|
|
116
|
+
*/
|
|
117
|
+
export declare function buildPersonaSpawnPlan(persona: ResolvedPersona, options?: PlanOptions): PersonaSpawnPlan;
|
|
118
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGzF,OAAO,KAAK,EACV,OAAO,EAGP,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,qFAAqF;IACrF,QAAQ,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC;;;OAGG;IACH,IAAI,EAAE,aAAa,CAAC;CACrB,GAAG,CACA;IACE,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,KAAK,CAAC;CACpB,GACD;IACE,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CACJ,CAAC;AAEF,yDAAyD;AACzD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,OAAO,EAAE,eAAe,CAAC;IACzB,4DAA4D;IAC5D,GAAG,EAAE,OAAO,CAAC;IACb,+EAA+E;IAC/E,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,WAAW,EAAE,qBAAqB,EAAE,CAAC;IACrC,iEAAiE;IACjE,MAAM,EAAE,wBAAwB,CAAC;IACjC,wEAAwE;IACxE,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,EAAE,oBAAoB,EAAE,CAAC;IACjC,sEAAsE;IACtE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CAC5E;AA8ED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,WAAgB,GACxB,gBAAgB,CA8ElB"}
|