strikethroo 3.21.3 → 3.22.1

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 (117) hide show
  1. package/README.md +10 -0
  2. package/dist/__tests__/built-skills.d.ts +15 -0
  3. package/dist/__tests__/built-skills.d.ts.map +1 -0
  4. package/dist/__tests__/built-skills.js +53 -0
  5. package/dist/__tests__/built-skills.js.map +1 -0
  6. package/dist/cli.js +19 -1
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +50 -15
  11. package/dist/index.js.map +1 -1
  12. package/dist/resolve-init-harnesses.d.ts +30 -0
  13. package/dist/resolve-init-harnesses.d.ts.map +1 -0
  14. package/dist/resolve-init-harnesses.js +44 -0
  15. package/dist/resolve-init-harnesses.js.map +1 -0
  16. package/dist/types.d.ts +32 -1
  17. package/dist/types.d.ts.map +1 -1
  18. package/dist/types.js.map +1 -1
  19. package/dist/update.d.ts +28 -0
  20. package/dist/update.d.ts.map +1 -0
  21. package/dist/update.js +198 -0
  22. package/dist/update.js.map +1 -0
  23. package/dist-web/assets/{arc-8Mxnwqfp.js → arc-Hwddr2kO.js} +1 -1
  24. package/dist-web/assets/{architectureDiagram-3BPJPVTR-CjR6ApxR.js → architectureDiagram-3BPJPVTR-i11AtK7_.js} +1 -1
  25. package/dist-web/assets/{blockDiagram-GPEHLZMM-DhGYH8V9.js → blockDiagram-GPEHLZMM-BBT6cVNX.js} +1 -1
  26. package/dist-web/assets/{c4Diagram-AAUBKEIU-BpUJqbui.js → c4Diagram-AAUBKEIU-C3vqlA6y.js} +1 -1
  27. package/dist-web/assets/channel-Cur0s-J7.js +1 -0
  28. package/dist-web/assets/{chunk-2J33WTMH-BX8NM2bi.js → chunk-2J33WTMH-B2qLeglu.js} +1 -1
  29. package/dist-web/assets/{chunk-4BX2VUAB-ChNDzlNh.js → chunk-4BX2VUAB-BOoURq0p.js} +1 -1
  30. package/dist-web/assets/{chunk-55IACEB6-62ChSXXQ.js → chunk-55IACEB6-DucbZmPO.js} +1 -1
  31. package/dist-web/assets/{chunk-727SXJPM-DM_m3yWL.js → chunk-727SXJPM-D1jwNHG5.js} +1 -1
  32. package/dist-web/assets/{chunk-AQP2D5EJ-DZcEQaCW.js → chunk-AQP2D5EJ-DEqgF-yl.js} +1 -1
  33. package/dist-web/assets/{chunk-FMBD7UC4-jITTRsf2.js → chunk-FMBD7UC4-DyqowetS.js} +1 -1
  34. package/dist-web/assets/{chunk-ND2GUHAM-D73huh8-.js → chunk-ND2GUHAM-B5m1NGQ0.js} +1 -1
  35. package/dist-web/assets/{chunk-QZHKN3VN-DqdeIFoN.js → chunk-QZHKN3VN-DuDvOVer.js} +1 -1
  36. package/dist-web/assets/classDiagram-4FO5ZUOK-CjiILMRI.js +1 -0
  37. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-CjiILMRI.js +1 -0
  38. package/dist-web/assets/{cose-bilkent-S5V4N54A-B6y8LQMc.js → cose-bilkent-S5V4N54A-C9HUgr5R.js} +1 -1
  39. package/dist-web/assets/{dagre-BM42HDAG-CEudzPZe.js → dagre-BM42HDAG-DT3KjQHY.js} +1 -1
  40. package/dist-web/assets/{diagram-2AECGRRQ-ADCpFrWI.js → diagram-2AECGRRQ-DrCpXRj9.js} +1 -1
  41. package/dist-web/assets/{diagram-5GNKFQAL-BQcNfKgC.js → diagram-5GNKFQAL-QcCYThB2.js} +1 -1
  42. package/dist-web/assets/{diagram-KO2AKTUF-2Y25ZUgl.js → diagram-KO2AKTUF-BsaZwGbo.js} +1 -1
  43. package/dist-web/assets/{diagram-LMA3HP47-qiLQPz0R.js → diagram-LMA3HP47-B6ZqNLaZ.js} +1 -1
  44. package/dist-web/assets/{diagram-OG6HWLK6-5tV6wHg0.js → diagram-OG6HWLK6-ZfJLCrYD.js} +1 -1
  45. package/dist-web/assets/{erDiagram-TEJ5UH35-C9KwzSBJ.js → erDiagram-TEJ5UH35-BlnJ9PIz.js} +1 -1
  46. package/dist-web/assets/{flowDiagram-I6XJVG4X-DWFT6yjl.js → flowDiagram-I6XJVG4X-CIfl3CnE.js} +1 -1
  47. package/dist-web/assets/{ganttDiagram-6RSMTGT7-CwOaaOj-.js → ganttDiagram-6RSMTGT7-CPrwdiin.js} +1 -1
  48. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-D9GwiRiE.js → gitGraphDiagram-PVQCEYII-DcY9oRGk.js} +1 -1
  49. package/dist-web/assets/{index-R-j45X6T.js → index-COfame-T.js} +4 -4
  50. package/dist-web/assets/{index-CJtNiGoR.js → index-DGtMmSy6.js} +1 -1
  51. package/dist-web/assets/{index-CXzu9Ojw.js → index-j2lPssdc.js} +1 -1
  52. package/dist-web/assets/{infoDiagram-5YYISTIA-8s7z_vpg.js → infoDiagram-5YYISTIA-DVU5i5FV.js} +1 -1
  53. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-mkZLBAJy.js → ishikawaDiagram-YF4QCWOH-B8Ga6Rav.js} +1 -1
  54. package/dist-web/assets/{journeyDiagram-JHISSGLW-CrSmLI8k.js → journeyDiagram-JHISSGLW-DOzvgBoA.js} +1 -1
  55. package/dist-web/assets/{kanban-definition-UN3LZRKU-jB_Pkb2G.js → kanban-definition-UN3LZRKU-BGc6pe_I.js} +1 -1
  56. package/dist-web/assets/{linear-BmZe-JSe.js → linear-BpZOijWC.js} +1 -1
  57. package/dist-web/assets/{mermaid.core-kJp9v7BU.js → mermaid.core-C_2qQ8rS.js} +4 -4
  58. package/dist-web/assets/{mindmap-definition-RKZ34NQL-BygLhP5m.js → mindmap-definition-RKZ34NQL-DkMM_7Yr.js} +1 -1
  59. package/dist-web/assets/{pieDiagram-4H26LBE5-CERgWyaB.js → pieDiagram-4H26LBE5-1TkSQl-I.js} +1 -1
  60. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-BA_bITko.js → quadrantDiagram-W4KKPZXB-cmPoFli_.js} +1 -1
  61. package/dist-web/assets/{requirementDiagram-4Y6WPE33-BkZUv4kJ.js → requirementDiagram-4Y6WPE33-BRm2ySws.js} +1 -1
  62. package/dist-web/assets/{sankeyDiagram-5OEKKPKP-DpAA7Nm0.js → sankeyDiagram-5OEKKPKP-Bm7c5KA3.js} +1 -1
  63. package/dist-web/assets/{sequenceDiagram-3UESZ5HK-D1A1wk57.js → sequenceDiagram-3UESZ5HK-TsJi1UnU.js} +1 -1
  64. package/dist-web/assets/{stateDiagram-AJRCARHV-GNvrUmkz.js → stateDiagram-AJRCARHV-C96-LO_W.js} +1 -1
  65. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-DyP066tY.js +1 -0
  66. package/dist-web/assets/{timeline-definition-PNZ67QCA-GEOSAbn6.js → timeline-definition-PNZ67QCA-CXS_QOle.js} +1 -1
  67. package/dist-web/assets/{vennDiagram-CIIHVFJN-D_IwvMPq.js → vennDiagram-CIIHVFJN-C2GyjnKb.js} +1 -1
  68. package/dist-web/assets/{wardley-L42UT6IY-CpNQq-PK.js → wardley-L42UT6IY-B4Z1vQiy.js} +1 -1
  69. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-DjyTS7lS.js → wardleyDiagram-YWT4CUSO-C4rdUwqJ.js} +1 -1
  70. package/dist-web/assets/{xychartDiagram-2RQKCTM6-Bi0kYEuJ.js → xychartDiagram-2RQKCTM6-ldEuZMCT.js} +1 -1
  71. package/dist-web/index.html +1 -1
  72. package/package.json +5 -1
  73. package/templates/strikethroo/config/templates/UPDATE_NOTICE_TEMPLATE.md +1 -0
  74. package/dist-web/assets/channel-BJWsQ6W2.js +0 -1
  75. package/dist-web/assets/classDiagram-4FO5ZUOK-yCIjCNKh.js +0 -1
  76. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-yCIjCNKh.js +0 -1
  77. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-DkJ7czmr.js +0 -1
  78. package/templates/harness/skills/st-code-review/SKILL.md +0 -52
  79. package/templates/harness/skills/st-code-review/references/review-example.xml.md +0 -18
  80. package/templates/harness/skills/st-code-review/scripts/code-review.cjs +0 -3887
  81. package/templates/harness/skills/st-code-review/scripts/find-strikethroo-root.cjs +0 -116
  82. package/templates/harness/skills/st-code-review/scripts/validate-plan-blueprint.cjs +0 -429
  83. package/templates/harness/skills/st-create-plan/SKILL.md +0 -100
  84. package/templates/harness/skills/st-create-plan/scripts/find-strikethroo-root.cjs +0 -116
  85. package/templates/harness/skills/st-create-plan/scripts/get-next-plan-id.cjs +0 -197
  86. package/templates/harness/skills/st-execute-blueprint/SKILL.md +0 -184
  87. package/templates/harness/skills/st-execute-blueprint/scripts/capture-base-commit.cjs +0 -330
  88. package/templates/harness/skills/st-execute-blueprint/scripts/check-phase-readiness.cjs +0 -471
  89. package/templates/harness/skills/st-execute-blueprint/scripts/create-feature-branch.cjs +0 -374
  90. package/templates/harness/skills/st-execute-blueprint/scripts/dispatch-task-execution.cjs +0 -6815
  91. package/templates/harness/skills/st-execute-blueprint/scripts/find-strikethroo-root.cjs +0 -116
  92. package/templates/harness/skills/st-execute-blueprint/scripts/validate-plan-blueprint.cjs +0 -429
  93. package/templates/harness/skills/st-execute-task/SKILL.md +0 -138
  94. package/templates/harness/skills/st-execute-task/scripts/check-task-dependencies.cjs +0 -462
  95. package/templates/harness/skills/st-execute-task/scripts/dispatch-task-execution.cjs +0 -6815
  96. package/templates/harness/skills/st-execute-task/scripts/find-strikethroo-root.cjs +0 -116
  97. package/templates/harness/skills/st-execute-task/scripts/validate-plan-blueprint.cjs +0 -429
  98. package/templates/harness/skills/st-full-workflow/SKILL.md +0 -453
  99. package/templates/harness/skills/st-full-workflow/references/complexity-rubric.md +0 -8
  100. package/templates/harness/skills/st-full-workflow/scripts/capture-base-commit.cjs +0 -330
  101. package/templates/harness/skills/st-full-workflow/scripts/check-phase-readiness.cjs +0 -471
  102. package/templates/harness/skills/st-full-workflow/scripts/create-feature-branch.cjs +0 -374
  103. package/templates/harness/skills/st-full-workflow/scripts/dispatch-task-execution.cjs +0 -6815
  104. package/templates/harness/skills/st-full-workflow/scripts/find-strikethroo-root.cjs +0 -116
  105. package/templates/harness/skills/st-full-workflow/scripts/get-next-plan-id.cjs +0 -197
  106. package/templates/harness/skills/st-full-workflow/scripts/get-next-task-id.cjs +0 -295
  107. package/templates/harness/skills/st-full-workflow/scripts/route-task-execution.cjs +0 -2874
  108. package/templates/harness/skills/st-full-workflow/scripts/validate-plan-blueprint.cjs +0 -429
  109. package/templates/harness/skills/st-generate-tasks/SKILL.md +0 -207
  110. package/templates/harness/skills/st-generate-tasks/references/complexity-rubric.md +0 -8
  111. package/templates/harness/skills/st-generate-tasks/scripts/find-strikethroo-root.cjs +0 -116
  112. package/templates/harness/skills/st-generate-tasks/scripts/get-next-task-id.cjs +0 -295
  113. package/templates/harness/skills/st-generate-tasks/scripts/route-task-execution.cjs +0 -2874
  114. package/templates/harness/skills/st-generate-tasks/scripts/validate-plan-blueprint.cjs +0 -429
  115. package/templates/harness/skills/st-refine-plan/SKILL.md +0 -121
  116. package/templates/harness/skills/st-refine-plan/scripts/find-strikethroo-root.cjs +0 -116
  117. package/templates/harness/skills/st-refine-plan/scripts/validate-plan-blueprint.cjs +0 -429
