@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Organon Methodology Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ ---
2
+ type: navigation
3
+ scope: domain
4
+ name: tools
5
+ version: "1.0"
6
+ summary: CLI and MCP server for the Organon methodology — validate frontmatter, run verification gates, query organon files
7
+ token_estimate: 1700
8
+ provides: [architecture, cli-commands, mcp-server, configuration, programmatic-api]
9
+ parent: packages
10
+ audience: [llm, human]
11
+ ---
12
+
13
+ # Organon Tools
14
+
15
+ CLI tools and MCP server for the **Organon Methodology** — enforce documentation constraints, validate frontmatter, and give agents immediate methodology context.
16
+
17
+ ## Organon (Start Here)
18
+
19
+ This project uses the Organon methodology to govern its own development:
20
+
21
+ - **[ETHOS.md](../../organon/domains/tools/ETHOS.md)** — Constraints for developing organon-tools (what rules must never be violated)
22
+ - **[PHILOSOPHY.md](../../organon/domains/tools/PHILOSOPHY.md)** — Design decisions and trade-offs (why TypeScript, why CLI, why fail-fast)
23
+ - **[dev/](./dev/)** — Design docs, RFCs, and future tool ideas
24
+
25
+ **For contributors:** Read ETHOS.md first to understand invariants and principles. Read PHILOSOPHY.md to understand why the tool is built this way.
26
+
27
+ ## Architecture
28
+
29
+ ```
30
+ packages/tools/src/
31
+ ├── core/ ← Pure logic (no I/O, no console, no process.exit)
32
+ │ ├── types.ts ← FileSystem interface, result types, config
33
+ │ ├── config.ts ← Convention-based config discovery
34
+ │ ├── frontmatter-parser.ts
35
+ │ ├── node-fs.ts ← NodeFileSystem implementation
36
+ │ ├── validate-frontmatter.ts ← 4-stage validation
37
+ │ ├── generate-frontmatter.ts ← Auto-generate from content
38
+ │ ├── query.ts ← Filter by scope/type/priority/budget
39
+ │ ├── health.ts ← Coverage, validation, tokens, freshness
40
+ │ ├── find.ts ← Cross-domain discovery
41
+ │ ├── verify-triplets.ts ← Protocol↔workflow↔tool bindings
42
+ │ ├── suggest-tools.ts ← Automation tier suggestions
43
+ │ └── verify.ts ← Gate registry orchestrator
44
+ ├── cli/ ← Thin yargs adapter
45
+ │ └── commands/ ← validate, generate, query, health, find, verify, mcp
46
+ ├── mcp/ ← Thin MCP adapter
47
+ │ ├── server.ts ← stdio transport
48
+ │ ├── tools.ts ← 8 MCP tools
49
+ │ ├── resources.ts ← 4 MCP resources
50
+ │ └── prompts.ts ← 4 MCP prompts
51
+ └── index.ts ← Public API
52
+ ```
53
+
54
+ ## CLI Commands
55
+
56
+ ```bash
57
+ # Validate frontmatter (schema, references, truthfulness, consistency)
58
+ organon validate
59
+ organon validate book-llms/ETHOS.md
60
+ organon validate --stages 1 3
61
+
62
+ # Generate frontmatter from file content
63
+ organon generate book-llms/ETHOS.md
64
+ organon generate book-llms/ETHOS.md --update
65
+
66
+ # Query organon files by metadata
67
+ organon query --scope=meta
68
+ organon query --budget=20000
69
+ organon query --task=genesis_tool_impl
70
+
71
+ # Health dashboard
72
+ organon health
73
+ organon health --detailed --fix-suggestions
74
+
75
+ # Cross-domain discovery
76
+ organon find --file=src/domain/genesis/Store.ts
77
+ organon find --scope=domain
78
+ organon find --name=frontmatter
79
+
80
+ # Run verification gates
81
+ organon verify
82
+ organon verify --gate frontmatter triplets
83
+
84
+ # Start MCP server
85
+ organon mcp
86
+ ```
87
+
88
+ ## MCP Server
89
+
90
+ Start with `organon mcp`. Exposes:
91
+
92
+ **8 Tools:** `organon_validate_frontmatter`, `organon_generate_frontmatter`, `organon_query`, `organon_health`, `organon_find`, `organon_verify_triplets`, `organon_suggest_tools`, `organon_verify`
93
+
94
+ **4 Resources:** `organon://index`, `organon://file/{path}`, `organon://scope/{scope}`, `organon://health`
95
+
96
+ **4 Prompts:** `implement-feature`, `review-changes`, `create-organon`, `evolve-organon`
97
+
98
+ ### Claude Code Integration
99
+
100
+ ```json
101
+ {
102
+ "mcpServers": {
103
+ "organon": {
104
+ "command": "npx",
105
+ "args": ["tsx", "packages/tools/src/cli/index.ts", "mcp", "--project-root", "."]
106
+ }
107
+ }
108
+ }
109
+ ```
110
+
111
+ ## Configuration
112
+
113
+ Place `organon.config.json` at your project root:
114
+
115
+ ```json
116
+ {
117
+ "organonPaths": ["book-llms", "organon", "."],
118
+ "organonGlobs": ["**/ETHOS.md", "**/PHILOSOPHY.md", "**/PROTOCOL.md", "**/README.md"],
119
+ "ignorePatterns": ["node_modules/**", "dist/**"],
120
+ "workflowPaths": {
121
+ "claudeCode": ".claude/skills",
122
+ "cursor": ".cursor/rules"
123
+ },
124
+ "freshnessThresholdHours": 720
125
+ }
126
+ ```
127
+
128
+ Without a config file, conventions are used: scans for `organon/` and `book-llms/` directories automatically.
129
+
130
+ ## Programmatic API
131
+
132
+ ```typescript
133
+ import { validateFrontmatter, resolveConfig, NodeFileSystem } from '@organon-methodology/tools';
134
+
135
+ const fs = new NodeFileSystem();
136
+ const config = await resolveConfig('.', fs);
137
+ const result = await validateFrontmatter({ projectRoot: '.', config, fs });
138
+ ```
139
+
140
+ ## Development
141
+
142
+ ```bash
143
+ npm install
144
+ npm run build
145
+ npm run dev # watch mode
146
+ npm test # vitest
147
+ npm run organon # run CLI locally
148
+ ```
149
+
150
+ ## License
151
+
152
+ MIT
@@ -0,0 +1,12 @@
1
+ /**
2
+ * organon coverage — Invariant coverage analysis.
3
+ */
4
+ import type { CommandModule } from 'yargs';
5
+ interface CoverageArgs {
6
+ 'project-root': string;
7
+ config?: string;
8
+ json: boolean;
9
+ }
10
+ export declare const coverageCommand: CommandModule<{}, CoverageArgs>;
11
+ export {};
12
+ //# sourceMappingURL=coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/coverage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,UAAU,YAAY;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,EAAE,EAAE,YAAY,CAmF3D,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * organon coverage — Invariant coverage analysis.
3
+ */
4
+ import chalk from 'chalk';
5
+ import { resolveConfig } from '../../core/config.js';
6
+ import { computeInvariantCoverage } from '../../core/invariant-coverage.js';
7
+ import { NodeFileSystem } from '../../core/node-fs.js';
8
+ export const coverageCommand = {
9
+ command: 'coverage',
10
+ describe: 'Analyze invariant test coverage',
11
+ builder: (yargs) => {
12
+ return yargs
13
+ .option('project-root', {
14
+ describe: 'Project root directory',
15
+ type: 'string',
16
+ default: process.cwd(),
17
+ })
18
+ .option('config', {
19
+ describe: 'Path to organon.config.json',
20
+ type: 'string',
21
+ })
22
+ .option('json', {
23
+ describe: 'Output machine-readable JSON',
24
+ type: 'boolean',
25
+ default: false,
26
+ })
27
+ .example('$0 coverage', 'Show invariant coverage report')
28
+ .example('$0 coverage --json', 'Output coverage as JSON');
29
+ },
30
+ handler: async (args) => {
31
+ const fs = new NodeFileSystem();
32
+ const config = await resolveConfig(args['project-root'], fs, args.config);
33
+ const result = await computeInvariantCoverage({
34
+ projectRoot: args['project-root'],
35
+ config,
36
+ fs,
37
+ });
38
+ if (args.json) {
39
+ console.log(JSON.stringify(result, null, 2));
40
+ }
41
+ else {
42
+ console.log(chalk.blue('Organon Invariant Coverage'));
43
+ console.log();
44
+ if (result.invariants.length === 0) {
45
+ console.log(chalk.dim(' No invariants defined in frontmatter.'));
46
+ console.log(chalk.dim(' Add an `invariants` array to ETHOS.md frontmatter.'));
47
+ return;
48
+ }
49
+ // Table header
50
+ console.log(` ${chalk.dim('ID'.padEnd(18))}${chalk.dim('Name'.padEnd(30))}${chalk.dim('Status'.padEnd(16))}${chalk.dim('Tests')}`);
51
+ console.log(chalk.dim(' ' + '─'.repeat(74)));
52
+ for (const inv of result.invariants) {
53
+ const statusIcon = inv.status === 'covered' ? chalk.green('covered')
54
+ : inv.status === 'judgment_call' ? chalk.yellow('judgment')
55
+ : chalk.red('uncovered');
56
+ const tests = inv.tests.length > 0 ? inv.tests.join(', ') : chalk.dim('none');
57
+ console.log(` ${inv.id.padEnd(18)}${inv.name.padEnd(30)}${statusIcon.padEnd(16)}${tests}`);
58
+ }
59
+ console.log();
60
+ const { summary } = result;
61
+ const parts = [
62
+ `${summary.covered}/${summary.total} covered`,
63
+ ];
64
+ if (summary.judgment_call > 0) {
65
+ parts.push(`${summary.judgment_call} judgment calls`);
66
+ }
67
+ if (summary.uncovered > 0) {
68
+ parts.push(`${summary.uncovered} uncovered`);
69
+ }
70
+ if (result.success) {
71
+ console.log(chalk.green(` ✓ ${parts.join(', ')}`));
72
+ }
73
+ else {
74
+ console.log(chalk.red(` ✗ ${parts.join(', ')}`));
75
+ process.exit(1);
76
+ }
77
+ }
78
+ },
79
+ };
80
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/cli/commands/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * organon find — Cross-domain discovery.
3
+ */
4
+ import type { CommandModule } from 'yargs';
5
+ interface FindArgs {
6
+ 'project-root': string;
7
+ config?: string;
8
+ file?: string;
9
+ scope?: string;
10
+ type?: string;
11
+ name?: string;
12
+ }
13
+ export declare const findCommand: CommandModule<{}, FindArgs>;
14
+ export {};
15
+ //# sourceMappingURL=find.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/find.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,UAAU,QAAQ;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,EAAE,EAAE,QAAQ,CA6EnD,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * organon find — Cross-domain discovery.
3
+ */
4
+ import chalk from 'chalk';
5
+ import { resolveConfig } from '../../core/config.js';
6
+ import { find } from '../../core/find.js';
7
+ import { NodeFileSystem } from '../../core/node-fs.js';
8
+ export const findCommand = {
9
+ command: 'find',
10
+ describe: 'Cross-domain discovery (find organons by file, scope, type, or name)',
11
+ builder: (yargs) => {
12
+ return yargs
13
+ .option('project-root', {
14
+ describe: 'Project root directory',
15
+ type: 'string',
16
+ default: process.cwd(),
17
+ })
18
+ .option('config', {
19
+ describe: 'Path to organon.config.json',
20
+ type: 'string',
21
+ })
22
+ .option('file', {
23
+ describe: 'Find organons governing this file path',
24
+ type: 'string',
25
+ })
26
+ .option('scope', {
27
+ describe: 'List organons at this scope level',
28
+ type: 'string',
29
+ choices: ['product', 'domain', 'feature', 'component', 'meta', 'methodology'],
30
+ })
31
+ .option('type', {
32
+ describe: 'List organons of this type',
33
+ type: 'string',
34
+ choices: ['navigation', 'constraints', 'rationale', 'procedures', 'mapping'],
35
+ })
36
+ .option('name', {
37
+ describe: 'Find organons matching this name (substring)',
38
+ type: 'string',
39
+ })
40
+ .check((argv) => {
41
+ if (!argv.file && !argv.scope && !argv.type && !argv.name) {
42
+ throw new Error('Specify at least one: --file, --scope, --type, or --name');
43
+ }
44
+ return true;
45
+ })
46
+ .example('$0 find --file=src/domain/genesis/Store.ts', 'Find governing organons')
47
+ .example('$0 find --scope=domain', 'List all domain organons')
48
+ .example('$0 find --name=frontmatter', 'Search by name');
49
+ },
50
+ handler: async (args) => {
51
+ const fs = new NodeFileSystem();
52
+ const config = await resolveConfig(args['project-root'], fs, args.config);
53
+ const result = await find({
54
+ projectRoot: args['project-root'],
55
+ config,
56
+ fs,
57
+ file: args.file,
58
+ scope: args.scope,
59
+ type: args.type,
60
+ name: args.name,
61
+ });
62
+ console.log(chalk.blue('Organon Find'));
63
+ console.log(chalk.dim(` Mode: ${result.mode}`));
64
+ console.log();
65
+ if (result.matches.length === 0) {
66
+ console.log(chalk.yellow(' No matches found'));
67
+ }
68
+ else {
69
+ for (const match of result.matches) {
70
+ console.log(` ${chalk.green(match.file)}`);
71
+ if (match.frontmatter) {
72
+ console.log(chalk.dim(` ${match.frontmatter.type} | ${match.frontmatter.scope} | ${match.frontmatter.name}`));
73
+ }
74
+ console.log(chalk.dim(` ${match.relevance}`));
75
+ }
76
+ }
77
+ console.log();
78
+ console.log(chalk.dim(`${result.matches.length} match(es)`));
79
+ },
80
+ };
81
+ //# sourceMappingURL=find.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/cli/commands/find.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * organon generate-tests — Generate test scaffolds for uncovered invariants.
3
+ */
4
+ import type { CommandModule } from 'yargs';
5
+ interface GenerateTestsArgs {
6
+ 'project-root': string;
7
+ config?: string;
8
+ invariant?: string[];
9
+ 'out-dir'?: string;
10
+ json: boolean;
11
+ }
12
+ export declare const generateTestsCommand: CommandModule<{}, GenerateTestsArgs>;
13
+ export {};
14
+ //# sourceMappingURL=generate-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-tests.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate-tests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,UAAU,iBAAiB;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,EAAE,EAAE,iBAAiB,CAuFrE,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * organon generate-tests — Generate test scaffolds for uncovered invariants.
3
+ */
4
+ import chalk from 'chalk';
5
+ import { resolveConfig } from '../../core/config.js';
6
+ import { generateTests } from '../../core/generate-tests.js';
7
+ import { NodeFileSystem } from '../../core/node-fs.js';
8
+ export const generateTestsCommand = {
9
+ command: 'generate-tests',
10
+ describe: 'Generate test scaffolds for uncovered invariants',
11
+ builder: (yargs) => {
12
+ return yargs
13
+ .option('project-root', {
14
+ describe: 'Project root directory',
15
+ type: 'string',
16
+ default: process.cwd(),
17
+ })
18
+ .option('config', {
19
+ describe: 'Path to organon.config.json',
20
+ type: 'string',
21
+ })
22
+ .option('invariant', {
23
+ describe: 'Generate for specific invariant ID(s)',
24
+ type: 'array',
25
+ string: true,
26
+ })
27
+ .option('out-dir', {
28
+ describe: 'Directory to write generated test files',
29
+ type: 'string',
30
+ })
31
+ .option('json', {
32
+ describe: 'Output machine-readable JSON',
33
+ type: 'boolean',
34
+ default: false,
35
+ })
36
+ .example('$0 generate-tests', 'Generate scaffolds for all uncovered invariants')
37
+ .example('$0 generate-tests --invariant INV-FOO-1', 'Generate for specific invariant')
38
+ .example('$0 generate-tests --json', 'Output as JSON');
39
+ },
40
+ handler: async (args) => {
41
+ const fs = new NodeFileSystem();
42
+ const config = await resolveConfig(args['project-root'], fs, args.config);
43
+ const result = await generateTests({
44
+ projectRoot: args['project-root'],
45
+ config,
46
+ fs,
47
+ invariantIds: args.invariant,
48
+ outDir: args['out-dir'],
49
+ });
50
+ if (args.json) {
51
+ console.log(JSON.stringify(result, null, 2));
52
+ return;
53
+ }
54
+ console.log(chalk.blue('Organon Generate Tests'));
55
+ console.log();
56
+ if (result.generated.length === 0 && result.alreadyCovered.length === 0 && result.judgmentCalls.length === 0) {
57
+ console.log(chalk.dim(' No invariants found. Add invariants to ETHOS.md frontmatter.'));
58
+ return;
59
+ }
60
+ // Show already covered
61
+ if (result.alreadyCovered.length > 0) {
62
+ console.log(chalk.green(` ✓ ${result.alreadyCovered.length} invariant(s) already covered`));
63
+ }
64
+ // Show judgment calls
65
+ if (result.judgmentCalls.length > 0) {
66
+ console.log(chalk.yellow(` ○ ${result.judgmentCalls.length} judgment call(s) (no test needed)`));
67
+ }
68
+ // Show generated scaffolds
69
+ if (result.generated.length > 0) {
70
+ console.log(chalk.cyan(` ⚡ ${result.generated.length} test scaffold(s) generated:`));
71
+ console.log();
72
+ for (const test of result.generated) {
73
+ console.log(chalk.dim(` ─── ${test.invariant.id}: ${test.invariant.name} ───`));
74
+ console.log(chalk.dim(` Suggested assertion: ${test.assertion}`));
75
+ console.log(chalk.dim(` Suggested filename: ${test.filename}`));
76
+ console.log();
77
+ console.log(test.code);
78
+ console.log();
79
+ }
80
+ }
81
+ else {
82
+ console.log();
83
+ console.log(chalk.green(' All invariants are covered!'));
84
+ }
85
+ },
86
+ };
87
+ //# sourceMappingURL=generate-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../../../src/cli/commands/generate-tests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * organon generate — Auto-generate frontmatter from file content.
3
+ */
4
+ import type { CommandModule } from 'yargs';
5
+ interface GenerateArgs {
6
+ file: string;
7
+ 'project-root': string;
8
+ config?: string;
9
+ update?: boolean;
10
+ type?: string;
11
+ scope?: string;
12
+ }
13
+ export declare const generateCommand: CommandModule<{}, GenerateArgs>;
14
+ export {};
15
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,EAAE,EAAE,YAAY,CA0E3D,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * organon generate — Auto-generate frontmatter from file content.
3
+ */
4
+ import chalk from 'chalk';
5
+ import { resolveConfig } from '../../core/config.js';
6
+ import { generateFrontmatter, serializeFrontmatter } from '../../core/generate-frontmatter.js';
7
+ import { NodeFileSystem } from '../../core/node-fs.js';
8
+ export const generateCommand = {
9
+ command: 'generate <file>',
10
+ describe: 'Auto-generate frontmatter for an organon file',
11
+ builder: (yargs) => {
12
+ return yargs
13
+ .positional('file', {
14
+ describe: 'File to generate frontmatter for',
15
+ type: 'string',
16
+ demandOption: true,
17
+ })
18
+ .option('project-root', {
19
+ describe: 'Project root directory',
20
+ type: 'string',
21
+ default: process.cwd(),
22
+ })
23
+ .option('config', {
24
+ describe: 'Path to organon.config.json',
25
+ type: 'string',
26
+ })
27
+ .option('update', {
28
+ describe: 'Write generated frontmatter back to file',
29
+ type: 'boolean',
30
+ default: false,
31
+ })
32
+ .option('type', {
33
+ describe: 'Override auto-detected type',
34
+ type: 'string',
35
+ choices: ['navigation', 'constraints', 'rationale', 'procedures', 'mapping'],
36
+ })
37
+ .option('scope', {
38
+ describe: 'Override auto-detected scope',
39
+ type: 'string',
40
+ choices: ['product', 'domain', 'feature', 'component', 'meta', 'methodology'],
41
+ })
42
+ .example('$0 generate book-llms/ETHOS.md', 'Generate frontmatter (dry run)')
43
+ .example('$0 generate book-llms/ETHOS.md --update', 'Generate and write to file');
44
+ },
45
+ handler: async (args) => {
46
+ const fs = new NodeFileSystem();
47
+ const config = await resolveConfig(args['project-root'], fs, args.config);
48
+ const result = await generateFrontmatter({
49
+ projectRoot: args['project-root'],
50
+ config,
51
+ fs,
52
+ file: args.file,
53
+ update: args.update,
54
+ type: args.type,
55
+ scope: args.scope,
56
+ });
57
+ console.log(chalk.blue('Organon Generate'));
58
+ console.log();
59
+ if (!result.success) {
60
+ for (const e of result.errors) {
61
+ console.log(chalk.red(` ✗ [${e.code}] ${e.message}`));
62
+ }
63
+ process.exit(1);
64
+ }
65
+ const yaml = serializeFrontmatter(result.generated);
66
+ console.log(chalk.dim('Generated frontmatter:'));
67
+ console.log();
68
+ console.log(yaml);
69
+ if (args.update) {
70
+ console.log(chalk.green(`✓ Updated ${args.file}`));
71
+ }
72
+ else {
73
+ console.log(chalk.dim('(dry run — use --update to write)'));
74
+ }
75
+ },
76
+ };
77
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * organon health — Dashboard showing coverage, validation, tokens, freshness.
3
+ */
4
+ import type { CommandModule } from 'yargs';
5
+ interface HealthArgs {
6
+ 'project-root': string;
7
+ config?: string;
8
+ detailed?: boolean;
9
+ 'fix-suggestions'?: boolean;
10
+ }
11
+ export declare const healthCommand: CommandModule<{}, HealthArgs>;
12
+ export {};
13
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,UAAU,UAAU;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,EAAE,EAAE,UAAU,CAiFvD,CAAC"}