yet-another-agentic-workflow 0.2.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 +125 -0
- package/dist/adapters.d.ts +43 -0
- package/dist/adapters.js +191 -0
- package/dist/adapters.js.map +1 -0
- package/dist/architect.d.ts +38 -0
- package/dist/architect.js +275 -0
- package/dist/architect.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +580 -0
- package/dist/cli.js.map +1 -0
- package/dist/feature.d.ts +30 -0
- package/dist/feature.js +344 -0
- package/dist/feature.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +26 -0
- package/dist/init.js +255 -0
- package/dist/init.js.map +1 -0
- package/dist/installer.d.ts +64 -0
- package/dist/installer.js +365 -0
- package/dist/installer.js.map +1 -0
- package/dist/observability.d.ts +37 -0
- package/dist/observability.js +200 -0
- package/dist/observability.js.map +1 -0
- package/dist/parser.d.ts +6 -0
- package/dist/parser.js +166 -0
- package/dist/parser.js.map +1 -0
- package/dist/persistence.d.ts +83 -0
- package/dist/persistence.js +279 -0
- package/dist/persistence.js.map +1 -0
- package/dist/providers.d.ts +14 -0
- package/dist/providers.js +27 -0
- package/dist/providers.js.map +1 -0
- package/dist/review.d.ts +29 -0
- package/dist/review.js +66 -0
- package/dist/review.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.js +44 -0
- package/dist/schema.js.map +1 -0
- package/dist/skills.d.ts +24 -0
- package/dist/skills.js +210 -0
- package/dist/skills.js.map +1 -0
- package/dist/types.d.ts +86 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
- package/schemas/agent.schema.json +37 -0
- package/schemas/context.schema.json +13 -0
- package/schemas/eval.schema.json +26 -0
- package/schemas/hook.schema.json +29 -0
- package/schemas/skill.schema.json +23 -0
- package/schemas/state.schema.json +14 -0
- package/schemas/workflow.schema.json +34 -0
- package/schemas/yaaw.schema.json +58 -0
- package/skills/clarify/SKILL.md +14 -0
- package/skills/code-review/SKILL.md +29 -0
- package/skills/slice-work/SKILL.md +15 -0
- package/skills/spec/SKILL.md +21 -0
- package/skills/tdd/SKILL.md +25 -0
- package/templates/instructions/managed-block.md +17 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { access, lstat, mkdir, readFile, readdir, realpath, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { discoverRepository } from "./init.js";
|
|
6
|
+
import { getProvider, listProviders } from "./providers.js";
|
|
7
|
+
export const MANIFEST_SCHEMA_VERSION = 1;
|
|
8
|
+
export const MANAGED_BLOCK_START = "<!-- yaaw:start -->";
|
|
9
|
+
export const MANAGED_BLOCK_END = "<!-- yaaw:end -->";
|
|
10
|
+
export const MANAGED_INSTRUCTION_BLOCK = `${MANAGED_BLOCK_START}\n\n## Yet Another Agentic Workflow\n\nThis repository uses YAAW engineering skills.\n\nUse the installed skills when their procedure matches the task.\n\nFor meaningful implementation work:\n\n- resolve consequential ambiguity before coding;\n- establish observable acceptance criteria;\n- prefer small independently verifiable slices;\n- use feedback loops rather than guessing;\n- verify before declaring work complete.\n\n${MANAGED_BLOCK_END}`;
|
|
11
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
12
|
+
function normalizeRelative(path) {
|
|
13
|
+
return path.replaceAll("\\", "/");
|
|
14
|
+
}
|
|
15
|
+
function digest(content) {
|
|
16
|
+
return `sha256:${createHash("sha256").update(content).digest("hex")}`;
|
|
17
|
+
}
|
|
18
|
+
async function exists(path) {
|
|
19
|
+
try {
|
|
20
|
+
await access(path);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function packageVersion() {
|
|
28
|
+
const parsed = JSON.parse(await readFile(join(packageRoot, "package.json"), "utf8"));
|
|
29
|
+
if (typeof parsed.version !== "string")
|
|
30
|
+
throw new Error("package.json does not contain a version");
|
|
31
|
+
return parsed.version;
|
|
32
|
+
}
|
|
33
|
+
function validateManagedPath(path) {
|
|
34
|
+
const normalized = normalizeRelative(path);
|
|
35
|
+
if (!normalized || isAbsolute(path) || normalized.split("/").some((part) => part === ".." || part === "")) {
|
|
36
|
+
throw new Error(`Unsafe managed path: ${path}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function assertSafeTarget(root, relativePath) {
|
|
40
|
+
validateManagedPath(relativePath);
|
|
41
|
+
const rootReal = await realpath(root);
|
|
42
|
+
const target = resolve(rootReal, relativePath);
|
|
43
|
+
const relation = relative(rootReal, target);
|
|
44
|
+
if (relation.startsWith(`..${sep}`) || relation === ".." || isAbsolute(relation)) {
|
|
45
|
+
throw new Error(`Managed path escapes repository: ${relativePath}`);
|
|
46
|
+
}
|
|
47
|
+
let current = rootReal;
|
|
48
|
+
for (const part of normalizeRelative(relativePath).split("/").slice(0, -1)) {
|
|
49
|
+
current = join(current, part);
|
|
50
|
+
if (await exists(current)) {
|
|
51
|
+
const info = await lstat(current);
|
|
52
|
+
if (info.isSymbolicLink())
|
|
53
|
+
throw new Error(`Managed path traverses a symbolic link: ${relativePath}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (await exists(target)) {
|
|
57
|
+
const info = await lstat(target);
|
|
58
|
+
if (info.isSymbolicLink())
|
|
59
|
+
throw new Error(`Managed path is a symbolic link: ${relativePath}`);
|
|
60
|
+
}
|
|
61
|
+
return target;
|
|
62
|
+
}
|
|
63
|
+
async function atomicWrite(path, content) {
|
|
64
|
+
await mkdir(dirname(path), { recursive: true });
|
|
65
|
+
const temporary = `${path}.yaaw-${process.pid}-${Date.now()}.tmp`;
|
|
66
|
+
await writeFile(temporary, content, "utf8");
|
|
67
|
+
await rename(temporary, path);
|
|
68
|
+
}
|
|
69
|
+
export async function readInstallManifest(root = ".") {
|
|
70
|
+
const path = join(resolve(root), ".yaaw", "install.json");
|
|
71
|
+
if (!(await exists(path)))
|
|
72
|
+
return undefined;
|
|
73
|
+
let value;
|
|
74
|
+
try {
|
|
75
|
+
value = JSON.parse(await readFile(path, "utf8"));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new Error(`${path} is not valid JSON`);
|
|
79
|
+
}
|
|
80
|
+
if (!value || typeof value !== "object")
|
|
81
|
+
throw new Error(`${path} is not a valid YAAW install manifest`);
|
|
82
|
+
const candidate = value;
|
|
83
|
+
const validRecords = (records) => {
|
|
84
|
+
if (!records || typeof records !== "object" || Array.isArray(records))
|
|
85
|
+
return false;
|
|
86
|
+
return Object.entries(records).every(([path, record]) => {
|
|
87
|
+
try {
|
|
88
|
+
validateManagedPath(path);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return Boolean(record) && typeof record === "object" && typeof record.hash === "string" && /^sha256:[a-f0-9]{64}$/.test(record.hash);
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
if (candidate.schemaVersion !== MANIFEST_SCHEMA_VERSION ||
|
|
97
|
+
typeof candidate.installedVersion !== "string" ||
|
|
98
|
+
!Array.isArray(candidate.providers) ||
|
|
99
|
+
!candidate.providers.every((id) => typeof id === "string" && listProviders().some((provider) => provider.id === id)) ||
|
|
100
|
+
typeof candidate.installedAt !== "string" ||
|
|
101
|
+
typeof candidate.updatedAt !== "string" ||
|
|
102
|
+
!validRecords(candidate.managedFiles) ||
|
|
103
|
+
(candidate.managedInstructionBlocks !== undefined && !validRecords(candidate.managedInstructionBlocks)))
|
|
104
|
+
throw new Error(`${path} uses an unsupported or invalid install manifest schema`);
|
|
105
|
+
return {
|
|
106
|
+
schemaVersion: candidate.schemaVersion,
|
|
107
|
+
installedVersion: candidate.installedVersion,
|
|
108
|
+
providers: candidate.providers,
|
|
109
|
+
installedAt: typeof candidate.installedAt === "string" ? candidate.installedAt : new Date(0).toISOString(),
|
|
110
|
+
updatedAt: typeof candidate.updatedAt === "string" ? candidate.updatedAt : new Date(0).toISOString(),
|
|
111
|
+
managedFiles: candidate.managedFiles,
|
|
112
|
+
managedInstructionBlocks: candidate.managedInstructionBlocks && typeof candidate.managedInstructionBlocks === "object"
|
|
113
|
+
? candidate.managedInstructionBlocks
|
|
114
|
+
: {}
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export async function detectLegacyProviders(root = ".") {
|
|
118
|
+
const absoluteRoot = resolve(root);
|
|
119
|
+
const detected = [];
|
|
120
|
+
for (const provider of listProviders()) {
|
|
121
|
+
const legacyManifest = join(absoluteRoot, ".yaaw", "adapters", `${provider.id}.json`);
|
|
122
|
+
const nativeSkills = join(absoluteRoot, provider.skillsDirectory);
|
|
123
|
+
if (await exists(legacyManifest) || await exists(nativeSkills))
|
|
124
|
+
detected.push(provider.id);
|
|
125
|
+
}
|
|
126
|
+
return detected;
|
|
127
|
+
}
|
|
128
|
+
async function loadSkills() {
|
|
129
|
+
const root = join(packageRoot, "skills");
|
|
130
|
+
const skills = new Map();
|
|
131
|
+
for (const entry of await readdir(root, { withFileTypes: true })) {
|
|
132
|
+
if (!entry.isDirectory())
|
|
133
|
+
continue;
|
|
134
|
+
const source = join(root, entry.name, "SKILL.md");
|
|
135
|
+
if (await exists(source))
|
|
136
|
+
skills.set(entry.name, await readFile(source, "utf8"));
|
|
137
|
+
}
|
|
138
|
+
if (skills.size === 0)
|
|
139
|
+
throw new Error("The package contains no installable skills");
|
|
140
|
+
return skills;
|
|
141
|
+
}
|
|
142
|
+
function replaceManagedBlock(existing, block) {
|
|
143
|
+
const start = existing.indexOf(MANAGED_BLOCK_START);
|
|
144
|
+
const end = existing.indexOf(MANAGED_BLOCK_END);
|
|
145
|
+
if ((start === -1) !== (end === -1) || (start !== -1 && end < start)) {
|
|
146
|
+
throw new Error("Instruction file contains malformed YAAW managed block markers");
|
|
147
|
+
}
|
|
148
|
+
if (start !== -1) {
|
|
149
|
+
const after = end + MANAGED_BLOCK_END.length;
|
|
150
|
+
if (!block)
|
|
151
|
+
return `${existing.slice(0, start).trimEnd()}${existing.slice(after)}`.replace(/^\s+$/, "");
|
|
152
|
+
return `${existing.slice(0, start)}${block}${existing.slice(after)}`;
|
|
153
|
+
}
|
|
154
|
+
if (!block)
|
|
155
|
+
return existing;
|
|
156
|
+
return existing.length === 0 ? `${block}\n` : `${existing.trimEnd()}\n\n${block}\n`;
|
|
157
|
+
}
|
|
158
|
+
function extractManagedBlock(existing) {
|
|
159
|
+
const start = existing.indexOf(MANAGED_BLOCK_START);
|
|
160
|
+
const end = existing.indexOf(MANAGED_BLOCK_END, start + MANAGED_BLOCK_START.length);
|
|
161
|
+
if (start === -1 || end === -1)
|
|
162
|
+
return undefined;
|
|
163
|
+
return existing.slice(start, end + MANAGED_BLOCK_END.length);
|
|
164
|
+
}
|
|
165
|
+
async function classifyDesiredFile(root, path, kind, content, previousHash, overwriteModified) {
|
|
166
|
+
const absolute = await assertSafeTarget(root, path);
|
|
167
|
+
const desiredHash = digest(content);
|
|
168
|
+
if (!(await exists(absolute)))
|
|
169
|
+
return { path, kind, status: "added", content, ...(previousHash ? { previousHash } : {}), desiredHash };
|
|
170
|
+
const current = await readFile(absolute, "utf8");
|
|
171
|
+
const currentHash = digest(kind === "instruction" ? (extractManagedBlock(current) ?? "") : current);
|
|
172
|
+
if (kind === "instruction" && !extractManagedBlock(current)) {
|
|
173
|
+
return { path, kind, status: "added", content, ...(previousHash ? { previousHash } : {}), desiredHash };
|
|
174
|
+
}
|
|
175
|
+
if (currentHash === desiredHash)
|
|
176
|
+
return { path, kind, status: "unchanged", content, ...(previousHash ? { previousHash } : {}), desiredHash };
|
|
177
|
+
if (!previousHash || currentHash !== previousHash) {
|
|
178
|
+
return { path, kind, status: overwriteModified ? "updated" : "conflicted", content, ...(previousHash ? { previousHash } : {}), desiredHash };
|
|
179
|
+
}
|
|
180
|
+
return { path, kind, status: "updated", content, previousHash, desiredHash };
|
|
181
|
+
}
|
|
182
|
+
async function classifyObsolete(root, path, kind, previousHash, overwriteModified) {
|
|
183
|
+
const absolute = await assertSafeTarget(root, path);
|
|
184
|
+
if (!(await exists(absolute)))
|
|
185
|
+
return { path, kind, status: "removed", previousHash };
|
|
186
|
+
const current = await readFile(absolute, "utf8");
|
|
187
|
+
const managed = kind === "instruction" ? extractManagedBlock(current) : current;
|
|
188
|
+
if (managed === undefined)
|
|
189
|
+
return { path, kind, status: "removed", previousHash };
|
|
190
|
+
const status = digest(managed) === previousHash || overwriteModified ? "removed" : "conflicted";
|
|
191
|
+
return { path, kind, status, previousHash };
|
|
192
|
+
}
|
|
193
|
+
export async function planInstallation(root, options) {
|
|
194
|
+
const absoluteRoot = resolve(root);
|
|
195
|
+
const rootInfo = await stat(absoluteRoot).catch(() => undefined);
|
|
196
|
+
if (!rootInfo?.isDirectory())
|
|
197
|
+
throw new Error(`Target repository does not exist: ${absoluteRoot}`);
|
|
198
|
+
const providers = [...new Set(options.providers)];
|
|
199
|
+
if (providers.length === 0)
|
|
200
|
+
throw new Error("Select at least one provider");
|
|
201
|
+
const selected = providers.map((id) => getProvider(id));
|
|
202
|
+
const [previousManifest, skills, discovery] = await Promise.all([
|
|
203
|
+
readInstallManifest(absoluteRoot), loadSkills(), discoverRepository(absoluteRoot)
|
|
204
|
+
]);
|
|
205
|
+
const desiredSkills = new Map();
|
|
206
|
+
const desiredInstructions = new Map();
|
|
207
|
+
for (const provider of selected) {
|
|
208
|
+
if (provider.capabilities.skills) {
|
|
209
|
+
for (const [name, content] of skills)
|
|
210
|
+
desiredSkills.set(`${provider.skillsDirectory}/${name}/SKILL.md`, content);
|
|
211
|
+
}
|
|
212
|
+
if (provider.capabilities.instructions)
|
|
213
|
+
desiredInstructions.set(provider.instructionFile, MANAGED_INSTRUCTION_BLOCK);
|
|
214
|
+
}
|
|
215
|
+
const operations = [];
|
|
216
|
+
for (const [path, content] of desiredSkills) {
|
|
217
|
+
operations.push(await classifyDesiredFile(absoluteRoot, path, "skill", content, previousManifest?.managedFiles[path]?.hash, options.overwriteModified ?? false));
|
|
218
|
+
}
|
|
219
|
+
for (const [path, content] of desiredInstructions) {
|
|
220
|
+
operations.push(await classifyDesiredFile(absoluteRoot, path, "instruction", content, previousManifest?.managedInstructionBlocks[path]?.hash, options.overwriteModified ?? false));
|
|
221
|
+
}
|
|
222
|
+
for (const [path, record] of Object.entries(previousManifest?.managedFiles ?? {})) {
|
|
223
|
+
if (!desiredSkills.has(path))
|
|
224
|
+
operations.push(await classifyObsolete(absoluteRoot, path, "skill", record.hash, options.overwriteModified ?? false));
|
|
225
|
+
}
|
|
226
|
+
for (const [path, record] of Object.entries(previousManifest?.managedInstructionBlocks ?? {})) {
|
|
227
|
+
if (!desiredInstructions.has(path))
|
|
228
|
+
operations.push(await classifyObsolete(absoluteRoot, path, "instruction", record.hash, options.overwriteModified ?? false));
|
|
229
|
+
}
|
|
230
|
+
operations.sort((left, right) => left.path.localeCompare(right.path) || left.kind.localeCompare(right.kind));
|
|
231
|
+
return { root: absoluteRoot, providers, discovery, ...(previousManifest ? { previousManifest } : {}), operations };
|
|
232
|
+
}
|
|
233
|
+
async function applyOperation(root, operation) {
|
|
234
|
+
if (operation.status === "unchanged" || operation.status === "conflicted")
|
|
235
|
+
return;
|
|
236
|
+
const absolute = await assertSafeTarget(root, operation.path);
|
|
237
|
+
if (operation.status === "removed") {
|
|
238
|
+
if (operation.kind === "instruction" && await exists(absolute)) {
|
|
239
|
+
const current = await readFile(absolute, "utf8");
|
|
240
|
+
await atomicWrite(absolute, replaceManagedBlock(current, undefined));
|
|
241
|
+
}
|
|
242
|
+
else
|
|
243
|
+
await rm(absolute, { force: true });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (operation.kind === "instruction") {
|
|
247
|
+
const current = await exists(absolute) ? await readFile(absolute, "utf8") : "";
|
|
248
|
+
await atomicWrite(absolute, replaceManagedBlock(current, operation.content));
|
|
249
|
+
}
|
|
250
|
+
else
|
|
251
|
+
await atomicWrite(absolute, operation.content);
|
|
252
|
+
}
|
|
253
|
+
export async function applyInstallation(plan, now = new Date()) {
|
|
254
|
+
for (const operation of plan.operations)
|
|
255
|
+
await applyOperation(plan.root, operation);
|
|
256
|
+
const previous = plan.previousManifest;
|
|
257
|
+
const managedFiles = {};
|
|
258
|
+
const managedInstructionBlocks = {};
|
|
259
|
+
for (const operation of plan.operations) {
|
|
260
|
+
const target = operation.kind === "skill" ? managedFiles : managedInstructionBlocks;
|
|
261
|
+
if ((operation.status === "added" || operation.status === "updated" || operation.status === "unchanged") && operation.desiredHash) {
|
|
262
|
+
target[operation.path] = { hash: operation.desiredHash };
|
|
263
|
+
}
|
|
264
|
+
else if (operation.status === "conflicted" && operation.previousHash) {
|
|
265
|
+
target[operation.path] = { hash: operation.previousHash };
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const timestamp = now.toISOString();
|
|
269
|
+
const manifest = {
|
|
270
|
+
schemaVersion: MANIFEST_SCHEMA_VERSION,
|
|
271
|
+
installedVersion: await packageVersion(),
|
|
272
|
+
providers: plan.providers,
|
|
273
|
+
installedAt: previous?.installedAt ?? timestamp,
|
|
274
|
+
updatedAt: timestamp,
|
|
275
|
+
managedFiles,
|
|
276
|
+
managedInstructionBlocks
|
|
277
|
+
};
|
|
278
|
+
const manifestPath = await assertSafeTarget(plan.root, ".yaaw/install.json");
|
|
279
|
+
await atomicWrite(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
280
|
+
return { plan, manifest, manifestPath };
|
|
281
|
+
}
|
|
282
|
+
export async function installRepository(root, options) {
|
|
283
|
+
return applyInstallation(await planInstallation(root, options), options.now);
|
|
284
|
+
}
|
|
285
|
+
export async function doctorRepository(root = ".") {
|
|
286
|
+
const absoluteRoot = resolve(root);
|
|
287
|
+
const checks = [];
|
|
288
|
+
let manifest;
|
|
289
|
+
try {
|
|
290
|
+
manifest = await readInstallManifest(absoluteRoot);
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
checks.push({ status: "error", message: error instanceof Error ? error.message : String(error) });
|
|
294
|
+
}
|
|
295
|
+
if (!manifest) {
|
|
296
|
+
if (checks.length === 0)
|
|
297
|
+
checks.push({ status: "error", message: ".yaaw/install.json is missing", path: ".yaaw/install.json" });
|
|
298
|
+
return { healthy: false, root: absoluteRoot, checks };
|
|
299
|
+
}
|
|
300
|
+
checks.push({ status: "ok", message: "installation manifest", path: ".yaaw/install.json" });
|
|
301
|
+
const checkedInstructionPaths = new Set();
|
|
302
|
+
for (const id of manifest.providers) {
|
|
303
|
+
const provider = getProvider(id);
|
|
304
|
+
checks.push({ status: "ok", message: `${provider.displayName} provider` });
|
|
305
|
+
checkedInstructionPaths.add(provider.instructionFile);
|
|
306
|
+
let instructionPath;
|
|
307
|
+
try {
|
|
308
|
+
instructionPath = await assertSafeTarget(absoluteRoot, provider.instructionFile);
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
checks.push({ status: "error", message: error instanceof Error ? error.message : String(error), path: provider.instructionFile });
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
const instruction = await exists(instructionPath) ? await readFile(instructionPath, "utf8") : "";
|
|
315
|
+
const block = extractManagedBlock(instruction);
|
|
316
|
+
if (!block)
|
|
317
|
+
checks.push({ status: "error", message: "managed instruction block missing", path: provider.instructionFile });
|
|
318
|
+
else if (digest(block) !== manifest.managedInstructionBlocks[provider.instructionFile]?.hash)
|
|
319
|
+
checks.push({ status: "warning", message: "managed instruction block modified", path: provider.instructionFile });
|
|
320
|
+
else
|
|
321
|
+
checks.push({ status: "ok", message: `${provider.instructionFile} integration`, path: provider.instructionFile });
|
|
322
|
+
}
|
|
323
|
+
for (const [path, record] of Object.entries(manifest.managedInstructionBlocks)) {
|
|
324
|
+
if (checkedInstructionPaths.has(path))
|
|
325
|
+
continue;
|
|
326
|
+
let absolute;
|
|
327
|
+
try {
|
|
328
|
+
absolute = await assertSafeTarget(absoluteRoot, path);
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
checks.push({ status: "error", message: error instanceof Error ? error.message : String(error), path });
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
const current = await exists(absolute) ? await readFile(absolute, "utf8") : "";
|
|
335
|
+
const block = extractManagedBlock(current);
|
|
336
|
+
if (!block)
|
|
337
|
+
checks.push({ status: "error", message: "managed instruction block missing", path });
|
|
338
|
+
else if (digest(block) !== record.hash)
|
|
339
|
+
checks.push({ status: "warning", message: "managed instruction block modified", path });
|
|
340
|
+
else
|
|
341
|
+
checks.push({ status: "warning", message: "obsolete managed instruction block remains", path });
|
|
342
|
+
}
|
|
343
|
+
for (const [path, record] of Object.entries(manifest.managedFiles)) {
|
|
344
|
+
let absolute;
|
|
345
|
+
try {
|
|
346
|
+
absolute = await assertSafeTarget(absoluteRoot, path);
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
checks.push({ status: "error", message: error instanceof Error ? error.message : String(error), path });
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
if (!(await exists(absolute)))
|
|
353
|
+
checks.push({ status: "error", message: "managed file missing", path });
|
|
354
|
+
else if (digest(await readFile(absolute)) !== record.hash)
|
|
355
|
+
checks.push({ status: "warning", message: "managed file modified", path });
|
|
356
|
+
}
|
|
357
|
+
const managedCount = Object.keys(manifest.managedFiles).length;
|
|
358
|
+
checks.push({ status: "ok", message: `${managedCount} managed skills` });
|
|
359
|
+
return { healthy: checks.every((check) => check.status === "ok"), root: absoluteRoot, manifest, checks };
|
|
360
|
+
}
|
|
361
|
+
export function providerNames(ids) {
|
|
362
|
+
return ids.map((id) => getProvider(id).displayName);
|
|
363
|
+
}
|
|
364
|
+
export function providerFromDefinition(definition) { return definition.id; }
|
|
365
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type WorkflowRunEventType = "task" | "agent_invocation" | "tool_call" | "verification_failure" | "retry" | "token_usage" | "human_intervention" | "result";
|
|
2
|
+
export interface WorkflowRunEvent {
|
|
3
|
+
version: 1;
|
|
4
|
+
runId: string;
|
|
5
|
+
workflow: string;
|
|
6
|
+
sequence: number;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
type: WorkflowRunEventType;
|
|
9
|
+
data: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface WorkflowRun {
|
|
12
|
+
runId: string;
|
|
13
|
+
path: string;
|
|
14
|
+
events: WorkflowRunEvent[];
|
|
15
|
+
}
|
|
16
|
+
export interface StartWorkflowRunOptions {
|
|
17
|
+
runId?: string;
|
|
18
|
+
timestamp?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface RecordWorkflowRunOptions {
|
|
21
|
+
timestamp?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface WorkflowResult {
|
|
24
|
+
status: "completed" | "failed" | "cancelled";
|
|
25
|
+
summary: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class ObservabilityError extends Error {
|
|
28
|
+
constructor(message: string);
|
|
29
|
+
}
|
|
30
|
+
/** Create one append-only JSONL record for a workflow task. */
|
|
31
|
+
export declare function startWorkflowRun(workflow: string, task: string, projectDirectory?: string, options?: StartWorkflowRunOptions): Promise<WorkflowRun>;
|
|
32
|
+
/** Read and validate every event in a workflow's JSONL record. */
|
|
33
|
+
export declare function readWorkflowRun(runId: string, projectDirectory?: string): Promise<WorkflowRun>;
|
|
34
|
+
/** Append an observed agent, tool, failure, retry, token, or human event. */
|
|
35
|
+
export declare function recordWorkflowRunEvent(runId: string, type: Exclude<WorkflowRunEventType, "task" | "result">, data: Record<string, unknown>, projectDirectory?: string, options?: RecordWorkflowRunOptions): Promise<WorkflowRunEvent>;
|
|
36
|
+
/** Append the terminal result and calculate wall-clock duration from the task event. */
|
|
37
|
+
export declare function finishWorkflowRun(runId: string, result: WorkflowResult, projectDirectory?: string, options?: RecordWorkflowRunOptions): Promise<WorkflowRunEvent>;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
export class ObservabilityError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "ObservabilityError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const RUN_ID = /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;
|
|
11
|
+
const RECORDABLE_TYPES = new Set([
|
|
12
|
+
"agent_invocation",
|
|
13
|
+
"tool_call",
|
|
14
|
+
"verification_failure",
|
|
15
|
+
"retry",
|
|
16
|
+
"token_usage",
|
|
17
|
+
"human_intervention"
|
|
18
|
+
]);
|
|
19
|
+
function isRecord(value) {
|
|
20
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function eventTimestamp(value) {
|
|
23
|
+
const timestamp = value ?? new Date().toISOString();
|
|
24
|
+
if (!Number.isFinite(Date.parse(timestamp)))
|
|
25
|
+
throw new ObservabilityError(`invalid event timestamp '${timestamp}'`);
|
|
26
|
+
return timestamp;
|
|
27
|
+
}
|
|
28
|
+
function assertRunId(runId) {
|
|
29
|
+
if (!RUN_ID.test(runId))
|
|
30
|
+
throw new ObservabilityError(`invalid run id '${runId}'`);
|
|
31
|
+
}
|
|
32
|
+
function runPath(runId, projectDirectory) {
|
|
33
|
+
assertRunId(runId);
|
|
34
|
+
return join(resolve(projectDirectory), ".yaaw", "runs", `${runId}.jsonl`);
|
|
35
|
+
}
|
|
36
|
+
function requiredString(data, field, type) {
|
|
37
|
+
if (typeof data[field] !== "string" || !data[field].trim()) {
|
|
38
|
+
throw new ObservabilityError(`${type}.${field} must be a non-empty string`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function requiredInteger(data, field, type, minimum = 0) {
|
|
42
|
+
const value = data[field];
|
|
43
|
+
if (!Number.isInteger(value) || value < minimum) {
|
|
44
|
+
throw new ObservabilityError(`${type}.${field} must be an integer >= ${minimum}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function validateEventData(type, data) {
|
|
48
|
+
if (type === "task")
|
|
49
|
+
requiredString(data, "request", type);
|
|
50
|
+
if (type === "agent_invocation")
|
|
51
|
+
requiredString(data, "agent", type);
|
|
52
|
+
if (type === "tool_call")
|
|
53
|
+
requiredString(data, "tool", type);
|
|
54
|
+
if (type === "verification_failure") {
|
|
55
|
+
requiredString(data, "command", type);
|
|
56
|
+
if (typeof data.output !== "string")
|
|
57
|
+
throw new ObservabilityError(`${type}.output must be a string`);
|
|
58
|
+
requiredInteger(data, "exitCode", type);
|
|
59
|
+
if (data.exitCode === 0)
|
|
60
|
+
throw new ObservabilityError(`${type}.exitCode must be non-zero`);
|
|
61
|
+
}
|
|
62
|
+
if (type === "retry") {
|
|
63
|
+
requiredString(data, "target", type);
|
|
64
|
+
requiredInteger(data, "attempt", type, 2);
|
|
65
|
+
}
|
|
66
|
+
if (type === "token_usage")
|
|
67
|
+
requiredInteger(data, "totalTokens", type);
|
|
68
|
+
if (type === "human_intervention")
|
|
69
|
+
requiredString(data, "action", type);
|
|
70
|
+
if (type === "result") {
|
|
71
|
+
if (!new Set(["completed", "failed", "cancelled"]).has(String(data.status))) {
|
|
72
|
+
throw new ObservabilityError("result.status must be completed, failed, or cancelled");
|
|
73
|
+
}
|
|
74
|
+
requiredString(data, "summary", type);
|
|
75
|
+
requiredInteger(data, "durationMs", type);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
JSON.stringify(data);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
throw new ObservabilityError(`${type} data must be JSON serializable`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function line(event) {
|
|
85
|
+
return `${JSON.stringify(event)}\n`;
|
|
86
|
+
}
|
|
87
|
+
function parseEvent(value, path, lineNumber) {
|
|
88
|
+
if (!isRecord(value) || value.version !== 1 || typeof value.runId !== "string" || typeof value.workflow !== "string" ||
|
|
89
|
+
!Number.isInteger(value.sequence) || typeof value.timestamp !== "string" || typeof value.type !== "string" || !isRecord(value.data)) {
|
|
90
|
+
throw new ObservabilityError(`${path}:${lineNumber} is not a YAAW run event`);
|
|
91
|
+
}
|
|
92
|
+
const type = value.type;
|
|
93
|
+
if (![...RECORDABLE_TYPES, "task", "result"].includes(type)) {
|
|
94
|
+
throw new ObservabilityError(`${path}:${lineNumber} has unknown event type '${value.type}'`);
|
|
95
|
+
}
|
|
96
|
+
validateEventData(type, value.data);
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
/** Create one append-only JSONL record for a workflow task. */
|
|
100
|
+
export async function startWorkflowRun(workflow, task, projectDirectory = ".", options = {}) {
|
|
101
|
+
if (!workflow.trim())
|
|
102
|
+
throw new ObservabilityError("workflow must be a non-empty string");
|
|
103
|
+
if (!task.trim())
|
|
104
|
+
throw new ObservabilityError("task must be a non-empty string");
|
|
105
|
+
const runId = options.runId ?? randomUUID();
|
|
106
|
+
const path = runPath(runId, projectDirectory);
|
|
107
|
+
const event = {
|
|
108
|
+
version: 1,
|
|
109
|
+
runId,
|
|
110
|
+
workflow,
|
|
111
|
+
sequence: 1,
|
|
112
|
+
timestamp: eventTimestamp(options.timestamp),
|
|
113
|
+
type: "task",
|
|
114
|
+
data: { request: task }
|
|
115
|
+
};
|
|
116
|
+
await mkdir(join(resolve(projectDirectory), ".yaaw", "runs"), { recursive: true });
|
|
117
|
+
try {
|
|
118
|
+
await writeFile(path, line(event), { encoding: "utf8", flag: "wx" });
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (isRecord(error) && error.code === "EEXIST")
|
|
122
|
+
throw new ObservabilityError(`run '${runId}' already exists`);
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
return { runId, path, events: [event] };
|
|
126
|
+
}
|
|
127
|
+
/** Read and validate every event in a workflow's JSONL record. */
|
|
128
|
+
export async function readWorkflowRun(runId, projectDirectory = ".") {
|
|
129
|
+
const path = runPath(runId, projectDirectory);
|
|
130
|
+
let source;
|
|
131
|
+
try {
|
|
132
|
+
source = await readFile(path, "utf8");
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
if (isRecord(error) && error.code === "ENOENT")
|
|
136
|
+
throw new ObservabilityError(`run '${runId}' does not exist`);
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
const rows = source.split(/\r?\n/).filter((row) => row.trim());
|
|
140
|
+
const events = rows.map((row, index) => {
|
|
141
|
+
try {
|
|
142
|
+
return parseEvent(JSON.parse(row), path, index + 1);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error instanceof ObservabilityError)
|
|
146
|
+
throw error;
|
|
147
|
+
throw new ObservabilityError(`${path}:${index + 1} contains invalid JSON`);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
if (!events.length || events[0]?.type !== "task")
|
|
151
|
+
throw new ObservabilityError(`${path} does not start with a task event`);
|
|
152
|
+
for (const [index, event] of events.entries()) {
|
|
153
|
+
if (event.runId !== runId || event.sequence !== index + 1 || event.workflow !== events[0].workflow) {
|
|
154
|
+
throw new ObservabilityError(`${path}:${index + 1} breaks run identity or event sequence`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { runId, path, events };
|
|
158
|
+
}
|
|
159
|
+
/** Append an observed agent, tool, failure, retry, token, or human event. */
|
|
160
|
+
export async function recordWorkflowRunEvent(runId, type, data, projectDirectory = ".", options = {}) {
|
|
161
|
+
if (!RECORDABLE_TYPES.has(type))
|
|
162
|
+
throw new ObservabilityError(`event type '${type}' cannot be recorded directly`);
|
|
163
|
+
validateEventData(type, data);
|
|
164
|
+
const run = await readWorkflowRun(runId, projectDirectory);
|
|
165
|
+
if (run.events.some((event) => event.type === "result"))
|
|
166
|
+
throw new ObservabilityError(`run '${runId}' already has a result`);
|
|
167
|
+
const event = {
|
|
168
|
+
version: 1,
|
|
169
|
+
runId,
|
|
170
|
+
workflow: run.events[0].workflow,
|
|
171
|
+
sequence: run.events.length + 1,
|
|
172
|
+
timestamp: eventTimestamp(options.timestamp),
|
|
173
|
+
type,
|
|
174
|
+
data
|
|
175
|
+
};
|
|
176
|
+
await appendFile(run.path, line(event), "utf8");
|
|
177
|
+
return event;
|
|
178
|
+
}
|
|
179
|
+
/** Append the terminal result and calculate wall-clock duration from the task event. */
|
|
180
|
+
export async function finishWorkflowRun(runId, result, projectDirectory = ".", options = {}) {
|
|
181
|
+
const run = await readWorkflowRun(runId, projectDirectory);
|
|
182
|
+
if (run.events.some((event) => event.type === "result"))
|
|
183
|
+
throw new ObservabilityError(`run '${runId}' already has a result`);
|
|
184
|
+
const timestamp = eventTimestamp(options.timestamp);
|
|
185
|
+
const durationMs = Math.max(0, Date.parse(timestamp) - Date.parse(run.events[0].timestamp));
|
|
186
|
+
const data = { ...result, durationMs };
|
|
187
|
+
validateEventData("result", data);
|
|
188
|
+
const event = {
|
|
189
|
+
version: 1,
|
|
190
|
+
runId,
|
|
191
|
+
workflow: run.events[0].workflow,
|
|
192
|
+
sequence: run.events.length + 1,
|
|
193
|
+
timestamp,
|
|
194
|
+
type: "result",
|
|
195
|
+
data
|
|
196
|
+
};
|
|
197
|
+
await appendFile(run.path, line(event), "utf8");
|
|
198
|
+
return event;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"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"}
|