@@ -1,116 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/skill-scripts/find-strikethroo-root.ts
31
- var find_strikethroo_root_exports = {};
32
- __export(find_strikethroo_root_exports, {
33
- main: () => main
34
- });
35
- module.exports = __toCommonJS(find_strikethroo_root_exports);
36
-
37
- // src/skill-scripts/shared/root.ts
38
- var fs = __toESM(require("fs"));
39
- var path = __toESM(require("path"));
40
- var EXPECTED_SCHEMA = true ? 4 : 4;
41
- var isValidStrikethrooRoot = (strikethrooPath) => {
42
- try {
43
- if (!fs.existsSync(strikethrooPath)) return false;
44
- if (!fs.lstatSync(strikethrooPath).isDirectory()) return false;
45
- const metadataPath = path.join(strikethrooPath, ".init-metadata.json");
46
- if (!fs.existsSync(metadataPath)) return false;
47
- const metadata = JSON.parse(fs.readFileSync(metadataPath, "utf8"));
48
- return metadata && typeof metadata === "object" && "version" in metadata;
49
- } catch (_err) {
50
- return false;
51
- }
52
- };
53
- var getStrikethrooAt = (directory) => {
54
- const strikethrooPath = path.join(directory, ".ai", "strikethroo");
55
- return isValidStrikethrooRoot(strikethrooPath) ? strikethrooPath : null;
56
- };
57
- var getParentPaths = (currentPath, acc = []) => {
58
- const absolutePath = path.resolve(currentPath);
59
- const nextAcc = [...acc, absolutePath];
60
- const parentPath = path.dirname(absolutePath);
61
- if (parentPath === absolutePath) return nextAcc;
62
- return getParentPaths(parentPath, nextAcc);
63
- };
64
- var checkWorkspaceSchema = (metadataPath) => {
65
- let metadata;
66
- try {
67
- metadata = JSON.parse(fs.readFileSync(metadataPath, "utf8"));
68
- } catch {
69
- return;
70
- }
71
- const actual = typeof metadata.workspaceSchemaVersion === "number" ? metadata.workspaceSchemaVersion : 1;
72
- if (actual === EXPECTED_SCHEMA) return;
73
- if (actual < EXPECTED_SCHEMA) {
74
- process.stderr.write(
75
- `Workspace schema v${actual} is older than this skill requires (v${EXPECTED_SCHEMA}). Re-run \`npx strikethroo init\` with the latest CLI to update.
76
- `
77
- );
78
- } else {
79
- process.stderr.write(
80
- `This skill (built for workspace schema v${EXPECTED_SCHEMA}) is older than the workspace (v${actual}). Re-run \`npx skills add e0ipso/strikethroo\` to update skills.
81
- `
82
- );
83
- }
84
- process.exit(1);
85
- };
86
- var findStrikethrooRoot = (startPath = process.cwd()) => {
87
- const paths = getParentPaths(startPath);
88
- const found = paths.find((p) => getStrikethrooAt(p));
89
- if (!found) return null;
90
- const root = getStrikethrooAt(found);
91
- if (root) checkWorkspaceSchema(path.join(root, ".init-metadata.json"));
92
- return root;
93
- };
94
-
95
- // src/skill-scripts/find-strikethroo-root.ts
96
- var main = () => {
97
- const startPath = process.argv[2] || process.cwd();
98
- const root = findStrikethrooRoot(startPath);
99
- if (!root) {
100
- process.stderr.write(
101
- `Could not find .ai/strikethroo root from ${startPath} or any parent directory.
102
- `
103
- );
104
- process.exit(1);
105
- }
106
- process.stdout.write(`${root}
107
- `);
108
- process.exit(0);
109
- };
110
- if (require.main === module) {
111
- main();
112
- }
113
- // Annotate the CommonJS export names for ESM import in node:
114
- 0 && (module.exports = {
115
- main
116
- });
@@ -1,429 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/skill-scripts/validate-plan-blueprint.ts
31
- var validate_plan_blueprint_exports = {};
32
- __export(validate_plan_blueprint_exports, {
33
- main: () => main
34
- });
35
- module.exports = __toCommonJS(validate_plan_blueprint_exports);
36
-
37
- // src/skill-scripts/shared/root.ts
38
- var fs = __toESM(require("fs"));
39
- var path = __toESM(require("path"));
40
- var EXPECTED_SCHEMA = true ? 4 : 4;
41
- var isValidStrikethrooRoot = (strikethrooPath) => {
42
- try {
43
- if (!fs.existsSync(strikethrooPath)) return false;
44
- if (!fs.lstatSync(strikethrooPath).isDirectory()) return false;
45
- const metadataPath = path.join(strikethrooPath, ".init-metadata.json");
46
- if (!fs.existsSync(metadataPath)) return false;
47
- const metadata = JSON.parse(fs.readFileSync(metadataPath, "utf8"));
48
- return metadata && typeof metadata === "object" && "version" in metadata;
49
- } catch (_err) {
50
- return false;
51
- }
52
- };
53
- var getStrikethrooAt = (directory) => {
54
- const strikethrooPath = path.join(directory, ".ai", "strikethroo");
55
- return isValidStrikethrooRoot(strikethrooPath) ? strikethrooPath : null;
56
- };
57
- var getParentPaths = (currentPath, acc = []) => {
58
- const absolutePath = path.resolve(currentPath);
59
- const nextAcc = [...acc, absolutePath];
60
- const parentPath = path.dirname(absolutePath);
61
- if (parentPath === absolutePath) return nextAcc;
62
- return getParentPaths(parentPath, nextAcc);
63
- };
64
- var checkWorkspaceSchema = (metadataPath) => {
65
- let metadata;
66
- try {
67
- metadata = JSON.parse(fs.readFileSync(metadataPath, "utf8"));
68
- } catch {
69
- return;
70
- }
71
- const actual = typeof metadata.workspaceSchemaVersion === "number" ? metadata.workspaceSchemaVersion : 1;
72
- if (actual === EXPECTED_SCHEMA) return;
73
- if (actual < EXPECTED_SCHEMA) {
74
- process.stderr.write(
75
- `Workspace schema v${actual} is older than this skill requires (v${EXPECTED_SCHEMA}). Re-run \`npx strikethroo init\` with the latest CLI to update.
76
- `
77
- );
78
- } else {
79
- process.stderr.write(
80
- `This skill (built for workspace schema v${EXPECTED_SCHEMA}) is older than the workspace (v${actual}). Re-run \`npx skills add e0ipso/strikethroo\` to update skills.
81
- `
82
- );
83
- }
84
- process.exit(1);
85
- };
86
- var findStrikethrooRoot = (startPath = process.cwd()) => {
87
- const paths = getParentPaths(startPath);
88
- const found = paths.find((p) => getStrikethrooAt(p));
89
- if (!found) return null;
90
- const root = getStrikethrooAt(found);
91
- if (root) checkWorkspaceSchema(path.join(root, ".init-metadata.json"));
92
- return root;
93
- };
94
-
95
- // src/skill-scripts/shared/plan-scan.ts
96
- var fs2 = __toESM(require("fs"));
97
- var path2 = __toESM(require("path"));
98
-
99
- // src/skill-scripts/shared/frontmatter.ts
100
- var ID_PATTERNS = [
101
- /^\s*["']?id["']?\s*:\s*["']?([+-]?\d+)["']?\s*(?:#.*)?$/im,
102
- /^\s*id\s*:\s*([+-]?\d+)\s*(?:#.*)?$/im,
103
- /^\s*["']?id["']?\s*:\s*"([+-]?\d+)"\s*(?:#.*)?$/im,
104
- /^\s*["']?id["']?\s*:\s*'([+-]?\d+)'\s*(?:#.*)?$/im,
105
- /^\s*["']id["']\s*:\s*([+-]?\d+)\s*(?:#.*)?$/im,
106
- /^\s*id\s*:\s*[|>]\s*([+-]?\d+)\s*$/im
107
- ];
108
- var validateId = (rawId) => {
109
- const id = parseInt(rawId, 10);
110
- if (Number.isNaN(id) || id < 0 || id > Number.MAX_SAFE_INTEGER) return null;
111
- return id;
112
- };
113
- var extractIdFromMarkdown = (content) => {
114
- const frontmatterMatch = content.match(/^---\s*\r?\n([\s\S]*?)\r?\n---/);
115
- if (!frontmatterMatch || !frontmatterMatch[1]) return null;
116
- const block = frontmatterMatch[1];
117
- for (const pattern of ID_PATTERNS) {
118
- const match = block.match(pattern);
119
- if (match && match[1]) {
120
- const id = validateId(match[1]);
121
- if (id !== null) return id;
122
- }
123
- }
124
- return null;
125
- };
126
- var extractPlanId = (content, _filePath) => {
127
- return extractIdFromMarkdown(content);
128
- };
129
-
130
- // src/skill-scripts/shared/plan-scan.ts
131
- var PLAN_EXTENSIONS = [".md"];
132
- var scanPlanDir = (planDirPath, dirName, isArchive) => {
133
- let entries;
134
- try {
135
- entries = fs2.readdirSync(planDirPath, { withFileTypes: true });
136
- } catch (_err) {
137
- return [];
138
- }
139
- return entries.filter((e) => e.isFile() && PLAN_EXTENSIONS.some((ext) => e.name.endsWith(ext))).flatMap((e) => {
140
- const filePath = path2.join(planDirPath, e.name);
141
- try {
142
- const content = fs2.readFileSync(filePath, "utf8");
143
- const id = extractPlanId(content, filePath);
144
- if (id === null) return [];
145
- return [{ id, file: filePath, dir: planDirPath, isArchive, name: dirName }];
146
- } catch (_err) {
147
- return [];
148
- }
149
- });
150
- };
151
- var getAllPlans = (taskManagerRoot) => {
152
- const sources = [
153
- { dir: path2.join(taskManagerRoot, "plans"), isArchive: false },
154
- { dir: path2.join(taskManagerRoot, "archive"), isArchive: true }
155
- ];
156
- return sources.flatMap(({ dir, isArchive }) => {
157
- if (!fs2.existsSync(dir)) return [];
158
- let entries;
159
- try {
160
- entries = fs2.readdirSync(dir, { withFileTypes: true });
161
- } catch (_err) {
162
- return [];
163
- }
164
- return entries.filter((e) => e.isDirectory()).flatMap((e) => scanPlanDir(path2.join(dir, e.name), e.name, isArchive));
165
- });
166
- };
167
-
168
- // src/skill-scripts/shared/plan-resolve.ts
169
- var fs3 = __toESM(require("fs"));
170
- var path3 = __toESM(require("path"));
171
- var isValidRootDir = (strikethrooPath) => {
172
- try {
173
- if (!fs3.existsSync(strikethrooPath)) return false;
174
- if (!fs3.lstatSync(strikethrooPath).isDirectory()) return false;
175
- const metadataPath = path3.join(strikethrooPath, ".init-metadata.json");
176
- if (!fs3.existsSync(metadataPath)) return false;
177
- const metadata = JSON.parse(fs3.readFileSync(metadataPath, "utf8"));
178
- return metadata && typeof metadata === "object" && "version" in metadata;
179
- } catch (_err) {
180
- return false;
181
- }
182
- };
183
- var checkStandardRootShortcut = (filePath) => {
184
- const planDir = path3.dirname(filePath);
185
- const parentDir = path3.dirname(planDir);
186
- const possibleRoot = path3.dirname(parentDir);
187
- const parentBase = path3.basename(parentDir);
188
- if (parentBase !== "plans" && parentBase !== "archive") return null;
189
- if (path3.basename(possibleRoot) !== "strikethroo") return null;
190
- const dotAiDir = path3.dirname(possibleRoot);
191
- if (path3.basename(dotAiDir) !== ".ai") return null;
192
- return isValidRootDir(possibleRoot) ? possibleRoot : null;
193
- };
194
- var resolveByPath = (absolutePath) => {
195
- let content;
196
- try {
197
- content = fs3.readFileSync(absolutePath, "utf8");
198
- } catch (_err) {
199
- return null;
200
- }
201
- const planId = extractPlanId(content, absolutePath);
202
- if (planId === null) return null;
203
- const tmRoot = checkStandardRootShortcut(absolutePath) || findStrikethrooRoot(path3.dirname(absolutePath));
204
- if (!tmRoot) return null;
205
- return {
206
- planFile: absolutePath,
207
- planDir: path3.dirname(absolutePath),
208
- strikethrooRoot: tmRoot,
209
- planId
210
- };
211
- };
212
- var resolveByIdInAncestry = (planId, startPath, searched = /* @__PURE__ */ new Set()) => {
213
- const tmRoot = findStrikethrooRoot(startPath);
214
- if (!tmRoot) return null;
215
- const normalized = path3.normalize(tmRoot);
216
- if (searched.has(normalized)) return null;
217
- searched.add(normalized);
218
- const plans = getAllPlans(tmRoot);
219
- const match = plans.find((p) => p.id === planId);
220
- if (match) {
221
- return {
222
- planFile: match.file,
223
- planDir: match.dir,
224
- strikethrooRoot: tmRoot,
225
- planId
226
- };
227
- }
228
- const parentOfRoot = path3.dirname(path3.dirname(tmRoot));
229
- if (parentOfRoot === tmRoot) return null;
230
- return resolveByIdInAncestry(planId, parentOfRoot, searched);
231
- };
232
- var resolvePlan = (input, startPath = process.cwd()) => {
233
- if (input === null || input === void 0 || input === "") return null;
234
- const inputStr = String(input);
235
- if (inputStr.startsWith("/")) {
236
- return resolveByPath(inputStr);
237
- }
238
- const planId = parseInt(inputStr, 10);
239
- if (Number.isNaN(planId)) return null;
240
- return resolveByIdInAncestry(planId, startPath);
241
- };
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
-
286
- // src/skill-scripts/shared/task-file.ts
287
- var extractFrontmatter = (content) => {
288
- const match = content.match(/^---\s*\r?\n([\s\S]*?)\r?\n---/);
289
- return match && match[1] ? match[1] : null;
290
- };
291
-
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 [];
296
- let files;
297
- try {
298
- if (!fs6.lstatSync(tasksDir).isDirectory()) return [];
299
- files = fs6.readdirSync(tasksDir).filter((f) => f.endsWith(".md")).sort();
300
- } catch (_err) {
301
- return [];
302
- }
303
- const invalid = [];
304
- for (const file of files) {
305
- let content;
306
- try {
307
- content = fs6.readFileSync(path5.join(tasksDir, file), "utf8");
308
- } catch (_err) {
309
- invalid.push(`${file}: unreadable`);
310
- continue;
311
- }
312
- const frontmatter = extractFrontmatter(content);
313
- const match = frontmatter ? frontmatter.match(/^\s*complexity_score\s*:\s*(.*?)\s*(?:#.*)?$/im) : null;
314
- if (!match || match[1] === void 0) {
315
- invalid.push(`${file}: missing complexity_score`);
316
- continue;
317
- }
318
- const raw = match[1].trim();
319
- const result = validateComplexityScore(raw);
320
- if (result.valid) continue;
321
- if (result.reason === "non-integer") {
322
- invalid.push(`${file}: non-integer complexity_score "${raw}"`);
323
- continue;
324
- }
325
- invalid.push(`${file}: complexity_score ${result.value} out of range 1-10`);
326
- }
327
- return invalid;
328
- };
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
- ];
341
- var usage = () => {
342
- const lines = [
343
- "Plan ID or absolute path is required",
344
- "",
345
- "Usage: node validate-plan-blueprint.cjs <plan-id-or-path> [field-name]",
346
- "",
347
- "Examples:",
348
- " node validate-plan-blueprint.cjs 47",
349
- " node validate-plan-blueprint.cjs /path/to/plan.md",
350
- " node validate-plan-blueprint.cjs 47 planFile",
351
- " node validate-plan-blueprint.cjs 47 blueprintExists"
352
- ];
353
- lines.forEach((l) => process.stderr.write(`[ERROR] ${l}
354
- `));
355
- };
356
- var listAvailablePlans = (startPath) => {
357
- const tmRoot = findStrikethrooRoot(startPath);
358
- if (!tmRoot) return [];
359
- const plans = getAllPlans(tmRoot);
360
- return plans.map((p) => p.name).sort((a, b) => {
361
- const aMatch = a.match(/^(\d+)--/);
362
- const bMatch = b.match(/^(\d+)--/);
363
- if (!aMatch || !bMatch || !aMatch[1] || !bMatch[1]) return 0;
364
- return parseInt(aMatch[1], 10) - parseInt(bMatch[1], 10);
365
- });
366
- };
367
- var main = () => {
368
- const inputId = process.argv[2];
369
- const fieldName = process.argv[3];
370
- if (!inputId) {
371
- usage();
372
- process.exit(1);
373
- }
374
- const numericInput = parseInt(inputId, 10);
375
- const isNumeric = !Number.isNaN(numericInput);
376
- const isAbsolutePath = inputId.startsWith("/");
377
- if (!isNumeric && !isAbsolutePath) {
378
- process.stderr.write(`[ERROR] Invalid plan ID: "${inputId}" is not a valid number
379
- `);
380
- process.exit(1);
381
- }
382
- const resolved = resolvePlan(inputId);
383
- if (!resolved) {
384
- process.stderr.write(`[ERROR] Plan ID ${inputId} not found or invalid
385
- `);
386
- process.stderr.write("[ERROR] \n");
387
- const available = listAvailablePlans(process.cwd());
388
- if (available.length > 0) {
389
- process.stderr.write("[ERROR] Available plans:\n");
390
- available.forEach((name) => process.stderr.write(`[ERROR] ${name}
391
- `));
392
- }
393
- process.exit(1);
394
- }
395
- const invalidComplexity = validateTaskComplexityScores(resolved.planDir);
396
- const result = {
397
- planFile: resolved.planFile,
398
- planDir: resolved.planDir,
399
- strikethrooRoot: resolved.strikethrooRoot,
400
- planId: resolved.planId,
401
- taskCount: countTaskFiles(resolved.planDir),
402
- blueprintExists: hasExecutionBlueprint(resolved.planFile) ? "yes" : "no",
403
- complexityScoresValid: invalidComplexity.length === 0 ? "yes" : "no",
404
- invalidComplexityTasks: invalidComplexity.join("; ")
405
- };
406
- if (fieldName) {
407
- if (!VALID_FIELDS.includes(fieldName)) {
408
- process.stderr.write(`[ERROR] Invalid field name: ${fieldName}
409
- `);
410
- process.stderr.write(`[ERROR] Valid fields: ${VALID_FIELDS.join(", ")}
411
- `);
412
- process.exit(1);
413
- }
414
- const value = result[fieldName];
415
- process.stdout.write(`${String(value)}
416
- `);
417
- } else {
418
- process.stdout.write(`${JSON.stringify(result, null, 2)}
419
- `);
420
- }
421
- process.exit(0);
422
- };
423
- if (require.main === module) {
424
- main();
425
- }
426
- // Annotate the CommonJS export names for ESM import in node:
427
- 0 && (module.exports = {
428
- main
429
- });
@@ -1,138 +0,0 @@
1
- ---
2
- name: st-execute-task
3
- description: Use when the user asks to run, execute, or implement one specific task ID within a Strikethroo plan in this repository — triggers include execute task, run task, implement task, do task N. Do not use to execute a whole plan or blueprint, to generate tasks, or for generic development outside Strikethroo.
4
- ---
5
-
6
- # st-execute-task
7
-
8
- ## Critical Rules
9
-
10
- 1. **Maintain status integrity** — update task status throughout the execution lifecycle.
11
- 2. **Document execution** — record all outcomes and issues encountered.
12
-
13
- ## Inputs
14
-
15
- The user supplies the numeric plan ID and task ID conversationally.
16
-
17
- ## Operating Procedure
18
-
19
- ### 1. Locate the strikethroo root
20
-
21
- Run `scripts/find-strikethroo-root.cjs` from the user's working directory. If
22
- it exits non-zero, stop and ask the user to run `npx strikethroo init`.
23
-
24
- Treat the path it prints as `<root>` for every subsequent step.
25
-
26
- ### 2. Resolve the plan
27
-
28
- Run `scripts/validate-plan-blueprint.cjs <plan-id> planFile` for the plan
29
- file's absolute path. Another field name prints that field instead.
30
-
31
- If the script exits non-zero, stop and ask the user to confirm the plan ID.
32
- Do not guess a different ID.
33
-
34
- Run `scripts/validate-plan-blueprint.cjs <plan-id> planDir` and treat the
35
- printed path as `<plan-dir>`.
36
-
37
- ### 3. Validate the task file
38
-
39
- Look for `<plan-dir>/tasks/<task-id>--*.md`, then for the zero-padded
40
- `<plan-dir>/tasks/0<task-id>--*.md`. If neither matches, list the files in
41
- `<plan-dir>/tasks/` and stop. Treat the match as `<task-file>`.
42
-
43
- ### 4. Check task status
44
-
45
- Read `status` from the `<task-file>` frontmatter.
46
-
47
- - `completed`, `in-progress`, or `needs-clarification`: stop, and name the way
48
- out (re-execute a completed task through execute-blueprint, answer the open
49
- clarification questions first).
50
- - `pending` or `failed`: execute.
51
- - Missing or unrecognized: proceed with caution and note the ambiguity.
52
-
53
- ### 5. Validate dependencies
54
-
55
- Run `scripts/check-task-dependencies.cjs <plan-id> <task-id>`. If it exits 1,
56
- stop and report that unresolved dependencies block the task. Do not proceed
57
- until they are satisfied.
58
-
59
- ### 6. Agent selection
60
-
61
- Read `<root>/config/hooks/PRE_TASK_ASSIGNMENT.md` and follow its instructions
62
- for selecting the appropriate agent or skill set for this task.
63
-
64
- ### 7. Update status to in-progress
65
-
66
- Rewrite the YAML frontmatter of `<task-file>`, setting `status: "in-progress"`.
67
- Preserve all other frontmatter fields exactly.
68
-
69
- ### 8. Execute the task
70
-
71
- Resolve the route before deploying any agent; resolution launches no task
72
- work:
73
-
74
- ```text
75
- scripts/dispatch-task-execution.cjs resolve <task-file> <current-harness> <workspace> <plan-id> <task-id>
76
- ```
77
-
78
- External execution uses:
79
-
80
- ```text
81
- scripts/dispatch-task-execution.cjs execute <handoff> <task-file> <current-harness> <workspace> <plan-id> <task-id>
82
- ```
83
-
84
- `<current-harness>` is the exact supported harness identifier running this
85
- skill; `<workspace>` is the project working directory.
86
-
87
- Interpret the one-line JSON result and act on its `kind` exactly once:
88
-
89
- | `kind` | Required action |
90
- | --- | --- |
91
- | `native-default` | Dispatch natively with no execution-setting prose. |
92
- | `native-override` | Dispatch natively, explicitly requiring the exact returned `model`. Require the returned `reasoningEffort` only when that property is present. |
93
- | `external-override` | Run the `execute` command with the returned `handoff`, then read its result against this same table. |
94
- | `fallback` | Nothing launched. Record the returned `reason` and `detail` visibly, then dispatch natively with no execution-setting prose. |
95
- | `launched-success` | The external process exited zero. Do not dispatch natively; review status and evidence as you would for a native agent. |
96
- | `launched-failure` | A failed task. Set its status to `failed` and run `<root>/config/hooks/POST_ERROR_DETECTION.md`. Never retry it natively. |
97
- | `infrastructure-failure` | Handle exactly as the preceding row. |
98
-
99
- Handoff rules:
100
-
101
- - Pass the exact opaque `handoff` string the resolver returned for that task. Never reconstruct one.
102
- - Never reuse a handoff for another task, and never rerun resolution after launches begin.
103
-
104
- Steps 9–11 are this skill's failed-status and error-hook path.
105
-
106
- For a native dispatch, deploy an agent using your internal Task tool. The agent
107
- must read and execute `<root>/config/hooks/PRE_TASK_EXECUTION.md` before any
108
- implementation work, then read the complete `<task-file>` and implement it.
109
-
110
- ### 9. Update status to completed or failed
111
-
112
- After the agent finishes, rewrite the YAML frontmatter of `<task-file>` based
113
- on the outcome:
114
-
115
- - Set `status: "completed"` if the task was implemented successfully and
116
- all acceptance criteria are met.
117
- - Set `status: "failed"` if the task could not be completed, acceptance
118
- criteria were not met, or an unrecoverable error occurred.
119
-
120
- Preserve all other frontmatter fields exactly.
121
-
122
- ### 10. Document noteworthy events
123
-
124
- If anything significant occurred during execution — decisions made, issues
125
- encountered, deviations from the plan, or follow-up actions required —
126
- append a "Noteworthy Events" section to the end of `<task-file>`:
127
-
128
- ```markdown
129
- ## Noteworthy Events
130
- - [YYYY-MM-DD] [Event description with sufficient context for the orchestrator]
131
- ```
132
-
133
- ### 11. Error handling
134
-
135
- If any error occurred during execution, read
136
- `<root>/config/hooks/POST_ERROR_DETECTION.md` and execute its instructions.
137
- Document the error in Noteworthy Events and ensure the task status is set to
138
- `failed` if it is not already.