strikethroo 3.8.0 → 3.9.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 (67) hide show
  1. package/dist/serve/markdown.d.ts +0 -12
  2. package/dist/serve/markdown.d.ts.map +1 -1
  3. package/dist/serve/markdown.js +6 -8
  4. package/dist/serve/markdown.js.map +1 -1
  5. package/dist/skill-scripts/shared/complexity-score.d.ts +14 -0
  6. package/dist/skill-scripts/shared/complexity-score.d.ts.map +1 -0
  7. package/dist/skill-scripts/shared/complexity-score.js +21 -0
  8. package/dist/skill-scripts/shared/complexity-score.js.map +1 -0
  9. package/dist-web/assets/{arc-ClZ3judi.js → arc-U8dalZIB.js} +1 -1
  10. package/dist-web/assets/{architectureDiagram-3BPJPVTR-BRD031Y3.js → architectureDiagram-3BPJPVTR-BII4UusQ.js} +1 -1
  11. package/dist-web/assets/{blockDiagram-GPEHLZMM-CfaXqzcG.js → blockDiagram-GPEHLZMM-DY4WZYhw.js} +1 -1
  12. package/dist-web/assets/{c4Diagram-AAUBKEIU-D9Os_mjw.js → c4Diagram-AAUBKEIU-ByZWkPq5.js} +1 -1
  13. package/dist-web/assets/channel-hoQZJ4FP.js +1 -0
  14. package/dist-web/assets/{chunk-2J33WTMH-CScaCetR.js → chunk-2J33WTMH-BkTWBAb4.js} +1 -1
  15. package/dist-web/assets/{chunk-4BX2VUAB-C_0wTF2D.js → chunk-4BX2VUAB-CQkRWCB3.js} +1 -1
  16. package/dist-web/assets/{chunk-55IACEB6-BU0yxIXn.js → chunk-55IACEB6-C-6bW0I1.js} +1 -1
  17. package/dist-web/assets/{chunk-727SXJPM-CEYPnfpF.js → chunk-727SXJPM-C4TUUt4s.js} +1 -1
  18. package/dist-web/assets/{chunk-AQP2D5EJ-3Wp97XA5.js → chunk-AQP2D5EJ-Dtp8JWF7.js} +1 -1
  19. package/dist-web/assets/{chunk-FMBD7UC4-B_iff0-_.js → chunk-FMBD7UC4-BwHFSRRs.js} +1 -1
  20. package/dist-web/assets/{chunk-ND2GUHAM-C9bo0MIV.js → chunk-ND2GUHAM-Cig_3TB-.js} +1 -1
  21. package/dist-web/assets/{chunk-QZHKN3VN-DuWFBza0.js → chunk-QZHKN3VN-BGETuJY7.js} +1 -1
  22. package/dist-web/assets/classDiagram-4FO5ZUOK-B0lk8Y6z.js +1 -0
  23. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-B0lk8Y6z.js +1 -0
  24. package/dist-web/assets/{cose-bilkent-S5V4N54A-BvbHJ-Zg.js → cose-bilkent-S5V4N54A-DuOybbaS.js} +1 -1
  25. package/dist-web/assets/{dagre-BM42HDAG-D6Et-JgF.js → dagre-BM42HDAG-VnC37qtr.js} +1 -1
  26. package/dist-web/assets/{diagram-2AECGRRQ-CNCYsbbA.js → diagram-2AECGRRQ-Ty7SQMgH.js} +1 -1
  27. package/dist-web/assets/{diagram-5GNKFQAL-CxRozyyO.js → diagram-5GNKFQAL-BlKDu0VW.js} +1 -1
  28. package/dist-web/assets/{diagram-KO2AKTUF-IZlLB90E.js → diagram-KO2AKTUF-Bbg0OCZg.js} +1 -1
  29. package/dist-web/assets/{diagram-LMA3HP47-CrSB8ihh.js → diagram-LMA3HP47-kkVpRIsu.js} +1 -1
  30. package/dist-web/assets/{diagram-OG6HWLK6-tCjUSZwa.js → diagram-OG6HWLK6-DOWYkZlS.js} +1 -1
  31. package/dist-web/assets/{erDiagram-TEJ5UH35-JLv81E72.js → erDiagram-TEJ5UH35-D8WlLdtK.js} +1 -1
  32. package/dist-web/assets/{flowDiagram-I6XJVG4X-Det1_WLC.js → flowDiagram-I6XJVG4X-U7NYonjl.js} +1 -1
  33. package/dist-web/assets/{ganttDiagram-6RSMTGT7-Mi2wMw1v.js → ganttDiagram-6RSMTGT7-vw1uFVh5.js} +1 -1
  34. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-Ddy55D8B.js → gitGraphDiagram-PVQCEYII-Coc0d6Bs.js} +1 -1
  35. package/dist-web/assets/{index-BwABcoi9.js → index-4vwdK2qG.js} +4 -4
  36. package/dist-web/assets/{index-Dw0N6U6b.js → index-D53fh0zY.js} +1 -1
  37. package/dist-web/assets/{index-CEoxzYhV.js → index-TwwNd18Z.js} +1 -1
  38. package/dist-web/assets/{infoDiagram-5YYISTIA-vrktGk5U.js → infoDiagram-5YYISTIA-D1rd3cgn.js} +1 -1
  39. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-CATnDGrp.js → ishikawaDiagram-YF4QCWOH-C6QHofgd.js} +1 -1
  40. package/dist-web/assets/{journeyDiagram-JHISSGLW-CEvYFLj2.js → journeyDiagram-JHISSGLW-CfCP3_lL.js} +1 -1
  41. package/dist-web/assets/{kanban-definition-UN3LZRKU-_6lp0n4D.js → kanban-definition-UN3LZRKU-eK9aAtUE.js} +1 -1
  42. package/dist-web/assets/{linear-C1oEZdKm.js → linear-Xl4NTVLR.js} +1 -1
  43. package/dist-web/assets/{mermaid.core-bqVxqCbb.js → mermaid.core-Bpv3Fy5r.js} +4 -4
  44. package/dist-web/assets/{mindmap-definition-RKZ34NQL-DxAus_u1.js → mindmap-definition-RKZ34NQL-C-UftEj-.js} +1 -1
  45. package/dist-web/assets/{pieDiagram-4H26LBE5-Bqjkt8dx.js → pieDiagram-4H26LBE5--B3LdTQd.js} +1 -1
  46. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-BoZHhSII.js → quadrantDiagram-W4KKPZXB-DTr-7cow.js} +1 -1
  47. package/dist-web/assets/{requirementDiagram-4Y6WPE33-D0rcLxmM.js → requirementDiagram-4Y6WPE33-CMKPuFbL.js} +1 -1
  48. package/dist-web/assets/{sankeyDiagram-5OEKKPKP-CWShHxDe.js → sankeyDiagram-5OEKKPKP-DnThFDZc.js} +1 -1
  49. package/dist-web/assets/{sequenceDiagram-3UESZ5HK-T8LE2GTr.js → sequenceDiagram-3UESZ5HK-WqT16YFF.js} +1 -1
  50. package/dist-web/assets/{stateDiagram-AJRCARHV-a8e0ie70.js → stateDiagram-AJRCARHV-5nr9Um5q.js} +1 -1
  51. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-Doh4LSg5.js +1 -0
  52. package/dist-web/assets/{timeline-definition-PNZ67QCA-Fn2xKeuG.js → timeline-definition-PNZ67QCA-CNOVn_B3.js} +1 -1
  53. package/dist-web/assets/{vennDiagram-CIIHVFJN-CdlvIB8X.js → vennDiagram-CIIHVFJN-D-h0Gph6.js} +1 -1
  54. package/dist-web/assets/{wardley-L42UT6IY-9pciD2XX.js → wardley-L42UT6IY-C1fuBpoj.js} +1 -1
  55. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-BK6qNOxa.js → wardleyDiagram-YWT4CUSO-BauL5Z2B.js} +1 -1
  56. package/dist-web/assets/{xychartDiagram-2RQKCTM6-QjMTFvse.js → xychartDiagram-2RQKCTM6-Z9Z3wS3v.js} +1 -1
  57. package/dist-web/index.html +1 -1
  58. package/package.json +1 -1
  59. package/templates/harness/skills/st-execute-blueprint/scripts/validate-plan-blueprint.cjs +69 -46
  60. package/templates/harness/skills/st-execute-task/scripts/validate-plan-blueprint.cjs +69 -46
  61. package/templates/harness/skills/st-full-workflow/scripts/validate-plan-blueprint.cjs +69 -46
  62. package/templates/harness/skills/st-generate-tasks/scripts/validate-plan-blueprint.cjs +69 -46
  63. package/templates/harness/skills/st-refine-plan/scripts/validate-plan-blueprint.cjs +69 -46
  64. package/dist-web/assets/channel-CJXJUs_u.js +0 -1
  65. package/dist-web/assets/classDiagram-4FO5ZUOK-DSnAL-3H.js +0 -1
  66. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-DSnAL-3H.js +0 -1
  67. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BmYjmWHJ.js +0 -1
