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.
Files changed (63) hide show
  1. package/dist-web/assets/{arc-C5tFWQfy.js → arc-xFaTbwSI.js} +1 -1
  2. package/dist-web/assets/{architectureDiagram-3BPJPVTR-DgCKGG7t.js → architectureDiagram-3BPJPVTR-Xz0i2dF0.js} +1 -1
  3. package/dist-web/assets/{blockDiagram-GPEHLZMM-BCkOJRns.js → blockDiagram-GPEHLZMM-BdKR7Rki.js} +1 -1
  4. package/dist-web/assets/{c4Diagram-AAUBKEIU-CSRTvUCD.js → c4Diagram-AAUBKEIU-DAayjcH7.js} +1 -1
  5. package/dist-web/assets/channel-Cmb5ngmL.js +1 -0
  6. package/dist-web/assets/{chunk-2J33WTMH-ClcerQV2.js → chunk-2J33WTMH-D4OfjzqG.js} +1 -1
  7. package/dist-web/assets/{chunk-4BX2VUAB-CbmeOs5K.js → chunk-4BX2VUAB-Ds6twHLE.js} +1 -1
  8. package/dist-web/assets/{chunk-55IACEB6-Bul5AABk.js → chunk-55IACEB6-CoVGj0A6.js} +1 -1
  9. package/dist-web/assets/{chunk-727SXJPM-CgLGtlrF.js → chunk-727SXJPM--kGZcEL_.js} +1 -1
  10. package/dist-web/assets/{chunk-AQP2D5EJ-DL7JPYWy.js → chunk-AQP2D5EJ-dK8X6Knv.js} +1 -1
  11. package/dist-web/assets/{chunk-FMBD7UC4-CGHZbLY6.js → chunk-FMBD7UC4-CIkH8fwk.js} +1 -1
  12. package/dist-web/assets/{chunk-ND2GUHAM-CvBKPRCq.js → chunk-ND2GUHAM-BqrY0fV2.js} +1 -1
  13. package/dist-web/assets/{chunk-QZHKN3VN-DQBIVpdk.js → chunk-QZHKN3VN-Bx8TPE1r.js} +1 -1
  14. package/dist-web/assets/classDiagram-4FO5ZUOK-Dh2pEfOy.js +1 -0
  15. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-Dh2pEfOy.js +1 -0
  16. package/dist-web/assets/{cose-bilkent-S5V4N54A-eh3JaEY5.js → cose-bilkent-S5V4N54A-PyZxi1yI.js} +1 -1
  17. package/dist-web/assets/{dagre-BM42HDAG-EJD5vp_w.js → dagre-BM42HDAG-yXPAIOqC.js} +1 -1
  18. package/dist-web/assets/{diagram-2AECGRRQ-BZ_P79sY.js → diagram-2AECGRRQ-DDkzzAIo.js} +1 -1
  19. package/dist-web/assets/{diagram-5GNKFQAL-OQ7nHA8w.js → diagram-5GNKFQAL-BD_aXIRb.js} +1 -1
  20. package/dist-web/assets/{diagram-KO2AKTUF-DdbHiG9U.js → diagram-KO2AKTUF-rntOw_IG.js} +1 -1
  21. package/dist-web/assets/{diagram-LMA3HP47-DtYxc1U-.js → diagram-LMA3HP47-BAB3HQQs.js} +1 -1
  22. package/dist-web/assets/{diagram-OG6HWLK6-DiYlNb2D.js → diagram-OG6HWLK6-CwTzozdw.js} +1 -1
  23. package/dist-web/assets/{erDiagram-TEJ5UH35-CfACqBE8.js → erDiagram-TEJ5UH35-BW-Ha54s.js} +1 -1
  24. package/dist-web/assets/{flowDiagram-I6XJVG4X-XjbGJa2k.js → flowDiagram-I6XJVG4X-AGkxH_mx.js} +1 -1
  25. package/dist-web/assets/{ganttDiagram-6RSMTGT7-uEIeokwH.js → ganttDiagram-6RSMTGT7--ZS9LkZ2.js} +1 -1
  26. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-nmf5n0DJ.js → gitGraphDiagram-PVQCEYII-D4KfIxPI.js} +1 -1
  27. package/dist-web/assets/{index-lcDf4NjX.js → index-BN30VZfQ.js} +1 -1
  28. package/dist-web/assets/{index-DNjRW3Nz.js → index-IHSMZO2U.js} +1 -1
  29. package/dist-web/assets/{index-BDUuRubV.js → index-uk0kSvAs.js} +4 -4
  30. package/dist-web/assets/{infoDiagram-5YYISTIA-ce27RWm0.js → infoDiagram-5YYISTIA-D_Z40zdo.js} +1 -1
  31. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-D6Wresga.js → ishikawaDiagram-YF4QCWOH-CGzxJ2vS.js} +1 -1
  32. package/dist-web/assets/{journeyDiagram-JHISSGLW-BBl3RVug.js → journeyDiagram-JHISSGLW-DLtpX1Ni.js} +1 -1
  33. package/dist-web/assets/{kanban-definition-UN3LZRKU-BR4xuvyK.js → kanban-definition-UN3LZRKU-C4_O7GEC.js} +1 -1
  34. package/dist-web/assets/{linear-t7m4QGzs.js → linear-BoMijEDN.js} +1 -1
  35. package/dist-web/assets/{mermaid.core-BrBzpjFi.js → mermaid.core-B7AM5BmV.js} +4 -4
  36. package/dist-web/assets/{mindmap-definition-RKZ34NQL-BtLQxP_O.js → mindmap-definition-RKZ34NQL-b8o1AjHb.js} +1 -1
  37. package/dist-web/assets/{pieDiagram-4H26LBE5-DRJmqIpA.js → pieDiagram-4H26LBE5-D7BGsvW4.js} +1 -1
  38. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-CE2Oh9Rc.js → quadrantDiagram-W4KKPZXB-BOsVmBQ_.js} +1 -1
  39. package/dist-web/assets/{requirementDiagram-4Y6WPE33-sG5PEAU3.js → requirementDiagram-4Y6WPE33-BwuELhlD.js} +1 -1
  40. package/dist-web/assets/{sankeyDiagram-5OEKKPKP-CArsTW6e.js → sankeyDiagram-5OEKKPKP-DDoQnSJz.js} +1 -1
  41. package/dist-web/assets/{sequenceDiagram-3UESZ5HK-CSEbWgF8.js → sequenceDiagram-3UESZ5HK-Dto9SgGd.js} +1 -1
  42. package/dist-web/assets/{stateDiagram-AJRCARHV-CPia1lq4.js → stateDiagram-AJRCARHV-Dx0qn_5x.js} +1 -1
  43. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-qo6que2v.js +1 -0
  44. package/dist-web/assets/{timeline-definition-PNZ67QCA-BW5V8Z8D.js → timeline-definition-PNZ67QCA-Dbhzc3Xh.js} +1 -1
  45. package/dist-web/assets/{vennDiagram-CIIHVFJN-BeCuGgz0.js → vennDiagram-CIIHVFJN-BEUtD6fT.js} +1 -1
  46. package/dist-web/assets/{wardley-L42UT6IY-DIy_1BDw.js → wardley-L42UT6IY-CqNfcWnP.js} +1 -1
  47. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-DV4cijhj.js → wardleyDiagram-YWT4CUSO-Co_bCOQZ.js} +1 -1
  48. package/dist-web/assets/{xychartDiagram-2RQKCTM6-DfIJ29y1.js → xychartDiagram-2RQKCTM6-CguzZIIB.js} +1 -1
  49. package/dist-web/index.html +1 -1
  50. package/package.json +3 -3
  51. package/templates/harness/skills/st-execute-blueprint/SKILL.md +4 -2
  52. package/templates/harness/skills/st-execute-blueprint/scripts/check-phase-readiness.cjs +471 -0
  53. package/templates/harness/skills/st-execute-blueprint/scripts/create-feature-branch.cjs +16 -8
  54. package/templates/harness/skills/st-execute-task/scripts/check-task-dependencies.cjs +113 -71
  55. package/templates/harness/skills/st-full-workflow/SKILL.md +4 -2
  56. package/templates/harness/skills/st-full-workflow/scripts/check-phase-readiness.cjs +471 -0
  57. package/templates/harness/skills/st-full-workflow/scripts/create-feature-branch.cjs +16 -8
  58. package/templates/strikethroo/config/hooks/POST_PHASE.md +5 -4
  59. package/templates/strikethroo/config/hooks/PRE_PHASE.md +0 -13
  60. package/dist-web/assets/channel-BaPw1Rvz.js +0 -1
  61. package/dist-web/assets/classDiagram-4FO5ZUOK-C35Ivx5Q.js +0 -1
  62. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-C35Ivx5Q.js +0 -1
  63. 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 fs4 = __toESM(require("fs"));
