@organon-methodology/tools 0.3.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 (287) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -0
  3. package/dist/cli/commands/coverage.d.ts +12 -0
  4. package/dist/cli/commands/coverage.d.ts.map +1 -0
  5. package/dist/cli/commands/coverage.js +80 -0
  6. package/dist/cli/commands/coverage.js.map +1 -0
  7. package/dist/cli/commands/find.d.ts +15 -0
  8. package/dist/cli/commands/find.d.ts.map +1 -0
  9. package/dist/cli/commands/find.js +81 -0
  10. package/dist/cli/commands/find.js.map +1 -0
  11. package/dist/cli/commands/generate-tests.d.ts +14 -0
  12. package/dist/cli/commands/generate-tests.d.ts.map +1 -0
  13. package/dist/cli/commands/generate-tests.js +87 -0
  14. package/dist/cli/commands/generate-tests.js.map +1 -0
  15. package/dist/cli/commands/generate.d.ts +15 -0
  16. package/dist/cli/commands/generate.d.ts.map +1 -0
  17. package/dist/cli/commands/generate.js +77 -0
  18. package/dist/cli/commands/generate.js.map +1 -0
  19. package/dist/cli/commands/health.d.ts +13 -0
  20. package/dist/cli/commands/health.d.ts.map +1 -0
  21. package/dist/cli/commands/health.js +79 -0
  22. package/dist/cli/commands/health.js.map +1 -0
  23. package/dist/cli/commands/init.d.ts +14 -0
  24. package/dist/cli/commands/init.d.ts.map +1 -0
  25. package/dist/cli/commands/init.js +132 -0
  26. package/dist/cli/commands/init.js.map +1 -0
  27. package/dist/cli/commands/mcp.d.ts +11 -0
  28. package/dist/cli/commands/mcp.d.ts.map +1 -0
  29. package/dist/cli/commands/mcp.js +26 -0
  30. package/dist/cli/commands/mcp.js.map +1 -0
  31. package/dist/cli/commands/query.d.ts +19 -0
  32. package/dist/cli/commands/query.d.ts.map +1 -0
  33. package/dist/cli/commands/query.js +103 -0
  34. package/dist/cli/commands/query.js.map +1 -0
  35. package/dist/cli/commands/upgrade.d.ts +13 -0
  36. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  37. package/dist/cli/commands/upgrade.js +162 -0
  38. package/dist/cli/commands/upgrade.js.map +1 -0
  39. package/dist/cli/commands/validate.d.ts +13 -0
  40. package/dist/cli/commands/validate.d.ts.map +1 -0
  41. package/dist/cli/commands/validate.js +89 -0
  42. package/dist/cli/commands/validate.js.map +1 -0
  43. package/dist/cli/commands/verify.d.ts +12 -0
  44. package/dist/cli/commands/verify.d.ts.map +1 -0
  45. package/dist/cli/commands/verify.js +67 -0
  46. package/dist/cli/commands/verify.js.map +1 -0
  47. package/dist/cli/index.d.ts +19 -0
  48. package/dist/cli/index.d.ts.map +1 -0
  49. package/dist/cli/index.js +59 -0
  50. package/dist/cli/index.js.map +1 -0
  51. package/dist/core/add-protocols-array.d.ts +17 -0
  52. package/dist/core/add-protocols-array.d.ts.map +1 -0
  53. package/dist/core/add-protocols-array.js +95 -0
  54. package/dist/core/add-protocols-array.js.map +1 -0
  55. package/dist/core/add-protocols-array.test.d.ts +2 -0
  56. package/dist/core/add-protocols-array.test.d.ts.map +1 -0
  57. package/dist/core/add-protocols-array.test.js +86 -0
  58. package/dist/core/add-protocols-array.test.js.map +1 -0
  59. package/dist/core/config.d.ts +44 -0
  60. package/dist/core/config.d.ts.map +1 -0
  61. package/dist/core/config.js +130 -0
  62. package/dist/core/config.js.map +1 -0
  63. package/dist/core/config.test.d.ts +2 -0
  64. package/dist/core/config.test.d.ts.map +1 -0
  65. package/dist/core/config.test.js +88 -0
  66. package/dist/core/config.test.js.map +1 -0
  67. package/dist/core/find.d.ts +29 -0
  68. package/dist/core/find.d.ts.map +1 -0
  69. package/dist/core/find.js +191 -0
  70. package/dist/core/find.js.map +1 -0
  71. package/dist/core/find.test.d.ts +2 -0
  72. package/dist/core/find.test.d.ts.map +1 -0
  73. package/dist/core/find.test.js +91 -0
  74. package/dist/core/find.test.js.map +1 -0
  75. package/dist/core/frontmatter-parser.d.ts +45 -0
  76. package/dist/core/frontmatter-parser.d.ts.map +1 -0
  77. package/dist/core/frontmatter-parser.js +122 -0
  78. package/dist/core/frontmatter-parser.js.map +1 -0
  79. package/dist/core/frontmatter-parser.test.d.ts +2 -0
  80. package/dist/core/frontmatter-parser.test.d.ts.map +1 -0
  81. package/dist/core/frontmatter-parser.test.js +200 -0
  82. package/dist/core/frontmatter-parser.test.js.map +1 -0
  83. package/dist/core/generate-frontmatter.d.ts +27 -0
  84. package/dist/core/generate-frontmatter.d.ts.map +1 -0
  85. package/dist/core/generate-frontmatter.js +219 -0
  86. package/dist/core/generate-frontmatter.js.map +1 -0
  87. package/dist/core/generate-frontmatter.test.d.ts +2 -0
  88. package/dist/core/generate-frontmatter.test.d.ts.map +1 -0
  89. package/dist/core/generate-frontmatter.test.js +161 -0
  90. package/dist/core/generate-frontmatter.test.js.map +1 -0
  91. package/dist/core/generate-tests.d.ts +41 -0
  92. package/dist/core/generate-tests.d.ts.map +1 -0
  93. package/dist/core/generate-tests.js +191 -0
  94. package/dist/core/generate-tests.js.map +1 -0
  95. package/dist/core/generate-tests.test.d.ts +2 -0
  96. package/dist/core/generate-tests.test.d.ts.map +1 -0
  97. package/dist/core/generate-tests.test.js +205 -0
  98. package/dist/core/generate-tests.test.js.map +1 -0
  99. package/dist/core/health.d.ts +16 -0
  100. package/dist/core/health.d.ts.map +1 -0
  101. package/dist/core/health.js +156 -0
  102. package/dist/core/health.js.map +1 -0
  103. package/dist/core/health.test.d.ts +2 -0
  104. package/dist/core/health.test.d.ts.map +1 -0
  105. package/dist/core/health.test.js +97 -0
  106. package/dist/core/health.test.js.map +1 -0
  107. package/dist/core/init.d.ts +25 -0
  108. package/dist/core/init.d.ts.map +1 -0
  109. package/dist/core/init.js +100 -0
  110. package/dist/core/init.js.map +1 -0
  111. package/dist/core/init.test.d.ts +8 -0
  112. package/dist/core/init.test.d.ts.map +1 -0
  113. package/dist/core/init.test.js +203 -0
  114. package/dist/core/init.test.js.map +1 -0
  115. package/dist/core/invariant-coverage.d.ts +41 -0
  116. package/dist/core/invariant-coverage.d.ts.map +1 -0
  117. package/dist/core/invariant-coverage.js +181 -0
  118. package/dist/core/invariant-coverage.js.map +1 -0
  119. package/dist/core/invariant-coverage.test.d.ts +2 -0
  120. package/dist/core/invariant-coverage.test.d.ts.map +1 -0
  121. package/dist/core/invariant-coverage.test.js +188 -0
  122. package/dist/core/invariant-coverage.test.js.map +1 -0
  123. package/dist/core/meta-invariants.test.d.ts +17 -0
  124. package/dist/core/meta-invariants.test.d.ts.map +1 -0
  125. package/dist/core/meta-invariants.test.js +191 -0
  126. package/dist/core/meta-invariants.test.js.map +1 -0
  127. package/dist/core/node-fs.d.ts +22 -0
  128. package/dist/core/node-fs.d.ts.map +1 -0
  129. package/dist/core/node-fs.js +47 -0
  130. package/dist/core/node-fs.js.map +1 -0
  131. package/dist/core/organon-invariants.test.d.ts +15 -0
  132. package/dist/core/organon-invariants.test.d.ts.map +1 -0
  133. package/dist/core/organon-invariants.test.js +149 -0
  134. package/dist/core/organon-invariants.test.js.map +1 -0
  135. package/dist/core/query.d.ts +35 -0
  136. package/dist/core/query.d.ts.map +1 -0
  137. package/dist/core/query.js +139 -0
  138. package/dist/core/query.js.map +1 -0
  139. package/dist/core/query.test.d.ts +2 -0
  140. package/dist/core/query.test.d.ts.map +1 -0
  141. package/dist/core/query.test.js +97 -0
  142. package/dist/core/query.test.js.map +1 -0
  143. package/dist/core/suggest-tools.d.ts +15 -0
  144. package/dist/core/suggest-tools.d.ts.map +1 -0
  145. package/dist/core/suggest-tools.js +139 -0
  146. package/dist/core/suggest-tools.js.map +1 -0
  147. package/dist/core/suggest-tools.test.d.ts +2 -0
  148. package/dist/core/suggest-tools.test.d.ts.map +1 -0
  149. package/dist/core/suggest-tools.test.js +122 -0
  150. package/dist/core/suggest-tools.test.js.map +1 -0
  151. package/dist/core/test-helpers.d.ts +63 -0
  152. package/dist/core/test-helpers.d.ts.map +1 -0
  153. package/dist/core/test-helpers.js +265 -0
  154. package/dist/core/test-helpers.js.map +1 -0
  155. package/dist/core/types.d.ts +277 -0
  156. package/dist/core/types.d.ts.map +1 -0
  157. package/dist/core/types.js +9 -0
  158. package/dist/core/types.js.map +1 -0
  159. package/dist/core/upgrade.d.ts +46 -0
  160. package/dist/core/upgrade.d.ts.map +1 -0
  161. package/dist/core/upgrade.js +227 -0
  162. package/dist/core/upgrade.js.map +1 -0
  163. package/dist/core/upgrade.test.d.ts +8 -0
  164. package/dist/core/upgrade.test.d.ts.map +1 -0
  165. package/dist/core/upgrade.test.js +370 -0
  166. package/dist/core/upgrade.test.js.map +1 -0
  167. package/dist/core/validate-frontmatter.d.ts +20 -0
  168. package/dist/core/validate-frontmatter.d.ts.map +1 -0
  169. package/dist/core/validate-frontmatter.js +529 -0
  170. package/dist/core/validate-frontmatter.js.map +1 -0
  171. package/dist/core/validate-frontmatter.test.d.ts +2 -0
  172. package/dist/core/validate-frontmatter.test.d.ts.map +1 -0
  173. package/dist/core/validate-frontmatter.test.js +366 -0
  174. package/dist/core/validate-frontmatter.test.js.map +1 -0
  175. package/dist/core/validate-workflow.d.ts +17 -0
  176. package/dist/core/validate-workflow.d.ts.map +1 -0
  177. package/dist/core/validate-workflow.js +233 -0
  178. package/dist/core/validate-workflow.js.map +1 -0
  179. package/dist/core/validate-workflow.test.d.ts +2 -0
  180. package/dist/core/validate-workflow.test.d.ts.map +1 -0
  181. package/dist/core/validate-workflow.test.js +205 -0
  182. package/dist/core/validate-workflow.test.js.map +1 -0
  183. package/dist/core/verify-tier4-tests.d.ts +34 -0
  184. package/dist/core/verify-tier4-tests.d.ts.map +1 -0
  185. package/dist/core/verify-tier4-tests.js +106 -0
  186. package/dist/core/verify-tier4-tests.js.map +1 -0
  187. package/dist/core/verify-tier4-tests.test.d.ts +2 -0
  188. package/dist/core/verify-tier4-tests.test.d.ts.map +1 -0
  189. package/dist/core/verify-tier4-tests.test.js +140 -0
  190. package/dist/core/verify-tier4-tests.test.js.map +1 -0
  191. package/dist/core/verify-triplets.d.ts +17 -0
  192. package/dist/core/verify-triplets.d.ts.map +1 -0
  193. package/dist/core/verify-triplets.js +217 -0
  194. package/dist/core/verify-triplets.js.map +1 -0
  195. package/dist/core/verify-triplets.test.d.ts +2 -0
  196. package/dist/core/verify-triplets.test.d.ts.map +1 -0
  197. package/dist/core/verify-triplets.test.js +147 -0
  198. package/dist/core/verify-triplets.test.js.map +1 -0
  199. package/dist/core/verify.d.ts +19 -0
  200. package/dist/core/verify.d.ts.map +1 -0
  201. package/dist/core/verify.js +162 -0
  202. package/dist/core/verify.js.map +1 -0
  203. package/dist/core/verify.test.d.ts +2 -0
  204. package/dist/core/verify.test.d.ts.map +1 -0
  205. package/dist/core/verify.test.js +147 -0
  206. package/dist/core/verify.test.js.map +1 -0
  207. package/dist/index.d.ts +31 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +27 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/mcp/prompts.d.ts +9 -0
  212. package/dist/mcp/prompts.d.ts.map +1 -0
  213. package/dist/mcp/prompts.js +265 -0
  214. package/dist/mcp/prompts.js.map +1 -0
  215. package/dist/mcp/resources.d.ts +7 -0
  216. package/dist/mcp/resources.d.ts.map +1 -0
  217. package/dist/mcp/resources.js +111 -0
  218. package/dist/mcp/resources.js.map +1 -0
  219. package/dist/mcp/server.d.ts +7 -0
  220. package/dist/mcp/server.d.ts.map +1 -0
  221. package/dist/mcp/server.js +31 -0
  222. package/dist/mcp/server.js.map +1 -0
  223. package/dist/mcp/tools.d.ts +7 -0
  224. package/dist/mcp/tools.d.ts.map +1 -0
  225. package/dist/mcp/tools.js +130 -0
  226. package/dist/mcp/tools.js.map +1 -0
  227. package/dist/templates/config.d.ts +6 -0
  228. package/dist/templates/config.d.ts.map +1 -0
  229. package/dist/templates/config.js +30 -0
  230. package/dist/templates/config.js.map +1 -0
  231. package/dist/templates/index.d.ts +7 -0
  232. package/dist/templates/index.d.ts.map +1 -0
  233. package/dist/templates/index.js +7 -0
  234. package/dist/templates/index.js.map +1 -0
  235. package/dist/templates/organon/claude-md.d.ts +7 -0
  236. package/dist/templates/organon/claude-md.d.ts.map +1 -0
  237. package/dist/templates/organon/claude-md.js +32 -0
  238. package/dist/templates/organon/claude-md.js.map +1 -0
  239. package/dist/templates/organon/ethos.d.ts +5 -0
  240. package/dist/templates/organon/ethos.d.ts.map +1 -0
  241. package/dist/templates/organon/ethos.js +69 -0
  242. package/dist/templates/organon/ethos.js.map +1 -0
  243. package/dist/templates/organon/index.d.ts +10 -0
  244. package/dist/templates/organon/index.d.ts.map +1 -0
  245. package/dist/templates/organon/index.js +10 -0
  246. package/dist/templates/organon/index.js.map +1 -0
  247. package/dist/templates/organon/observations-readme.d.ts +5 -0
  248. package/dist/templates/organon/observations-readme.d.ts.map +1 -0
  249. package/dist/templates/organon/observations-readme.js +25 -0
  250. package/dist/templates/organon/observations-readme.js.map +1 -0
  251. package/dist/templates/organon/philosophy.d.ts +5 -0
  252. package/dist/templates/organon/philosophy.d.ts.map +1 -0
  253. package/dist/templates/organon/philosophy.js +75 -0
  254. package/dist/templates/organon/philosophy.js.map +1 -0
  255. package/dist/templates/organon/protocols.d.ts +7 -0
  256. package/dist/templates/organon/protocols.d.ts.map +1 -0
  257. package/dist/templates/organon/protocols.js +197 -0
  258. package/dist/templates/organon/protocols.js.map +1 -0
  259. package/dist/templates/organon/readme.d.ts +5 -0
  260. package/dist/templates/organon/readme.d.ts.map +1 -0
  261. package/dist/templates/organon/readme.js +40 -0
  262. package/dist/templates/organon/readme.js.map +1 -0
  263. package/dist/templates/skills/domain-feature-design.d.ts +9 -0
  264. package/dist/templates/skills/domain-feature-design.d.ts.map +1 -0
  265. package/dist/templates/skills/domain-feature-design.js +123 -0
  266. package/dist/templates/skills/domain-feature-design.js.map +1 -0
  267. package/dist/templates/skills/index.d.ts +15 -0
  268. package/dist/templates/skills/index.d.ts.map +1 -0
  269. package/dist/templates/skills/index.js +35 -0
  270. package/dist/templates/skills/index.js.map +1 -0
  271. package/dist/templates/skills/organon-file-creation.d.ts +9 -0
  272. package/dist/templates/skills/organon-file-creation.d.ts.map +1 -0
  273. package/dist/templates/skills/organon-file-creation.js +138 -0
  274. package/dist/templates/skills/organon-file-creation.js.map +1 -0
  275. package/dist/templates/skills/quality-review.d.ts +9 -0
  276. package/dist/templates/skills/quality-review.d.ts.map +1 -0
  277. package/dist/templates/skills/quality-review.js +127 -0
  278. package/dist/templates/skills/quality-review.js.map +1 -0
  279. package/dist/templates/skills/session-compounding.d.ts +9 -0
  280. package/dist/templates/skills/session-compounding.d.ts.map +1 -0
  281. package/dist/templates/skills/session-compounding.js +118 -0
  282. package/dist/templates/skills/session-compounding.js.map +1 -0
  283. package/dist/templates/skills/verify-and-health.d.ts +9 -0
  284. package/dist/templates/skills/verify-and-health.d.ts.map +1 -0
  285. package/dist/templates/skills/verify-and-health.js +99 -0
  286. package/dist/templates/skills/verify-and-health.js.map +1 -0
  287. package/package.json +72 -0
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Automation suggestion heuristics.
3
+ *
4
+ * Analyzes protocols and suggests which ones should be upgraded
5
+ * from manual → semi-automated → automated, based on step count,
6
+ * complexity, frequency indicators, and error-proneness.
7
+ */
8
+ import { parseFrontmatter } from './frontmatter-parser.js';
9
+ import { joinPath } from './config.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Constants
12
+ // ---------------------------------------------------------------------------
13
+ const STEP_THRESHOLD_AUTOMATED = 5;
14
+ const STEP_THRESHOLD_SEMI = 2;
15
+ // Keywords that indicate error-proneness or frequency
16
+ const ERROR_PRONE_KEYWORDS = [
17
+ 'careful', 'ensure', 'verify', 'must', 'critical',
18
+ 'never', 'always', 'exactly', 'precisely',
19
+ ];
20
+ const FREQUENCY_KEYWORDS = [
21
+ 'every', 'each', 'always', 'regularly', 'frequently',
22
+ 'before each', 'after each', 'on every',
23
+ ];
24
+ const CROSS_DOMAIN_KEYWORDS = [
25
+ 'across', 'multiple', 'all domains', 'cross-cutting',
26
+ 'throughout', 'every domain',
27
+ ];
28
+ // ---------------------------------------------------------------------------
29
+ // Main
30
+ // ---------------------------------------------------------------------------
31
+ export async function suggestTools(options) {
32
+ const { projectRoot, config, fs } = options;
33
+ const errors = [];
34
+ const warnings = [];
35
+ const suggestions = [];
36
+ // Discover protocol files
37
+ const organonFiles = await discoverOrganonFiles(projectRoot, config, fs);
38
+ for (const file of organonFiles) {
39
+ const absPath = joinPath(projectRoot, file);
40
+ let content;
41
+ try {
42
+ content = await fs.readFile(absPath);
43
+ }
44
+ catch {
45
+ continue;
46
+ }
47
+ const { frontmatter, body } = parseFrontmatter(content);
48
+ if (frontmatter?.type !== 'procedures' || !frontmatter.protocols)
49
+ continue;
50
+ for (const proto of frontmatter.protocols) {
51
+ const suggestedTier = suggestTier(proto.steps, proto.automation_tier, body);
52
+ if (suggestedTier && suggestedTier !== proto.automation_tier) {
53
+ const reason = buildReason(proto.steps, proto.automation_tier, suggestedTier, body);
54
+ suggestions.push({
55
+ protocolId: proto.id,
56
+ protocolFile: file,
57
+ currentTier: proto.automation_tier,
58
+ suggestedTier,
59
+ reason,
60
+ steps: proto.steps,
61
+ complexity: proto.complexity,
62
+ });
63
+ }
64
+ }
65
+ }
66
+ return {
67
+ success: errors.length === 0,
68
+ suggestions,
69
+ errors,
70
+ warnings,
71
+ };
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Suggestion logic
75
+ // ---------------------------------------------------------------------------
76
+ function suggestTier(steps, currentTier, body) {
77
+ const lower = body.toLowerCase();
78
+ const errorProneScore = ERROR_PRONE_KEYWORDS.reduce((count, kw) => count + (lower.includes(kw) ? 1 : 0), 0);
79
+ const frequencyScore = FREQUENCY_KEYWORDS.reduce((count, kw) => count + (lower.includes(kw) ? 1 : 0), 0);
80
+ const crossDomainScore = CROSS_DOMAIN_KEYWORDS.reduce((count, kw) => count + (lower.includes(kw) ? 1 : 0), 0);
81
+ const totalScore = errorProneScore + frequencyScore + crossDomainScore;
82
+ // Suggest upgrade based on step count + heuristic score
83
+ if (currentTier === 'manual') {
84
+ if (steps >= STEP_THRESHOLD_AUTOMATED || totalScore >= 4) {
85
+ return 'automated';
86
+ }
87
+ if (steps >= STEP_THRESHOLD_SEMI || totalScore >= 2) {
88
+ return 'semi-automated';
89
+ }
90
+ }
91
+ if (currentTier === 'semi-automated') {
92
+ if (steps >= STEP_THRESHOLD_AUTOMATED || totalScore >= 4) {
93
+ return 'automated';
94
+ }
95
+ }
96
+ return null;
97
+ }
98
+ function buildReason(steps, currentTier, suggestedTier, body) {
99
+ const reasons = [];
100
+ const lower = body.toLowerCase();
101
+ if (steps >= STEP_THRESHOLD_AUTOMATED) {
102
+ reasons.push(`${steps} steps (threshold: ${STEP_THRESHOLD_AUTOMATED})`);
103
+ }
104
+ else if (steps >= STEP_THRESHOLD_SEMI) {
105
+ reasons.push(`${steps} steps`);
106
+ }
107
+ const hasErrorProne = ERROR_PRONE_KEYWORDS.some((kw) => lower.includes(kw));
108
+ if (hasErrorProne)
109
+ reasons.push('error-prone language detected');
110
+ const hasFrequency = FREQUENCY_KEYWORDS.some((kw) => lower.includes(kw));
111
+ if (hasFrequency)
112
+ reasons.push('frequent execution indicated');
113
+ const hasCrossDomain = CROSS_DOMAIN_KEYWORDS.some((kw) => lower.includes(kw));
114
+ if (hasCrossDomain)
115
+ reasons.push('cross-domain scope');
116
+ return reasons.length > 0
117
+ ? `Upgrade ${currentTier} → ${suggestedTier}: ${reasons.join(', ')}`
118
+ : `Consider upgrading from ${currentTier} to ${suggestedTier}`;
119
+ }
120
+ // ---------------------------------------------------------------------------
121
+ // Helpers
122
+ // ---------------------------------------------------------------------------
123
+ async function discoverOrganonFiles(projectRoot, config, fs) {
124
+ const allFiles = new Set();
125
+ for (const organonPath of config.organonPaths) {
126
+ for (const pattern of config.organonGlobs) {
127
+ const fullPattern = organonPath === '.' ? pattern : `${organonPath}/${pattern}`;
128
+ const matches = await fs.glob(fullPattern, {
129
+ cwd: projectRoot,
130
+ ignore: config.ignorePatterns,
131
+ });
132
+ for (const m of matches) {
133
+ allFiles.add(m);
134
+ }
135
+ }
136
+ }
137
+ return [...allFiles].sort();
138
+ }
139
+ //# sourceMappingURL=suggest-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-tools.js","sourceRoot":"","sources":["../../src/core/suggest-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=suggest-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-tools.test.d.ts","sourceRoot":"","sources":["../../src/core/suggest-tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,122 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { suggestTools } from './suggest-tools.js';
3
+ import { MemoryFileSystem } from './test-helpers.js';
4
+ function makeConfig(projectRoot) {
5
+ return {
6
+ projectRoot,
7
+ organonPaths: ['.'],
8
+ organonGlobs: ['**/PROTOCOLS.md'],
9
+ ignorePatterns: [],
10
+ workflowPaths: {},
11
+ freshnessThresholdHours: 24,
12
+ };
13
+ }
14
+ describe('suggestTools', () => {
15
+ it('suggests upgrading manual protocol with many steps', async () => {
16
+ const fs = new MemoryFileSystem({
17
+ '/project/PROTOCOLS.md': `---
18
+ type: procedures
19
+ scope: methodology
20
+ name: test
21
+ version: "1.0"
22
+ summary: Test
23
+ token_estimate: 500
24
+ protocols_count: 1
25
+ protocols:
26
+ - id: PROTO-BIG-1
27
+ name: Big Manual Protocol
28
+ steps: 8
29
+ automation_tier: manual
30
+ complexity: high
31
+ ---
32
+
33
+ ## Steps
34
+
35
+ You must always ensure every step is done carefully.
36
+ This is critical and must never be skipped.
37
+ Before each deployment, verify all checks pass.
38
+
39
+ 1. Step one
40
+ 2. Step two
41
+ 3. Step three
42
+ 4. Step four
43
+ 5. Step five
44
+ 6. Step six
45
+ 7. Step seven
46
+ 8. Step eight`,
47
+ });
48
+ const config = makeConfig('/project');
49
+ const result = await suggestTools({ projectRoot: '/project', config, fs });
50
+ expect(result.suggestions.length).toBeGreaterThanOrEqual(1);
51
+ expect(result.suggestions[0].suggestedTier).toBe('automated');
52
+ expect(result.suggestions[0].currentTier).toBe('manual');
53
+ });
54
+ it('does not suggest changes for already automated protocols', async () => {
55
+ const fs = new MemoryFileSystem({
56
+ '/project/PROTOCOLS.md': `---
57
+ type: procedures
58
+ scope: methodology
59
+ name: test
60
+ version: "1.0"
61
+ summary: Test
62
+ token_estimate: 300
63
+ protocols_count: 1
64
+ protocols:
65
+ - id: PROTO-AUTO-1
66
+ name: Already Automated
67
+ steps: 6
68
+ automation_tier: automated
69
+ workflow: my-workflow
70
+ complexity: high
71
+ ---
72
+
73
+ ## Steps
74
+ 1. Step one`,
75
+ });
76
+ const config = makeConfig('/project');
77
+ const result = await suggestTools({ projectRoot: '/project', config, fs });
78
+ expect(result.suggestions.length).toBe(0);
79
+ });
80
+ it('suggests semi-automated for small manual protocols with error-prone language', async () => {
81
+ const fs = new MemoryFileSystem({
82
+ '/project/PROTOCOLS.md': `---
83
+ type: procedures
84
+ scope: methodology
85
+ name: test
86
+ version: "1.0"
87
+ summary: Test
88
+ token_estimate: 300
89
+ protocols_count: 1
90
+ protocols:
91
+ - id: PROTO-SMALL-1
92
+ name: Small Protocol
93
+ steps: 3
94
+ automation_tier: manual
95
+ complexity: low
96
+ ---
97
+
98
+ ## Steps
99
+
100
+ You must carefully ensure the output is precisely correct.
101
+ Always verify before proceeding.
102
+
103
+ 1. Step one
104
+ 2. Step two
105
+ 3. Step three`,
106
+ });
107
+ const config = makeConfig('/project');
108
+ const result = await suggestTools({ projectRoot: '/project', config, fs });
109
+ expect(result.suggestions.length).toBeGreaterThanOrEqual(1);
110
+ const suggestion = result.suggestions[0];
111
+ expect(suggestion.currentTier).toBe('manual');
112
+ expect(['semi-automated', 'automated']).toContain(suggestion.suggestedTier);
113
+ });
114
+ it('returns empty suggestions for projects without protocols', async () => {
115
+ const fs = new MemoryFileSystem();
116
+ const config = makeConfig('/project');
117
+ const result = await suggestTools({ projectRoot: '/project', config, fs });
118
+ expect(result.suggestions).toHaveLength(0);
119
+ expect(result.success).toBe(true);
120
+ });
121
+ });
122
+ //# sourceMappingURL=suggest-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-tools.test.js","sourceRoot":"","sources":["../../src/core/suggest-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * In-memory FileSystem for testing core functions.
3
+ */
4
+ import type { FileSystem, FileStat } from './types.js';
5
+ export declare class MemoryFileSystem implements FileSystem {
6
+ private files;
7
+ private throwPaths;
8
+ private throwReadPaths;
9
+ constructor(files?: Record<string, string>);
10
+ addFile(path: string, content: string, mtime?: Date): void;
11
+ /** Make exists() and readFile() throw for any path containing this substring. */
12
+ throwOn(pathSubstring: string): void;
13
+ /** Make only readFile() throw for any path containing this substring (exists() still works). */
14
+ throwOnRead(pathSubstring: string): void;
15
+ private checkThrow;
16
+ private checkThrowRead;
17
+ readFile(path: string): Promise<string>;
18
+ readDir(dirPath: string): Promise<string[]>;
19
+ exists(path: string): Promise<boolean>;
20
+ glob(pattern: string, options?: {
21
+ cwd: string;
22
+ ignore?: string[];
23
+ }): Promise<string[]>;
24
+ stat(path: string): Promise<FileStat>;
25
+ }
26
+ /**
27
+ * Create a minimal ETHOS.md file content for testing.
28
+ */
29
+ export declare function makeEthos(opts?: {
30
+ name?: string;
31
+ scope?: string;
32
+ invariants?: number;
33
+ principles?: number;
34
+ heuristics?: number;
35
+ extra?: Record<string, unknown>;
36
+ }): string;
37
+ /**
38
+ * Create a minimal PHILOSOPHY.md for testing.
39
+ */
40
+ export declare function makePhilosophy(opts?: {
41
+ name?: string;
42
+ decisions?: number;
43
+ }): string;
44
+ /**
45
+ * Create a minimal README.md for testing.
46
+ */
47
+ export declare function makeReadme(opts?: {
48
+ name?: string;
49
+ scope?: string;
50
+ }): string;
51
+ /**
52
+ * Create a minimal workflow file for testing.
53
+ */
54
+ export declare function makeWorkflow(opts?: {
55
+ name?: string;
56
+ protocolId?: string;
57
+ protocolFile?: string;
58
+ tools?: string[];
59
+ loads?: string[];
60
+ includeRecovery?: boolean;
61
+ steps?: number;
62
+ }): string;
63
+ //# sourceMappingURL=test-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../src/core/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOvD,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,cAAc,CAAqB;gBAE/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQ1C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI;IAO1D,iFAAiF;IACjF,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAIpC,gGAAgG;IAChG,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAIxC,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,cAAc;IAQhB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQvC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAa3C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYtC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBtF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;CAK5C;AAwBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,GAAG,MAAM,CAkET;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAoCnF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAgB3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CA8CT"}
@@ -0,0 +1,265 @@
1
+ /**
2
+ * In-memory FileSystem for testing core functions.
3
+ */
4
+ export class MemoryFileSystem {
5
+ files = new Map();
6
+ throwPaths = new Set();
7
+ throwReadPaths = new Set();
8
+ constructor(files) {
9
+ if (files) {
10
+ for (const [path, content] of Object.entries(files)) {
11
+ this.addFile(path, content);
12
+ }
13
+ }
14
+ }
15
+ addFile(path, content, mtime) {
16
+ this.files.set(normalize(path), {
17
+ content,
18
+ mtime: mtime ?? new Date(),
19
+ });
20
+ }
21
+ /** Make exists() and readFile() throw for any path containing this substring. */
22
+ throwOn(pathSubstring) {
23
+ this.throwPaths.add(pathSubstring);
24
+ }
25
+ /** Make only readFile() throw for any path containing this substring (exists() still works). */
26
+ throwOnRead(pathSubstring) {
27
+ this.throwReadPaths.add(pathSubstring);
28
+ }
29
+ checkThrow(path) {
30
+ for (const sub of this.throwPaths) {
31
+ if (path.includes(sub)) {
32
+ throw new Error(`EPERM: permission denied, '${path}'`);
33
+ }
34
+ }
35
+ }
36
+ checkThrowRead(path) {
37
+ for (const sub of this.throwReadPaths) {
38
+ if (path.includes(sub)) {
39
+ throw new Error(`EPERM: permission denied, '${path}'`);
40
+ }
41
+ }
42
+ }
43
+ async readFile(path) {
44
+ this.checkThrow(path);
45
+ this.checkThrowRead(path);
46
+ const file = this.files.get(normalize(path));
47
+ if (!file)
48
+ throw new Error(`ENOENT: ${path}`);
49
+ return file.content;
50
+ }
51
+ async readDir(dirPath) {
52
+ const dir = normalize(dirPath);
53
+ const entries = new Set();
54
+ for (const key of this.files.keys()) {
55
+ if (key.startsWith(dir + '/')) {
56
+ const rest = key.slice(dir.length + 1);
57
+ const firstSegment = rest.split('/')[0];
58
+ entries.add(firstSegment);
59
+ }
60
+ }
61
+ return [...entries];
62
+ }
63
+ async exists(path) {
64
+ this.checkThrow(path);
65
+ const norm = normalize(path);
66
+ // Check exact file match
67
+ if (this.files.has(norm))
68
+ return true;
69
+ // Check if it's a directory (any file starts with this path)
70
+ for (const key of this.files.keys()) {
71
+ if (key.startsWith(norm + '/'))
72
+ return true;
73
+ }
74
+ return false;
75
+ }
76
+ async glob(pattern, options) {
77
+ const cwd = options?.cwd ? normalize(options.cwd) : '';
78
+ const ignorePatterns = options?.ignore ?? [];
79
+ const results = [];
80
+ for (const key of this.files.keys()) {
81
+ // Files in cwd
82
+ const relative = cwd ? (key.startsWith(cwd + '/') ? key.slice(cwd.length + 1) : null) : key;
83
+ if (relative === null)
84
+ continue;
85
+ // Simple glob matching
86
+ if (matchGlob(relative, pattern)) {
87
+ // Check ignore patterns
88
+ const ignored = ignorePatterns.some((ip) => matchGlob(relative, ip));
89
+ if (!ignored) {
90
+ results.push(relative);
91
+ }
92
+ }
93
+ }
94
+ return results.sort();
95
+ }
96
+ async stat(path) {
97
+ const file = this.files.get(normalize(path));
98
+ if (!file)
99
+ throw new Error(`ENOENT: ${path}`);
100
+ return { mtime: file.mtime, size: file.content.length };
101
+ }
102
+ }
103
+ function normalize(p) {
104
+ return p.replace(/\\/g, '/').replace(/\/+/g, '/').replace(/\/$/, '');
105
+ }
106
+ /**
107
+ * Simple glob matcher supporting:
108
+ * ** = any path segments
109
+ * * = any characters except /
110
+ */
111
+ function matchGlob(path, pattern) {
112
+ // Convert glob to regex
113
+ let regexStr = pattern
114
+ .replace(/\./g, '\\.')
115
+ .replace(/\*\*\//g, '§§/') // temp placeholder for **/
116
+ .replace(/\*\*/g, '§§') // temp placeholder for bare **
117
+ .replace(/\*/g, '[^/]*') // * matches anything except /
118
+ .replace(/§§\//g, '(.*/)?') // **/ matches zero or more path segments
119
+ .replace(/§§/g, '.*'); // ** matches anything including /
120
+ const regex = new RegExp(`^${regexStr}$`);
121
+ return regex.test(path);
122
+ }
123
+ /**
124
+ * Create a minimal ETHOS.md file content for testing.
125
+ */
126
+ export function makeEthos(opts) {
127
+ const { name = 'test-ethos', scope = 'domain', invariants = 3, principles = 2, heuristics = 2, extra = {}, } = opts ?? {};
128
+ const extraEntries = Object.entries(extra)
129
+ .map(([k, v]) => `${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}`);
130
+ const extraFields = extraEntries.length > 0 ? extraEntries.join('\n') + '\n' : '';
131
+ const invLines = Array.from({ length: invariants }, (_, i) => `${i + 1}. **Rule ${i + 1}.** Description of rule ${i + 1}.`).join('\n');
132
+ const priLines = Array.from({ length: principles }, (_, i) => `${i + 1}. **Principle ${i + 1}.** Description of principle ${i + 1}.`).join('\n');
133
+ const heuristicRows = Array.from({ length: heuristics }, (_, i) => `| Situation ${i + 1} | Action ${i + 1} |`).join('\n');
134
+ const tokenEstimate = Math.ceil((`---\ntype: constraints\nscope: ${scope}\nname: ${name}\nversion: "1.0"\nsummary: Test ethos\ntoken_estimate: 500\ninvariants_count: ${invariants}\nprinciples_count: ${principles}\nheuristics_count: ${heuristics}\n${extraFields}\n---\n\n# ${name}\n\n## Identity\n\n### What ${name} IS\n- A test\n\n### What ${name} IS NOT\n- Not production\n\n## Invariants\n\n${invLines}\n\n## Principles (Prioritized)\n\n${priLines}\n\n## Decision Heuristics\n\n| Situation | Action |\n|-----------|--------|\n${heuristicRows}\n`).length / 4);
135
+ return `---
136
+ type: constraints
137
+ scope: ${scope}
138
+ name: ${name}
139
+ version: "1.0"
140
+ summary: Test ethos
141
+ token_estimate: ${tokenEstimate}
142
+ invariants_count: ${invariants}
143
+ principles_count: ${principles}
144
+ heuristics_count: ${heuristics}
145
+ ${extraFields}---
146
+
147
+ # ${name}
148
+
149
+ ## Identity
150
+
151
+ ### What ${name} IS
152
+ - A test
153
+
154
+ ### What ${name} IS NOT
155
+ - Not production
156
+
157
+ ## Invariants
158
+
159
+ ${invLines}
160
+
161
+ ## Principles (Prioritized)
162
+
163
+ ${priLines}
164
+
165
+ ## Decision Heuristics
166
+
167
+ | Situation | Action |
168
+ |-----------|--------|
169
+ ${heuristicRows}
170
+ `;
171
+ }
172
+ /**
173
+ * Create a minimal PHILOSOPHY.md for testing.
174
+ */
175
+ export function makePhilosophy(opts) {
176
+ const { name = 'test-philosophy', decisions = 2 } = opts ?? {};
177
+ const decisionLines = Array.from({ length: decisions }, (_, i) => `### ${i + 1}. Decision ${i + 1}\nDescription.\n**Rationale:** Because.`).join('\n\n');
178
+ return `---
179
+ type: rationale
180
+ scope: domain
181
+ name: ${name}
182
+ version: "1.0"
183
+ summary: Test philosophy
184
+ token_estimate: 400
185
+ decision_count: ${decisions}
186
+ ---
187
+
188
+ # ${name}
189
+
190
+ ## The Problem
191
+
192
+ Test problem.
193
+
194
+ ## The Bet
195
+
196
+ Test bet.
197
+
198
+ ## Design Decisions
199
+
200
+ ${decisionLines}
201
+
202
+ ## Trade-offs
203
+
204
+ | Decision | Benefit | Cost |
205
+ |----------|---------|------|
206
+ | Choice 1 | Gain 1 | Cost 1 |
207
+ `;
208
+ }
209
+ /**
210
+ * Create a minimal README.md for testing.
211
+ */
212
+ export function makeReadme(opts) {
213
+ const { name = 'test-readme', scope = 'domain' } = opts ?? {};
214
+ return `---
215
+ type: navigation
216
+ scope: ${scope}
217
+ name: ${name}
218
+ version: "1.0"
219
+ summary: Test navigation
220
+ token_estimate: 100
221
+ ---
222
+
223
+ # ${name}
224
+
225
+ - [ETHOS.md](ETHOS.md)
226
+ - [PHILOSOPHY.md](PHILOSOPHY.md)
227
+ `;
228
+ }
229
+ /**
230
+ * Create a minimal workflow file for testing.
231
+ */
232
+ export function makeWorkflow(opts) {
233
+ const { name = 'test-workflow', protocolId = 'PROTO-TEST-1', protocolFile = 'PROTOCOLS.md', tools = ['tool:verify'], loads = ['/ETHOS.md'], includeRecovery = true, steps = 3, } = opts ?? {};
234
+ const toolsYaml = tools.map((t) => ` - ${t}`).join('\n');
235
+ const loadsYaml = loads.map((l) => ` - ${l}`).join('\n');
236
+ const stepLines = Array.from({ length: steps }, (_, i) => `${i + 1}. **Step ${i + 1}.** Run \`${tools[0] ?? 'tool:action'}\` to do thing ${i + 1}.`).join('\n\n');
237
+ const recoverySection = includeRecovery
238
+ ? `\n## Error Recovery\n\n| Failure | Recovery Action |\n|---------|------------------|\n| Tool fails | Re-run after fixing the issue |\n`
239
+ : '';
240
+ return `---
241
+ name: ${name}
242
+ protocol_id: ${protocolId}
243
+ protocol_file: ${protocolFile}
244
+ tools:
245
+ ${toolsYaml}
246
+ loads:
247
+ ${loadsYaml}
248
+ ---
249
+
250
+ # Workflow: ${name}
251
+
252
+ ## Context Loading
253
+
254
+ 1. Load product organons
255
+
256
+ ## Steps
257
+
258
+ ${stepLines}
259
+
260
+ ## Verification
261
+
262
+ Run verification tools.
263
+ ${recoverySection}`;
264
+ }
265
+ //# sourceMappingURL=test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/core/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,OAAO,gBAAgB;IACnB,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtC,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAE3C,YAAY,KAA8B;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,KAAY;QACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YAC9B,OAAO;YACP,KAAK,EAAE,KAAK,IAAI,IAAI,IAAI,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,iFAAiF;IACjF,OAAO,CAAC,aAAqB;QAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IAED,gGAAgG;IAChG,WAAW,CAAC,aAAqB;QAC/B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,GAAG,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,IAAY;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,GAAG,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,yBAAyB;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,6DAA6D;QAC7D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,OAA4C;QACtE,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,cAAc,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;QAE7C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,eAAe;YACf,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5F,IAAI,QAAQ,KAAK,IAAI;gBAAE,SAAS;YAEhC,uBAAuB;YACvB,IAAI,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBACjC,wBAAwB;gBACxB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;CACF;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,OAAe;IAC9C,wBAAwB;IACxB,IAAI,QAAQ,GAAG,OAAO;SACnB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAG,2BAA2B;SACvD,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAM,+BAA+B;SAC3D,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAM,8BAA8B;SAC3D,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAG,yCAAyC;SACtE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAQ,kCAAkC;IAClE,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAOzB;IACC,MAAM,EACJ,IAAI,GAAG,YAAY,EACnB,KAAK,GAAG,QAAQ,EAChB,UAAU,GAAG,CAAC,EACd,UAAU,GAAG,CAAC,EACd,UAAU,GAAG,CAAC,EACd,KAAK,GAAG,EAAE,GACX,GAAG,IAAI,IAAI,EAAE,CAAC;IAEf,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAElF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC3D,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,2BAA2B,CAAC,GAAG,CAAC,GAAG,CAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC3D,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,gCAAgC,CAAC,GAAG,CAAC,GAAG,CACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAChE,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,CAAC,kCAAkC,KAAK,WAAW,IAAI,iFAAiF,UAAU,uBAAuB,UAAU,uBAAuB,UAAU,KAAK,WAAW,cAAc,IAAI,+BAA+B,IAAI,6BAA6B,IAAI,iDAAiD,QAAQ,sCAAsC,QAAQ,iFAAiF,aAAa,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAChhB,CAAC;IAEF,OAAO;;SAEA,KAAK;QACN,IAAI;;;kBAGM,aAAa;oBACX,UAAU;oBACV,UAAU;oBACV,UAAU;EAC5B,WAAW;;IAET,IAAI;;;;WAIG,IAAI;;;WAGJ,IAAI;;;;;EAKb,QAAQ;;;;EAIR,QAAQ;;;;;;EAMR,aAAa;CACd,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAA4C;IACzE,MAAM,EAAE,IAAI,GAAG,iBAAiB,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IAC/D,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC/D,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,yCAAyC,CACzE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,OAAO;;;QAGD,IAAI;;;;kBAIM,SAAS;;;IAGvB,IAAI;;;;;;;;;;;;EAYN,aAAa;;;;;;;CAOd,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAwC;IACjE,MAAM,EAAE,IAAI,GAAG,aAAa,EAAE,KAAK,GAAG,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IAC9D,OAAO;;SAEA,KAAK;QACN,IAAI;;;;;;IAMR,IAAI;;;;CAIP,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAQ5B;IACC,MAAM,EACJ,IAAI,GAAG,eAAe,EACtB,UAAU,GAAG,cAAc,EAC3B,YAAY,GAAG,cAAc,EAC7B,KAAK,GAAG,CAAC,aAAa,CAAC,EACvB,KAAK,GAAG,CAAC,WAAW,CAAC,EACrB,eAAe,GAAG,IAAI,EACtB,KAAK,GAAG,CAAC,GACV,GAAG,IAAI,IAAI,EAAE,CAAC;IAEf,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvD,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,IAAI,aAAa,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAC1F,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,MAAM,eAAe,GAAG,eAAe;QACrC,CAAC,CAAC,wIAAwI;QAC1I,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACD,IAAI;eACG,UAAU;iBACR,YAAY;;EAE3B,SAAS;;EAET,SAAS;;;cAGG,IAAI;;;;;;;;EAQhB,SAAS;;;;;EAKT,eAAe,EAAE,CAAC;AACpB,CAAC"}