@@ -33,8 +33,6 @@ __export(validate_plan_blueprint_exports, {
33
33
  main: () => main
34
34
  });
35
35
  module.exports = __toCommonJS(validate_plan_blueprint_exports);
36
- var fs4 = __toESM(require("fs"));
37
- var path4 = __toESM(require("path"));
38
36
 
39
37
  // src/skill-scripts/shared/root.ts
40
38
  var fs = __toESM(require("fs"));
@@ -242,30 +240,63 @@ var resolvePlan = (input, startPath = process.cwd()) => {
242
240
  return resolveByIdInAncestry(planId, startPath);
243
241
  };
244
242
 
243
+ // src/skill-scripts/shared/blueprint-detection.ts
244
+ var fs4 = __toESM(require("fs"));
245
+ var hasExecutionBlueprint = (planFile) => {
246
+ try {
247
+ const content = fs4.readFileSync(planFile, "utf8");
248
+ return /^## Execution Blueprint/m.test(content);
249
+ } catch (_err) {
250
+ return false;
251
+ }
252
+ };
253
+
254
+ // src/skill-scripts/shared/task-count.ts
255
+ var fs5 = __toESM(require("fs"));
256
+ var path4 = __toESM(require("path"));
257
+ var countTaskFiles = (planDir) => {
258
+ const tasksDir = path4.join(planDir, "tasks");
259
+ if (!fs5.existsSync(tasksDir)) return 0;
260
+ try {
261
+ const stat = fs5.lstatSync(tasksDir);
262
+ if (!stat.isDirectory()) return 0;
263
+ return fs5.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).length;
264
+ } catch (_err) {
265
+ return 0;
266
+ }
267
+ };
268
+
269
+ // src/skill-scripts/shared/task-complexity.ts
270
+ var fs6 = __toESM(require("fs"));
271
+ var path5 = __toESM(require("path"));
272
+
273
+ // src/skill-scripts/shared/complexity-score.ts
274
+ var validateComplexityScore = (value) => {
275
+ const trimmed = value.trim();
276
+ if (!/^\d+$/.test(trimmed)) {
277
+ return { valid: false, reason: "non-integer" };
278
+ }
279
+ const parsed = Number.parseInt(trimmed, 10);
280
+ if (parsed < 1 || parsed > 10) {
281
+ return { valid: false, reason: "out-of-range", value: parsed };
282
+ }
283
+ return { valid: true, value: parsed };
284
+ };
285
+
245
286
  // src/skill-scripts/shared/task-file.ts
