ios-agent-mcp 2.5.1 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -10
- package/data/knowledge.json +1 -1
- package/data/local-library.mjs +2 -2
- package/dist/analyzers/app-intents.d.ts +9 -0
- package/dist/analyzers/app-intents.js +105 -0
- package/dist/analyzers/app-intents.js.map +1 -0
- package/dist/analyzers/skill.js +1 -1
- package/dist/analyzers/skill.js.map +1 -1
- package/dist/app-loop.d.ts +7 -0
- package/dist/app-loop.js +548 -0
- package/dist/app-loop.js.map +1 -0
- package/dist/development-feedback.d.ts +3 -0
- package/dist/development-feedback.js +12 -0
- package/dist/development-feedback.js.map +1 -0
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/issue-report.d.ts +70 -0
- package/dist/issue-report.js +41 -0
- package/dist/issue-report.js.map +1 -0
- package/dist/resources.js +2 -0
- package/dist/resources.js.map +1 -1
- package/dist/result.d.ts +16 -16
- package/dist/unified.js +25 -4
- package/dist/unified.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/mcp.json +9 -1
- package/package.json +5 -4
package/dist/app-loop.js
ADDED
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { mkdir, readFile, writeFile, rename, readdir, stat, lstat, open, rm, } from "node:fs/promises";
|
|
4
|
+
import { resolve, join, relative, isAbsolute } from "node:path";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
const Check = z
|
|
7
|
+
.object({
|
|
8
|
+
id: z.string().regex(/^[a-z0-9-]+$/),
|
|
9
|
+
description: z.string().min(1),
|
|
10
|
+
command: z.string().min(1),
|
|
11
|
+
args: z.array(z.string()),
|
|
12
|
+
timeoutSeconds: z.number().int().min(1).max(1800).default(600),
|
|
13
|
+
artifacts: z.array(z.string()).default([]),
|
|
14
|
+
})
|
|
15
|
+
.strict();
|
|
16
|
+
const Config = z
|
|
17
|
+
.object({
|
|
18
|
+
protectedFiles: z.array(z.string().min(1)).min(1),
|
|
19
|
+
checks: z.array(Check).min(1),
|
|
20
|
+
screens: z
|
|
21
|
+
.array(z.object({
|
|
22
|
+
name: z.string().min(1),
|
|
23
|
+
checkId: z.string(),
|
|
24
|
+
artifact: z.string().min(1),
|
|
25
|
+
}))
|
|
26
|
+
.min(1),
|
|
27
|
+
})
|
|
28
|
+
.strict();
|
|
29
|
+
const Plan = z.object({
|
|
30
|
+
summary: z.string().min(1),
|
|
31
|
+
screens: z.array(z.string()).min(1),
|
|
32
|
+
features: z.array(z.string()).min(1),
|
|
33
|
+
criteria: z
|
|
34
|
+
.array(z.object({
|
|
35
|
+
id: z.string(),
|
|
36
|
+
description: z.string().min(1),
|
|
37
|
+
checkIds: z.array(z.string()).min(1),
|
|
38
|
+
}))
|
|
39
|
+
.min(1),
|
|
40
|
+
});
|
|
41
|
+
const hash = (text) => createHash("sha256").update(text).digest("hex");
|
|
42
|
+
async function save(path, data) {
|
|
43
|
+
await writeFile(path + ".tmp", JSON.stringify(data, null, 2) + "\n");
|
|
44
|
+
await rename(path + ".tmp", path);
|
|
45
|
+
}
|
|
46
|
+
function local(root, path) {
|
|
47
|
+
if (path.replaceAll("\\", "/").startsWith(".ios-agent/loop"))
|
|
48
|
+
throw Error("Artifacts cannot target loop state");
|
|
49
|
+
const full = resolve(root, path);
|
|
50
|
+
const rel = relative(root, full);
|
|
51
|
+
if (isAbsolute(path) ||
|
|
52
|
+
rel.startsWith("..") ||
|
|
53
|
+
!rel ||
|
|
54
|
+
rel.replaceAll("\\", "/").startsWith(".ios-agent/loop"))
|
|
55
|
+
throw Error(`Expected project-relative artifact: ${path}`);
|
|
56
|
+
return full;
|
|
57
|
+
}
|
|
58
|
+
function validate(config, plan) {
|
|
59
|
+
const artifacts = config.checks.flatMap((c) => c.artifacts);
|
|
60
|
+
for (const artifact of artifacts) {
|
|
61
|
+
if (!artifact.startsWith(".ios-agent/evidence/") ||
|
|
62
|
+
artifact
|
|
63
|
+
.split("/")
|
|
64
|
+
.some((part) => !part || part === "." || part === "..") ||
|
|
65
|
+
artifact.includes("\\"))
|
|
66
|
+
throw Error("Artifacts must use canonical paths inside .ios-agent/evidence/");
|
|
67
|
+
}
|
|
68
|
+
if (new Set(artifacts).size !== artifacts.length)
|
|
69
|
+
throw Error("Duplicate artifact ownership");
|
|
70
|
+
const ids = new Set(config.checks.map((c) => c.id));
|
|
71
|
+
if (ids.size !== config.checks.length)
|
|
72
|
+
throw Error("Duplicate check IDs");
|
|
73
|
+
for (const screen of config.screens) {
|
|
74
|
+
const check = config.checks.find((c) => c.id === screen.checkId);
|
|
75
|
+
if (!check?.artifacts.includes(screen.artifact))
|
|
76
|
+
throw Error(`Screen ${screen.name} lacks a producing check/artifact`);
|
|
77
|
+
}
|
|
78
|
+
if (plan) {
|
|
79
|
+
if (plan.screens.some((name) => !config.screens.some((screen) => screen.name === name)) ||
|
|
80
|
+
config.screens.some((screen) => !plan.screens.includes(screen.name)))
|
|
81
|
+
throw Error("Plan must cover exactly the configured screens");
|
|
82
|
+
}
|
|
83
|
+
if (plan)
|
|
84
|
+
for (const criterion of plan.criteria)
|
|
85
|
+
for (const id of criterion.checkIds)
|
|
86
|
+
if (!ids.has(id))
|
|
87
|
+
throw Error(`Unknown acceptance check ${id}`);
|
|
88
|
+
}
|
|
89
|
+
// Spawn argv directly: no shell interpretation. Logs are bounded; long processes have a hard deadline.
|
|
90
|
+
export async function runProcess(command, args, cwd, timeoutSeconds, log, input) {
|
|
91
|
+
const handle = await open(log, "w");
|
|
92
|
+
let bytes = 0;
|
|
93
|
+
let stdout = "";
|
|
94
|
+
const writes = [];
|
|
95
|
+
try {
|
|
96
|
+
return await new Promise((done) => {
|
|
97
|
+
const child = spawn(command, args, {
|
|
98
|
+
cwd,
|
|
99
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
100
|
+
detached: process.platform !== "win32",
|
|
101
|
+
});
|
|
102
|
+
let timedOut = false;
|
|
103
|
+
let interrupted = false;
|
|
104
|
+
let settled = false;
|
|
105
|
+
let escalation;
|
|
106
|
+
const kill = (signal) => {
|
|
107
|
+
try {
|
|
108
|
+
if (process.platform !== "win32" && child.pid)
|
|
109
|
+
process.kill(-child.pid, signal);
|
|
110
|
+
else
|
|
111
|
+
child.kill(signal);
|
|
112
|
+
}
|
|
113
|
+
catch { }
|
|
114
|
+
};
|
|
115
|
+
const stop = () => {
|
|
116
|
+
kill("SIGTERM");
|
|
117
|
+
escalation ??= setTimeout(() => kill("SIGKILL"), 5000);
|
|
118
|
+
escalation.unref();
|
|
119
|
+
};
|
|
120
|
+
const interrupt = () => {
|
|
121
|
+
interrupted = true;
|
|
122
|
+
stop();
|
|
123
|
+
};
|
|
124
|
+
process.once("SIGINT", interrupt);
|
|
125
|
+
process.once("SIGTERM", interrupt);
|
|
126
|
+
const timer = setTimeout(() => {
|
|
127
|
+
timedOut = true;
|
|
128
|
+
stop();
|
|
129
|
+
}, timeoutSeconds * 1000);
|
|
130
|
+
const record = (data) => {
|
|
131
|
+
if (bytes < 4 * 1024 * 1024) {
|
|
132
|
+
bytes += data.length;
|
|
133
|
+
writes.push(handle.write(data));
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
child.stdout.on("data", (data) => {
|
|
137
|
+
if (stdout.length < 4 * 1024 * 1024)
|
|
138
|
+
stdout += data.toString();
|
|
139
|
+
record(data);
|
|
140
|
+
});
|
|
141
|
+
child.stderr.on("data", record);
|
|
142
|
+
const finish = (exitCode) => {
|
|
143
|
+
if (settled)
|
|
144
|
+
return;
|
|
145
|
+
settled = true;
|
|
146
|
+
clearTimeout(timer);
|
|
147
|
+
if (escalation)
|
|
148
|
+
clearTimeout(escalation);
|
|
149
|
+
process.removeListener("SIGINT", interrupt);
|
|
150
|
+
process.removeListener("SIGTERM", interrupt);
|
|
151
|
+
done({ exitCode, timedOut, stdout, interrupted });
|
|
152
|
+
};
|
|
153
|
+
child.on("error", (error) => {
|
|
154
|
+
record(Buffer.from(error.message));
|
|
155
|
+
finish(null);
|
|
156
|
+
});
|
|
157
|
+
child.on("close", finish);
|
|
158
|
+
child.stdin.on("error", () => { });
|
|
159
|
+
child.stdin.end(input);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
await Promise.all(writes);
|
|
164
|
+
await handle.close();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async function safeArtifact(root, path) {
|
|
168
|
+
const full = local(root, path);
|
|
169
|
+
let part = root;
|
|
170
|
+
for (const component of relative(root, full).split("/")) {
|
|
171
|
+
part = join(part, component);
|
|
172
|
+
try {
|
|
173
|
+
if ((await lstat(part)).isSymbolicLink())
|
|
174
|
+
throw Error(`Symlink evidence path rejected: ${path}`);
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
if (e.code !== "ENOENT")
|
|
178
|
+
throw e;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return full;
|
|
182
|
+
}
|
|
183
|
+
async function fingerprint(root) {
|
|
184
|
+
const entries = [];
|
|
185
|
+
async function walk(dir) {
|
|
186
|
+
for (const ent of (await readdir(dir, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
187
|
+
if ([
|
|
188
|
+
".git",
|
|
189
|
+
".ios-agent",
|
|
190
|
+
"node_modules",
|
|
191
|
+
".build",
|
|
192
|
+
"DerivedData",
|
|
193
|
+
"build",
|
|
194
|
+
"xcuserdata",
|
|
195
|
+
"project.xcworkspace",
|
|
196
|
+
].includes(ent.name) ||
|
|
197
|
+
ent.name.endsWith(".xcresult"))
|
|
198
|
+
continue;
|
|
199
|
+
const path = join(dir, ent.name);
|
|
200
|
+
if (ent.isDirectory())
|
|
201
|
+
await walk(path);
|
|
202
|
+
else if (ent.isSymbolicLink())
|
|
203
|
+
throw Error(`Symlink source not supported: ${path}`);
|
|
204
|
+
else if (ent.isFile())
|
|
205
|
+
entries.push(relative(root, path) + ":" + hash(await readFile(path)));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
await walk(root);
|
|
209
|
+
return hash(entries.join("\n"));
|
|
210
|
+
}
|
|
211
|
+
async function claude(root, prompt, log, planning) {
|
|
212
|
+
const args = [
|
|
213
|
+
"-p",
|
|
214
|
+
"--output-format",
|
|
215
|
+
"json",
|
|
216
|
+
"--max-turns",
|
|
217
|
+
"12",
|
|
218
|
+
"--strict-mcp-config",
|
|
219
|
+
"--mcp-config",
|
|
220
|
+
'{"mcpServers":{}}',
|
|
221
|
+
"--tools",
|
|
222
|
+
planning ? "Read,Glob,Grep" : "Read,Glob,Grep,Edit,Write",
|
|
223
|
+
"--allowedTools",
|
|
224
|
+
planning ? "Read,Glob,Grep" : "Read,Glob,Grep,Edit,Write",
|
|
225
|
+
"--permission-mode",
|
|
226
|
+
planning ? "default" : "acceptEdits",
|
|
227
|
+
];
|
|
228
|
+
const result = await runProcess("claude", args, root, 600, log, prompt);
|
|
229
|
+
if (result.exitCode !== 0 || result.timedOut || result.interrupted)
|
|
230
|
+
throw Error(`Claude did not finish. See ${log}`);
|
|
231
|
+
const raw = JSON.parse(result.stdout);
|
|
232
|
+
if (raw.is_error)
|
|
233
|
+
throw Error(`Claude returned an error. See ${log}`);
|
|
234
|
+
return String(raw.result ?? "");
|
|
235
|
+
}
|
|
236
|
+
export async function appLoop(argv) {
|
|
237
|
+
const action = argv[0];
|
|
238
|
+
const value = (flag) => {
|
|
239
|
+
const i = argv.indexOf(flag);
|
|
240
|
+
return i < 0 ? undefined : argv[i + 1];
|
|
241
|
+
};
|
|
242
|
+
const root = resolve(value("--project") ?? process.cwd());
|
|
243
|
+
const directory = join(root, ".ios-agent", "loop");
|
|
244
|
+
await mkdir(directory, { recursive: true });
|
|
245
|
+
const statePath = join(directory, "state.json");
|
|
246
|
+
if (action === "status") {
|
|
247
|
+
console.log(await readFile(statePath, "utf8"));
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const lockPath = join(directory, "lock");
|
|
251
|
+
let lock;
|
|
252
|
+
try {
|
|
253
|
+
lock = await open(lockPath, "wx");
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
if (e.code !== "EEXIST")
|
|
257
|
+
throw e;
|
|
258
|
+
const pid = Number(await readFile(lockPath, "utf8"));
|
|
259
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
260
|
+
throw Error("Unrecognized loop lock; inspect before removing it.");
|
|
261
|
+
let alive = true;
|
|
262
|
+
try {
|
|
263
|
+
process.kill(pid, 0);
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
if (error.code === "ESRCH")
|
|
267
|
+
alive = false;
|
|
268
|
+
}
|
|
269
|
+
if (alive)
|
|
270
|
+
throw Error("Another loop is active.");
|
|
271
|
+
await rm(lockPath);
|
|
272
|
+
lock = await open(lockPath, "wx");
|
|
273
|
+
}
|
|
274
|
+
await lock.writeFile(String(process.pid));
|
|
275
|
+
try {
|
|
276
|
+
if (action === "init") {
|
|
277
|
+
try {
|
|
278
|
+
await stat(statePath);
|
|
279
|
+
throw Error("A saved loop already exists; use resume.");
|
|
280
|
+
}
|
|
281
|
+
catch (e) {
|
|
282
|
+
if (e.code !== "ENOENT")
|
|
283
|
+
throw e;
|
|
284
|
+
}
|
|
285
|
+
const briefPath = value("--brief");
|
|
286
|
+
const configPath = value("--checks");
|
|
287
|
+
if (!briefPath || !configPath)
|
|
288
|
+
throw Error("init requires --brief brief.md --checks checks.json");
|
|
289
|
+
const brief = await readFile(resolve(root, briefPath), "utf8");
|
|
290
|
+
const config = Config.parse(JSON.parse(await readFile(resolve(root, configPath), "utf8")));
|
|
291
|
+
validate(config);
|
|
292
|
+
for (const c of config.checks)
|
|
293
|
+
for (const a of c.artifacts)
|
|
294
|
+
local(root, a);
|
|
295
|
+
const prompt = `Plan an iOS app from this brief. Do not edit files. Return ONLY JSON, no markdown, shaped {"summary":"...","screens":["..."],"features":["..."],"criteria":[{"id":"...","description":"...","checkIds":["existing-check-id"]}]}. Every criterion needs supplied check IDs. Use exactly the supplied screen names in screens. Do not invent verification claims.\nBRIEF:\n${brief}\nCHECKS:\n${JSON.stringify(config)}`;
|
|
296
|
+
const response = value("--plan")
|
|
297
|
+
? await readFile(resolve(root, value("--plan")), "utf8")
|
|
298
|
+
: await claude(root, prompt, join(directory, "plan.log"), true);
|
|
299
|
+
const plan = Plan.parse(JSON.parse(response.replace(/^```(?:json)?\s*|\s*```$/g, "")));
|
|
300
|
+
validate(config, plan);
|
|
301
|
+
const limit = Number(value("--attempts") ?? 3);
|
|
302
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 10)
|
|
303
|
+
throw Error("Attempts must be 1–10");
|
|
304
|
+
const protectedHashes = {};
|
|
305
|
+
for (const file of config.protectedFiles)
|
|
306
|
+
protectedHashes[file] = hash(await readFile(local(root, file), "utf8"));
|
|
307
|
+
const state = {
|
|
308
|
+
version: 1,
|
|
309
|
+
protectedHashes,
|
|
310
|
+
brief,
|
|
311
|
+
plan,
|
|
312
|
+
config,
|
|
313
|
+
attempts: 0,
|
|
314
|
+
limit,
|
|
315
|
+
status: "planned",
|
|
316
|
+
results: [],
|
|
317
|
+
events: [],
|
|
318
|
+
};
|
|
319
|
+
await save(statePath, state);
|
|
320
|
+
console.log(`Plan saved: ${statePath}. Review checks/plan, then run loop resume.`);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
if (action !== "resume")
|
|
324
|
+
throw Error("Usage: ios-agent-mcp loop init|resume|status --project PATH [--brief brief.md --checks checks.json --attempts 3] [--verify-only]");
|
|
325
|
+
const parsed = JSON.parse(await readFile(statePath, "utf8"));
|
|
326
|
+
const StateSchema = z
|
|
327
|
+
.object({
|
|
328
|
+
version: z.literal(1),
|
|
329
|
+
protectedHashes: z.record(z.string()),
|
|
330
|
+
brief: z.string(),
|
|
331
|
+
plan: Plan,
|
|
332
|
+
config: Config,
|
|
333
|
+
attempts: z.number().int().min(0).max(10),
|
|
334
|
+
limit: z.number().int().min(1).max(10),
|
|
335
|
+
status: z.enum([
|
|
336
|
+
"planned",
|
|
337
|
+
"implementing",
|
|
338
|
+
"checking",
|
|
339
|
+
"blocked",
|
|
340
|
+
"complete",
|
|
341
|
+
]),
|
|
342
|
+
reason: z.string().optional(),
|
|
343
|
+
fingerprint: z.string().optional(),
|
|
344
|
+
results: z.array(z.object({
|
|
345
|
+
id: z.string(),
|
|
346
|
+
passed: z.boolean(),
|
|
347
|
+
exitCode: z.number().int().nullable(),
|
|
348
|
+
log: z.string(),
|
|
349
|
+
logHash: z.string().optional(),
|
|
350
|
+
artifacts: z.array(z.string()),
|
|
351
|
+
artifactHashes: z.record(z.string()).optional(),
|
|
352
|
+
reason: z.string().optional(),
|
|
353
|
+
})),
|
|
354
|
+
events: z.array(z.object({ at: z.string(), message: z.string() })),
|
|
355
|
+
})
|
|
356
|
+
.strict();
|
|
357
|
+
const state = StateSchema.parse(parsed);
|
|
358
|
+
if (new Set(state.results.map((r) => r.id)).size !== state.results.length ||
|
|
359
|
+
state.results.some((r) => !state.config.checks.some((c) => c.id === r.id &&
|
|
360
|
+
JSON.stringify(c.artifacts) === JSON.stringify(r.artifacts))))
|
|
361
|
+
throw Error("Invalid saved check results");
|
|
362
|
+
state.config = Config.parse(state.config);
|
|
363
|
+
state.plan = Plan.parse(state.plan);
|
|
364
|
+
validate(state.config, state.plan);
|
|
365
|
+
if (!Number.isInteger(state.limit) ||
|
|
366
|
+
state.limit < 1 ||
|
|
367
|
+
state.limit > 10 ||
|
|
368
|
+
!Number.isInteger(state.attempts) ||
|
|
369
|
+
state.attempts < 0)
|
|
370
|
+
throw Error("Invalid saved retry budget");
|
|
371
|
+
const checkProtected = async () => {
|
|
372
|
+
for (const file of state.config.protectedFiles)
|
|
373
|
+
if (hash(await readFile(local(root, file), "utf8")) !==
|
|
374
|
+
state.protectedHashes[file])
|
|
375
|
+
throw Error(`Frozen verification file changed: ${file}. Restore it before resuming.`);
|
|
376
|
+
};
|
|
377
|
+
await checkProtected();
|
|
378
|
+
const evidenceValid = async (r) => {
|
|
379
|
+
try {
|
|
380
|
+
if (!r.log.startsWith(".ios-agent/loop/") ||
|
|
381
|
+
hash(await readFile(resolve(root, r.log))) !== r.logHash)
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
for (const file of r.artifacts) {
|
|
388
|
+
try {
|
|
389
|
+
if (hash(await readFile(await safeArtifact(root, file), "base64")) !==
|
|
390
|
+
r.artifactHashes?.[file])
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return true;
|
|
398
|
+
};
|
|
399
|
+
for (const r of state.results)
|
|
400
|
+
if (r.passed && !(await evidenceValid(r)))
|
|
401
|
+
r.passed = false;
|
|
402
|
+
const event = async (message) => {
|
|
403
|
+
state.events.push({ at: new Date().toISOString(), message });
|
|
404
|
+
await save(statePath, state);
|
|
405
|
+
console.log(message);
|
|
406
|
+
};
|
|
407
|
+
const resolvedArtifacts = state.config.checks.flatMap((c) => c.artifacts.map((a) => local(root, a)));
|
|
408
|
+
if (new Set(resolvedArtifacts).size !== resolvedArtifacts.length)
|
|
409
|
+
throw Error("Duplicate resolved artifact paths");
|
|
410
|
+
const initialFingerprint = await fingerprint(root);
|
|
411
|
+
if (state.status === "complete" &&
|
|
412
|
+
state.fingerprint === initialFingerprint &&
|
|
413
|
+
state.results.length === state.config.checks.length &&
|
|
414
|
+
state.results.every((r) => r.passed)) {
|
|
415
|
+
console.log("Already complete; source unchanged. Saved evidence retained.");
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
if (state.fingerprint !== initialFingerprint)
|
|
419
|
+
state.results = [];
|
|
420
|
+
const verify = async () => {
|
|
421
|
+
await checkProtected();
|
|
422
|
+
state.fingerprint = await fingerprint(root);
|
|
423
|
+
const before = state.fingerprint;
|
|
424
|
+
state.status = "checking";
|
|
425
|
+
await event("Running acceptance checks");
|
|
426
|
+
for (const check of state.config.checks) {
|
|
427
|
+
if (state.results.some((r) => r.id === check.id && r.passed))
|
|
428
|
+
continue;
|
|
429
|
+
const log = join(directory, `${state.attempts}-${check.id}.log`);
|
|
430
|
+
for (const a of check.artifacts)
|
|
431
|
+
await rm(await safeArtifact(root, a), { force: true });
|
|
432
|
+
const output = await runProcess(check.command, check.args, root, check.timeoutSeconds, log);
|
|
433
|
+
if (output.interrupted)
|
|
434
|
+
throw Error("Interrupted; saved checks can be resumed.");
|
|
435
|
+
let passed = output.exitCode === 0 && !output.timedOut;
|
|
436
|
+
let reason = output.timedOut ? "Timed out" : undefined;
|
|
437
|
+
for (const a of check.artifacts) {
|
|
438
|
+
try {
|
|
439
|
+
const info = await stat(await safeArtifact(root, a));
|
|
440
|
+
if (!info.isFile() || !info.size)
|
|
441
|
+
throw Error("empty");
|
|
442
|
+
}
|
|
443
|
+
catch {
|
|
444
|
+
passed = false;
|
|
445
|
+
reason = `Missing/nonempty artifact required: ${a}`;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
const artifactHashes = {};
|
|
449
|
+
if (passed)
|
|
450
|
+
for (const a of check.artifacts)
|
|
451
|
+
artifactHashes[a] = hash(await readFile(await safeArtifact(root, a), "base64"));
|
|
452
|
+
const result = {
|
|
453
|
+
logHash: hash(await readFile(log)),
|
|
454
|
+
artifactHashes,
|
|
455
|
+
id: check.id,
|
|
456
|
+
passed,
|
|
457
|
+
exitCode: output.exitCode,
|
|
458
|
+
log: relative(root, log),
|
|
459
|
+
artifacts: check.artifacts,
|
|
460
|
+
reason,
|
|
461
|
+
};
|
|
462
|
+
state.results = state.results
|
|
463
|
+
.filter((r) => r.id !== check.id)
|
|
464
|
+
.concat(result);
|
|
465
|
+
await event(`${check.id}: ${passed ? "PASS" : "FAIL"}`);
|
|
466
|
+
}
|
|
467
|
+
if ((await fingerprint(root)) !== before) {
|
|
468
|
+
state.results = [];
|
|
469
|
+
state.fingerprint = undefined;
|
|
470
|
+
await save(statePath, state);
|
|
471
|
+
throw Error("Source changed during verification; rerun checks.");
|
|
472
|
+
}
|
|
473
|
+
return (state.results.length === state.config.checks.length &&
|
|
474
|
+
state.results.every((r) => r.passed));
|
|
475
|
+
};
|
|
476
|
+
while (true) {
|
|
477
|
+
if (await verify()) {
|
|
478
|
+
await checkProtected();
|
|
479
|
+
state.status = "complete";
|
|
480
|
+
state.reason = undefined;
|
|
481
|
+
await event("Complete: every configured acceptance check passed. Screenshots are evidence, not automatic visual judgment.");
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
if (argv.includes("--verify-only") || state.attempts >= state.limit) {
|
|
485
|
+
state.status = "blocked";
|
|
486
|
+
state.reason = argv.includes("--verify-only")
|
|
487
|
+
? "Verification failed; no agent changes requested."
|
|
488
|
+
: "Retry limit reached.";
|
|
489
|
+
await event(state.reason);
|
|
490
|
+
process.exitCode = 1;
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
state.attempts++;
|
|
494
|
+
state.status = "implementing";
|
|
495
|
+
await event(`Implementation attempt ${state.attempts}/${state.limit}`);
|
|
496
|
+
const contract = JSON.stringify({
|
|
497
|
+
brief: state.brief,
|
|
498
|
+
plan: state.plan,
|
|
499
|
+
config: state.config,
|
|
500
|
+
protectedHashes: state.protectedHashes,
|
|
501
|
+
});
|
|
502
|
+
const failures = await Promise.all(state.results
|
|
503
|
+
.filter((r) => !r.passed)
|
|
504
|
+
.map(async (r) => ({
|
|
505
|
+
check: r.id,
|
|
506
|
+
reason: r.reason,
|
|
507
|
+
output: (await readFile(resolve(root, r.log), "utf8")).slice(-14000),
|
|
508
|
+
})));
|
|
509
|
+
try {
|
|
510
|
+
await claude(root, `Implement/fix this iOS app. Edit implementation source within this project only. Never edit frozen files: ${state.config.protectedFiles.join(", ")}. Never weaken checks or edit .ios-agent/loop, the check configuration or verification scripts. No git commits, publishing, or dependency installation. Your edits will be independently verified.\n${contract}\nFAILURES:\n${JSON.stringify(failures)}`, join(directory, `agent-${state.attempts}.log`), false);
|
|
511
|
+
}
|
|
512
|
+
catch (e) {
|
|
513
|
+
state.status = "blocked";
|
|
514
|
+
state.reason = String(e);
|
|
515
|
+
await event(state.reason);
|
|
516
|
+
process.exitCode = 1;
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
const disk = JSON.parse(await readFile(statePath, "utf8"));
|
|
520
|
+
if (JSON.stringify({
|
|
521
|
+
brief: disk.brief,
|
|
522
|
+
plan: disk.plan,
|
|
523
|
+
config: disk.config,
|
|
524
|
+
protectedHashes: disk.protectedHashes,
|
|
525
|
+
}) !== contract)
|
|
526
|
+
throw Error("Agent changed frozen acceptance contract; inspect before resuming.");
|
|
527
|
+
await checkProtected();
|
|
528
|
+
state.results = [];
|
|
529
|
+
state.fingerprint = undefined;
|
|
530
|
+
await save(statePath, state);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
try {
|
|
535
|
+
const existing = JSON.parse(await readFile(statePath, "utf8"));
|
|
536
|
+
existing.status = "blocked";
|
|
537
|
+
existing.reason = error instanceof Error ? error.message : String(error);
|
|
538
|
+
await save(statePath, existing);
|
|
539
|
+
}
|
|
540
|
+
catch { }
|
|
541
|
+
throw error;
|
|
542
|
+
}
|
|
543
|
+
finally {
|
|
544
|
+
await lock.close();
|
|
545
|
+
await rm(join(directory, "lock"), { force: true });
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
//# sourceMappingURL=app-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-loop.js","sourceRoot":"","sources":["../src/app-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Local agent guidance only. Never receives a reporter or transmits diagnostics. */
|
|
2
|
+
export declare const DEVELOPMENT_FAILURE_GUIDANCE = "Developer workflow for this failed operation:\nExplain the actual diagnostic above to the developer in their current coding session. Separate observed evidence from a suspected cause; do not treat an ordinary app bug as an ios-agent package bug.\nState the smallest next check or fix within the approved task, run the relevant verification, then show what passed and what remains blocked. Keep retries bounded and preserve cancellation. Do not claim success without evidence.\nKeep project-specific details in this session; do not put troubleshooting banners, reporting controls or maintainer branding into the app being built. Redact secrets from any explanation.\nThis tool result is not confirmation of a public report. Never upload source, paths, raw logs or exception text. Automatic reporting is not implemented. Use prepare_issue_report for a local preview; public reproduction steps require a separately reviewed, authorized submission.";
|
|
3
|
+
export declare function withDevelopmentFeedback<T extends Record<string, unknown>>(result: T): T;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Local agent guidance only. Never receives a reporter or transmits diagnostics. */
|
|
2
|
+
export const DEVELOPMENT_FAILURE_GUIDANCE = `Developer workflow for this failed operation:
|
|
3
|
+
Explain the actual diagnostic above to the developer in their current coding session. Separate observed evidence from a suspected cause; do not treat an ordinary app bug as an ios-agent package bug.
|
|
4
|
+
State the smallest next check or fix within the approved task, run the relevant verification, then show what passed and what remains blocked. Keep retries bounded and preserve cancellation. Do not claim success without evidence.
|
|
5
|
+
Keep project-specific details in this session; do not put troubleshooting banners, reporting controls or maintainer branding into the app being built. Redact secrets from any explanation.
|
|
6
|
+
This tool result is not confirmation of a public report. Never upload source, paths, raw logs or exception text. Automatic reporting is not implemented. Use prepare_issue_report for a local preview; public reproduction steps require a separately reviewed, authorized submission.`;
|
|
7
|
+
export function withDevelopmentFeedback(result) {
|
|
8
|
+
if (result.isError !== true || !Array.isArray(result.content))
|
|
9
|
+
return result;
|
|
10
|
+
return { ...result, content: [...result.content, { type: 'text', text: DEVELOPMENT_FAILURE_GUIDANCE }] };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=development-feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"development-feedback.js","sourceRoot":"","sources":["../src/development-feedback.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;uRAI2O,CAAC;AAExR,MAAM,UAAU,uBAAuB,CAAoC,MAAS;IAClF,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7E,OAAO,EAAC,GAAG,MAAM,EAAE,OAAO,EAAC,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,EAAC,IAAI,EAAC,MAAM,EAAE,IAAI,EAAC,4BAA4B,EAAC,CAAC,EAAC,CAAC;AACpG,CAAC"}
|