@monoes/monomindcli 2.9.25 → 2.9.27

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 (254) hide show
  1. package/.claude/helpers/control-start.cjs +15 -1
  2. package/.claude/helpers/handlers/edit-handler.cjs +3 -2
  3. package/.claude/helpers/handlers/route-handler.cjs +19 -4
  4. package/.claude/helpers/hook-handler.cjs +2 -0
  5. package/.claude/helpers/utils/monograph.cjs +8 -0
  6. package/.claude/skills/mastermind/SKILL.md +21 -0
  7. package/.claude/skills/mastermind/references/antigravity-tools.md +60 -0
  8. package/.claude/skills/mastermind/references/claude-code-tools.md +50 -0
  9. package/.claude/skills/mastermind/references/codex-tools.md +64 -0
  10. package/.claude/skills/mastermind/references/copilot-tools.md +49 -0
  11. package/.claude/skills/mastermind/references/gemini-tools.md +63 -0
  12. package/.claude/skills/mastermind/references/pi-tools.md +28 -0
  13. package/.claude/skills/mastermind-org/SKILL.md +16 -0
  14. package/dist/src/commands/browse.d.ts +2 -10
  15. package/dist/src/commands/browse.d.ts.map +1 -1
  16. package/dist/src/commands/browse.js +7 -2
  17. package/dist/src/commands/browse.js.map +1 -1
  18. package/dist/src/commands/doctor.d.ts.map +1 -1
  19. package/dist/src/commands/doctor.js +16 -1
  20. package/dist/src/commands/doctor.js.map +1 -1
  21. package/dist/src/commands/index.d.ts +1 -1
  22. package/dist/src/commands/index.d.ts.map +1 -1
  23. package/dist/src/commands/index.js +10 -1
  24. package/dist/src/commands/index.js.map +1 -1
  25. package/dist/src/commands/init.d.ts.map +1 -1
  26. package/dist/src/commands/init.js +63 -5
  27. package/dist/src/commands/init.js.map +1 -1
  28. package/dist/src/commands/mastermind.d.ts +10 -0
  29. package/dist/src/commands/mastermind.d.ts.map +1 -0
  30. package/dist/src/commands/mastermind.js +62 -0
  31. package/dist/src/commands/mastermind.js.map +1 -0
  32. package/dist/src/commands/platforms.d.ts +9 -7
  33. package/dist/src/commands/platforms.d.ts.map +1 -1
  34. package/dist/src/commands/platforms.js +225 -571
  35. package/dist/src/commands/platforms.js.map +1 -1
  36. package/dist/src/commands/status.d.ts.map +1 -1
  37. package/dist/src/commands/status.js +7 -1
  38. package/dist/src/commands/status.js.map +1 -1
  39. package/dist/src/commands/update.d.ts.map +1 -1
  40. package/dist/src/commands/update.js +22 -0
  41. package/dist/src/commands/update.js.map +1 -1
  42. package/dist/src/init/codex-generator.d.ts.map +1 -1
  43. package/dist/src/init/codex-generator.js +5 -3
  44. package/dist/src/init/codex-generator.js.map +1 -1
  45. package/dist/src/init/executor.d.ts +6 -0
  46. package/dist/src/init/executor.d.ts.map +1 -1
  47. package/dist/src/init/executor.js +32 -3
  48. package/dist/src/init/executor.js.map +1 -1
  49. package/dist/src/init/mcp-generator.d.ts.map +1 -1
  50. package/dist/src/init/mcp-generator.js +5 -40
  51. package/dist/src/init/mcp-generator.js.map +1 -1
  52. package/dist/src/init/shared.d.ts.map +1 -1
  53. package/dist/src/init/shared.js +6 -5
  54. package/dist/src/init/shared.js.map +1 -1
  55. package/dist/src/init/types.d.ts +4 -0
  56. package/dist/src/init/types.d.ts.map +1 -1
  57. package/dist/src/init/types.js.map +1 -1
  58. package/dist/src/init/upgrade.d.ts.map +1 -1
  59. package/dist/src/init/upgrade.js +11 -1
  60. package/dist/src/init/upgrade.js.map +1 -1
  61. package/dist/src/init/write-antigravity.d.ts.map +1 -1
  62. package/dist/src/init/write-antigravity.js +5 -50
  63. package/dist/src/init/write-antigravity.js.map +1 -1
  64. package/dist/src/init/write-claude.d.ts.map +1 -1
  65. package/dist/src/init/write-claude.js +4 -88
  66. package/dist/src/init/write-claude.js.map +1 -1
  67. package/dist/src/init/write-codex.d.ts.map +1 -1
  68. package/dist/src/init/write-codex.js +12 -8
  69. package/dist/src/init/write-codex.js.map +1 -1
  70. package/dist/src/init/write-kimicode.d.ts.map +1 -1
  71. package/dist/src/init/write-kimicode.js +4 -48
  72. package/dist/src/init/write-kimicode.js.map +1 -1
  73. package/dist/src/knowledge/document-pipeline.d.ts.map +1 -1
  74. package/dist/src/knowledge/document-pipeline.js +6 -4
  75. package/dist/src/knowledge/document-pipeline.js.map +1 -1
  76. package/dist/src/knowledge/eval/harness.d.ts.map +1 -1
  77. package/dist/src/knowledge/eval/harness.js +9 -11
  78. package/dist/src/knowledge/eval/harness.js.map +1 -1
  79. package/dist/src/mastermind/manifest-data.d.ts +10 -0
  80. package/dist/src/mastermind/manifest-data.d.ts.map +1 -0
  81. package/dist/src/mastermind/manifest-data.js +67 -0
  82. package/dist/src/mastermind/manifest-data.js.map +1 -0
  83. package/dist/src/mastermind/manifest.d.ts +22 -0
  84. package/dist/src/mastermind/manifest.d.ts.map +1 -0
  85. package/dist/src/mastermind/manifest.js +36 -0
  86. package/dist/src/mastermind/manifest.js.map +1 -0
  87. package/dist/src/mcp-client.d.ts.map +1 -1
  88. package/dist/src/mcp-client.js +2 -0
  89. package/dist/src/mcp-client.js.map +1 -1
  90. package/dist/src/mcp-tools/index.d.ts +1 -0
  91. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  92. package/dist/src/mcp-tools/index.js +1 -0
  93. package/dist/src/mcp-tools/index.js.map +1 -1
  94. package/dist/src/mcp-tools/platforms-tools.d.ts +5 -0
  95. package/dist/src/mcp-tools/platforms-tools.d.ts.map +1 -0
  96. package/dist/src/mcp-tools/platforms-tools.js +38 -0
  97. package/dist/src/mcp-tools/platforms-tools.js.map +1 -0
  98. package/dist/src/memory/intelligence.d.ts.map +1 -1
  99. package/dist/src/memory/intelligence.js +54 -20
  100. package/dist/src/memory/intelligence.js.map +1 -1
  101. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  102. package/dist/src/memory/memory-bridge.js +3 -2
  103. package/dist/src/memory/memory-bridge.js.map +1 -1
  104. package/dist/src/memory/memory-kg.js +3 -3
  105. package/dist/src/memory/memory-kg.js.map +1 -1
  106. package/dist/src/monovector/diff-classifier.d.ts +2 -2
  107. package/dist/src/monovector/diff-classifier.d.ts.map +1 -1
  108. package/dist/src/monovector/diff-classifier.js.map +1 -1
  109. package/dist/src/orgrt/session.d.ts.map +1 -1
  110. package/dist/src/orgrt/session.js +54 -24
  111. package/dist/src/orgrt/session.js.map +1 -1
  112. package/dist/src/orgrt/task-dag.d.ts.map +1 -1
  113. package/dist/src/orgrt/task-dag.js +5 -1
  114. package/dist/src/orgrt/task-dag.js.map +1 -1
  115. package/dist/src/platform-adapters/core.d.ts +20 -0
  116. package/dist/src/platform-adapters/core.d.ts.map +1 -0
  117. package/dist/src/platform-adapters/core.js +34 -0
  118. package/dist/src/platform-adapters/core.js.map +1 -0
  119. package/dist/src/platform-adapters/discovery.d.ts +15 -0
  120. package/dist/src/platform-adapters/discovery.d.ts.map +1 -0
  121. package/dist/src/platform-adapters/discovery.js +64 -0
  122. package/dist/src/platform-adapters/discovery.js.map +1 -0
  123. package/dist/src/platform-adapters/docs.d.ts +4 -0
  124. package/dist/src/platform-adapters/docs.d.ts.map +1 -0
  125. package/dist/src/platform-adapters/docs.js +34 -0
  126. package/dist/src/platform-adapters/docs.js.map +1 -0
  127. package/dist/src/platform-adapters/hook-bridge.d.ts +44 -0
  128. package/dist/src/platform-adapters/hook-bridge.d.ts.map +1 -0
  129. package/dist/src/platform-adapters/hook-bridge.js +133 -0
  130. package/dist/src/platform-adapters/hook-bridge.js.map +1 -0
  131. package/dist/src/platform-adapters/merge.d.ts +32 -0
  132. package/dist/src/platform-adapters/merge.d.ts.map +1 -0
  133. package/dist/src/platform-adapters/merge.js +209 -0
  134. package/dist/src/platform-adapters/merge.js.map +1 -0
  135. package/dist/src/platform-adapters/migration.d.ts +31 -0
  136. package/dist/src/platform-adapters/migration.d.ts.map +1 -0
  137. package/dist/src/platform-adapters/migration.js +402 -0
  138. package/dist/src/platform-adapters/migration.js.map +1 -0
  139. package/dist/src/platform-adapters/operations.d.ts +23 -0
  140. package/dist/src/platform-adapters/operations.d.ts.map +1 -0
  141. package/dist/src/platform-adapters/operations.js +405 -0
  142. package/dist/src/platform-adapters/operations.js.map +1 -0
  143. package/dist/src/platform-adapters/registry.d.ts +9 -0
  144. package/dist/src/platform-adapters/registry.d.ts.map +1 -0
  145. package/dist/src/platform-adapters/registry.js +614 -0
  146. package/dist/src/platform-adapters/registry.js.map +1 -0
  147. package/dist/src/platform-adapters/renderers/agents.d.ts +5 -0
  148. package/dist/src/platform-adapters/renderers/agents.d.ts.map +1 -0
  149. package/dist/src/platform-adapters/renderers/agents.js +46 -0
  150. package/dist/src/platform-adapters/renderers/agents.js.map +1 -0
  151. package/dist/src/platform-adapters/renderers/aider.d.ts +2 -0
  152. package/dist/src/platform-adapters/renderers/aider.d.ts.map +1 -0
  153. package/dist/src/platform-adapters/renderers/aider.js +3 -0
  154. package/dist/src/platform-adapters/renderers/aider.js.map +1 -0
  155. package/dist/src/platform-adapters/renderers/antigravity.d.ts +2 -0
  156. package/dist/src/platform-adapters/renderers/antigravity.d.ts.map +1 -0
  157. package/dist/src/platform-adapters/renderers/antigravity.js +3 -0
  158. package/dist/src/platform-adapters/renderers/antigravity.js.map +1 -0
  159. package/dist/src/platform-adapters/renderers/claude.d.ts +2 -0
  160. package/dist/src/platform-adapters/renderers/claude.d.ts.map +1 -0
  161. package/dist/src/platform-adapters/renderers/claude.js +3 -0
  162. package/dist/src/platform-adapters/renderers/claude.js.map +1 -0
  163. package/dist/src/platform-adapters/renderers/codex.d.ts +2 -0
  164. package/dist/src/platform-adapters/renderers/codex.d.ts.map +1 -0
  165. package/dist/src/platform-adapters/renderers/codex.js +3 -0
  166. package/dist/src/platform-adapters/renderers/codex.js.map +1 -0
  167. package/dist/src/platform-adapters/renderers/commands.d.ts +13 -0
  168. package/dist/src/platform-adapters/renderers/commands.d.ts.map +1 -0
  169. package/dist/src/platform-adapters/renderers/commands.js +78 -0
  170. package/dist/src/platform-adapters/renderers/commands.js.map +1 -0
  171. package/dist/src/platform-adapters/renderers/copilot.d.ts +2 -0
  172. package/dist/src/platform-adapters/renderers/copilot.d.ts.map +1 -0
  173. package/dist/src/platform-adapters/renderers/copilot.js +3 -0
  174. package/dist/src/platform-adapters/renderers/copilot.js.map +1 -0
  175. package/dist/src/platform-adapters/renderers/cursor.d.ts +2 -0
  176. package/dist/src/platform-adapters/renderers/cursor.d.ts.map +1 -0
  177. package/dist/src/platform-adapters/renderers/cursor.js +3 -0
  178. package/dist/src/platform-adapters/renderers/cursor.js.map +1 -0
  179. package/dist/src/platform-adapters/renderers/droid.d.ts +2 -0
  180. package/dist/src/platform-adapters/renderers/droid.d.ts.map +1 -0
  181. package/dist/src/platform-adapters/renderers/droid.js +3 -0
  182. package/dist/src/platform-adapters/renderers/droid.js.map +1 -0
  183. package/dist/src/platform-adapters/renderers/experimental.d.ts +6 -0
  184. package/dist/src/platform-adapters/renderers/experimental.d.ts.map +1 -0
  185. package/dist/src/platform-adapters/renderers/experimental.js +9 -0
  186. package/dist/src/platform-adapters/renderers/experimental.js.map +1 -0
  187. package/dist/src/platform-adapters/renderers/factory.d.ts +14 -0
  188. package/dist/src/platform-adapters/renderers/factory.d.ts.map +1 -0
  189. package/dist/src/platform-adapters/renderers/factory.js +53 -0
  190. package/dist/src/platform-adapters/renderers/factory.js.map +1 -0
  191. package/dist/src/platform-adapters/renderers/gemini.d.ts +2 -0
  192. package/dist/src/platform-adapters/renderers/gemini.d.ts.map +1 -0
  193. package/dist/src/platform-adapters/renderers/gemini.js +3 -0
  194. package/dist/src/platform-adapters/renderers/gemini.js.map +1 -0
  195. package/dist/src/platform-adapters/renderers/hooks.d.ts +37 -0
  196. package/dist/src/platform-adapters/renderers/hooks.d.ts.map +1 -0
  197. package/dist/src/platform-adapters/renderers/hooks.js +166 -0
  198. package/dist/src/platform-adapters/renderers/hooks.js.map +1 -0
  199. package/dist/src/platform-adapters/renderers/index.d.ts +8 -0
  200. package/dist/src/platform-adapters/renderers/index.d.ts.map +1 -0
  201. package/dist/src/platform-adapters/renderers/index.js +39 -0
  202. package/dist/src/platform-adapters/renderers/index.js.map +1 -0
  203. package/dist/src/platform-adapters/renderers/instructions.d.ts +6 -0
  204. package/dist/src/platform-adapters/renderers/instructions.d.ts.map +1 -0
  205. package/dist/src/platform-adapters/renderers/instructions.js +31 -0
  206. package/dist/src/platform-adapters/renderers/instructions.js.map +1 -0
  207. package/dist/src/platform-adapters/renderers/kimi.d.ts +2 -0
  208. package/dist/src/platform-adapters/renderers/kimi.d.ts.map +1 -0
  209. package/dist/src/platform-adapters/renderers/kimi.js +3 -0
  210. package/dist/src/platform-adapters/renderers/kimi.js.map +1 -0
  211. package/dist/src/platform-adapters/renderers/kiro.d.ts +2 -0
  212. package/dist/src/platform-adapters/renderers/kiro.d.ts.map +1 -0
  213. package/dist/src/platform-adapters/renderers/kiro.js +3 -0
  214. package/dist/src/platform-adapters/renderers/kiro.js.map +1 -0
  215. package/dist/src/platform-adapters/renderers/mcp.d.ts +29 -0
  216. package/dist/src/platform-adapters/renderers/mcp.d.ts.map +1 -0
  217. package/dist/src/platform-adapters/renderers/mcp.js +69 -0
  218. package/dist/src/platform-adapters/renderers/mcp.js.map +1 -0
  219. package/dist/src/platform-adapters/renderers/openclaw.d.ts +2 -0
  220. package/dist/src/platform-adapters/renderers/openclaw.d.ts.map +1 -0
  221. package/dist/src/platform-adapters/renderers/openclaw.js +3 -0
  222. package/dist/src/platform-adapters/renderers/openclaw.js.map +1 -0
  223. package/dist/src/platform-adapters/renderers/opencode.d.ts +2 -0
  224. package/dist/src/platform-adapters/renderers/opencode.d.ts.map +1 -0
  225. package/dist/src/platform-adapters/renderers/opencode.js +3 -0
  226. package/dist/src/platform-adapters/renderers/opencode.js.map +1 -0
  227. package/dist/src/platform-adapters/renderers/skills.d.ts +11 -0
  228. package/dist/src/platform-adapters/renderers/skills.d.ts.map +1 -0
  229. package/dist/src/platform-adapters/renderers/skills.js +60 -0
  230. package/dist/src/platform-adapters/renderers/skills.js.map +1 -0
  231. package/dist/src/platform-adapters/renderers/status.d.ts +23 -0
  232. package/dist/src/platform-adapters/renderers/status.d.ts.map +1 -0
  233. package/dist/src/platform-adapters/renderers/status.js +63 -0
  234. package/dist/src/platform-adapters/renderers/status.js.map +1 -0
  235. package/dist/src/platform-adapters/renderers/vscode.d.ts +2 -0
  236. package/dist/src/platform-adapters/renderers/vscode.d.ts.map +1 -0
  237. package/dist/src/platform-adapters/renderers/vscode.js +3 -0
  238. package/dist/src/platform-adapters/renderers/vscode.js.map +1 -0
  239. package/dist/src/platform-adapters/renderers/zed.d.ts +2 -0
  240. package/dist/src/platform-adapters/renderers/zed.d.ts.map +1 -0
  241. package/dist/src/platform-adapters/renderers/zed.js +3 -0
  242. package/dist/src/platform-adapters/renderers/zed.js.map +1 -0
  243. package/dist/src/platform-adapters/types.d.ts +105 -0
  244. package/dist/src/platform-adapters/types.d.ts.map +1 -0
  245. package/dist/src/platform-adapters/types.js +13 -0
  246. package/dist/src/platform-adapters/types.js.map +1 -0
  247. package/dist/src/platform-adapters/verification-ledger.d.ts +8 -0
  248. package/dist/src/platform-adapters/verification-ledger.d.ts.map +1 -0
  249. package/dist/src/platform-adapters/verification-ledger.js +24 -0
  250. package/dist/src/platform-adapters/verification-ledger.js.map +1 -0
  251. package/dist/src/ui/markdown.js +10 -0
  252. package/dist/tsconfig.tsbuildinfo +1 -1
  253. package/package.json +1 -1
  254. package/dist/src/ui/data/mastermind-sessions.json +0 -1
