@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 @@
1
+ {"version":3,"file":"meta-invariants.test.js","sourceRoot":"","sources":["../../src/core/meta-invariants.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAE7D,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,OAAe;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,aAAa,CAAC,YAAY,EAAE,yCAAyC,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,UAAU,GAAG;YACjB,oBAAoB;YACpB,kBAAkB;YAClB,gCAAgC;YAChC,kCAAkC;SACnC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,EAAE,0BAA0B,CAAC;mBAC9D,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACxC,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,oCAAoC,CAAC,CAAC,UAAU,EAAE,CAAC;YAC7E,uDAAuD;YACvD,MAAM,QAAQ,GAAG,UAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,8BAA8B,CAAC,CAAC,UAAU,EAAE,CAAC;YACrE,MAAM,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,aAAa,CAAC,YAAY,EAAE,yCAAyC,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,YAAY,GAAG;YACnB,oBAAoB;YACpB,yBAAyB;YACzB,kBAAkB;YAClB,mBAAmB;YACnB,gCAAgC;YAChC,qCAAqC;YACrC,kCAAkC;YAClC,uCAAuC;YACvC,gCAAgC;SACjC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,CAAC,WAAW,EAAE,GAAG,IAAI,6BAA6B,CAAC,CAAC,UAAU,EAAE,CAAC;YACvE,MAAM,CAAC,WAAY,CAAC,IAAI,EAAE,GAAG,IAAI,6BAA6B,CAAC,CAAC,UAAU,EAAE,CAAC;YAC7E,MAAM,CAAC,WAAY,CAAC,KAAK,EAAE,GAAG,IAAI,8BAA8B,CAAC,CAAC,UAAU,EAAE,CAAC;QACjF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,aAAa,CAAC,YAAY,EAAE,uCAAuC,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,UAAU,GAAG;YACjB,kBAAkB;YAClB,gCAAgC;YAChC,kCAAkC;SACnC,CAAC;QAEF,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAEpD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAE3C,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC5C,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,iBAAiB,OAAO,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,aAAa,CAAC,YAAY,EAAE,4CAA4C,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,gCAAgC,CAAC,CAAC;QACxE,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,WAAW,EAAE,SAIjB,CAAC;QAEf,MAAM,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC,UAAU,EAAE,CAAC;QAEzE,KAAK,MAAM,KAAK,IAAI,SAAU,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,eAAe,KAAK,WAAW,EAAE,CAAC;gBAC1C,MAAM,CACJ,KAAK,CAAC,QAAQ,EACd,YAAY,KAAK,CAAC,EAAE,2CAA2C,CAChE,CAAC,UAAU,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,aAAa,CAAC,WAAW,EAAE,yCAAyC,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,WAAW,EAAE,uCAAuC,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,CAAC,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,aAAa,CAAC,WAAW,EAAE,qDAAqD,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,CAAC,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QACpF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,aAAa,CAAC,WAAW,EAAE,uCAAuC,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,UAAU,GAAG;YACjB,kBAAkB;YAClB,gCAAgC;YAChC,kCAAkC;SACnC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,IAAI,4BAA4B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,WAAW,EAAE,0CAA0C,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,eAAe,GAAG;YACtB,qCAAqC;YACrC,uCAAuC;SACxC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,IAAI,0BAA0B,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,WAAW,EAAE,0CAA0C,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,gCAAgC,CAAC,CAAC;QACxE,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,aAAa,CAAC,WAAW,EAAE,8DAA8D,EAAE,KAAK,IAAI,EAAE;QACpG,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,gCAAgC,CAAC,CAAC;QACxE,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,WAAW,EAAE,SAIjB,CAAC;QAEf,KAAK,MAAM,KAAK,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,eAAe,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC5D,MAAM,SAAS,GAAG,kBAAkB,KAAK,CAAC,QAAQ,WAAW,CAAC;gBAC9D,MAAM,CACJ,MAAM,MAAM,CAAC,SAAS,CAAC,EACvB,aAAa,KAAK,CAAC,QAAQ,kBAAkB,KAAK,CAAC,EAAE,kBAAkB,SAAS,EAAE,CACnF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * NodeFileSystem — concrete FileSystem implementation using Node.js APIs.
3
+ *
4
+ * Used by CLI and MCP server for real I/O. Core functions receive the
5
+ * FileSystem interface, not this class directly.
6
+ */
7
+ import type { FileSystem, FileStat } from './types.js';
8
+ export declare class NodeFileSystem implements FileSystem {
9
+ readFile(filePath: string): Promise<string>;
10
+ readDir(dirPath: string): Promise<string[]>;
11
+ exists(filePath: string): Promise<boolean>;
12
+ glob(pattern: string, options?: {
13
+ cwd: string;
14
+ ignore?: string[];
15
+ }): Promise<string[]>;
16
+ stat(filePath: string): Promise<FileStat>;
17
+ }
18
+ /**
19
+ * Resolve a potentially relative path against a base directory.
20
+ */
21
+ export declare function resolvePath(base: string, relative: string): string;
22
+ //# sourceMappingURL=node-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-fs.d.ts","sourceRoot":"","sources":["../../src/core/node-fs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,cAAe,YAAW,UAAU;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK3C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1C,IAAI,CACR,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC3C,OAAO,CAAC,MAAM,EAAE,CAAC;IAUd,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;CAIhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * NodeFileSystem — concrete FileSystem implementation using Node.js APIs.
3
+ *
4
+ * Used by CLI and MCP server for real I/O. Core functions receive the
5
+ * FileSystem interface, not this class directly.
6
+ */
7
+ import * as fs from 'node:fs/promises';
8
+ import * as path from 'node:path';
9
+ import { glob as globFn } from 'glob';
10
+ export class NodeFileSystem {
11
+ async readFile(filePath) {
12
+ return fs.readFile(filePath, 'utf-8');
13
+ }
14
+ async readDir(dirPath) {
15
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
16
+ return entries.map((e) => e.name);
17
+ }
18
+ async exists(filePath) {
19
+ try {
20
+ await fs.access(filePath);
21
+ return true;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ async glob(pattern, options) {
28
+ const results = await globFn(pattern, {
29
+ cwd: options?.cwd,
30
+ ignore: options?.ignore,
31
+ nodir: true,
32
+ posix: true,
33
+ });
34
+ return results;
35
+ }
36
+ async stat(filePath) {
37
+ const s = await fs.stat(filePath);
38
+ return { mtime: s.mtime, size: s.size };
39
+ }
40
+ }
41
+ /**
42
+ * Resolve a potentially relative path against a base directory.
43
+ */
44
+ export function resolvePath(base, relative) {
45
+ return path.resolve(base, relative);
46
+ }
47
+ //# sourceMappingURL=node-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-fs.js","sourceRoot":"","sources":["../../src/core/node-fs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAGtC,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CACR,OAAe,EACf,OAA4C;QAE5C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE;YACpC,GAAG,EAAE,OAAO,EAAE,GAAG;YACjB,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAgB;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Dogfood tests: @organon-methodology/testing used inside @organon-methodology/tools.
3
+ *
4
+ * These tests exercise the @organon-methodology/testing library against real source files
5
+ * in this package, proving the API works end-to-end from a consumer perspective.
6
+ *
7
+ * @organon-invariant INV-TOOLS-1 schema-fidelity
8
+ * @organon-invariant INV-TOOLS-2 every-command-has-tests
9
+ * @organon-invariant INV-TOOLS-3 gates-fail-not-warn
10
+ * @organon-invariant INV-TOOLS-4 machine-parsable-output
11
+ * @organon-invariant INV-TOOLS-5 idempotent-operations
12
+ * @organon-invariant INV-TOOLS-6 breaking-changes-major-version
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=organon-invariants.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organon-invariants.test.d.ts","sourceRoot":"","sources":["../../src/core/organon-invariants.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Dogfood tests: @organon-methodology/testing used inside @organon-methodology/tools.
3
+ *
4
+ * These tests exercise the @organon-methodology/testing library against real source files
5
+ * in this package, proving the API works end-to-end from a consumer perspective.
6
+ *
7
+ * @organon-invariant INV-TOOLS-1 schema-fidelity
8
+ * @organon-invariant INV-TOOLS-2 every-command-has-tests
9
+ * @organon-invariant INV-TOOLS-3 gates-fail-not-warn
10
+ * @organon-invariant INV-TOOLS-4 machine-parsable-output
11
+ * @organon-invariant INV-TOOLS-5 idempotent-operations
12
+ * @organon-invariant INV-TOOLS-6 breaking-changes-major-version
13
+ */
14
+ import { describe } from 'vitest';
15
+ import { testInvariant, assertMaxValue } from '@organon-methodology/testing/vitest';
16
+ import { resolve } from 'node:path';
17
+ import { readdir, readFile } from 'node:fs/promises';
18
+ import { validateFrontmatter } from './validate-frontmatter.js';
19
+ import { validateWorkflow } from './validate-workflow.js';
20
+ import { MemoryFileSystem, makeEthos } from './test-helpers.js';
21
+ const coreDir = resolve(import.meta.dirname, '.');
22
+ describe('@organon-methodology/testing dogfood — tools invariant verification', () => {
23
+ // -------------------------------------------------------------------------
24
+ // INV-TOOLS-1: schema-fidelity — MAX_SUMMARY_LENGTH ≤ 200
25
+ // -------------------------------------------------------------------------
26
+ testInvariant('INV-TOOLS-1', 'MAX_SUMMARY_LENGTH does not exceed 200 characters', async () => {
27
+ await assertMaxValue({
28
+ files: ['src/core/validate-frontmatter.ts'],
29
+ pattern: /MAX_SUMMARY_LENGTH\s*=\s*(\d+)/,
30
+ maxValue: 200,
31
+ unit: 'characters',
32
+ cwd: resolve(coreDir, '../..'),
33
+ });
34
+ });
35
+ // -------------------------------------------------------------------------
36
+ // INV-TOOLS-1: schema-fidelity — TOKEN_TOLERANCE ≤ 2.0
37
+ // -------------------------------------------------------------------------
38
+ testInvariant('INV-TOOLS-1', 'TOKEN_TOLERANCE stays within reasonable bounds (max 2.0)', async () => {
39
+ await assertMaxValue({
40
+ files: ['src/core/validate-frontmatter.ts'],
41
+ pattern: /TOKEN_TOLERANCE\s*=\s*([\d.]+)/,
42
+ maxValue: 2.0,
43
+ unit: 'ratio',
44
+ cwd: resolve(coreDir, '../..'),
45
+ });
46
+ });
47
+ // -------------------------------------------------------------------------
48
+ // INV-TOOLS-2: every-command-has-tests — core/ has ≥ 5 test files
49
+ // -------------------------------------------------------------------------
50
+ testInvariant('INV-TOOLS-2', 'core/ directory has at least 5 test files', async () => {
51
+ const entries = await readdir(coreDir);
52
+ const testFiles = entries.filter((f) => f.endsWith('.test.ts'));
53
+ if (testFiles.length < 5) {
54
+ throw new Error(`Expected at least 5 test files in core/, found ${testFiles.length}: ${testFiles.join(', ')}`);
55
+ }
56
+ });
57
+ // -------------------------------------------------------------------------
58
+ // INV-TOOLS-3: gates-fail-not-warn — gate errors use 'error' severity
59
+ // -------------------------------------------------------------------------
60
+ testInvariant('INV-TOOLS-3', 'verification gates produce errors (not warnings) for blocking checks', async () => {
61
+ // A workflow missing required fields should produce errors, not warnings
62
+ const fs = new MemoryFileSystem({
63
+ '/project/workflows/bad.md': '# No frontmatter',
64
+ });
65
+ const config = {
66
+ projectRoot: '/project',
67
+ organonPaths: ['.'],
68
+ organonGlobs: ['**/ETHOS.md'],
69
+ ignorePatterns: [],
70
+ workflowPaths: { generic: 'workflows' },
71
+ freshnessThresholdHours: 24,
72
+ };
73
+ const result = await validateWorkflow({ projectRoot: '/project', config, fs });
74
+ // Must fail (not just warn)
75
+ if (result.success) {
76
+ throw new Error('Gate should fail for invalid workflow, not silently pass');
77
+ }
78
+ // All blocking issues must be errors, not warnings
79
+ for (const err of result.errors) {
80
+ if (err.severity !== 'error') {
81
+ throw new Error(`Blocking diagnostic ${err.code} has severity '${err.severity}', expected 'error'`);
82
+ }
83
+ }
84
+ });
85
+ // -------------------------------------------------------------------------
86
+ // INV-TOOLS-4: machine-parsable-output — results are structured objects
87
+ // -------------------------------------------------------------------------
88
+ testInvariant('INV-TOOLS-4', 'validation results are structured objects with success/errors fields', async () => {
89
+ const fs = new MemoryFileSystem({
90
+ '/project/ETHOS.md': makeEthos(),
91
+ });
92
+ const config = {
93
+ projectRoot: '/project',
94
+ organonPaths: ['.'],
95
+ organonGlobs: ['**/ETHOS.md'],
96
+ ignorePatterns: [],
97
+ workflowPaths: {},
98
+ freshnessThresholdHours: 24,
99
+ };
100
+ const result = await validateFrontmatter({ projectRoot: '/project', config, fs });
101
+ // Result must have structured fields for programmatic consumption
102
+ if (typeof result.success !== 'boolean') {
103
+ throw new Error('Result must have boolean success field');
104
+ }
105
+ if (!Array.isArray(result.errors)) {
106
+ throw new Error('Result must have errors array');
107
+ }
108
+ if (!Array.isArray(result.warnings)) {
109
+ throw new Error('Result must have warnings array');
110
+ }
111
+ });
112
+ // -------------------------------------------------------------------------
113
+ // INV-TOOLS-5: idempotent-operations — same input → same output
114
+ // -------------------------------------------------------------------------
115
+ testInvariant('INV-TOOLS-5', 're-running validation with identical input produces identical output', async () => {
116
+ const fs = new MemoryFileSystem({
117
+ '/project/ETHOS.md': makeEthos(),
118
+ });
119
+ const config = {
120
+ projectRoot: '/project',
121
+ organonPaths: ['.'],
122
+ organonGlobs: ['**/ETHOS.md'],
123
+ ignorePatterns: [],
124
+ workflowPaths: {},
125
+ freshnessThresholdHours: 24,
126
+ };
127
+ const opts = { projectRoot: '/project', config, fs };
128
+ const result1 = await validateFrontmatter(opts);
129
+ const result2 = await validateFrontmatter(opts);
130
+ if (result1.success !== result2.success) {
131
+ throw new Error('Idempotency violated: success differs between runs');
132
+ }
133
+ if (result1.errors.length !== result2.errors.length) {
134
+ throw new Error('Idempotency violated: error count differs between runs');
135
+ }
136
+ });
137
+ // -------------------------------------------------------------------------
138
+ // INV-TOOLS-6: breaking-changes-major-version — version is semver
139
+ // -------------------------------------------------------------------------
140
+ testInvariant('INV-TOOLS-6', 'package.json version follows semver format', async () => {
141
+ const pkgPath = resolve(coreDir, '../../package.json');
142
+ const pkgJson = JSON.parse(await readFile(pkgPath, 'utf-8'));
143
+ const semverRe = /^\d+\.\d+\.\d+/;
144
+ if (!semverRe.test(pkgJson.version)) {
145
+ throw new Error(`Version "${pkgJson.version}" does not follow semver`);
146
+ }
147
+ });
148
+ });
149
+ //# sourceMappingURL=organon-invariants.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organon-invariants.test.js","sourceRoot":"","sources":["../../src/core/organon-invariants.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Query organon files by frontmatter metadata.
3
+ *
4
+ * Supports filtering by scope, type, priority, task, budget, name pattern,
5
+ * and related entities. Returns matching files with frontmatter and total
6
+ * token cost for context budget planning.
7
+ */
8
+ import type { FileSystem, FrontmatterScope, FrontmatterType, LoadPriority, OrganonConfig, QueryResult } from './types.js';
9
+ export interface QueryOptions {
10
+ projectRoot: string;
11
+ config: OrganonConfig;
12
+ fs: FileSystem;
13
+ /** Filter by scope */
14
+ scope?: FrontmatterScope;
15
+ /** Filter by type */
16
+ type?: FrontmatterType;
17
+ /** Filter by load_priority */
18
+ priority?: LoadPriority;
19
+ /** Filter by required_for containing this task */
20
+ task?: string;
21
+ /** Maximum total token budget — stops adding files when budget exceeded */
22
+ budget?: number;
23
+ /** Filter by name pattern (substring match) */
24
+ namePattern?: string;
25
+ /** Filter by related domain name */
26
+ relatedDomain?: string;
27
+ /** Filter by related feature name */
28
+ relatedFeature?: string;
29
+ /** Include files without frontmatter in results */
30
+ includeInvalid?: boolean;
31
+ /** Return full file content (body) or just frontmatter */
32
+ verbose?: boolean;
33
+ }
34
+ export declare function query(options: QueryOptions): Promise<QueryResult>;
35
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/core/query.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAEV,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,aAAa,EAEb,WAAW,EACZ,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,UAAU,CAAC;IACf,sBAAsB;IACtB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,qBAAqB;IACrB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAkIvE"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Query organon files by frontmatter metadata.
3
+ *
4
+ * Supports filtering by scope, type, priority, task, budget, name pattern,
5
+ * and related entities. Returns matching files with frontmatter and total
6
+ * token cost for context budget planning.
7
+ */
8
+ import { parseOrganonFile } from './frontmatter-parser.js';
9
+ import { joinPath } from './config.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Main
12
+ // ---------------------------------------------------------------------------
13
+ export async function query(options) {
14
+ const { projectRoot, config, fs } = options;
15
+ const errors = [];
16
+ const warnings = [];
17
+ // Discover all organon files
18
+ const allFiles = await discoverOrganonFiles(projectRoot, config, fs);
19
+ // Parse frontmatter for all files
20
+ const parsed = [];
21
+ for (const file of allFiles) {
22
+ const absPath = joinPath(projectRoot, file);
23
+ try {
24
+ const content = await fs.readFile(absPath);
25
+ parsed.push(parseOrganonFile(file, content));
26
+ }
27
+ catch {
28
+ errors.push({
29
+ severity: 'error',
30
+ code: 'FILE_READ_ERROR',
31
+ message: `Cannot read file: ${file}`,
32
+ file,
33
+ });
34
+ }
35
+ }
36
+ // Apply filters
37
+ let filtered = parsed;
38
+ // Filter out files without frontmatter (unless includeInvalid)
39
+ if (!options.includeInvalid) {
40
+ filtered = filtered.filter((f) => f.frontmatter !== null);
41
+ }
42
+ // Filter by scope
43
+ if (options.scope) {
44
+ filtered = filtered.filter((f) => f.frontmatter?.scope === options.scope);
45
+ }
46
+ // Filter by type
47
+ if (options.type) {
48
+ filtered = filtered.filter((f) => f.frontmatter?.type === options.type);
49
+ }
50
+ // Filter by priority
51
+ if (options.priority) {
52
+ filtered = filtered.filter((f) => f.frontmatter?.load_priority === options.priority);
53
+ }
54
+ // Filter by task (required_for)
55
+ if (options.task) {
56
+ filtered = filtered.filter((f) => f.frontmatter?.required_for?.includes(options.task));
57
+ }
58
+ // Filter by name pattern
59
+ if (options.namePattern) {
60
+ const pattern = options.namePattern.toLowerCase();
61
+ filtered = filtered.filter((f) => f.frontmatter?.name?.toLowerCase().includes(pattern));
62
+ }
63
+ // Filter by related domain
64
+ if (options.relatedDomain) {
65
+ filtered = filtered.filter((f) => f.frontmatter?.related_domains?.includes(options.relatedDomain) ||
66
+ f.frontmatter?.name === options.relatedDomain);
67
+ }
68
+ // Filter by related feature
69
+ if (options.relatedFeature) {
70
+ filtered = filtered.filter((f) => f.frontmatter?.related_features?.includes(options.relatedFeature) ||
71
+ f.frontmatter?.name === options.relatedFeature);
72
+ }
73
+ // Sort by load_priority (high first), then by token_estimate (smallest first)
74
+ filtered.sort((a, b) => {
75
+ const priorityOrder = { high: 0, medium: 1, low: 2 };
76
+ const aPri = priorityOrder[a.frontmatter?.load_priority ?? 'medium'];
77
+ const bPri = priorityOrder[b.frontmatter?.load_priority ?? 'medium'];
78
+ if (aPri !== bPri)
79
+ return aPri - bPri;
80
+ return (a.frontmatter?.token_estimate ?? 0) - (b.frontmatter?.token_estimate ?? 0);
81
+ });
82
+ // Apply budget constraint
83
+ if (options.budget) {
84
+ let tokenSum = 0;
85
+ const budgetFiltered = [];
86
+ for (const f of filtered) {
87
+ const tokens = f.frontmatter?.token_estimate ?? 0;
88
+ if (tokenSum + tokens <= options.budget) {
89
+ budgetFiltered.push(f);
90
+ tokenSum += tokens;
91
+ }
92
+ else {
93
+ warnings.push({
94
+ severity: 'warning',
95
+ code: 'BUDGET_EXCEEDED',
96
+ message: `Skipping '${f.path}' (${tokens} tokens) — would exceed budget of ${options.budget}`,
97
+ file: f.path,
98
+ });
99
+ }
100
+ }
101
+ filtered = budgetFiltered;
102
+ }
103
+ // Strip body content if not verbose
104
+ if (!options.verbose) {
105
+ filtered = filtered.map((f) => ({
106
+ ...f,
107
+ body: '',
108
+ content: '',
109
+ }));
110
+ }
111
+ const totalTokens = filtered.reduce((sum, f) => sum + (f.frontmatter?.token_estimate ?? 0), 0);
112
+ return {
113
+ success: errors.length === 0,
114
+ files: filtered,
115
+ totalTokens,
116
+ errors,
117
+ warnings,
118
+ };
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=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/core/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=query.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../../src/core/query.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { query } from './query.js';
3
+ import { MemoryFileSystem, makeEthos, makePhilosophy, makeReadme } from './test-helpers.js';
4
+ function makeConfig(projectRoot) {
5
+ return {
6
+ projectRoot,
7
+ organonPaths: ['.'],
8
+ organonGlobs: ['**/ETHOS.md', '**/PHILOSOPHY.md', '**/PROTOCOLS.md', '**/README.md'],
9
+ ignorePatterns: [],
10
+ workflowPaths: {},
11
+ freshnessThresholdHours: 24,
12
+ };
13
+ }
14
+ describe('query', () => {
15
+ const ethosContent = makeEthos({ name: 'genesis', scope: 'domain', extra: { load_priority: 'high', 'required_for': '[genesis_impl]' } });
16
+ const philContent = makePhilosophy({ name: 'genesis-phil' });
17
+ const readmeContent = makeReadme({ name: 'root', scope: 'product' });
18
+ function makeFs() {
19
+ return new MemoryFileSystem({
20
+ '/project/organon/domains/genesis/ETHOS.md': ethosContent,
21
+ '/project/organon/domains/genesis/PHILOSOPHY.md': philContent,
22
+ '/project/README.md': readmeContent,
23
+ });
24
+ }
25
+ it('returns all files with frontmatter by default', async () => {
26
+ const fs = makeFs();
27
+ const config = makeConfig('/project');
28
+ const result = await query({ projectRoot: '/project', config, fs });
29
+ expect(result.success).toBe(true);
30
+ expect(result.files.length).toBe(3);
31
+ });
32
+ it('filters by scope', async () => {
33
+ const fs = makeFs();
34
+ const config = makeConfig('/project');
35
+ const result = await query({ projectRoot: '/project', config, fs, scope: 'domain' });
36
+ expect(result.files.length).toBe(2); // genesis ETHOS + PHILOSOPHY
37
+ expect(result.files.every((f) => f.frontmatter?.scope === 'domain')).toBe(true);
38
+ });
39
+ it('filters by type', async () => {
40
+ const fs = makeFs();
41
+ const config = makeConfig('/project');
42
+ const result = await query({ projectRoot: '/project', config, fs, type: 'constraints' });
43
+ expect(result.files.length).toBe(1);
44
+ expect(result.files[0].frontmatter?.type).toBe('constraints');
45
+ });
46
+ it('filters by name pattern', async () => {
47
+ const fs = makeFs();
48
+ const config = makeConfig('/project');
49
+ const result = await query({ projectRoot: '/project', config, fs, namePattern: 'genesis' });
50
+ expect(result.files.length).toBe(2);
51
+ });
52
+ it('respects token budget', async () => {
53
+ const fs = makeFs();
54
+ const config = makeConfig('/project');
55
+ // Budget of 200 tokens - should only fit small files
56
+ const result = await query({ projectRoot: '/project', config, fs, budget: 200 });
57
+ expect(result.totalTokens).toBeLessThanOrEqual(200);
58
+ expect(result.warnings.some((w) => w.code === 'BUDGET_EXCEEDED')).toBe(true);
59
+ });
60
+ it('calculates total tokens', async () => {
61
+ const fs = makeFs();
62
+ const config = makeConfig('/project');
63
+ const result = await query({ projectRoot: '/project', config, fs });
64
+ expect(result.totalTokens).toBeGreaterThan(0);
65
+ });
66
+ it('strips body in non-verbose mode', async () => {
67
+ const fs = makeFs();
68
+ const config = makeConfig('/project');
69
+ const result = await query({ projectRoot: '/project', config, fs, verbose: false });
70
+ expect(result.files.every((f) => f.body === '')).toBe(true);
71
+ });
72
+ it('includes body in verbose mode', async () => {
73
+ const fs = makeFs();
74
+ const config = makeConfig('/project');
75
+ const result = await query({ projectRoot: '/project', config, fs, verbose: true });
76
+ expect(result.files.some((f) => f.body.length > 0)).toBe(true);
77
+ });
78
+ it('excludes files without frontmatter by default', async () => {
79
+ const fs = new MemoryFileSystem({
80
+ '/project/ETHOS.md': makeEthos({ name: 'test', scope: 'product' }),
81
+ '/project/README.md': '# No frontmatter',
82
+ });
83
+ const config = makeConfig('/project');
84
+ const result = await query({ projectRoot: '/project', config, fs });
85
+ expect(result.files.length).toBe(1);
86
+ });
87
+ it('includes invalid files when requested', async () => {
88
+ const fs = new MemoryFileSystem({
89
+ '/project/ETHOS.md': makeEthos({ name: 'test', scope: 'product' }),
90
+ '/project/README.md': '# No frontmatter',
91
+ });
92
+ const config = makeConfig('/project');
93
+ const result = await query({ projectRoot: '/project', config, fs, includeInvalid: true });
94
+ expect(result.files.length).toBe(2);
95
+ });
96
+ });
97
+ //# sourceMappingURL=query.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.test.js","sourceRoot":"","sources":["../../src/core/query.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
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 type { FileSystem, OrganonConfig, SuggestToolsResult } from './types.js';
9
+ export interface SuggestToolsOptions {
10
+ projectRoot: string;
11
+ config: OrganonConfig;
12
+ fs: FileSystem;
13
+ }
14
+ export declare function suggestTools(options: SuggestToolsOptions): Promise<SuggestToolsResult>;
15
+ //# sourceMappingURL=suggest-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest-tools.d.ts","sourceRoot":"","sources":["../../src/core/suggest-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAIV,UAAU,EACV,aAAa,EACb,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,UAAU,CAAC;CAChB;AA2BD,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA6C7B"}