strikethroo 3.6.0 → 3.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/dist-web/assets/{arc-C5tFWQfy.js → arc-xFaTbwSI.js} +1 -1
- package/dist-web/assets/{architectureDiagram-3BPJPVTR-DgCKGG7t.js → architectureDiagram-3BPJPVTR-Xz0i2dF0.js} +1 -1
- package/dist-web/assets/{blockDiagram-GPEHLZMM-BCkOJRns.js → blockDiagram-GPEHLZMM-BdKR7Rki.js} +1 -1
- package/dist-web/assets/{c4Diagram-AAUBKEIU-CSRTvUCD.js → c4Diagram-AAUBKEIU-DAayjcH7.js} +1 -1
- package/dist-web/assets/channel-Cmb5ngmL.js +1 -0
- package/dist-web/assets/{chunk-2J33WTMH-ClcerQV2.js → chunk-2J33WTMH-D4OfjzqG.js} +1 -1
- package/dist-web/assets/{chunk-4BX2VUAB-CbmeOs5K.js → chunk-4BX2VUAB-Ds6twHLE.js} +1 -1
- package/dist-web/assets/{chunk-55IACEB6-Bul5AABk.js → chunk-55IACEB6-CoVGj0A6.js} +1 -1
- package/dist-web/assets/{chunk-727SXJPM-CgLGtlrF.js → chunk-727SXJPM--kGZcEL_.js} +1 -1
- package/dist-web/assets/{chunk-AQP2D5EJ-DL7JPYWy.js → chunk-AQP2D5EJ-dK8X6Knv.js} +1 -1
- package/dist-web/assets/{chunk-FMBD7UC4-CGHZbLY6.js → chunk-FMBD7UC4-CIkH8fwk.js} +1 -1
- package/dist-web/assets/{chunk-ND2GUHAM-CvBKPRCq.js → chunk-ND2GUHAM-BqrY0fV2.js} +1 -1
- package/dist-web/assets/{chunk-QZHKN3VN-DQBIVpdk.js → chunk-QZHKN3VN-Bx8TPE1r.js} +1 -1
- package/dist-web/assets/classDiagram-4FO5ZUOK-Dh2pEfOy.js +1 -0
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-Dh2pEfOy.js +1 -0
- package/dist-web/assets/{cose-bilkent-S5V4N54A-eh3JaEY5.js → cose-bilkent-S5V4N54A-PyZxi1yI.js} +1 -1
- package/dist-web/assets/{dagre-BM42HDAG-EJD5vp_w.js → dagre-BM42HDAG-yXPAIOqC.js} +1 -1
- package/dist-web/assets/{diagram-2AECGRRQ-BZ_P79sY.js → diagram-2AECGRRQ-DDkzzAIo.js} +1 -1
- package/dist-web/assets/{diagram-5GNKFQAL-OQ7nHA8w.js → diagram-5GNKFQAL-BD_aXIRb.js} +1 -1
- package/dist-web/assets/{diagram-KO2AKTUF-DdbHiG9U.js → diagram-KO2AKTUF-rntOw_IG.js} +1 -1
- package/dist-web/assets/{diagram-LMA3HP47-DtYxc1U-.js → diagram-LMA3HP47-BAB3HQQs.js} +1 -1
- package/dist-web/assets/{diagram-OG6HWLK6-DiYlNb2D.js → diagram-OG6HWLK6-CwTzozdw.js} +1 -1
- package/dist-web/assets/{erDiagram-TEJ5UH35-CfACqBE8.js → erDiagram-TEJ5UH35-BW-Ha54s.js} +1 -1
- package/dist-web/assets/{flowDiagram-I6XJVG4X-XjbGJa2k.js → flowDiagram-I6XJVG4X-AGkxH_mx.js} +1 -1
- package/dist-web/assets/{ganttDiagram-6RSMTGT7-uEIeokwH.js → ganttDiagram-6RSMTGT7--ZS9LkZ2.js} +1 -1
- package/dist-web/assets/{gitGraphDiagram-PVQCEYII-nmf5n0DJ.js → gitGraphDiagram-PVQCEYII-D4KfIxPI.js} +1 -1
- package/dist-web/assets/{index-lcDf4NjX.js → index-BN30VZfQ.js} +1 -1
- package/dist-web/assets/{index-DNjRW3Nz.js → index-IHSMZO2U.js} +1 -1
- package/dist-web/assets/{index-BDUuRubV.js → index-uk0kSvAs.js} +4 -4
- package/dist-web/assets/{infoDiagram-5YYISTIA-ce27RWm0.js → infoDiagram-5YYISTIA-D_Z40zdo.js} +1 -1
- package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-D6Wresga.js → ishikawaDiagram-YF4QCWOH-CGzxJ2vS.js} +1 -1
- package/dist-web/assets/{journeyDiagram-JHISSGLW-BBl3RVug.js → journeyDiagram-JHISSGLW-DLtpX1Ni.js} +1 -1
- package/dist-web/assets/{kanban-definition-UN3LZRKU-BR4xuvyK.js → kanban-definition-UN3LZRKU-C4_O7GEC.js} +1 -1
- package/dist-web/assets/{linear-t7m4QGzs.js → linear-BoMijEDN.js} +1 -1
- package/dist-web/assets/{mermaid.core-BrBzpjFi.js → mermaid.core-B7AM5BmV.js} +4 -4
- package/dist-web/assets/{mindmap-definition-RKZ34NQL-BtLQxP_O.js → mindmap-definition-RKZ34NQL-b8o1AjHb.js} +1 -1
- package/dist-web/assets/{pieDiagram-4H26LBE5-DRJmqIpA.js → pieDiagram-4H26LBE5-D7BGsvW4.js} +1 -1
- package/dist-web/assets/{quadrantDiagram-W4KKPZXB-CE2Oh9Rc.js → quadrantDiagram-W4KKPZXB-BOsVmBQ_.js} +1 -1
- package/dist-web/assets/{requirementDiagram-4Y6WPE33-sG5PEAU3.js → requirementDiagram-4Y6WPE33-BwuELhlD.js} +1 -1
- package/dist-web/assets/{sankeyDiagram-5OEKKPKP-CArsTW6e.js → sankeyDiagram-5OEKKPKP-DDoQnSJz.js} +1 -1
- package/dist-web/assets/{sequenceDiagram-3UESZ5HK-CSEbWgF8.js → sequenceDiagram-3UESZ5HK-Dto9SgGd.js} +1 -1
- package/dist-web/assets/{stateDiagram-AJRCARHV-CPia1lq4.js → stateDiagram-AJRCARHV-Dx0qn_5x.js} +1 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-qo6que2v.js +1 -0
- package/dist-web/assets/{timeline-definition-PNZ67QCA-BW5V8Z8D.js → timeline-definition-PNZ67QCA-Dbhzc3Xh.js} +1 -1
- package/dist-web/assets/{vennDiagram-CIIHVFJN-BeCuGgz0.js → vennDiagram-CIIHVFJN-BEUtD6fT.js} +1 -1
- package/dist-web/assets/{wardley-L42UT6IY-DIy_1BDw.js → wardley-L42UT6IY-CqNfcWnP.js} +1 -1
- package/dist-web/assets/{wardleyDiagram-YWT4CUSO-DV4cijhj.js → wardleyDiagram-YWT4CUSO-Co_bCOQZ.js} +1 -1
- package/dist-web/assets/{xychartDiagram-2RQKCTM6-DfIJ29y1.js → xychartDiagram-2RQKCTM6-CguzZIIB.js} +1 -1
- package/dist-web/index.html +1 -1
- package/package.json +3 -3
- package/templates/harness/skills/st-execute-blueprint/SKILL.md +4 -2
- package/templates/harness/skills/st-execute-blueprint/scripts/check-phase-readiness.cjs +471 -0
- package/templates/harness/skills/st-execute-blueprint/scripts/create-feature-branch.cjs +16 -8
- package/templates/harness/skills/st-execute-task/scripts/check-task-dependencies.cjs +113 -71
- package/templates/harness/skills/st-full-workflow/SKILL.md +4 -2
- package/templates/harness/skills/st-full-workflow/scripts/check-phase-readiness.cjs +471 -0
- package/templates/harness/skills/st-full-workflow/scripts/create-feature-branch.cjs +16 -8
- package/templates/strikethroo/config/hooks/POST_PHASE.md +5 -4
- package/templates/strikethroo/config/hooks/PRE_PHASE.md +0 -13
- package/dist-web/assets/channel-BaPw1Rvz.js +0 -1
- package/dist-web/assets/classDiagram-4FO5ZUOK-C35Ivx5Q.js +0 -1
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-C35Ivx5Q.js +0 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-CR8eRw1b.js +0 -1
|
@@ -33,8 +33,8 @@ __export(check_task_dependencies_exports, {
|
|
|
33
33
|
_main: () => _main
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(check_task_dependencies_exports);
|
|
36
|
-
var
|
|
37
|
-
var
|
|
36
|
+
var fs5 = __toESM(require("fs"));
|
|
37
|
+
var path5 = __toESM(require("path"));
|
|
38
38
|
|
|
39
39
|
// src/skill-scripts/shared/plan-resolve.ts
|
|
40
40
|
var fs3 = __toESM(require("fs"));
|
|
@@ -244,43 +244,31 @@ var resolvePlan = (input, startPath = process.cwd()) => {
|
|
|
244
244
|
return resolveByIdInAncestry(planId, startPath);
|
|
245
245
|
};
|
|
246
246
|
|
|
247
|
-
// src/skill-scripts/
|
|
248
|
-
var
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
var _printSuccess = (message) => {
|
|
252
|
-
console.log(`\u2713 ${message}`);
|
|
253
|
-
};
|
|
254
|
-
var _printWarning = (message) => {
|
|
255
|
-
console.log(`\u26A0 ${message}`);
|
|
256
|
-
};
|
|
257
|
-
var _printInfo = (message) => {
|
|
258
|
-
console.log(message);
|
|
259
|
-
};
|
|
260
|
-
var _extractFrontmatter = (content) => {
|
|
247
|
+
// src/skill-scripts/shared/task-file.ts
|
|
248
|
+
var fs4 = __toESM(require("fs"));
|
|
249
|
+
var path4 = __toESM(require("path"));
|
|
250
|
+
var extractFrontmatter = (content) => {
|
|
261
251
|
const match = content.match(/^---\s*\r?\n([\s\S]*?)\r?\n---/);
|
|
262
252
|
return match && match[1] ? match[1] : null;
|
|
263
253
|
};
|
|
264
|
-
var
|
|
254
|
+
var findTaskFile = (planDir, taskId) => {
|
|
265
255
|
const taskDir = path4.join(planDir, "tasks");
|
|
266
|
-
if (!fs4.existsSync(taskDir))
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const variations = [taskId, taskId.padStart(2, "0"), taskId.replace(/^0+/, "") || "0"];
|
|
256
|
+
if (!fs4.existsSync(taskDir)) return null;
|
|
257
|
+
const idStr = String(taskId);
|
|
258
|
+
const variations = [idStr, idStr.padStart(2, "0"), idStr.replace(/^0+/, "") || "0"];
|
|
270
259
|
const uniqueVariations = [...new Set(variations)];
|
|
271
260
|
try {
|
|
272
261
|
const files = fs4.readdirSync(taskDir);
|
|
273
|
-
|
|
262
|
+
return uniqueVariations.reduce((acc, v) => {
|
|
274
263
|
if (acc) return acc;
|
|
275
264
|
const match = files.find((f) => f.startsWith(`${v}--`) && f.endsWith(".md"));
|
|
276
265
|
return match ? path4.join(taskDir, match) : null;
|
|
277
|
-
}, null);
|
|
278
|
-
return found;
|
|
266
|
+
}, null) ?? null;
|
|
279
267
|
} catch (_err) {
|
|
280
268
|
return null;
|
|
281
269
|
}
|
|
282
270
|
};
|
|
283
|
-
var
|
|
271
|
+
var extractDependencies = (frontmatter) => {
|
|
284
272
|
const lines = frontmatter.split("\n");
|
|
285
273
|
const dependencies = [];
|
|
286
274
|
let inDependenciesSection = false;
|
|
@@ -300,22 +288,86 @@ var _extractDependencies = (frontmatter) => {
|
|
|
300
288
|
}
|
|
301
289
|
if (inDependenciesSection && line.match(/^[ \t]*-/)) {
|
|
302
290
|
const dep = line.replace(/^[ \t]*-[ \t]*/, "").replace(/[ \t]*$/, "").replace(/['"]/g, "");
|
|
303
|
-
if (dep.length > 0)
|
|
304
|
-
dependencies.push(dep);
|
|
305
|
-
}
|
|
291
|
+
if (dep.length > 0) dependencies.push(dep);
|
|
306
292
|
}
|
|
307
293
|
}
|
|
308
294
|
return dependencies;
|
|
309
295
|
};
|
|
310
|
-
var
|
|
311
|
-
const
|
|
312
|
-
for (const line of lines) {
|
|
296
|
+
var extractStatus = (frontmatter) => {
|
|
297
|
+
for (const line of frontmatter.split("\n")) {
|
|
313
298
|
if (line.match(/^status:/)) {
|
|
314
299
|
return line.replace(/^status:[ \t]*/, "").replace(/^["']/, "").replace(/["']$/, "").trim();
|
|
315
300
|
}
|
|
316
301
|
}
|
|
317
302
|
return null;
|
|
318
303
|
};
|
|
304
|
+
var collectTaskReadinessIssues = (planDir, taskId) => {
|
|
305
|
+
const issues = [];
|
|
306
|
+
const taskFile = findTaskFile(planDir, taskId);
|
|
307
|
+
const idLabel = String(taskId);
|
|
308
|
+
if (!taskFile || !fs4.existsSync(taskFile)) {
|
|
309
|
+
issues.push({ taskId: idLabel, kind: "missing", detail: "task file not found" });
|
|
310
|
+
return issues;
|
|
311
|
+
}
|
|
312
|
+
const taskContent = fs4.readFileSync(taskFile, "utf8");
|
|
313
|
+
const frontmatter = extractFrontmatter(taskContent);
|
|
314
|
+
if (!frontmatter) {
|
|
315
|
+
issues.push({ taskId: idLabel, kind: "missing", detail: "task frontmatter not found" });
|
|
316
|
+
return issues;
|
|
317
|
+
}
|
|
318
|
+
const status = extractStatus(frontmatter);
|
|
319
|
+
if (status === "needs-clarification") {
|
|
320
|
+
issues.push({
|
|
321
|
+
taskId: idLabel,
|
|
322
|
+
kind: "needs-clarification",
|
|
323
|
+
detail: "status is needs-clarification"
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
for (const depId of extractDependencies(frontmatter)) {
|
|
327
|
+
const depFile = findTaskFile(planDir, depId);
|
|
328
|
+
if (!depFile || !fs4.existsSync(depFile)) {
|
|
329
|
+
issues.push({
|
|
330
|
+
taskId: idLabel,
|
|
331
|
+
kind: "unresolved-dependency",
|
|
332
|
+
detail: `dependency ${depId} not found`
|
|
333
|
+
});
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
const depContent = fs4.readFileSync(depFile, "utf8");
|
|
337
|
+
const depFrontmatter = extractFrontmatter(depContent);
|
|
338
|
+
if (!depFrontmatter) {
|
|
339
|
+
issues.push({
|
|
340
|
+
taskId: idLabel,
|
|
341
|
+
kind: "unresolved-dependency",
|
|
342
|
+
detail: `dependency ${depId} has no frontmatter`
|
|
343
|
+
});
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
const depStatus = extractStatus(depFrontmatter);
|
|
347
|
+
if (depStatus !== "completed") {
|
|
348
|
+
issues.push({
|
|
349
|
+
taskId: idLabel,
|
|
350
|
+
kind: "unresolved-dependency",
|
|
351
|
+
detail: `dependency ${depId} status is ${depStatus ?? "unknown"}`
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return issues;
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
// src/skill-scripts/check-task-dependencies.ts
|
|
359
|
+
var _printError = (message) => {
|
|
360
|
+
console.error(`ERROR: ${message}`);
|
|
361
|
+
};
|
|
362
|
+
var _printSuccess = (message) => {
|
|
363
|
+
console.log(`\u2713 ${message}`);
|
|
364
|
+
};
|
|
365
|
+
var _printWarning = (message) => {
|
|
366
|
+
console.log(`\u26A0 ${message}`);
|
|
367
|
+
};
|
|
368
|
+
var _printInfo = (message) => {
|
|
369
|
+
console.log(message);
|
|
370
|
+
};
|
|
319
371
|
var _main = (startPath = process.cwd()) => {
|
|
320
372
|
if (process.argv.length !== 4) {
|
|
321
373
|
_printError("Invalid number of arguments");
|
|
@@ -336,20 +388,29 @@ var _main = (startPath = process.cwd()) => {
|
|
|
336
388
|
}
|
|
337
389
|
const { planDir, planId } = resolved;
|
|
338
390
|
_printInfo(`Found plan directory: ${planDir}`);
|
|
339
|
-
const taskFile =
|
|
340
|
-
if (!taskFile
|
|
391
|
+
const taskFile = findTaskFile(planDir, taskId);
|
|
392
|
+
if (!taskFile) {
|
|
341
393
|
_printError(`Task with ID ${taskId} not found in plan ${planId}`);
|
|
342
394
|
process.exit(1);
|
|
343
395
|
}
|
|
344
|
-
_printInfo(`Checking task: ${
|
|
396
|
+
_printInfo(`Checking task: ${path5.basename(taskFile)}`);
|
|
345
397
|
console.log("");
|
|
346
|
-
const
|
|
347
|
-
const
|
|
398
|
+
const issues = collectTaskReadinessIssues(planDir, taskId);
|
|
399
|
+
const dependencyIssues = issues.filter((issue) => issue.kind === "unresolved-dependency");
|
|
400
|
+
const blockingIssues = issues.filter((issue) => issue.kind !== "unresolved-dependency");
|
|
401
|
+
if (blockingIssues.length > 0) {
|
|
402
|
+
for (const issue of blockingIssues) {
|
|
403
|
+
_printError(issue.detail);
|
|
404
|
+
}
|
|
405
|
+
process.exit(1);
|
|
406
|
+
}
|
|
407
|
+
const taskContent = fs5.readFileSync(taskFile, "utf8");
|
|
408
|
+
const frontmatter = extractFrontmatter(taskContent);
|
|
348
409
|
if (!frontmatter) {
|
|
349
410
|
_printError("Could not extract frontmatter from task file");
|
|
350
411
|
process.exit(1);
|
|
351
412
|
}
|
|
352
|
-
const dependencies =
|
|
413
|
+
const dependencies = extractDependencies(frontmatter);
|
|
353
414
|
if (dependencies.length === 0) {
|
|
354
415
|
_printSuccess("Task has no dependencies - ready to execute!");
|
|
355
416
|
process.exit(0);
|
|
@@ -359,57 +420,38 @@ var _main = (startPath = process.cwd()) => {
|
|
|
359
420
|
console.log(` - Task ${dep}`);
|
|
360
421
|
});
|
|
361
422
|
console.log("");
|
|
362
|
-
let allResolved = true;
|
|
363
|
-
const unresolvedDeps = [];
|
|
364
|
-
let resolvedCount = 0;
|
|
365
|
-
const totalDeps = dependencies.length;
|
|
366
423
|
_printInfo("Checking dependency status...");
|
|
367
424
|
console.log("");
|
|
425
|
+
let resolvedCount = 0;
|
|
368
426
|
for (const depId of dependencies) {
|
|
369
|
-
const depFile =
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
unresolvedDeps.push(`${depId} (not found)`);
|
|
374
|
-
continue;
|
|
375
|
-
}
|
|
376
|
-
const depContent = fs4.readFileSync(depFile, "utf8");
|
|
377
|
-
const depFrontmatter = _extractFrontmatter(depContent);
|
|
378
|
-
if (!depFrontmatter) {
|
|
379
|
-
_printError(`Could not extract frontmatter from dependency task ${depId}`);
|
|
380
|
-
allResolved = false;
|
|
381
|
-
unresolvedDeps.push(`${depId} (no frontmatter)`);
|
|
382
|
-
continue;
|
|
383
|
-
}
|
|
384
|
-
const status = _extractStatus(depFrontmatter);
|
|
385
|
-
if (status === "completed") {
|
|
427
|
+
const depFile = findTaskFile(planDir, depId);
|
|
428
|
+
const depFrontmatter = depFile ? extractFrontmatter(fs5.readFileSync(depFile, "utf8")) : null;
|
|
429
|
+
const depStatus = depFrontmatter ? extractStatus(depFrontmatter) : null;
|
|
430
|
+
if (depStatus === "completed") {
|
|
386
431
|
_printSuccess(`Task ${depId} - Status: completed \u2713`);
|
|
387
432
|
resolvedCount++;
|
|
388
433
|
} else {
|
|
389
|
-
_printWarning(`Task ${depId} - Status: ${
|
|
390
|
-
allResolved = false;
|
|
391
|
-
unresolvedDeps.push(`${depId} (${status || "unknown"})`);
|
|
434
|
+
_printWarning(`Task ${depId} - Status: ${depStatus ?? "unknown"} \u2717`);
|
|
392
435
|
}
|
|
393
436
|
}
|
|
394
437
|
console.log("");
|
|
395
438
|
_printInfo("=========================================");
|
|
396
439
|
_printInfo("Dependency Check Summary");
|
|
397
440
|
_printInfo("=========================================");
|
|
398
|
-
_printInfo(`Total dependencies: ${
|
|
441
|
+
_printInfo(`Total dependencies: ${dependencies.length}`);
|
|
399
442
|
_printInfo(`Resolved: ${resolvedCount}`);
|
|
400
|
-
_printInfo(`Unresolved: ${
|
|
443
|
+
_printInfo(`Unresolved: ${dependencies.length - resolvedCount}`);
|
|
401
444
|
console.log("");
|
|
402
|
-
if (
|
|
445
|
+
if (dependencyIssues.length === 0) {
|
|
403
446
|
_printSuccess(`All dependencies are resolved! Task ${taskId} is ready to execute.`);
|
|
404
447
|
process.exit(0);
|
|
405
|
-
} else {
|
|
406
|
-
_printError(`Task ${taskId} has unresolved dependencies:`);
|
|
407
|
-
unresolvedDeps.forEach((dep) => {
|
|
408
|
-
console.log(dep);
|
|
409
|
-
});
|
|
410
|
-
_printInfo("Please complete the dependencies before executing this task.");
|
|
411
|
-
process.exit(1);
|
|
412
448
|
}
|
|
449
|
+
_printError(`Task ${taskId} has unresolved dependencies:`);
|
|
450
|
+
dependencyIssues.forEach((issue) => {
|
|
451
|
+
console.log(issue.detail);
|
|
452
|
+
});
|
|
453
|
+
_printInfo("Please complete the dependencies before executing this task.");
|
|
454
|
+
process.exit(1);
|
|
413
455
|
};
|
|
414
456
|
if (require.main === module) {
|
|
415
457
|
_main();
|
|
@@ -330,7 +330,7 @@ If `taskCount` is 0 or `blueprintExists` is `no`:
|
|
|
330
330
|
|
|
331
331
|
#### 3. Optionally create a feature branch
|
|
332
332
|
|
|
333
|
-
Run `scripts/create-feature-branch.cjs <plan-id
|
|
333
|
+
Run `scripts/create-feature-branch.cjs <plan-id>` once before phase execution. Branch creation is best-effort: when the script reports that it skipped creation (for example, not on `main`/`master`), continue on the current branch and do not retry or create a branch manually. When the script exits with an error (for example, uncommitted changes on `main`/`master`), halt and report the error. Do not treat a skipped branch as a failure or spend effort working around a skip.
|
|
334
334
|
|
|
335
335
|
#### 4. Load execution blueprint
|
|
336
336
|
|
|
@@ -346,10 +346,12 @@ Read these files in order:
|
|
|
346
346
|
Use an internal task or todo tracker to monitor progress. For each phase defined in the Execution Blueprint:
|
|
347
347
|
|
|
348
348
|
##### 5a. Phase pre-execution
|
|
349
|
+
Run `scripts/check-phase-readiness.cjs <plan-id> <phase-number>`. If the script exits non-zero, halt the phase and report the blocking issues before continuing.
|
|
350
|
+
|
|
349
351
|
Read `<root>/config/hooks/PRE_PHASE.md` and execute its instructions before starting the phase.
|
|
350
352
|
|
|
351
353
|
##### 5b. Task dispatch
|
|
352
|
-
Identify all tasks scheduled for this phase whose dependencies are fully satisfied. Read `<root>/config/hooks/
|
|
354
|
+
Identify all tasks scheduled for this phase whose dependencies are fully satisfied. Read `<root>/config/hooks/PRE_TASK_ASSIGNMENT.md` and follow its instructions for agent selection before dispatching tasks.
|
|
353
355
|
|
|
354
356
|
Deploy all selected agents simultaneously using your internal Task tool. Each agent MUST:
|
|
355
357
|
|