@@ -0,0 +1,209 @@
1
+ /** Safe, format-neutral primitives for Monomind-managed configuration content. */
2
+ function escapeRegExp(value) {
3
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
4
+ }
5
+ function isValidMarker(marker) {
6
+ return marker.trim().length > 0 && marker.trim() === marker && !/[\r\n]/.test(marker);
7
+ }
8
+ function markerBlockPattern(marker) {
9
+ if (!isValidMarker(marker))
10
+ return undefined;
11
+ const escapedMarker = escapeRegExp(marker);
12
+ const commentPrefix = '(?:(?:#|//)\\s*|<!--\\s*)?';
13
+ const suffix = '\\s*(?:-->)?[^\\S\\r\\n]*(?:\\r?\\n|$)';
14
+ return new RegExp(`^[\\t ]*${commentPrefix}monomind:start\\s+${escapedMarker}${suffix}[\\s\\S]*?^[\\t ]*${commentPrefix}monomind:end\\s+${escapedMarker}${suffix}`, 'gm');
15
+ }
16
+ function lineEnding(content) {
17
+ return content.includes('\r\n') ? '\r\n' : '\n';
18
+ }
19
+ function managedBlock(marker, content, eol, comment) {
20
+ const body = content.replace(/\r\n|\r|\n/g, eol).replace(new RegExp(`(?:${eol})+$`), '');
21
+ const start = `${comment} monomind:start ${marker}`;
22
+ const end = `${comment} monomind:end ${marker}`;
23
+ return body.length > 0 ? `${start}${eol}${body}${eol}${end}${eol}` : `${start}${eol}${end}${eol}`;
24
+ }
25
+ /**
26
+ * Adds or replaces one managed marker block. Blocks for other artifacts and
27
+ * platforms are deliberately left untouched.
28
+ */
29
+ export function mergeManagedBlock(existing, marker, content, comment = '#') {
30
+ const pattern = markerBlockPattern(marker);
31
+ if (!pattern)
32
+ return existing;
33
+ const block = managedBlock(marker, content, lineEnding(existing), comment);
34
+ let found = false;
35
+ const merged = existing.replace(pattern, () => {
36
+ if (found)
37
+ return '';
38
+ found = true;
39
+ return block;
40
+ });
41
+ if (found)
42
+ return merged;
43
+ return existing.length === 0 || /(?:\r?\n)$/.test(existing)
44
+ ? `${existing}${block}`
45
+ : `${existing}${lineEnding(existing)}${block}`;
46
+ }
47
+ /** Removes exactly one artifact/platform block, leaving all other content unchanged. */
48
+ export function removeManagedBlock(content, artifact, platform) {
49
+ return removeManagedMarker(content, `${artifact}:${platform}`);
50
+ }
51
+ /** Removes a block by its full marker for artifacts with qualified names. */
52
+ export function removeManagedMarker(content, marker) {
53
+ const pattern = markerBlockPattern(marker);
54
+ return pattern ? content.replace(pattern, '') : content;
55
+ }
56
+ function frontmatterEnd(content) {
57
+ if (!content.startsWith('---\n'))
58
+ return undefined;
59
+ const end = content.indexOf('\n---\n', 4);
60
+ return end === -1 ? undefined : end + '\n---\n'.length;
61
+ }
62
+ function skillName(content) {
63
+ const end = frontmatterEnd(content);
64
+ if (end === undefined)
65
+ return undefined;
66
+ return /^name:\s*([^\s]+)\s*$/m.exec(content.slice(0, end))?.[1];
67
+ }
68
+ /**
69
+ * SKILL.md requires YAML frontmatter to be its first bytes. Keep it outside
70
+ * the managed marker and replace only Monomind's body block. A same-name file
71
+ * may contain user guidance around the block; a different-name file is foreign
72
+ * and is never overwritten by an adapter install.
73
+ */
74
+ export function mergeSkillManagedBlock(existing, marker, rendered) {
75
+ const renderedEnd = frontmatterEnd(rendered);
76
+ const name = skillName(rendered);
77
+ if (renderedEnd === undefined || !name)
78
+ return { content: existing, diagnostics: ['ERROR: rendered skill has invalid frontmatter'] };
79
+ if (!existing) {
80
+ const header = rendered.slice(0, renderedEnd);
81
+ const body = rendered.slice(renderedEnd).replace(/^\n/, '');
82
+ return { content: `${header}${mergeManagedBlock('', marker, body)}`, diagnostics: [] };
83
+ }
84
+ const existingEnd = frontmatterEnd(existing);
85
+ if (existingEnd === undefined || skillName(existing) !== name) {
86
+ return {
87
+ content: existing,
88
+ diagnostics: [`ERROR: foreign SKILL.md prevents installing ${name}`],
89
+ };
90
+ }
91
+ const header = existing.slice(0, existingEnd);
92
+ const body = existing.slice(existingEnd);
93
+ const renderedBody = rendered.slice(renderedEnd).replace(/^\n/, '');
94
+ return { content: `${header}${mergeManagedBlock(body, marker, renderedBody)}`, diagnostics: [] };
95
+ }
96
+ function isJsonObject(value) {
97
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
98
+ }
99
+ function parseJsonObject(content) {
100
+ try {
101
+ const parsed = JSON.parse(content);
102
+ if (isJsonObject(parsed))
103
+ return { value: parsed };
104
+ return { content, diagnostics: ['ERROR: expected a JSON object at the document root'] };
105
+ }
106
+ catch (error) {
107
+ const detail = error instanceof Error ? error.message : String(error);
108
+ return { content, diagnostics: [`ERROR: invalid JSON: ${detail}`] };
109
+ }
110
+ }
111
+ function isSafeJsonResult(value) {
112
+ return !('value' in value);
113
+ }
114
+ function validatePath(path) {
115
+ if (path.length === 0)
116
+ return 'ERROR: named-entry path must contain an entry name';
117
+ if (path.some((segment) => segment.trim().length === 0))
118
+ return 'ERROR: named-entry path segments must not be empty';
119
+ return undefined;
120
+ }
121
+ function jsonIndent(content) {
122
+ const indentation = content.match(/\r?\n([\t ]+)"/u)?.[1];
123
+ if (!indentation)
124
+ return undefined;
125
+ return indentation.includes('\t') ? '\t' : indentation.length;
126
+ }
127
+ function stringifyJson(value, source) {
128
+ const rendered = JSON.stringify(value, null, jsonIndent(source));
129
+ return source.endsWith('\n') ? `${rendered}${lineEnding(source)}` : rendered;
130
+ }
131
+ function normalizeJsonValue(value) {
132
+ try {
133
+ const serialized = JSON.stringify(value);
134
+ if (serialized === undefined)
135
+ return { ok: false, diagnostic: 'ERROR: named-entry value is not JSON serializable' };
136
+ return { ok: true, value: JSON.parse(serialized) };
137
+ }
138
+ catch (error) {
139
+ const detail = error instanceof Error ? error.message : String(error);
140
+ return {
141
+ ok: false,
142
+ diagnostic: `ERROR: named-entry value is not JSON serializable: ${detail}`,
143
+ };
144
+ }
145
+ }
146
+ function sameJsonValue(left, right) {
147
+ return JSON.stringify(left) === JSON.stringify(right);
148
+ }
149
+ function parentForEntry(root, path, createMissing) {
150
+ let current = root;
151
+ for (const segment of path) {
152
+ const child = current[segment];
153
+ if (child === undefined && createMissing) {
154
+ const created = {};
155
+ current[segment] = created;
156
+ current = created;
157
+ continue;
158
+ }
159
+ if (!isJsonObject(child))
160
+ return `ERROR: JSON path segment "${segment}" is not an object`;
161
+ current = child;
162
+ }
163
+ return current;
164
+ }
165
+ /** Merges a named JSON object entry, leaving malformed input unmodified. */
166
+ export function safeJsonMerge(content, path, entry) {
167
+ const pathError = validatePath(path);
168
+ if (pathError)
169
+ return { content, diagnostics: [pathError] };
170
+ const parsed = parseJsonObject(content);
171
+ if (isSafeJsonResult(parsed))
172
+ return parsed;
173
+ const normalizedEntry = normalizeJsonValue(entry);
174
+ if (!normalizedEntry.ok)
175
+ return { content, diagnostics: [normalizedEntry.diagnostic] };
176
+ const parent = parentForEntry(parsed.value, path.slice(0, -1), true);
177
+ if (typeof parent === 'string')
178
+ return { content, diagnostics: [parent] };
179
+ const name = path[path.length - 1];
180
+ if (sameJsonValue(parent[name], normalizedEntry.value))
181
+ return { content, diagnostics: [] };
182
+ parent[name] = normalizedEntry.value;
183
+ return { content: stringifyJson(parsed.value, content), diagnostics: [] };
184
+ }
185
+ /** Convenience form for callers that do not need malformed-input diagnostics. */
186
+ export function mergeNamedEntry(content, path, entry) {
187
+ return safeJsonMerge(content, path, entry).content;
188
+ }
189
+ /** Removes a named JSON object entry, leaving malformed input unmodified. */
190
+ export function safeJsonRemove(content, path, name) {
191
+ const pathError = validatePath([...path, name]);
192
+ if (pathError)
193
+ return { content, diagnostics: [pathError] };
194
+ const parsed = parseJsonObject(content);
195
+ if (isSafeJsonResult(parsed))
196
+ return parsed;
197
+ const parent = parentForEntry(parsed.value, path, false);
198
+ if (typeof parent === 'string')
199
+ return { content, diagnostics: [parent] };
200
+ if (!(name in parent))
201
+ return { content, diagnostics: [] };
202
+ delete parent[name];
203
+ return { content: stringifyJson(parsed.value, content), diagnostics: [] };
204
+ }
205
+ /** Convenience form for callers that do not need malformed-input diagnostics. */
206
+ export function removeNamedEntry(content, path, name) {
207
+ return safeJsonRemove(content, path, name).content;
208
+ }
209
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/platform-adapters/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /** Detection and safe cleanup rules for pre-adapter platform installations. */
2
+ export interface LegacySurface {
3
+ id: string;
4
+ path: string;
5
+ scope: 'project' | 'user';
6
+ ownership: 'marker' | 'named-entry' | 'monomind-file';
7
+ action: 'remove-block' | 'remove-entry' | 'remove-file' | 'migrate';
8
+ }
9
+ export interface LegacyMigrationResult {
10
+ changed: readonly string[];
11
+ skipped: readonly string[];
12
+ diagnostics: readonly string[];
13
+ }
14
+ /**
15
+ * Every surface is explicit so detection can remain read-only and never infer
16
+ * ownership from an arbitrary file name or config location.
17
+ */
18
+ export declare const LEGACY_SURFACE_INVENTORY: readonly LegacySurface[];
19
+ export declare function isMonomindOwned(content: string): boolean;
20
+ export declare function findLegacySurfaces(root: string, scope: 'project' | 'user'): string[];
21
+ /** Remove only old marker blocks; callers retain unrelated content and keys. */
22
+ export declare function removeLegacyManagedBlocks(content: string): string;
23
+ /** Recover a YAML file corrupted by the historical HTML comment installer. */
24
+ export declare function deCorruptAiderYaml(content: string): string;
25
+ export declare function migrateLegacyArtifacts(root: string, scope: 'project' | 'user', options?: {
26
+ dryRun?: boolean;
27
+ removeLegacy?: boolean;
28
+ /** Called before a verified legacy artifact is changed or removed. */
29
+ beforeWrite?: (path: string) => void;
30
+ }): LegacyMigrationResult;
31
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/platform-adapters/migration.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAc/E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,SAAS,EAAE,QAAQ,GAAG,aAAa,GAAG,eAAe,CAAC;IACtD,MAAM,EAAE,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,SAAS,CAAC;CACrE;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,aAAa,EA2J3D,CAAC;AAEH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE,CAapF;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOjE;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM1D;AA4GD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,GAAG,MAAM,EACzB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GACL,qBAAqB,CAgHvB"}
@@ -0,0 +1,402 @@
1
+ /** Detection and safe cleanup rules for pre-adapter platform installations. */
2
+ import { existsSync, mkdirSync, readFileSync, rmSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { mergeManagedBlock, removeManagedMarker } from './merge.js';
5
+ /**
6
+ * Every surface is explicit so detection can remain read-only and never infer
7
+ * ownership from an arbitrary file name or config location.
8
+ */
9
+ export const LEGACY_SURFACE_INVENTORY = Object.freeze([
10
+ {
11
+ id: 'codex-sessionstart',
12
+ path: '.codex/config.toml',
13
+ scope: 'user',
14
+ ownership: 'marker',
15
+ action: 'remove-block',
16
+ },
17
+ {
18
+ id: 'codex-activate-script',
19
+ path: '.codex/monomind-activate.cjs',
20
+ scope: 'user',
21
+ ownership: 'monomind-file',
22
+ action: 'remove-file',
23
+ },
24
+ {
25
+ id: 'cursor-sessionstart',
26
+ path: '.cursor/settings.json',
27
+ scope: 'project',
28
+ ownership: 'named-entry',
29
+ action: 'remove-entry',
30
+ },
31
+ {
32
+ id: 'cursor-activate-script',
33
+ path: '.cursor/monomind-activate.cjs',
34
+ scope: 'user',
35
+ ownership: 'monomind-file',
36
+ action: 'remove-file',
37
+ },
38
+ {
39
+ id: 'antigravity-plugin',
40
+ path: '.gemini/antigravity-cli/plugins/monomind',
41
+ scope: 'user',
42
+ ownership: 'monomind-file',
43
+ action: 'remove-file',
44
+ },
45
+ {
46
+ id: 'shared-agent-skills',
47
+ path: '.agents/skills',
48
+ scope: 'project',
49
+ ownership: 'monomind-file',
50
+ action: 'remove-file',
51
+ },
52
+ {
53
+ id: 'shared-gemini-skills',
54
+ path: '.gemini/skills',
55
+ scope: 'user',
56
+ ownership: 'monomind-file',
57
+ action: 'remove-file',
58
+ },
59
+ {
60
+ id: 'openclaw-config',
61
+ path: '.claw/config.md',
62
+ scope: 'project',
63
+ ownership: 'marker',
64
+ action: 'migrate',
65
+ },
66
+ {
67
+ id: 'cursor-rules',
68
+ path: '.cursorrules',
69
+ scope: 'project',
70
+ ownership: 'marker',
71
+ action: 'remove-block',
72
+ },
73
+ {
74
+ id: 'droid-instructions',
75
+ path: 'DROID.md',
76
+ scope: 'project',
77
+ ownership: 'marker',
78
+ action: 'remove-block',
79
+ },
80
+ {
81
+ id: 'antigravity-rules',
82
+ path: '.agents/rules/monomind.md',
83
+ scope: 'project',
84
+ ownership: 'marker',
85
+ action: 'remove-block',
86
+ },
87
+ {
88
+ id: 'trae-rules',
89
+ path: '.trae/rules/monomind.md',
90
+ scope: 'project',
91
+ ownership: 'marker',
92
+ action: 'migrate',
93
+ },
94
+ {
95
+ id: 'hermes-instructions',
96
+ path: 'HERMES.md',
97
+ scope: 'project',
98
+ ownership: 'marker',
99
+ action: 'remove-block',
100
+ },
101
+ {
102
+ id: 'kiro-steering',
103
+ path: '.kiro/steering/monomind.md',
104
+ scope: 'project',
105
+ ownership: 'marker',
106
+ action: 'migrate',
107
+ },
108
+ {
109
+ id: 'aider-corrupted-yaml',
110
+ path: '.aider.conf.yml',
111
+ scope: 'project',
112
+ ownership: 'marker',
113
+ action: 'migrate',
114
+ },
115
+ {
116
+ id: 'bare-instruction-markers',
117
+ path: 'AGENTS.md',
118
+ scope: 'project',
119
+ ownership: 'marker',
120
+ action: 'migrate',
121
+ },
122
+ {
123
+ id: 'claude-bare-instruction-markers',
124
+ path: 'CLAUDE.md',
125
+ scope: 'project',
126
+ ownership: 'marker',
127
+ action: 'migrate',
128
+ },
129
+ {
130
+ id: 'gemini-bare-instruction-markers',
131
+ path: 'GEMINI.md',
132
+ scope: 'project',
133
+ ownership: 'marker',
134
+ action: 'migrate',
135
+ },
136
+ {
137
+ id: 'copilot-bare-instruction-markers',
138
+ path: '.github/copilot-instructions.md',
139
+ scope: 'project',
140
+ ownership: 'marker',
141
+ action: 'migrate',
142
+ },
143
+ {
144
+ id: 'cursor-bare-instruction-markers',
145
+ path: '.cursor/rules/monomind.mdc',
146
+ scope: 'project',
147
+ ownership: 'marker',
148
+ action: 'migrate',
149
+ },
150
+ {
151
+ id: 'claude-global-instructions',
152
+ path: '.claude/CLAUDE.md',
153
+ scope: 'user',
154
+ ownership: 'marker',
155
+ action: 'remove-block',
156
+ },
157
+ {
158
+ id: 'claude-global-sessionstart',
159
+ path: '.claude/settings.json',
160
+ scope: 'user',
161
+ ownership: 'named-entry',
162
+ action: 'remove-entry',
163
+ },
164
+ ]);
165
+ export function isMonomindOwned(content) {
166
+ return /(?:<!--\s*)?monomind:start|monomind-activate|name:\s*mastermind(?:-|$)/i.test(content);
167
+ }
168
+ export function findLegacySurfaces(root, scope) {
169
+ return LEGACY_SURFACE_INVENTORY.filter((surface) => surface.scope === scope)
170
+ .filter((surface) => {
171
+ const path = join(root, surface.path);
172
+ if (!existsSync(path))
173
+ return false;
174
+ if (surface.ownership === 'monomind-file')
175
+ return true;
176
+ try {
177
+ return isMonomindOwned(readFileSync(path, 'utf8'));
178
+ }
179
+ catch {
180
+ return false;
181
+ }
182
+ })
183
+ .map((surface) => surface.id);
184
+ }
185
+ /** Remove only old marker blocks; callers retain unrelated content and keys. */
186
+ export function removeLegacyManagedBlocks(content) {
187
+ return removeManagedMarker(removeManagedMarker(content, 'instructions:codex'), 'instructions:opencode')
188
+ .replace(/\n?<!--\s*monomind:start\s*-->[\s\S]*?<!--\s*monomind:end\s*-->\n?/g, '\n')
189
+ .replace(/\n?#\s*monomind:start\s*[\s\S]*?#\s*monomind:end\s*\n?/g, '\n');
190
+ }
191
+ /** Recover a YAML file corrupted by the historical HTML comment installer. */
192
+ export function deCorruptAiderYaml(content) {
193
+ const cleaned = content
194
+ .replace(/\n?<!--\s*monomind:start\s*-->[\s\S]*?<!--\s*monomind:end\s*-->\n?/g, '\n')
195
+ .trimEnd();
196
+ if (/^read:\s*/m.test(cleaned))
197
+ return `${cleaned}\n`;
198
+ return `${cleaned ? `${cleaned}\n` : ''}read: CONVENTIONS.md\n`;
199
+ }
200
+ const BARE_BLOCK = /(?:<!--\s*)?monomind:start\s*-->(?:\r?\n)?([\s\S]*?)(?:<!--\s*)?monomind:end\s*-->(?:\r?\n)?/i;
201
+ const HASH_BARE_BLOCK = /#\s*monomind:start\s*(?:\r?\n)?([\s\S]*?)#\s*monomind:end\s*(?:\r?\n)?/i;
202
+ function takeLegacyBlock(content) {
203
+ const match = BARE_BLOCK.exec(content) ?? HASH_BARE_BLOCK.exec(content);
204
+ if (!match)
205
+ return undefined;
206
+ return {
207
+ body: match[1].trim(),
208
+ remainder: `${content.slice(0, match.index)}${content.slice(match.index + match[0].length)}`,
209
+ };
210
+ }
211
+ function instructionMarker(surface, body) {
212
+ switch (surface.id) {
213
+ case 'trae-rules':
214
+ return 'instructions:trae';
215
+ case 'kiro-steering':
216
+ return 'instructions:kiro';
217
+ case 'claude-bare-instruction-markers':
218
+ return 'instructions:claude';
219
+ case 'gemini-bare-instruction-markers':
220
+ return 'instructions:gemini';
221
+ case 'copilot-bare-instruction-markers':
222
+ return 'instructions:copilot';
223
+ case 'cursor-bare-instruction-markers':
224
+ return 'instructions:cursor';
225
+ case 'bare-instruction-markers':
226
+ // AGENTS.md is shared by several runtimes. Old installs did not retain
227
+ // their writer id, so use only an explicit self-identification; the
228
+ // conservative Codex fallback matches the legacy Codex writer.
229
+ if (/\bopencode\b/i.test(body))
230
+ return 'instructions:opencode';
231
+ if (/\bdroid\b/i.test(body))
232
+ return 'instructions:droid';
233
+ if (/\bopenclaw\b/i.test(body))
234
+ return 'instructions:openclaw';
235
+ if (/\bkimi\b/i.test(body))
236
+ return 'instructions:kimi';
237
+ return 'instructions:codex';
238
+ default:
239
+ return undefined;
240
+ }
241
+ }
242
+ function writeMigratedInstructions(root, surface, original, beforeWrite) {
243
+ const extracted = takeLegacyBlock(original);
244
+ if (!extracted)
245
+ return { changed: false, paths: [] };
246
+ if (surface.id === 'openclaw-config') {
247
+ const target = join(root, 'AGENTS.md');
248
+ const targetContent = existsSync(target) ? readFileSync(target, 'utf8') : '';
249
+ const migrated = mergeManagedBlock(targetContent, 'instructions:openclaw', extracted.body);
250
+ beforeWrite?.(target);
251
+ mkdirSync(dirname(target), { recursive: true });
252
+ writeFileSync(target, migrated, 'utf8');
253
+ beforeWrite?.(join(root, surface.path));
254
+ writeFileSync(join(root, surface.path), extracted.remainder, 'utf8');
255
+ return { changed: true, paths: ['AGENTS.md', surface.path] };
256
+ }
257
+ const marker = instructionMarker(surface, extracted.body);
258
+ if (!marker)
259
+ return { changed: false, paths: [] };
260
+ const migrated = mergeManagedBlock(extracted.remainder, marker, extracted.body);
261
+ beforeWrite?.(join(root, surface.path));
262
+ writeFileSync(join(root, surface.path), migrated, 'utf8');
263
+ return { changed: true, paths: [surface.path] };
264
+ }
265
+ function isOwnedScript(path) {
266
+ try {
267
+ return /monomind|mastermind/i.test(readFileSync(path, 'utf8'));
268
+ }
269
+ catch {
270
+ return false;
271
+ }
272
+ }
273
+ function removeLegacyCursorHook(content) {
274
+ try {
275
+ const parsed = JSON.parse(content);
276
+ const hooks = parsed.hooks;
277
+ if (!hooks || typeof hooks !== 'object' || Array.isArray(hooks))
278
+ return { content, changed: false };
279
+ const entries = hooks.SessionStart;
280
+ if (!Array.isArray(entries))
281
+ return { content, changed: false };
282
+ const retained = entries.filter((entry) => !JSON.stringify(entry).includes('monomind-activate'));
283
+ if (retained.length === entries.length)
284
+ return { content, changed: false };
285
+ hooks.SessionStart = retained;
286
+ return { content: `${JSON.stringify(parsed, null, 2)}\n`, changed: true };
287
+ }
288
+ catch {
289
+ return {
290
+ content,
291
+ changed: false,
292
+ diagnostic: 'ERROR: cursor legacy settings are malformed; left unchanged',
293
+ };
294
+ }
295
+ }
296
+ export function migrateLegacyArtifacts(root, scope, options = {}) {
297
+ const changed = [];
298
+ const skipped = [];
299
+ const diagnostics = [];
300
+ for (const surface of LEGACY_SURFACE_INVENTORY.filter((item) => item.scope === scope)) {
301
+ const path = join(root, surface.path);
302
+ if (!existsSync(path)) {
303
+ skipped.push(surface.path);
304
+ continue;
305
+ }
306
+ if (surface.id === 'shared-agent-skills' || surface.id === 'shared-gemini-skills') {
307
+ // The current manifest has no consumer-reference record. Preserve the
308
+ // shared root and every package until one exists instead of guessing
309
+ // whether another adapter still owns it.
310
+ skipped.push(surface.path);
311
+ continue;
312
+ }
313
+ if (surface.ownership === 'monomind-file') {
314
+ if (statSync(path).isDirectory()) {
315
+ const manifest = join(path, 'plugin.json');
316
+ if (!existsSync(manifest) || !isOwnedScript(manifest)) {
317
+ skipped.push(surface.path);
318
+ continue;
319
+ }
320
+ if (!options.dryRun) {
321
+ options.beforeWrite?.(path);
322
+ rmSync(path, { recursive: true, force: false });
323
+ }
324
+ }
325
+ else {
326
+ if (!isOwnedScript(path)) {
327
+ skipped.push(surface.path);
328
+ continue;
329
+ }
330
+ if (!options.dryRun) {
331
+ options.beforeWrite?.(path);
332
+ unlinkSync(path);
333
+ }
334
+ }
335
+ changed.push(surface.path);
336
+ continue;
337
+ }
338
+ const original = readFileSync(path, 'utf8');
339
+ if (!isMonomindOwned(original)) {
340
+ skipped.push(surface.path);
341
+ continue;
342
+ }
343
+ if (surface.id === 'cursor-sessionstart' || surface.id === 'claude-global-sessionstart') {
344
+ const cursor = removeLegacyCursorHook(original);
345
+ if (cursor.diagnostic)
346
+ diagnostics.push(cursor.diagnostic);
347
+ if (!cursor.changed) {
348
+ skipped.push(surface.path);
349
+ continue;
350
+ }
351
+ if (!options.dryRun) {
352
+ options.beforeWrite?.(path);
353
+ writeFileSync(path, cursor.content, 'utf8');
354
+ }
355
+ changed.push(surface.path);
356
+ continue;
357
+ }
358
+ if (surface.id === 'aider-corrupted-yaml') {
359
+ const next = deCorruptAiderYaml(original);
360
+ if (next === original) {
361
+ skipped.push(surface.path);
362
+ continue;
363
+ }
364
+ if (!options.dryRun) {
365
+ options.beforeWrite?.(path);
366
+ writeFileSync(path, next, 'utf8');
367
+ }
368
+ changed.push(surface.path);
369
+ continue;
370
+ }
371
+ if (surface.action === 'migrate') {
372
+ if (options.dryRun) {
373
+ const extracted = takeLegacyBlock(original);
374
+ if (!extracted) {
375
+ skipped.push(surface.path);
376
+ continue;
377
+ }
378
+ changed.push(surface.path);
379
+ continue;
380
+ }
381
+ const migrated = writeMigratedInstructions(root, surface, original, options.beforeWrite);
382
+ if (!migrated.changed) {
383
+ skipped.push(surface.path);
384
+ continue;
385
+ }
386
+ changed.push(...migrated.paths);
387
+ continue;
388
+ }
389
+ const next = removeLegacyManagedBlocks(original);
390
+ if (next === original) {
391
+ skipped.push(surface.path);
392
+ continue;
393
+ }
394
+ if (!options.dryRun) {
395
+ options.beforeWrite?.(path);
396
+ writeFileSync(path, next, 'utf8');
397
+ }
398
+ changed.push(surface.path);
399
+ }
400
+ return { changed, skipped, diagnostics };
401
+ }
402
+ //# sourceMappingURL=migration.js.map