@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,370 @@
1
+ /**
2
+ * Tests for organon upgrade core logic.
3
+ *
4
+ * @organon-invariant INV-TOOLS-2 every-command-has-tests
5
+ * @organon-invariant INV-TOOLS-5 idempotent-operations
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { detectVersion, computeUpgradePlan, applyUpgrade } from './upgrade.js';
9
+ import { MemoryFileSystem } from './test-helpers.js';
10
+ import { METHODOLOGY_VERSION, getSkillTemplates } from '../templates/index.js';
11
+ describe('detectVersion', () => {
12
+ it('returns null current when no config exists', async () => {
13
+ const fs = new MemoryFileSystem();
14
+ const version = await detectVersion('/project', fs);
15
+ expect(version.current).toBeNull();
16
+ expect(version.target).toBe(METHODOLOGY_VERSION);
17
+ expect(version.drift).toBe('unknown');
18
+ });
19
+ it('returns null current when config has no methodology_version', async () => {
20
+ const fs = new MemoryFileSystem({
21
+ '/project/organon.config.json': '{"organonPaths": ["organon"]}',
22
+ });
23
+ const version = await detectVersion('/project', fs);
24
+ expect(version.current).toBeNull();
25
+ expect(version.drift).toBe('unknown');
26
+ });
27
+ it('returns none drift when versions match', async () => {
28
+ const fs = new MemoryFileSystem({
29
+ '/project/organon.config.json': `{"methodology_version": "${METHODOLOGY_VERSION}"}`,
30
+ });
31
+ const version = await detectVersion('/project', fs);
32
+ expect(version.current).toBe(METHODOLOGY_VERSION);
33
+ expect(version.drift).toBe('none');
34
+ });
35
+ it('returns behind drift when current is older', async () => {
36
+ const fs = new MemoryFileSystem({
37
+ '/project/organon.config.json': '{"methodology_version": "0.1.0"}',
38
+ });
39
+ const version = await detectVersion('/project', fs);
40
+ expect(version.current).toBe('0.1.0');
41
+ expect(version.drift).toBe('behind');
42
+ });
43
+ it('returns ahead drift when current is newer', async () => {
44
+ const fs = new MemoryFileSystem({
45
+ '/project/organon.config.json': '{"methodology_version": "99.0.0"}',
46
+ });
47
+ const version = await detectVersion('/project', fs);
48
+ expect(version.drift).toBe('ahead');
49
+ });
50
+ it('returns null current when config contains invalid JSON', async () => {
51
+ const fs = new MemoryFileSystem({
52
+ '/project/organon.config.json': 'not valid json {{{',
53
+ });
54
+ const version = await detectVersion('/project', fs);
55
+ expect(version.current).toBeNull();
56
+ expect(version.drift).toBe('unknown');
57
+ });
58
+ it('returns null current when methodology_version is not a string', async () => {
59
+ const fs = new MemoryFileSystem({
60
+ '/project/organon.config.json': '{"methodology_version": 123}',
61
+ });
62
+ const version = await detectVersion('/project', fs);
63
+ expect(version.current).toBeNull();
64
+ expect(version.drift).toBe('unknown');
65
+ });
66
+ it('returns unknown when fs.exists throws', async () => {
67
+ const fs = new MemoryFileSystem();
68
+ fs.throwOn('organon.config.json');
69
+ const version = await detectVersion('/project', fs);
70
+ expect(version.current).toBeNull();
71
+ expect(version.drift).toBe('unknown');
72
+ });
73
+ });
74
+ describe('computeUpgradePlan', () => {
75
+ it('detects missing skills as new', async () => {
76
+ const fs = new MemoryFileSystem({
77
+ '/project/organon.config.json': `{"methodology_version": "${METHODOLOGY_VERSION}"}`,
78
+ });
79
+ const version = await detectVersion('/project', fs);
80
+ const plan = await computeUpgradePlan({
81
+ projectRoot: '/project',
82
+ skillsOnly: false,
83
+ fs,
84
+ version,
85
+ });
86
+ const skillChanges = plan.changes.filter((c) => c.type === 'skill');
87
+ expect(skillChanges.length).toBe(getSkillTemplates().size);
88
+ expect(skillChanges.every((c) => c.action === 'create')).toBe(true);
89
+ });
90
+ it('detects outdated skills as update', async () => {
91
+ const fs = new MemoryFileSystem({
92
+ '/project/organon.config.json': `{"methodology_version": "${METHODOLOGY_VERSION}"}`,
93
+ '/project/.claude/skills/verify-and-health/SKILL.md': '---\nname: verify-and-health\n---\n# Old content',
94
+ });
95
+ const version = await detectVersion('/project', fs);
96
+ const plan = await computeUpgradePlan({
97
+ projectRoot: '/project',
98
+ skillsOnly: false,
99
+ fs,
100
+ version,
101
+ });
102
+ const vhChange = plan.changes.find((c) => c.path.includes('verify-and-health'));
103
+ expect(vhChange).toBeDefined();
104
+ expect(vhChange.action).toBe('update');
105
+ });
106
+ it('reports no changes when everything is current', async () => {
107
+ // Simulate all skills existing with matching content
108
+ const { getSkillTemplates } = await import('../templates/index.js');
109
+ const skills = getSkillTemplates();
110
+ const files = {
111
+ '/project/organon.config.json': `{"methodology_version": "${METHODOLOGY_VERSION}"}`,
112
+ };
113
+ for (const [, { path, content }] of skills) {
114
+ files[`/project/${path}`] = content;
115
+ }
116
+ const fs = new MemoryFileSystem(files);
117
+ const version = await detectVersion('/project', fs);
118
+ const plan = await computeUpgradePlan({
119
+ projectRoot: '/project',
120
+ skillsOnly: false,
121
+ fs,
122
+ version,
123
+ });
124
+ expect(plan.changes.length).toBe(0);
125
+ });
126
+ it('includes config update when version drifts', async () => {
127
+ const fs = new MemoryFileSystem({
128
+ '/project/organon.config.json': '{"methodology_version": "0.1.0"}',
129
+ });
130
+ const version = await detectVersion('/project', fs);
131
+ const plan = await computeUpgradePlan({
132
+ projectRoot: '/project',
133
+ skillsOnly: false,
134
+ fs,
135
+ version,
136
+ });
137
+ const configChange = plan.changes.find((c) => c.type === 'config');
138
+ expect(configChange).toBeDefined();
139
+ expect(configChange.action).toBe('update');
140
+ });
141
+ it('does not suggest config downgrade when version is ahead', async () => {
142
+ const fs = new MemoryFileSystem({
143
+ '/project/organon.config.json': '{"methodology_version": "99.0.0"}',
144
+ });
145
+ const version = await detectVersion('/project', fs);
146
+ expect(version.drift).toBe('ahead');
147
+ const plan = await computeUpgradePlan({
148
+ projectRoot: '/project',
149
+ skillsOnly: false,
150
+ fs,
151
+ version,
152
+ });
153
+ const configChange = plan.changes.find((c) => c.type === 'config');
154
+ expect(configChange).toBeUndefined();
155
+ });
156
+ it('skips config when skillsOnly is true', async () => {
157
+ const fs = new MemoryFileSystem({
158
+ '/project/organon.config.json': '{"methodology_version": "0.1.0"}',
159
+ });
160
+ const version = await detectVersion('/project', fs);
161
+ const plan = await computeUpgradePlan({
162
+ projectRoot: '/project',
163
+ skillsOnly: true,
164
+ fs,
165
+ version,
166
+ });
167
+ const configChange = plan.changes.find((c) => c.type === 'config');
168
+ expect(configChange).toBeUndefined();
169
+ });
170
+ });
171
+ describe('applyUpgrade', () => {
172
+ it('produces files for all changes', async () => {
173
+ const fs = new MemoryFileSystem({
174
+ '/project/organon.config.json': '{"methodology_version": "0.1.0"}',
175
+ });
176
+ const version = await detectVersion('/project', fs);
177
+ const plan = await computeUpgradePlan({
178
+ projectRoot: '/project',
179
+ skillsOnly: false,
180
+ fs,
181
+ version,
182
+ });
183
+ const result = await applyUpgrade(plan, '/project', fs);
184
+ const filesToWrite = result.filesToWrite;
185
+ expect(result.success).toBe(true);
186
+ expect(result.applied.length).toBeGreaterThan(0);
187
+ expect(filesToWrite.size).toBeGreaterThan(0);
188
+ });
189
+ it('updates methodology_version in config', async () => {
190
+ const fs = new MemoryFileSystem({
191
+ '/project/organon.config.json': '{"methodology_version": "0.1.0", "organonPaths": ["organon"]}',
192
+ });
193
+ const version = await detectVersion('/project', fs);
194
+ const plan = await computeUpgradePlan({
195
+ projectRoot: '/project',
196
+ skillsOnly: false,
197
+ fs,
198
+ version,
199
+ });
200
+ const result = await applyUpgrade(plan, '/project', fs);
201
+ const filesToWrite = result.filesToWrite;
202
+ const configContent = filesToWrite.get('organon.config.json');
203
+ expect(configContent).toBeDefined();
204
+ const config = JSON.parse(configContent);
205
+ expect(config.methodology_version).toBe(METHODOLOGY_VERSION);
206
+ // Preserves existing fields
207
+ expect(config.organonPaths).toEqual(['organon']);
208
+ });
209
+ it('emits warning when skill template not found', async () => {
210
+ // Craft a plan with a skill change pointing to a non-existent template path
211
+ const fs = new MemoryFileSystem();
212
+ const plan = {
213
+ version: { current: '0.1.0', target: METHODOLOGY_VERSION, drift: 'behind' },
214
+ changes: [
215
+ {
216
+ type: 'skill',
217
+ action: 'update',
218
+ path: '.claude/skills/nonexistent-skill/SKILL.md',
219
+ description: 'Updated: nonexistent-skill',
220
+ },
221
+ ],
222
+ };
223
+ const result = await applyUpgrade(plan, '/project', fs);
224
+ const warning = result.diagnostics.find((d) => d.code === 'UPGRADE_SKILL_TEMPLATE_NOT_FOUND');
225
+ expect(warning).toBeDefined();
226
+ expect(result.applied).not.toContain('.claude/skills/nonexistent-skill/SKILL.md');
227
+ });
228
+ it('emits warning for structure change type', async () => {
229
+ const fs = new MemoryFileSystem();
230
+ const plan = {
231
+ version: { current: '0.1.0', target: METHODOLOGY_VERSION, drift: 'behind' },
232
+ changes: [
233
+ {
234
+ type: 'structure',
235
+ action: 'create',
236
+ path: 'organon/new-dir/README.md',
237
+ description: 'New structural file',
238
+ },
239
+ ],
240
+ };
241
+ const result = await applyUpgrade(plan, '/project', fs);
242
+ const warning = result.diagnostics.find((d) => d.code === 'UPGRADE_STRUCTURE_NOT_SUPPORTED');
243
+ expect(warning).toBeDefined();
244
+ expect(result.filesToWrite.size).toBe(0);
245
+ });
246
+ it('creates config from template when action is create', async () => {
247
+ const fs = new MemoryFileSystem();
248
+ const plan = {
249
+ version: { current: null, target: METHODOLOGY_VERSION, drift: 'unknown' },
250
+ changes: [
251
+ {
252
+ type: 'config',
253
+ action: 'create',
254
+ path: 'organon.config.json',
255
+ description: 'Create organon.config.json',
256
+ },
257
+ ],
258
+ };
259
+ const result = await applyUpgrade(plan, '/project', fs);
260
+ expect(result.success).toBe(true);
261
+ expect(result.applied).toContain('organon.config.json');
262
+ const configContent = result.filesToWrite.get('organon.config.json');
263
+ expect(configContent).toBeDefined();
264
+ const config = JSON.parse(configContent);
265
+ expect(config.methodology_version).toBe(METHODOLOGY_VERSION);
266
+ });
267
+ it('emits error when config cannot be read during update', async () => {
268
+ const fs = new MemoryFileSystem();
269
+ fs.throwOn('organon.config.json');
270
+ const plan = {
271
+ version: { current: '0.1.0', target: METHODOLOGY_VERSION, drift: 'behind' },
272
+ changes: [
273
+ {
274
+ type: 'config',
275
+ action: 'update',
276
+ path: 'organon.config.json',
277
+ description: 'Update methodology_version',
278
+ },
279
+ ],
280
+ };
281
+ const result = await applyUpgrade(plan, '/project', fs);
282
+ expect(result.success).toBe(false);
283
+ const error = result.diagnostics.find((d) => d.code === 'UPGRADE_CONFIG_READ_ERROR');
284
+ expect(error).toBeDefined();
285
+ });
286
+ it('emits error when config contains invalid JSON during update', async () => {
287
+ const fs = new MemoryFileSystem({
288
+ '/project/organon.config.json': 'not valid json {{{',
289
+ });
290
+ const plan = {
291
+ version: { current: '0.1.0', target: METHODOLOGY_VERSION, drift: 'behind' },
292
+ changes: [
293
+ {
294
+ type: 'config',
295
+ action: 'update',
296
+ path: 'organon.config.json',
297
+ description: 'Update methodology_version',
298
+ },
299
+ ],
300
+ };
301
+ const result = await applyUpgrade(plan, '/project', fs);
302
+ expect(result.success).toBe(false);
303
+ const error = result.diagnostics.find((d) => d.code === 'UPGRADE_CONFIG_READ_ERROR');
304
+ expect(error).toBeDefined();
305
+ });
306
+ it('returns empty plan when no changes needed', async () => {
307
+ const fs = new MemoryFileSystem();
308
+ const plan = {
309
+ version: { current: METHODOLOGY_VERSION, target: METHODOLOGY_VERSION, drift: 'none' },
310
+ changes: [],
311
+ };
312
+ const result = await applyUpgrade(plan, '/project', fs);
313
+ expect(result.success).toBe(true);
314
+ expect(result.applied.length).toBe(0);
315
+ expect(result.filesToWrite.size).toBe(0);
316
+ expect(result.diagnostics.length).toBe(0);
317
+ });
318
+ });
319
+ describe('computeUpgradePlan — error paths', () => {
320
+ it('treats skill with unreadable fs.exists as needing create', async () => {
321
+ const fs = new MemoryFileSystem({
322
+ '/project/organon.config.json': `{"methodology_version": "${METHODOLOGY_VERSION}"}`,
323
+ });
324
+ fs.throwOn('verify-and-health');
325
+ const version = await detectVersion('/project', fs);
326
+ const plan = await computeUpgradePlan({
327
+ projectRoot: '/project',
328
+ skillsOnly: false,
329
+ fs,
330
+ version,
331
+ });
332
+ const vhChange = plan.changes.find((c) => c.path.includes('verify-and-health'));
333
+ expect(vhChange).toBeDefined();
334
+ expect(vhChange.action).toBe('create');
335
+ expect(vhChange.description).toContain('could not check');
336
+ });
337
+ it('treats unreadable existing skill as needing update', async () => {
338
+ const fs = new MemoryFileSystem({
339
+ '/project/organon.config.json': `{"methodology_version": "${METHODOLOGY_VERSION}"}`,
340
+ '/project/.claude/skills/verify-and-health/SKILL.md': 'content',
341
+ });
342
+ // Make only readFile throw (exists() still returns true)
343
+ fs.throwOnRead('verify-and-health');
344
+ const version = await detectVersion('/project', fs);
345
+ const plan = await computeUpgradePlan({
346
+ projectRoot: '/project',
347
+ skillsOnly: false,
348
+ fs,
349
+ version,
350
+ });
351
+ const vhChange = plan.changes.find((c) => c.path.includes('verify-and-health'));
352
+ expect(vhChange).toBeDefined();
353
+ expect(vhChange.action).toBe('update');
354
+ expect(vhChange.description).toContain('could not read');
355
+ });
356
+ it('suggests config create when config does not exist', async () => {
357
+ const fs = new MemoryFileSystem();
358
+ const version = { current: null, target: METHODOLOGY_VERSION, drift: 'unknown' };
359
+ const plan = await computeUpgradePlan({
360
+ projectRoot: '/project',
361
+ skillsOnly: false,
362
+ fs,
363
+ version,
364
+ });
365
+ const configChange = plan.changes.find((c) => c.type === 'config');
366
+ expect(configChange).toBeDefined();
367
+ expect(configChange.action).toBe('create');
368
+ });
369
+ });
370
+ //# sourceMappingURL=upgrade.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.test.js","sourceRoot":"","sources":["../../src/core/upgrade.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Multi-stage frontmatter validation.
3
+ *
4
+ * Stage 1: Schema — required fields, type enums, format rules
5
+ * Stage 2: References — inherits_from, related_domains, related_features, primary_rfcs exist
6
+ * Stage 3: Truthfulness — counts match content, token_estimate order-of-magnitude accurate
7
+ * Stage 4: Consistency — name↔directory, scope↔directory, bidirectional refs
8
+ */
9
+ import type { FileSystem, OrganonConfig, ValidateFrontmatterResult } from './types.js';
10
+ export interface ValidateFrontmatterOptions {
11
+ projectRoot: string;
12
+ config: OrganonConfig;
13
+ fs: FileSystem;
14
+ /** Specific files to validate. If empty, validates all discovered organon files. */
15
+ files?: string[];
16
+ /** Which stages to run. Defaults to all 4. */
17
+ stages?: Array<1 | 2 | 3 | 4>;
18
+ }
19
+ export declare function validateFrontmatter(options: ValidateFrontmatterOptions): Promise<ValidateFrontmatterResult>;
20
+ //# sourceMappingURL=validate-frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-frontmatter.d.ts","sourceRoot":"","sources":["../../src/core/validate-frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAEV,UAAU,EAKV,aAAa,EACb,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,UAAU,CAAC;IACf,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;CAC/B;AAiBD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yBAAyB,CAAC,CA8FpC"}