37
- var path4 = __toESM(require("path"));
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/check-task-dependencies.ts
248
- var _printError = (message) => {
249
- console.error(`ERROR: ${message}`);
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 _findTaskFile = (planDir, taskId) => {
254
+ var findTaskFile = (planDir, taskId) => {
265
255
  const taskDir = path4.join(planDir, "tasks");
266
- if (!fs4.existsSync(taskDir)) {
267
- return null;
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
- const found = uniqueVariations.reduce((acc, v) => {
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 _extractDependencies = (frontmatter) => {
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 _extractStatus = (frontmatter) => {
311
- const lines = frontmatter.split("\n");
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 = _findTaskFile(planDir, taskId);
340
- if (!taskFile || !fs4.existsSync(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: ${path4.basename(taskFile)}`);
396
+ _printInfo(`Checking task: ${path5.basename(taskFile)}`);
345
397
  console.log("");
346
- const taskContent = fs4.readFileSync(taskFile, "utf8");
347
- const frontmatter = _extractFrontmatter(taskContent);
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 = _extractDependencies(frontmatter);
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 = _findTaskFile(planDir, depId);
370
- if (!depFile || !fs4.existsSync(depFile)) {
371
- _printError(`Dependency task ${depId} not found`);
372
- allResolved = false;
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: ${status || "unknown"} \u2717`);
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: ${totalDeps}`);
441
+ _printInfo(`Total dependencies: ${dependencies.length}`);
399
442
  _printInfo(`Resolved: ${resolvedCount}`);
400
- _printInfo(`Unresolved: ${totalDeps - resolvedCount}`);
443
+ _printInfo(`Unresolved: ${dependencies.length - resolvedCount}`);
401
444
  console.log("");
402
- if (allResolved) {
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>`. The script creates a branch named after the plan and prints the branch name. Continue execution regardless of whether a branch is created.
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/PRE_TASK_EXECUTION.md` and execute its instructions before starting any implementation work.
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