@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,161 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { generateFrontmatter, serializeFrontmatter } from './generate-frontmatter.js';
3
+ import { MemoryFileSystem, makeEthos } from './test-helpers.js';
4
+ function makeConfig(projectRoot) {
5
+ return {
6
+ projectRoot,
7
+ organonPaths: ['.'],
8
+ organonGlobs: ['**/ETHOS.md'],
9
+ ignorePatterns: [],
10
+ workflowPaths: {},
11
+ freshnessThresholdHours: 24,
12
+ };
13
+ }
14
+ describe('generateFrontmatter', () => {
15
+ it('infers type from filename', async () => {
16
+ const fs = new MemoryFileSystem({
17
+ '/project/ETHOS.md': '# Test\n\n## Identity\n\n## Invariants\n\n1. **Rule.** Desc.',
18
+ });
19
+ const config = makeConfig('/project');
20
+ const result = await generateFrontmatter({
21
+ projectRoot: '/project',
22
+ config,
23
+ fs,
24
+ file: 'ETHOS.md',
25
+ });
26
+ expect(result.generated.type).toBe('constraints');
27
+ });
28
+ it('infers scope from path', async () => {
29
+ const fs = new MemoryFileSystem({
30
+ '/project/organon/domains/genesis/ETHOS.md': '# Genesis\n\n## Invariants\n\n1. **Rule.** Desc.',
31
+ });
32
+ const config = makeConfig('/project');
33
+ const result = await generateFrontmatter({
34
+ projectRoot: '/project',
35
+ config,
36
+ fs,
37
+ file: 'organon/domains/genesis/ETHOS.md',
38
+ });
39
+ expect(result.generated.scope).toBe('domain');
40
+ });
41
+ it('infers name from parent directory', async () => {
42
+ const fs = new MemoryFileSystem({
43
+ '/project/organon/domains/genesis/ETHOS.md': '# Genesis\n\n## Invariants\n\n1. **Rule.** Desc.',
44
+ });
45
+ const config = makeConfig('/project');
46
+ const result = await generateFrontmatter({
47
+ projectRoot: '/project',
48
+ config,
49
+ fs,
50
+ file: 'organon/domains/genesis/ETHOS.md',
51
+ });
52
+ expect(result.generated.name).toBe('genesis');
53
+ });
54
+ it('counts invariants and principles for constraints type', async () => {
55
+ const content = `# Test
56
+
57
+ ## Invariants
58
+
59
+ 1. **Rule one.** First.
60
+ 2. **Rule two.** Second.
61
+ 3. **Rule three.** Third.
62
+
63
+ ## Principles (Prioritized)
64
+
65
+ 1. **Principle one.** First.
66
+ 2. **Principle two.** Second.
67
+
68
+ ## Decision Heuristics
69
+
70
+ | Situation | Action |
71
+ |-----------|--------|
72
+ | When X | Do Y |
73
+ `;
74
+ const fs = new MemoryFileSystem({
75
+ '/project/ETHOS.md': content,
76
+ });
77
+ const config = makeConfig('/project');
78
+ const result = await generateFrontmatter({
79
+ projectRoot: '/project',
80
+ config,
81
+ fs,
82
+ file: 'ETHOS.md',
83
+ });
84
+ expect(result.generated.invariants_count).toBe(3);
85
+ expect(result.generated.principles_count).toBe(2);
86
+ expect(result.generated.heuristics_count).toBe(1);
87
+ });
88
+ it('preserves existing relationship fields', async () => {
89
+ const fs = new MemoryFileSystem({
90
+ '/project/ETHOS.md': makeEthos({
91
+ name: 'test',
92
+ scope: 'domain',
93
+ extra: {
94
+ 'inherits_from': '[product]',
95
+ 'related_domains': '[other]',
96
+ load_priority: 'high',
97
+ },
98
+ }),
99
+ });
100
+ const config = makeConfig('/project');
101
+ const result = await generateFrontmatter({
102
+ projectRoot: '/project',
103
+ config,
104
+ fs,
105
+ file: 'ETHOS.md',
106
+ });
107
+ expect(result.generated.inherits_from).toEqual(['product']);
108
+ expect(result.generated.related_domains).toEqual(['other']);
109
+ expect(result.generated.load_priority).toBe('high');
110
+ });
111
+ it('allows type override', async () => {
112
+ const fs = new MemoryFileSystem({
113
+ '/project/custom.md': '# Custom\n\nContent.',
114
+ });
115
+ const config = makeConfig('/project');
116
+ config.organonGlobs = ['**/*.md'];
117
+ const result = await generateFrontmatter({
118
+ projectRoot: '/project',
119
+ config,
120
+ fs,
121
+ file: 'custom.md',
122
+ type: 'rationale',
123
+ });
124
+ expect(result.generated.type).toBe('rationale');
125
+ });
126
+ it('calculates token estimate', async () => {
127
+ const fs = new MemoryFileSystem({
128
+ '/project/ETHOS.md': makeEthos(),
129
+ });
130
+ const config = makeConfig('/project');
131
+ const result = await generateFrontmatter({
132
+ projectRoot: '/project',
133
+ config,
134
+ fs,
135
+ file: 'ETHOS.md',
136
+ });
137
+ expect(result.generated.token_estimate).toBeGreaterThan(0);
138
+ });
139
+ it('returns error for missing file', async () => {
140
+ const fs = new MemoryFileSystem();
141
+ const config = makeConfig('/project');
142
+ const result = await generateFrontmatter({
143
+ projectRoot: '/project',
144
+ config,
145
+ fs,
146
+ file: 'nonexistent.md',
147
+ });
148
+ expect(result.success).toBe(false);
149
+ expect(result.errors).toContainEqual(expect.objectContaining({ code: 'FILE_READ_ERROR' }));
150
+ });
151
+ });
152
+ describe('serializeFrontmatter', () => {
153
+ it('produces valid YAML with delimiters', () => {
154
+ const yaml = serializeFrontmatter({ type: 'constraints', name: 'test' });
155
+ expect(yaml).toMatch(/^---\n/);
156
+ expect(yaml).toMatch(/---\n$/);
157
+ expect(yaml).toContain('type: constraints');
158
+ expect(yaml).toContain('name: test');
159
+ });
160
+ });
161
+ //# sourceMappingURL=generate-frontmatter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-frontmatter.test.js","sourceRoot":"","sources":["../../src/core/generate-frontmatter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * generate-tests — Find uncovered invariants and generate test scaffolds.
3
+ *
4
+ * Scans organon files for invariant declarations, checks which ones
5
+ * already have tests (via @organon-invariant annotations), and generates
6
+ * test scaffold files for uncovered invariants using heuristic assertion matching.
7
+ */
8
+ import { type ExtractedInvariant } from './invariant-coverage.js';
9
+ import type { FileSystem, OrganonConfig } from './types.js';
10
+ export interface GenerateTestsOptions {
11
+ projectRoot: string;
12
+ config: OrganonConfig;
13
+ fs: FileSystem;
14
+ /** If set, only generate for these invariant IDs */
15
+ invariantIds?: string[];
16
+ /** Directory to write generated test files */
17
+ outDir?: string;
18
+ }
19
+ export interface GeneratedTest {
20
+ /** The invariant this test covers */
21
+ invariant: ExtractedInvariant;
22
+ /** Suggested assertion function */
23
+ assertion: string;
24
+ /** Generated test scaffold code */
25
+ code: string;
26
+ /** Suggested filename */
27
+ filename: string;
28
+ }
29
+ export interface GenerateTestsResult {
30
+ /** Tests generated for uncovered invariants */
31
+ generated: GeneratedTest[];
32
+ /** Invariants that already have test coverage */
33
+ alreadyCovered: ExtractedInvariant[];
34
+ /** Invariants marked as judgment calls */
35
+ judgmentCalls: ExtractedInvariant[];
36
+ }
37
+ /**
38
+ * Generate test scaffolds for uncovered invariants.
39
+ */
40
+ export declare function generateTests(options: GenerateTestsOptions): Promise<GenerateTestsResult>;
41
+ //# sourceMappingURL=generate-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-tests.d.ts","sourceRoot":"","sources":["../../src/core/generate-tests.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,UAAU,EAEV,aAAa,EACd,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,UAAU,CAAC;IACf,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,iDAAiD;IACjD,cAAc,EAAE,kBAAkB,EAAE,CAAC;IACrC,0CAA0C;IAC1C,aAAa,EAAE,kBAAkB,EAAE,CAAC;CACrC;AA4ID;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAyE9B"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * generate-tests — Find uncovered invariants and generate test scaffolds.
3
+ *
4
+ * Scans organon files for invariant declarations, checks which ones
5
+ * already have tests (via @organon-invariant annotations), and generates
6
+ * test scaffold files for uncovered invariants using heuristic assertion matching.
7
+ */
8
+ import { parseFrontmatter } from './frontmatter-parser.js';
9
+ import { joinPath } from './config.js';
10
+ import { extractInvariants, scanTestAnnotations, } from './invariant-coverage.js';
11
+ function matchAssertion(invariant) {
12
+ const name = invariant.name.toLowerCase();
13
+ const id = invariant.id.toLowerCase();
14
+ const combined = `${name} ${id}`;
15
+ if (/max|limit|threshold|ceiling|bound/.test(combined)) {
16
+ return {
17
+ assertion: 'assertMaxValue',
18
+ scaffold: (inv) => scaffoldMaxValue(inv),
19
+ };
20
+ }
21
+ if (/pure|side.?effect|no.?io|no.?import/.test(combined)) {
22
+ return {
23
+ assertion: 'assertNoSideEffects',
24
+ scaffold: (inv) => scaffoldNoSideEffects(inv),
25
+ };
26
+ }
27
+ if (/naming|convention|case|kebab|camel|pascal|snake/.test(combined)) {
28
+ return {
29
+ assertion: 'assertNamingConvention',
30
+ scaffold: (inv) => scaffoldNamingConvention(inv),
31
+ };
32
+ }
33
+ if (/exist|present|require|file/.test(combined)) {
34
+ return {
35
+ assertion: 'assertFileExists',
36
+ scaffold: (inv) => scaffoldFileExists(inv),
37
+ };
38
+ }
39
+ return {
40
+ assertion: 'assertCustom',
41
+ scaffold: (inv) => scaffoldCustom(inv),
42
+ };
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Scaffold templates
46
+ // ---------------------------------------------------------------------------
47
+ function testFileHeader(inv) {
48
+ return `// @organon-invariant ${inv.id}
49
+ import { describe } from 'vitest';
50
+ import { testInvariant } from '@organon-methodology/testing/vitest';
51
+ `;
52
+ }
53
+ function scaffoldMaxValue(inv) {
54
+ return `${testFileHeader(inv)}import { assertMaxValue } from '@organon-methodology/testing/vitest';
55
+
56
+ describe('${inv.id}', () => {
57
+ testInvariant('${inv.id}', '${inv.name}', async () => {
58
+ await assertMaxValue({
59
+ files: ['src/**/*.ts'], // TODO: adjust file pattern
60
+ pattern: /TODO_PATTERN/, // TODO: regex with capturing group for numeric value
61
+ maxValue: 100, // TODO: set appropriate maximum
62
+ unit: 'TODO', // TODO: set unit (e.g., 'lines', 'seconds')
63
+ });
64
+ });
65
+ });
66
+ `;
67
+ }
68
+ function scaffoldNoSideEffects(inv) {
69
+ return `${testFileHeader(inv)}import { assertNoSideEffects } from '@organon-methodology/testing/vitest';
70
+
71
+ describe('${inv.id}', () => {
72
+ testInvariant('${inv.id}', '${inv.name}', async () => {
73
+ await assertNoSideEffects({
74
+ files: ['src/**/*.ts'], // TODO: adjust file pattern
75
+ forbiddenModules: ['fs', 'http'], // TODO: adjust forbidden modules
76
+ });
77
+ });
78
+ });
79
+ `;
80
+ }
81
+ function scaffoldFileExists(inv) {
82
+ return `${testFileHeader(inv)}import { assertFileExists } from '@organon-methodology/testing/vitest';
83
+
84
+ describe('${inv.id}', () => {
85
+ testInvariant('${inv.id}', '${inv.name}', async () => {
86
+ await assertFileExists({
87
+ files: ['TODO/path/to/required-file.ts'], // TODO: list required files
88
+ });
89
+ });
90
+ });
91
+ `;
92
+ }
93
+ function scaffoldNamingConvention(inv) {
94
+ return `${testFileHeader(inv)}import { assertNamingConvention } from '@organon-methodology/testing/vitest';
95
+
96
+ describe('${inv.id}', () => {
97
+ testInvariant('${inv.id}', '${inv.name}', async () => {
98
+ await assertNamingConvention({
99
+ mode: 'filenames', // TODO: 'filenames' or 'identifiers'
100
+ files: ['src/**/*.ts'], // TODO: adjust file pattern
101
+ convention: 'kebab-case', // TODO: adjust convention
102
+ });
103
+ });
104
+ });
105
+ `;
106
+ }
107
+ function scaffoldCustom(inv) {
108
+ return `${testFileHeader(inv)}import { assertCustom } from '@organon-methodology/testing/vitest';
109
+
110
+ describe('${inv.id}', () => {
111
+ testInvariant('${inv.id}', '${inv.name}', async () => {
112
+ await assertCustom({
113
+ label: '${inv.name}',
114
+ validate: async () => {
115
+ // TODO: implement custom validation logic
116
+ throw new Error('Not implemented');
117
+ },
118
+ });
119
+ });
120
+ });
121
+ `;
122
+ }
123
+ // ---------------------------------------------------------------------------
124
+ // Core logic
125
+ // ---------------------------------------------------------------------------
126
+ /**
127
+ * Generate test scaffolds for uncovered invariants.
128
+ */
129
+ export async function generateTests(options) {
130
+ const { projectRoot, config, fs, invariantIds } = options;
131
+ // 1. Discover organon files and extract invariants
132
+ const seenPaths = new Set();
133
+ const parsedFiles = [];
134
+ for (const organonPath of config.organonPaths) {
135
+ for (const pattern of config.organonGlobs) {
136
+ const fullPattern = organonPath === '.' ? pattern : `${organonPath}/${pattern}`;
137
+ const matches = await fs.glob(fullPattern, {
138
+ cwd: projectRoot,
139
+ ignore: config.ignorePatterns,
140
+ });
141
+ for (const file of matches) {
142
+ if (seenPaths.has(file))
143
+ continue;
144
+ seenPaths.add(file);
145
+ const absPath = joinPath(projectRoot, file);
146
+ try {
147
+ const content = await fs.readFile(absPath);
148
+ const { frontmatter } = parseFrontmatter(content);
149
+ parsedFiles.push({ path: file, frontmatter });
150
+ }
151
+ catch {
152
+ // Skip unreadable files
153
+ }
154
+ }
155
+ }
156
+ }
157
+ const allInvariants = extractInvariants(parsedFiles);
158
+ // 2. Filter by requested IDs if specified
159
+ const targetInvariants = invariantIds
160
+ ? allInvariants.filter((inv) => invariantIds.includes(inv.id))
161
+ : allInvariants;
162
+ // 3. Scan for existing test annotations
163
+ const annotations = await scanTestAnnotations(fs, projectRoot, config);
164
+ // 4. Categorize invariants
165
+ const generated = [];
166
+ const alreadyCovered = [];
167
+ const judgmentCalls = [];
168
+ for (const inv of targetInvariants) {
169
+ if (inv.judgment_call) {
170
+ judgmentCalls.push(inv);
171
+ continue;
172
+ }
173
+ const existingTests = annotations.get(inv.id) ?? [];
174
+ if (existingTests.length > 0) {
175
+ alreadyCovered.push(inv);
176
+ continue;
177
+ }
178
+ // Generate scaffold
179
+ const template = matchAssertion(inv);
180
+ const code = template.scaffold(inv);
181
+ const filename = `${inv.id.toLowerCase().replace(/[^a-z0-9]+/g, '-')}.test.ts`;
182
+ generated.push({
183
+ invariant: inv,
184
+ assertion: template.assertion,
185
+ code,
186
+ filename,
187
+ });
188
+ }
189
+ return { generated, alreadyCovered, judgmentCalls };
190
+ }
191
+ //# sourceMappingURL=generate-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../../src/core/generate-tests.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AAkDjC,SAAS,cAAc,CAAC,SAA6B;IACnD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;IAEjC,IAAI,mCAAmC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,OAAO;YACL,SAAS,EAAE,gBAAgB;YAC3B,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC;SACzC,CAAC;IACJ,CAAC;IAED,IAAI,qCAAqC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,OAAO;YACL,SAAS,EAAE,qBAAqB;YAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC;SAC9C,CAAC;IACJ,CAAC;IAED,IAAI,iDAAiD,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrE,OAAO;YACL,SAAS,EAAE,wBAAwB;YACnC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,SAAS,EAAE,kBAAkB;YAC7B,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,cAAc;QACzB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,SAAS,cAAc,CAAC,GAAuB;IAC7C,OAAO,yBAAyB,GAAG,CAAC,EAAE;;;CAGvC,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC;;YAEnB,GAAG,CAAC,EAAE;mBACC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;;;;;;;;;CASvC,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAuB;IACpD,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC;;YAEnB,GAAG,CAAC,EAAE;mBACC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;;;;;;;CAOvC,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAuB;IACjD,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC;;YAEnB,GAAG,CAAC,EAAE;mBACC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;;;;;;CAMvC,CAAC;AACF,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAuB;IACvD,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC;;YAEnB,GAAG,CAAC,EAAE;mBACC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;;;;;;;;CAQvC,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,GAAuB;IAC7C,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC;;YAEnB,GAAG,CAAC,EAAE;mBACC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;;gBAExB,GAAG,CAAC,IAAI;;;;;;;;CAQvB,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6B;IAE7B,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAE1D,mDAAmD;IACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,WAAW,GAGZ,EAAE,CAAC;IAER,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC9C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAG,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,OAAO,EAAE,CAAC;YAChF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;gBACzC,GAAG,EAAE,WAAW;gBAChB,MAAM,EAAE,MAAM,CAAC,cAAc;aAC9B,CAAC,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAClC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC3C,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;oBAClD,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBAChD,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAErD,0CAA0C;IAC1C,MAAM,gBAAgB,GAAG,YAAY;QACnC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,aAAa,CAAC;IAElB,wCAAwC;IACxC,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAEvE,2BAA2B;IAC3B,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,MAAM,cAAc,GAAyB,EAAE,CAAC;IAChD,MAAM,aAAa,GAAyB,EAAE,CAAC;IAE/C,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QAED,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QAED,oBAAoB;QACpB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,UAAU,CAAC;QAE/E,SAAS,CAAC,IAAI,CAAC;YACb,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,IAAI;YACJ,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate-tests.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-tests.test.d.ts","sourceRoot":"","sources":["../../src/core/generate-tests.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,205 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { generateTests } from './generate-tests.js';
3
+ import { MemoryFileSystem, makeEthos } from './test-helpers.js';
4
+ const PROJECT_ROOT = '/project';
5
+ function makeConfig(overrides) {
6
+ return {
7
+ projectRoot: PROJECT_ROOT,
8
+ organonPaths: ['.'],
9
+ organonGlobs: ['**/ETHOS.md'],
10
+ ignorePatterns: ['node_modules/**'],
11
+ workflowPaths: {},
12
+ freshnessThresholdHours: 720,
13
+ ...overrides,
14
+ };
15
+ }
16
+ function makeEthosWithInvariants(invariants) {
17
+ const invYaml = invariants.map((inv) => {
18
+ const jc = inv.judgment_call ? `\n judgment_call: true` : '';
19
+ return ` - id: ${inv.id}\n name: ${inv.name}${jc}`;
20
+ }).join('\n');
21
+ return `---
22
+ type: constraints
23
+ scope: domain
24
+ name: test-domain
25
+ version: "1.0"
26
+ summary: Test ethos
27
+ token_estimate: 500
28
+ invariants_count: ${invariants.length}
29
+ principles_count: 1
30
+ heuristics_count: 1
31
+ invariants:
32
+ ${invYaml}
33
+ ---
34
+
35
+ # Test Domain
36
+
37
+ ## Identity
38
+
39
+ ### What This IS
40
+ - A test domain
41
+
42
+ ### What This IS NOT
43
+ - Not production
44
+
45
+ ## Invariants
46
+
47
+ 1. **Rule 1.** Test rule.
48
+
49
+ ## Principles (Prioritized)
50
+
51
+ 1. **Principle 1.** Test principle.
52
+
53
+ ## Decision Heuristics
54
+
55
+ | Situation | Action |
56
+ |-----------|--------|
57
+ | Test | Do test |
58
+ `;
59
+ }
60
+ describe('generateTests', () => {
61
+ it('generates scaffolds for uncovered invariants', async () => {
62
+ const fs = new MemoryFileSystem({
63
+ '/project/ETHOS.md': makeEthosWithInvariants([
64
+ { id: 'INV-TEST-1', name: 'max-timeout' },
65
+ ]),
66
+ });
67
+ const result = await generateTests({
68
+ projectRoot: PROJECT_ROOT,
69
+ config: makeConfig(),
70
+ fs,
71
+ });
72
+ expect(result.generated).toHaveLength(1);
73
+ expect(result.generated[0].invariant.id).toBe('INV-TEST-1');
74
+ expect(result.generated[0].assertion).toBe('assertMaxValue');
75
+ expect(result.generated[0].code).toContain('assertMaxValue');
76
+ expect(result.generated[0].code).toContain('@organon-invariant INV-TEST-1');
77
+ expect(result.generated[0].filename).toBe('inv-test-1.test.ts');
78
+ });
79
+ it('skips already covered invariants', async () => {
80
+ const fs = new MemoryFileSystem({
81
+ '/project/ETHOS.md': makeEthosWithInvariants([
82
+ { id: 'INV-TEST-1', name: 'max-timeout' },
83
+ ]),
84
+ '/project/tests/my-test.test.ts': `// @organon-invariant INV-TEST-1\nconsole.log("test");`,
85
+ });
86
+ const result = await generateTests({
87
+ projectRoot: PROJECT_ROOT,
88
+ config: makeConfig({ testGlobs: ['tests/**/*.test.ts'] }),
89
+ fs,
90
+ });
91
+ expect(result.generated).toHaveLength(0);
92
+ expect(result.alreadyCovered).toHaveLength(1);
93
+ });
94
+ it('separates judgment calls', async () => {
95
+ const fs = new MemoryFileSystem({
96
+ '/project/ETHOS.md': makeEthosWithInvariants([
97
+ { id: 'INV-TEST-1', name: 'requires-human-review', judgment_call: true },
98
+ ]),
99
+ });
100
+ const result = await generateTests({
101
+ projectRoot: PROJECT_ROOT,
102
+ config: makeConfig(),
103
+ fs,
104
+ });
105
+ expect(result.generated).toHaveLength(0);
106
+ expect(result.judgmentCalls).toHaveLength(1);
107
+ });
108
+ it('matches heuristic: "pure" → assertNoSideEffects', async () => {
109
+ const fs = new MemoryFileSystem({
110
+ '/project/ETHOS.md': makeEthosWithInvariants([
111
+ { id: 'INV-TEST-1', name: 'assertion-logic-pure' },
112
+ ]),
113
+ });
114
+ const result = await generateTests({
115
+ projectRoot: PROJECT_ROOT,
116
+ config: makeConfig(),
117
+ fs,
118
+ });
119
+ expect(result.generated[0].assertion).toBe('assertNoSideEffects');
120
+ });
121
+ it('matches heuristic: "exists" → assertFileExists', async () => {
122
+ const fs = new MemoryFileSystem({
123
+ '/project/ETHOS.md': makeEthosWithInvariants([
124
+ { id: 'INV-TEST-1', name: 'config-file-must-exist' },
125
+ ]),
126
+ });
127
+ const result = await generateTests({
128
+ projectRoot: PROJECT_ROOT,
129
+ config: makeConfig(),
130
+ fs,
131
+ });
132
+ expect(result.generated[0].assertion).toBe('assertFileExists');
133
+ });
134
+ it('matches heuristic: "naming" → assertNamingConvention', async () => {
135
+ const fs = new MemoryFileSystem({
136
+ '/project/ETHOS.md': makeEthosWithInvariants([
137
+ { id: 'INV-TEST-1', name: 'file-naming-convention' },
138
+ ]),
139
+ });
140
+ const result = await generateTests({
141
+ projectRoot: PROJECT_ROOT,
142
+ config: makeConfig(),
143
+ fs,
144
+ });
145
+ expect(result.generated[0].assertion).toBe('assertNamingConvention');
146
+ });
147
+ it('falls back to assertCustom for unrecognized patterns', async () => {
148
+ const fs = new MemoryFileSystem({
149
+ '/project/ETHOS.md': makeEthosWithInvariants([
150
+ { id: 'INV-TEST-1', name: 'something-unusual' },
151
+ ]),
152
+ });
153
+ const result = await generateTests({
154
+ projectRoot: PROJECT_ROOT,
155
+ config: makeConfig(),
156
+ fs,
157
+ });
158
+ expect(result.generated[0].assertion).toBe('assertCustom');
159
+ });
160
+ it('filters by invariantIds when specified', async () => {
161
+ const fs = new MemoryFileSystem({
162
+ '/project/ETHOS.md': makeEthosWithInvariants([
163
+ { id: 'INV-A-1', name: 'max-timeout' },
164
+ { id: 'INV-B-1', name: 'side-effect-free' },
165
+ { id: 'INV-C-1', name: 'file-exists' },
166
+ ]),
167
+ });
168
+ const result = await generateTests({
169
+ projectRoot: PROJECT_ROOT,
170
+ config: makeConfig(),
171
+ fs,
172
+ invariantIds: ['INV-B-1'],
173
+ });
174
+ expect(result.generated).toHaveLength(1);
175
+ expect(result.generated[0].invariant.id).toBe('INV-B-1');
176
+ });
177
+ it('returns empty when no invariants defined', async () => {
178
+ const fs = new MemoryFileSystem({
179
+ '/project/ETHOS.md': makeEthos({ invariants: 0 }),
180
+ });
181
+ const result = await generateTests({
182
+ projectRoot: PROJECT_ROOT,
183
+ config: makeConfig(),
184
+ fs,
185
+ });
186
+ expect(result.generated).toHaveLength(0);
187
+ expect(result.alreadyCovered).toHaveLength(0);
188
+ expect(result.judgmentCalls).toHaveLength(0);
189
+ });
190
+ it('generated code includes testInvariant wrapper', async () => {
191
+ const fs = new MemoryFileSystem({
192
+ '/project/ETHOS.md': makeEthosWithInvariants([
193
+ { id: 'INV-TEST-1', name: 'limit-check' },
194
+ ]),
195
+ });
196
+ const result = await generateTests({
197
+ projectRoot: PROJECT_ROOT,
198
+ config: makeConfig(),
199
+ fs,
200
+ });
201
+ expect(result.generated[0].code).toContain("testInvariant('INV-TEST-1'");
202
+ expect(result.generated[0].code).toContain("import { testInvariant } from '@organon-methodology/testing/vitest'");
203
+ });
204
+ });
205
+ //# sourceMappingURL=generate-tests.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-tests.test.js","sourceRoot":"","sources":["../../src/core/generate-tests.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Health dashboard.
3
+ *
4
+ * Reports coverage (% files with frontmatter), validation status,
5
+ * token analysis, freshness, and overall health score.
6
+ */
7
+ import type { FileSystem, HealthResult, OrganonConfig } from './types.js';
8
+ export interface HealthOptions {
9
+ projectRoot: string;
10
+ config: OrganonConfig;
11
+ fs: FileSystem;
12
+ /** Include fix suggestions in issues */
13
+ fixSuggestions?: boolean;
14
+ }
15
+ export declare function health(options: HealthOptions): Promise<HealthResult>;
16
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/core/health.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAEV,UAAU,EACV,YAAY,EACZ,aAAa,EAEd,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,UAAU,CAAC;IACf,wCAAwC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAMD,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAuI1E"}