246
287
  var extractFrontmatter = (content) => {
247
288
  const match = content.match(/^---\s*\r?\n([\s\S]*?)\r?\n---/);
248
289
  return match && match[1] ? match[1] : null;
249
290
  };
250
291
 
251
- // src/skill-scripts/validate-plan-blueprint.ts
252
- var VALID_FIELDS = [
253
- "planFile",
254
- "planDir",
255
- "taskCount",
256
- "blueprintExists",
257
- "strikethrooRoot",
258
- "planId",
259
- "complexityScoresValid",
260
- "invalidComplexityTasks"
261
- ];
262
- var validateComplexityScores = (planDir) => {
263
- const tasksDir = path4.join(planDir, "tasks");
264
- if (!fs4.existsSync(tasksDir)) return [];
292
+ // src/skill-scripts/shared/task-complexity.ts
293
+ var validateTaskComplexityScores = (planDir) => {
294
+ const tasksDir = path5.join(planDir, "tasks");
295
+ if (!fs6.existsSync(tasksDir)) return [];
265
296
  let files;
266
297
  try {
267
- if (!fs4.lstatSync(tasksDir).isDirectory()) return [];
268
- files = fs4.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).sort();
298
+ if (!fs6.lstatSync(tasksDir).isDirectory()) return [];
299
+ files = fs6.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).sort();
269
300
  } catch (_err) {
270
301
  return [];
271
302
  }
@@ -273,7 +304,7 @@ var validateComplexityScores = (planDir) => {
273
304
  for (const file of files) {
274
305
  let content;
275
306
  try {
276
- content = fs4.readFileSync(path4.join(tasksDir, file), "utf8");
307
+ content = fs6.readFileSync(path5.join(tasksDir, file), "utf8");
277
308
  } catch (_err) {
278
309
  invalid.push(`${file}: unreadable`);
279
310
  continue;
@@ -285,36 +316,28 @@ var validateComplexityScores = (planDir) => {
285
316
  continue;
286
317
  }
287
318
  const raw = match[1].trim();
288
- if (!/^\d+$/.test(raw)) {
319
+ const result = validateComplexityScore(raw);
320
+ if (result.valid) continue;
321
+ if (result.reason === "non-integer") {
289
322
  invalid.push(`${file}: non-integer complexity_score "${raw}"`);
290
323
  continue;
291
324
  }
292
- const parsed = Number.parseInt(raw, 10);
293
- if (parsed < 1 || parsed > 10) {
294
- invalid.push(`${file}: complexity_score ${parsed} out of range 1-10`);
295
- }
325
+ invalid.push(`${file}: complexity_score ${result.value} out of range 1-10`);
296
326
  }
297
327
  return invalid;
298
328
  };
299
- var countTasks = (planDir) => {
300
- const tasksDir = path4.join(planDir, "tasks");
301
- if (!fs4.existsSync(tasksDir)) return 0;
302
- try {
303
- const stat = fs4.lstatSync(tasksDir);
304
- if (!stat.isDirectory()) return 0;
305
- return fs4.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).length;
306
- } catch (_err) {
307
- return 0;
308
- }
309
- };
310
- var checkBlueprintExists = (planFile) => {
311
- try {
312
- const content = fs4.readFileSync(planFile, "utf8");
313
- return /^## Execution Blueprint/m.test(content);
314
- } catch (_err) {
315
- return false;
316
- }
317
- };
329
+
330
+ // src/skill-scripts/validate-plan-blueprint.ts
331
+ var VALID_FIELDS = [
332
+ "planFile",
333
+ "planDir",
334
+ "taskCount",
335
+ "blueprintExists",
336
+ "strikethrooRoot",
337
+ "planId",
338
+ "complexityScoresValid",
339
+ "invalidComplexityTasks"
340
+ ];
318
341
  var usage = () => {
319
342
  const lines = [
320
343
  "Plan ID or absolute path is required",
@@ -369,14 +392,14 @@ var main = () => {
369
392
  }
370
393
  process.exit(1);
371
394
  }
372
- const invalidComplexity = validateComplexityScores(resolved.planDir);
395
+ const invalidComplexity = validateTaskComplexityScores(resolved.planDir);
373
396
  const result = {
374
397
  planFile: resolved.planFile,
375
398
  planDir: resolved.planDir,
376
399
  strikethrooRoot: resolved.strikethrooRoot,
377
400
  planId: resolved.planId,
378
- taskCount: countTasks(resolved.planDir),
379
- blueprintExists: checkBlueprintExists(resolved.planFile) ? "yes" : "no",
401
+ taskCount: countTaskFiles(resolved.planDir),
402
+ blueprintExists: hasExecutionBlueprint(resolved.planFile) ? "yes" : "no",
380
403
  complexityScoresValid: invalidComplexity.length === 0 ? "yes" : "no",
381
404
  invalidComplexityTasks: invalidComplexity.join("; ")
382
405
  };
@@ -33,8 +33,6 @@ __export(validate_plan_blueprint_exports, {
33
33
  main: () => main
34
34
  });
35
35
  module.exports = __toCommonJS(validate_plan_blueprint_exports);
36
- var fs4 = __toESM(require("fs"));
37
- var path4 = __toESM(require("path"));
38
36
 
39
37
  // src/skill-scripts/shared/root.ts
40
38
  var fs = __toESM(require("fs"));
@@ -242,30 +240,63 @@ var resolvePlan = (input, startPath = process.cwd()) => {
242
240
  return resolveByIdInAncestry(planId, startPath);
243
241
  };
244
242
 
243
+ // src/skill-scripts/shared/blueprint-detection.ts
244
+ var fs4 = __toESM(require("fs"));
245
+ var hasExecutionBlueprint = (planFile) => {
246
+ try {
247
+ const content = fs4.readFileSync(planFile, "utf8");
248
+ return /^## Execution Blueprint/m.test(content);
249
+ } catch (_err) {
250
+ return false;
251
+ }
252
+ };
253
+
254
+ // src/skill-scripts/shared/task-count.ts
255
+ var fs5 = __toESM(require("fs"));
256
+ var path4 = __toESM(require("path"));
257
+ var countTaskFiles = (planDir) => {
258
+ const tasksDir = path4.join(planDir, "tasks");
259
+ if (!fs5.existsSync(tasksDir)) return 0;
260
+ try {
261
+ const stat = fs5.lstatSync(tasksDir);
262
+ if (!stat.isDirectory()) return 0;
263
+ return fs5.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).length;
264
+ } catch (_err) {
265
+ return 0;
266
+ }
267
+ };
268
+
269
+ // src/skill-scripts/shared/task-complexity.ts
270
+ var fs6 = __toESM(require("fs"));
271
+ var path5 = __toESM(require("path"));
272
+
273
+ // src/skill-scripts/shared/complexity-score.ts
274
+ var validateComplexityScore = (value) => {
275
+ const trimmed = value.trim();
276
+ if (!/^\d+$/.test(trimmed)) {
277
+ return { valid: false, reason: "non-integer" };
278
+ }
279
+ const parsed = Number.parseInt(trimmed, 10);
280
+ if (parsed < 1 || parsed > 10) {
281
+ return { valid: false, reason: "out-of-range", value: parsed };
282
+ }
283
+ return { valid: true, value: parsed };
284
+ };
285
+
245
286
  // src/skill-scripts/shared/task-file.ts
246
287
  var extractFrontmatter = (content) => {
247
288
  const match = content.match(/^---\s*\r?\n([\s\S]*?)\r?\n---/);
248
289
  return match && match[1] ? match[1] : null;
249
290
  };
250
291
 
251
- // src/skill-scripts/validate-plan-blueprint.ts
252
- var VALID_FIELDS = [
253
- "planFile",
254
- "planDir",
255
- "taskCount",
256
- "blueprintExists",
257
- "strikethrooRoot",
258
- "planId",
259
- "complexityScoresValid",
260
- "invalidComplexityTasks"
261
- ];
262
- var validateComplexityScores = (planDir) => {
263
- const tasksDir = path4.join(planDir, "tasks");
264
- if (!fs4.existsSync(tasksDir)) return [];
292
+ // src/skill-scripts/shared/task-complexity.ts
293
+ var validateTaskComplexityScores = (planDir) => {
294
+ const tasksDir = path5.join(planDir, "tasks");
295
+ if (!fs6.existsSync(tasksDir)) return [];
265
296
  let files;
266
297
  try {
267
- if (!fs4.lstatSync(tasksDir).isDirectory()) return [];
268
- files = fs4.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).sort();
298
+ if (!fs6.lstatSync(tasksDir).isDirectory()) return [];
299
+ files = fs6.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).sort();
269
300
  } catch (_err) {
270
301
  return [];
271
302
  }
@@ -273,7 +304,7 @@ var validateComplexityScores = (planDir) => {
273
304
  for (const file of files) {
274
305
  let content;
275
306
  try {
276
- content = fs4.readFileSync(path4.join(tasksDir, file), "utf8");
307
+ content = fs6.readFileSync(path5.join(tasksDir, file), "utf8");
277
308
  } catch (_err) {
278
309
  invalid.push(`${file}: unreadable`);
279
310
  continue;
@@ -285,36 +316,28 @@ var validateComplexityScores = (planDir) => {
285
316
  continue;
286
317
  }
287
318
  const raw = match[1].trim();
288
- if (!/^\d+$/.test(raw)) {
319
+ const result = validateComplexityScore(raw);
320
+ if (result.valid) continue;
321
+ if (result.reason === "non-integer") {
289
322
  invalid.push(`${file}: non-integer complexity_score "${raw}"`);
290
323
  continue;
291
324
  }
292
- const parsed = Number.parseInt(raw, 10);
293
- if (parsed < 1 || parsed > 10) {
294
- invalid.push(`${file}: complexity_score ${parsed} out of range 1-10`);
295
- }
325
+ invalid.push(`${file}: complexity_score ${result.value} out of range 1-10`);
296
326
  }
297
327
  return invalid;
298
328
  };
299
- var countTasks = (planDir) => {
300
- const tasksDir = path4.join(planDir, "tasks");
301
- if (!fs4.existsSync(tasksDir)) return 0;
302
- try {
303
- const stat = fs4.lstatSync(tasksDir);
304
- if (!stat.isDirectory()) return 0;
305
- return fs4.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).length;
306
- } catch (_err) {
307
- return 0;
308
- }
309
- };
310
- var checkBlueprintExists = (planFile) => {
311
- try {
312
- const content = fs4.readFileSync(planFile, "utf8");
313
- return /^## Execution Blueprint/m.test(content);
314
- } catch (_err) {
315
- return false;
316
- }
317
- };
329
+
330
+ // src/skill-scripts/validate-plan-blueprint.ts
331
+ var VALID_FIELDS = [
332
+ "planFile",
333
+ "planDir",
334
+ "taskCount",
335
+ "blueprintExists",
336
+ "strikethrooRoot",
337
+ "planId",
338
+ "complexityScoresValid",
339
+ "invalidComplexityTasks"
340
+ ];
318
341
  var usage = () => {
319
342
  const lines = [
320
343
  "Plan ID or absolute path is required",
@@ -369,14 +392,14 @@ var main = () => {
369
392
  }
370
393
  process.exit(1);
371
394
  }
372
- const invalidComplexity = validateComplexityScores(resolved.planDir);
395
+ const invalidComplexity = validateTaskComplexityScores(resolved.planDir);
373
396
  const result = {
374
397
  planFile: resolved.planFile,
375
398
  planDir: resolved.planDir,
376
399
  strikethrooRoot: resolved.strikethrooRoot,
377
400
  planId: resolved.planId,
378
- taskCount: countTasks(resolved.planDir),
379
- blueprintExists: checkBlueprintExists(resolved.planFile) ? "yes" : "no",
401
+ taskCount: countTaskFiles(resolved.planDir),
402
+ blueprintExists: hasExecutionBlueprint(resolved.planFile) ? "yes" : "no",
380
403
  complexityScoresValid: invalidComplexity.length === 0 ? "yes" : "no",
381
404
  invalidComplexityTasks: invalidComplexity.join("; ")
382
405
  };
@@ -33,8 +33,6 @@ __export(validate_plan_blueprint_exports, {
33
33
  main: () => main
34
34
  });
35
35
  module.exports = __toCommonJS(validate_plan_blueprint_exports);
36
- var fs4 = __toESM(require("fs"));
37
- var path4 = __toESM(require("path"));
38
36
 
39
37
  // src/skill-scripts/shared/root.ts
40
38
  var fs = __toESM(require("fs"));
@@ -242,30 +240,63 @@ var resolvePlan = (input, startPath = process.cwd()) => {
242
240
  return resolveByIdInAncestry(planId, startPath);
243
241
  };
244
242
 
243
+ // src/skill-scripts/shared/blueprint-detection.ts
244
+ var fs4 = __toESM(require("fs"));
245
+ var hasExecutionBlueprint = (planFile) => {
246
+ try {
247
+ const content = fs4.readFileSync(planFile, "utf8");
248
+ return /^## Execution Blueprint/m.test(content);
249
+ } catch (_err) {
250
+ return false;
251
+ }
252
+ };
253
+
254
+ // src/skill-scripts/shared/task-count.ts
255
+ var fs5 = __toESM(require("fs"));
256
+ var path4 = __toESM(require("path"));
257
+ var countTaskFiles = (planDir) => {
258
+ const tasksDir = path4.join(planDir, "tasks");
259
+ if (!fs5.existsSync(tasksDir)) return 0;
260
+ try {
261
+ const stat = fs5.lstatSync(tasksDir);
262
+ if (!stat.isDirectory()) return 0;
263
+ return fs5.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).length;
264
+ } catch (_err) {
265
+ return 0;
266
+ }
267
+ };
268
+
269
+ // src/skill-scripts/shared/task-complexity.ts
270
+ var fs6 = __toESM(require("fs"));
271
+ var path5 = __toESM(require("path"));
272
+
273
+ // src/skill-scripts/shared/complexity-score.ts
274
+ var validateComplexityScore = (value) => {
275
+ const trimmed = value.trim();
276
+ if (!/^\d+$/.test(trimmed)) {
277
+ return { valid: false, reason: "non-integer" };
278
+ }
279
+ const parsed = Number.parseInt(trimmed, 10);
280
+ if (parsed < 1 || parsed > 10) {
281
+ return { valid: false, reason: "out-of-range", value: parsed };
282
+ }
283
+ return { valid: true, value: parsed };
284
+ };
285
+
245
286
  // src/skill-scripts/shared/task-file.ts
246
287
  var extractFrontmatter = (content) => {
247
288
  const match = content.match(/^---\s*\r?\n([\s\S]*?)\r?\n---/);
248
289
  return match && match[1] ? match[1] : null;
249
290
  };
250
291
 
251
- // src/skill-scripts/validate-plan-blueprint.ts
252
- var VALID_FIELDS = [
253
- "planFile",
254
- "planDir",
255
- "taskCount",
256
- "blueprintExists",
257
- "strikethrooRoot",
258
- "planId",
259
- "complexityScoresValid",
260
- "invalidComplexityTasks"
261
- ];
262
- var validateComplexityScores = (planDir) => {
263
- const tasksDir = path4.join(planDir, "tasks");
264
- if (!fs4.existsSync(tasksDir)) return [];
292
+ // src/skill-scripts/shared/task-complexity.ts
293
+ var validateTaskComplexityScores = (planDir) => {
294
+ const tasksDir = path5.join(planDir, "tasks");
295
+ if (!fs6.existsSync(tasksDir)) return [];
265
296
  let files;
266
297
  try {
267
- if (!fs4.lstatSync(tasksDir).isDirectory()) return [];
268
- files = fs4.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).sort();
298
+ if (!fs6.lstatSync(tasksDir).isDirectory()) return [];
299
+ files = fs6.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).sort();
269
300
  } catch (_err) {
270
301
  return [];
271
302
  }
@@ -273,7 +304,7 @@ var validateComplexityScores = (planDir) => {
273
304
  for (const file of files) {
274
305
  let content;
275
306
  try {
276
- content = fs4.readFileSync(path4.join(tasksDir, file), "utf8");
307
+ content = fs6.readFileSync(path5.join(tasksDir, file), "utf8");
277
308
  } catch (_err) {
278
309
  invalid.push(`${file}: unreadable`);
279
310
  continue;
@@ -285,36 +316,28 @@ var validateComplexityScores = (planDir) => {
285
316
  continue;
286
317
  }
287
318
  const raw = match[1].trim();
288
- if (!/^\d+$/.test(raw)) {
319
+ const result = validateComplexityScore(raw);
320
+ if (result.valid) continue;
321
+ if (result.reason === "non-integer") {
289
322
  invalid.push(`${file}: non-integer complexity_score "${raw}"`);
290
323
  continue;
291
324
  }
292
- const parsed = Number.parseInt(raw, 10);
293
- if (parsed < 1 || parsed > 10) {
294
- invalid.push(`${file}: complexity_score ${parsed} out of range 1-10`);
295
- }
325
+ invalid.push(`${file}: complexity_score ${result.value} out of range 1-10`);
296
326
  }
297
327
  return invalid;
298
328
  };
299
- var countTasks = (planDir) => {
300
- const tasksDir = path4.join(planDir, "tasks");
301
- if (!fs4.existsSync(tasksDir)) return 0;
302
- try {
303
- const stat = fs4.lstatSync(tasksDir);
304
- if (!stat.isDirectory()) return 0;
305
- return fs4.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).length;
306
- } catch (_err) {
307
- return 0;
308
- }
309
- };
310
- var checkBlueprintExists = (planFile) => {
311
- try {
312
- const content = fs4.readFileSync(planFile, "utf8");
313
- return /^## Execution Blueprint/m.test(content);
314
- } catch (_err) {
315
- return false;
316
- }
317
- };
329
+
330
+ // src/skill-scripts/validate-plan-blueprint.ts
331
+ var VALID_FIELDS = [
332
+ "planFile",
333
+ "planDir",
334
+ "taskCount",
335
+ "blueprintExists",
336
+ "strikethrooRoot",
337
+ "planId",
338
+ "complexityScoresValid",
339
+ "invalidComplexityTasks"
340
+ ];
318
341
  var usage = () => {
319
342
  const lines = [
320
343
  "Plan ID or absolute path is required",
@@ -369,14 +392,14 @@ var main = () => {
369
392
  }
370
393
  process.exit(1);
371
394
  }
372
- const invalidComplexity = validateComplexityScores(resolved.planDir);
395
+ const invalidComplexity = validateTaskComplexityScores(resolved.planDir);
373
396
  const result = {
374
397
  planFile: resolved.planFile,
375
398
  planDir: resolved.planDir,
376
399
  strikethrooRoot: resolved.strikethrooRoot,
377
400
  planId: resolved.planId,
378
- taskCount: countTasks(resolved.planDir),
379
- blueprintExists: checkBlueprintExists(resolved.planFile) ? "yes" : "no",
401
+ taskCount: countTaskFiles(resolved.planDir),
402
+ blueprintExists: hasExecutionBlueprint(resolved.planFile) ? "yes" : "no",
380
403
  complexityScoresValid: invalidComplexity.length === 0 ? "yes" : "no",
381
404
  invalidComplexityTasks: invalidComplexity.join("; ")
382
405
  };
@@ -33,8 +33,6 @@ __export(validate_plan_blueprint_exports, {
33
33
  main: () => main
34
34
  });
35
35
  module.exports = __toCommonJS(validate_plan_blueprint_exports);
36
- var fs4 = __toESM(require("fs"));
37
- var path4 = __toESM(require("path"));
38
36
 
39
37
  // src/skill-scripts/shared/root.ts
40
38
  var fs = __toESM(require("fs"));
@@ -242,30 +240,63 @@ var resolvePlan = (input, startPath = process.cwd()) => {
242
240
  return resolveByIdInAncestry(planId, startPath);
243
241
  };
244
242
 
243
+ // src/skill-scripts/shared/blueprint-detection.ts
244
+ var fs4 = __toESM(require("fs"));
245
+ var hasExecutionBlueprint = (planFile) => {
246
+ try {
247
+ const content = fs4.readFileSync(planFile, "utf8");
248
+ return /^## Execution Blueprint/m.test(content);
249
+ } catch (_err) {
250
+ return false;
251
+ }
252
+ };
253
+
254
+ // src/skill-scripts/shared/task-count.ts
255
+ var fs5 = __toESM(require("fs"));
256
+ var path4 = __toESM(require("path"));
257
+ var countTaskFiles = (planDir) => {
258
+ const tasksDir = path4.join(planDir, "tasks");
259
+ if (!fs5.existsSync(tasksDir)) return 0;
260
+ try {
261
+ const stat = fs5.lstatSync(tasksDir);
262
+ if (!stat.isDirectory()) return 0;
263
+ return fs5.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).length;
264
+ } catch (_err) {
265
+ return 0;
266
+ }
267
+ };
268
+
269
+ // src/skill-scripts/shared/task-complexity.ts
270
+ var fs6 = __toESM(require("fs"));
271
+ var path5 = __toESM(require("path"));
272
+
273
+ // src/skill-scripts/shared/complexity-score.ts
274
+ var validateComplexityScore = (value) => {
275
+ const trimmed = value.trim();
276
+ if (!/^\d+$/.test(trimmed)) {
277
+ return { valid: false, reason: "non-integer" };
278
+ }
279
+ const parsed = Number.parseInt(trimmed, 10);
280
+ if (parsed < 1 || parsed > 10) {
281
+ return { valid: false, reason: "out-of-range", value: parsed };
282
+ }
283
+ return { valid: true, value: parsed };
284
+ };
285
+
245
286
  // src/skill-scripts/shared/task-file.ts
246
287
  var extractFrontmatter = (content) => {
247
288
  const match = content.match(/^---\s*\r?\n([\s\S]*?)\r?\n---/);
248
289
  return match && match[1] ? match[1] : null;
249
290
  };
250
291
 
251
- // src/skill-scripts/validate-plan-blueprint.ts
252
- var VALID_FIELDS = [
253
- "planFile",
254
- "planDir",
255
- "taskCount",
256
- "blueprintExists",
257
- "strikethrooRoot",
258
- "planId",
259
- "complexityScoresValid",
260
- "invalidComplexityTasks"
261
- ];
262
- var validateComplexityScores = (planDir) => {
263
- const tasksDir = path4.join(planDir, "tasks");
264
- if (!fs4.existsSync(tasksDir)) return [];
292
+ // src/skill-scripts/shared/task-complexity.ts
293
+ var validateTaskComplexityScores = (planDir) => {
294
+ const tasksDir = path5.join(planDir, "tasks");
295
+ if (!fs6.existsSync(tasksDir)) return [];
265
296
  let files;
266
297
  try {
267
- if (!fs4.lstatSync(tasksDir).isDirectory()) return [];
268
- files = fs4.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).sort();
298
+ if (!fs6.lstatSync(tasksDir).isDirectory()) return [];
299
+ files = fs6.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).sort();
269
300
  } catch (_err) {
270
301
  return [];
271
302
  }
@@ -273,7 +304,7 @@ var validateComplexityScores = (planDir) => {
273
304
  for (const file of files) {
274
305
  let content;
275
306
  try {
276
- content = fs4.readFileSync(path4.join(tasksDir, file), "utf8");
307
+ content = fs6.readFileSync(path5.join(tasksDir, file), "utf8");
277
308
  } catch (_err) {
278
309
  invalid.push(`${file}: unreadable`);
279
310
  continue;
@@ -285,36 +316,28 @@ var validateComplexityScores = (planDir) => {
285
316
  continue;
286
317
  }
287
318
  const raw = match[1].trim();
288
- if (!/^\d+$/.test(raw)) {
319
+ const result = validateComplexityScore(raw);
320
+ if (result.valid) continue;
321
+ if (result.reason === "non-integer") {
289
322
  invalid.push(`${file}: non-integer complexity_score "${raw}"`);
290
323
  continue;
291
324
  }
292
- const parsed = Number.parseInt(raw, 10);
293
- if (parsed < 1 || parsed > 10) {
294
- invalid.push(`${file}: complexity_score ${parsed} out of range 1-10`);
295
- }
325
+ invalid.push(`${file}: complexity_score ${result.value} out of range 1-10`);
296
326
  }
297
327
  return invalid;
298
328
  };
299
- var countTasks = (planDir) => {
300
- const tasksDir = path4.join(planDir, "tasks");
301
- if (!fs4.existsSync(tasksDir)) return 0;
302
- try {
303
- const stat = fs4.lstatSync(tasksDir);
304
- if (!stat.isDirectory()) return 0;
305
- return fs4.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).length;
306
- } catch (_err) {
307
- return 0;
308
- }
309
- };
310
- var checkBlueprintExists = (planFile) => {
311
- try {
312
- const content = fs4.readFileSync(planFile, "utf8");
313
- return /^## Execution Blueprint/m.test(content);
314
- } catch (_err) {
315
- return false;
316
- }
317
- };
329
+
330
+ // src/skill-scripts/validate-plan-blueprint.ts
331
+ var VALID_FIELDS = [
332
+ "planFile",
333
+ "planDir",
334
+ "taskCount",
335
+ "blueprintExists",
336
+ "strikethrooRoot",
337
+ "planId",
338
+ "complexityScoresValid",
339
+ "invalidComplexityTasks"
340
+ ];
318
341
  var usage = () => {
319
342
  const lines = [
320
343
  "Plan ID or absolute path is required",
@@ -369,14 +392,14 @@ var main = () => {
369
392
  }
370
393
  process.exit(1);
371
394
  }
372
- const invalidComplexity = validateComplexityScores(resolved.planDir);
395
+ const invalidComplexity = validateTaskComplexityScores(resolved.planDir);
373
396
  const result = {
374
397
  planFile: resolved.planFile,
375
398
  planDir: resolved.planDir,
376
399
  strikethrooRoot: resolved.strikethrooRoot,
377
400
  planId: resolved.planId,
378
- taskCount: countTasks(resolved.planDir),
379
- blueprintExists: checkBlueprintExists(resolved.planFile) ? "yes" : "no",
401
+ taskCount: countTaskFiles(resolved.planDir),
402
+ blueprintExists: hasExecutionBlueprint(resolved.planFile) ? "yes" : "no",
380
403
  complexityScoresValid: invalidComplexity.length === 0 ? "yes" : "no",
381
404
  invalidComplexityTasks: invalidComplexity.join("; ")
382
405
  };
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./mermaid.core-bqVxqCbb.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,a as s,c as e,C as t}from"./chunk-727SXJPM-CEYPnfpF.js";import{b as i}from"./mermaid.core-bqVxqCbb.js";import"./chunk-FMBD7UC4-B_iff0-_.js";import"./chunk-ND2GUHAM-C9bo0MIV.js";import"./chunk-55IACEB6-BU0yxIXn.js";import"./chunk-2J33WTMH-CScaCetR.js";import"./index-BwABcoi9.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{s as a,a as s,c as e,C as t}from"./chunk-727SXJPM-CEYPnfpF.js";import{b as i}from"./mermaid.core-bqVxqCbb.js";import"./chunk-FMBD7UC4-B_iff0-_.js";import"./chunk-ND2GUHAM-C9bo0MIV.js";import"./chunk-55IACEB6-BU0yxIXn.js";import"./chunk-2J33WTMH-CScaCetR.js";import"./index-BwABcoi9.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};