contextos-agents 1.6.1 → 2.0.0-beta.2

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 (323) hide show
  1. package/.agents/AGENTS.md +6 -1
  2. package/.agents/adapters/aider/export.js +117 -97
  3. package/.agents/adapters/claude/export.js +68 -26
  4. package/.agents/adapters/copilot/export.js +90 -51
  5. package/.agents/adapters/cursor/export.js +83 -68
  6. package/.agents/adapters/drift-detector.js +196 -0
  7. package/.agents/adapters/gemini/export.js +76 -45
  8. package/.agents/adapters/pure-compiler.js +443 -0
  9. package/.agents/adapters/zed/export.js +109 -62
  10. package/.agents/compiled/registry.v2.json +504 -0
  11. package/.agents/compiled/registry.v2.sha256 +1 -0
  12. package/.agents/compiler/manifest-compiler.js +963 -0
  13. package/.agents/compiler/vendor/yaml.LICENSE.txt +13 -0
  14. package/.agents/compiler/vendor/yaml.SBOM.json +6 -0
  15. package/.agents/compiler/vendor/yaml.js +139 -0
  16. package/.agents/core/profiles/init.yaml +25 -0
  17. package/.agents/core/skills/context-manager/references/context-rules.md +59 -0
  18. package/.agents/core/skills/context-manager/skill.yaml +10 -5
  19. package/.agents/core/skills/context-os/SKILL.md +3 -6
  20. package/.agents/core/skills/context-os/skill.yaml +14 -8
  21. package/.agents/core/skills/engineering-workflow/SKILL.md +1 -1
  22. package/.agents/core/skills/engineering-workflow/skill.yaml +7 -7
  23. package/.agents/core/skills/gemini-precision/SKILL.md +4 -0
  24. package/.agents/core/skills/gemini-precision/skill.yaml +5 -6
  25. package/.agents/core/skills/gstack-roles/SKILL.md +3 -1
  26. package/.agents/core/skills/gstack-roles/skill.yaml +9 -6
  27. package/.agents/core/skills/ponytail-mindset/skill.yaml +7 -7
  28. package/.agents/core/skills/security/skill.yaml +21 -2
  29. package/.agents/ctx.js +587 -111
  30. package/.agents/customization-dx.js +282 -0
  31. package/.agents/doctor.js +877 -33
  32. package/.agents/filesystem/index.js +71 -0
  33. package/.agents/filesystem/journaled-transaction.js +451 -0
  34. package/.agents/filesystem/lockfile-v2.js +275 -0
  35. package/.agents/filesystem/platform-hardening.js +222 -0
  36. package/.agents/filesystem/project-lock.js +218 -0
  37. package/.agents/filesystem/safe-path.js +256 -0
  38. package/.agents/generated/claude/skills/context-os/SKILL.md +1 -1
  39. package/.agents/generated/claude/skills/engineering-workflow/SKILL.md +1 -1
  40. package/.agents/generated/claude/skills/gemini-precision/SKILL.md +4 -0
  41. package/.agents/generated/claude/skills/gstack-roles/SKILL.md +3 -1
  42. package/.agents/generated/gemini/skills/context-os/SKILL.md +2 -2
  43. package/.agents/generated/gemini/skills/engineering-workflow/SKILL.md +1 -1
  44. package/.agents/generated/gemini/skills/gemini-precision/SKILL.md +4 -0
  45. package/.agents/generated/gemini/skills/gstack-roles/SKILL.md +3 -1
  46. package/.agents/plugins/contextos/hooks.json +25 -0
  47. package/.agents/plugins/contextos/plugin.json +19 -0
  48. package/.agents/plugins.js +432 -73
  49. package/.agents/profiles.js +507 -46
  50. package/.agents/resolver.js +50 -414
  51. package/.agents/schemas/attestation.review.v1.json +111 -0
  52. package/.agents/schemas/attestation.verification.v1.json +85 -0
  53. package/.agents/schemas/lockfile.v2.schema.json +134 -0
  54. package/.agents/schemas/profile.v2.schema.json +114 -0
  55. package/.agents/schemas/runtime.thread.v1.json +192 -0
  56. package/.agents/schemas/skill.manifest.v2.json +177 -0
  57. package/.agents/schemas/verification.spec.v1.json +39 -0
  58. package/.agents/schemas/workspace.graph.schema.json +106 -0
  59. package/.agents/stats.js +22 -9
  60. package/.agents/transaction-core/event-store.js +288 -0
  61. package/.agents/transaction-core/idempotency.js +129 -0
  62. package/.agents/transaction-core/ipc-lock.js +311 -0
  63. package/.agents/transaction-core/plugin-supply-chain-bundle.js +436 -0
  64. package/.agents/validate.js +143 -14
  65. package/.agents/watch.js +354 -102
  66. package/.agents/workspace/workspace-graph.js +778 -0
  67. package/README.md +59 -387
  68. package/benchmarks/v2/analysis/statistics.js +140 -0
  69. package/benchmarks/v2/analysis/stats.js +69 -0
  70. package/benchmarks/v2/arms/arm-definitions.js +79 -0
  71. package/benchmarks/v2/dataset.schema.json +34 -0
  72. package/benchmarks/v2/evaluators/index.js +25 -0
  73. package/benchmarks/v2/evaluators/verified-success.js +116 -0
  74. package/benchmarks/v2/harness/runner.js +88 -0
  75. package/benchmarks/v2/pilot-tasks.json +392 -0
  76. package/bin/commands/recover.js +88 -0
  77. package/bin/commands/uninstall.js +207 -0
  78. package/bin/commands/update.js +325 -0
  79. package/bin/commands.js +342 -0
  80. package/bin/index.js +326 -149
  81. package/bin/lib/detector.js +106 -0
  82. package/bin/lib/lockfile.js +253 -0
  83. package/bin/lib/safe-writer.js +290 -0
  84. package/package.json +85 -73
  85. package/registry.json +15 -7
  86. package/registry.schema.json +3 -1
  87. package/registry.v2.schema.json +86 -0
  88. package/.agents/core/profiles/backend.yaml +0 -47
  89. package/.agents/core/profiles/enterprise.yaml +0 -46
  90. package/.agents/core/profiles/frontend.yaml +0 -46
  91. package/.agents/core/profiles/hackathon.yaml +0 -45
  92. package/.agents/core/profiles/mvp.yaml +0 -44
  93. package/.agents/core/profiles/startup.yaml +0 -48
  94. package/.agents/core/skills/adapters/EXAMPLES.md +0 -19
  95. package/.agents/core/skills/adapters/SKILL.md +0 -105
  96. package/.agents/core/skills/adapters/TROUBLESHOOTING.md +0 -7
  97. package/.agents/core/skills/adapters/VALIDATION.json +0 -12
  98. package/.agents/core/skills/adapters/skill.yaml +0 -10
  99. package/.agents/core/skills/architecture-diagrams/SKILL.md +0 -108
  100. package/.agents/core/skills/architecture-diagrams/VALIDATION.json +0 -12
  101. package/.agents/core/skills/architecture-diagrams/skill.yaml +0 -8
  102. package/.agents/core/skills/brutalist-design/SKILL.md +0 -150
  103. package/.agents/core/skills/brutalist-design/VALIDATION.json +0 -12
  104. package/.agents/core/skills/brutalist-design/skill.yaml +0 -8
  105. package/.agents/core/skills/database/EXAMPLES.md +0 -74
  106. package/.agents/core/skills/database/SKILL.md +0 -101
  107. package/.agents/core/skills/database/TROUBLESHOOTING.md +0 -18
  108. package/.agents/core/skills/database/VALIDATION.json +0 -11
  109. package/.agents/core/skills/database/skill.yaml +0 -25
  110. package/.agents/core/skills/ddd/EXAMPLES.md +0 -42
  111. package/.agents/core/skills/ddd/SKILL.md +0 -247
  112. package/.agents/core/skills/ddd/TROUBLESHOOTING.md +0 -19
  113. package/.agents/core/skills/ddd/VALIDATION.json +0 -12
  114. package/.agents/core/skills/ddd/ddd.md +0 -178
  115. package/.agents/core/skills/ddd/skill.yaml +0 -10
  116. package/.agents/core/skills/decisions/EXAMPLES.md +0 -35
  117. package/.agents/core/skills/decisions/SKILL.md +0 -90
  118. package/.agents/core/skills/decisions/TROUBLESHOOTING.md +0 -13
  119. package/.agents/core/skills/decisions/VALIDATION.json +0 -12
  120. package/.agents/core/skills/decisions/skill.yaml +0 -10
  121. package/.agents/core/skills/docker/EXAMPLES.md +0 -56
  122. package/.agents/core/skills/docker/SKILL.md +0 -63
  123. package/.agents/core/skills/docker/TROUBLESHOOTING.md +0 -18
  124. package/.agents/core/skills/docker/VALIDATION.json +0 -11
  125. package/.agents/core/skills/docker/skill.yaml +0 -23
  126. package/.agents/core/skills/fastapi/EXAMPLES.md +0 -36
  127. package/.agents/core/skills/fastapi/SKILL.md +0 -148
  128. package/.agents/core/skills/fastapi/TROUBLESHOOTING.md +0 -19
  129. package/.agents/core/skills/fastapi/VALIDATION.json +0 -12
  130. package/.agents/core/skills/fastapi/fastapi.md +0 -112
  131. package/.agents/core/skills/fastapi/skill.yaml +0 -10
  132. package/.agents/core/skills/generators/EXAMPLES.md +0 -19
  133. package/.agents/core/skills/generators/SKILL.md +0 -112
  134. package/.agents/core/skills/generators/TROUBLESHOOTING.md +0 -7
  135. package/.agents/core/skills/generators/VALIDATION.json +0 -12
  136. package/.agents/core/skills/generators/skill.yaml +0 -10
  137. package/.agents/core/skills/generators/templates/API.md +0 -77
  138. package/.agents/core/skills/generators/templates/ARCHITECTURE.md +0 -70
  139. package/.agents/core/skills/generators/templates/DATABASE.md +0 -42
  140. package/.agents/core/skills/generators/templates/DECISION.md +0 -46
  141. package/.agents/core/skills/generators/templates/PRD.md +0 -67
  142. package/.agents/core/skills/generators/templates/PROJECT_GRAPH.md +0 -56
  143. package/.agents/core/skills/generators/templates/ROADMAP.md +0 -51
  144. package/.agents/core/skills/generators/templates/TASKS.md +0 -43
  145. package/.agents/core/skills/generators/templates/UI.md +0 -73
  146. package/.agents/core/skills/graphify/EXAMPLES.md +0 -73
  147. package/.agents/core/skills/graphify/SKILL.md +0 -130
  148. package/.agents/core/skills/graphify/VALIDATION.json +0 -12
  149. package/.agents/core/skills/graphify/skill.yaml +0 -13
  150. package/.agents/core/skills/impeccable-design/EXAMPLES.md +0 -26
  151. package/.agents/core/skills/impeccable-design/SKILL.md +0 -201
  152. package/.agents/core/skills/impeccable-design/TROUBLESHOOTING.md +0 -19
  153. package/.agents/core/skills/impeccable-design/VALIDATION.json +0 -12
  154. package/.agents/core/skills/impeccable-design/skill.yaml +0 -14
  155. package/.agents/core/skills/interview-me/SKILL.md +0 -97
  156. package/.agents/core/skills/interview-me/VALIDATION.json +0 -12
  157. package/.agents/core/skills/interview-me/skill.yaml +0 -8
  158. package/.agents/core/skills/microservices/EXAMPLES.md +0 -38
  159. package/.agents/core/skills/microservices/SKILL.md +0 -164
  160. package/.agents/core/skills/microservices/TROUBLESHOOTING.md +0 -19
  161. package/.agents/core/skills/microservices/VALIDATION.json +0 -12
  162. package/.agents/core/skills/microservices/microservices.md +0 -119
  163. package/.agents/core/skills/microservices/skill.yaml +0 -10
  164. package/.agents/core/skills/minimalist-design/SKILL.md +0 -113
  165. package/.agents/core/skills/minimalist-design/VALIDATION.json +0 -12
  166. package/.agents/core/skills/minimalist-design/skill.yaml +0 -8
  167. package/.agents/core/skills/nestjs/EXAMPLES.md +0 -40
  168. package/.agents/core/skills/nestjs/SKILL.md +0 -139
  169. package/.agents/core/skills/nestjs/TROUBLESHOOTING.md +0 -19
  170. package/.agents/core/skills/nestjs/VALIDATION.json +0 -12
  171. package/.agents/core/skills/nestjs/nestjs.md +0 -103
  172. package/.agents/core/skills/nestjs/skill.yaml +0 -10
  173. package/.agents/core/skills/nextjs/EXAMPLES.md +0 -40
  174. package/.agents/core/skills/nextjs/SKILL.md +0 -163
  175. package/.agents/core/skills/nextjs/TROUBLESHOOTING.md +0 -19
  176. package/.agents/core/skills/nextjs/VALIDATION.json +0 -12
  177. package/.agents/core/skills/nextjs/nextjs.md +0 -67
  178. package/.agents/core/skills/nextjs/skill.yaml +0 -10
  179. package/.agents/core/skills/node/EXAMPLES.md +0 -80
  180. package/.agents/core/skills/node/SKILL.md +0 -128
  181. package/.agents/core/skills/node/TROUBLESHOOTING.md +0 -19
  182. package/.agents/core/skills/node/VALIDATION.json +0 -12
  183. package/.agents/core/skills/node/node.md +0 -87
  184. package/.agents/core/skills/node/skill.yaml +0 -10
  185. package/.agents/core/skills/performance/EXAMPLES.md +0 -30
  186. package/.agents/core/skills/performance/SKILL.md +0 -75
  187. package/.agents/core/skills/performance/TROUBLESHOOTING.md +0 -19
  188. package/.agents/core/skills/performance/VALIDATION.json +0 -12
  189. package/.agents/core/skills/performance/performance.md +0 -52
  190. package/.agents/core/skills/performance/skill.yaml +0 -10
  191. package/.agents/core/skills/react/EXAMPLES.md +0 -79
  192. package/.agents/core/skills/react/SKILL.md +0 -132
  193. package/.agents/core/skills/react/TROUBLESHOOTING.md +0 -19
  194. package/.agents/core/skills/react/VALIDATION.json +0 -12
  195. package/.agents/core/skills/react/react.md +0 -93
  196. package/.agents/core/skills/react/skill.yaml +0 -10
  197. package/.agents/core/skills/react-best-practices/SKILL.md +0 -155
  198. package/.agents/core/skills/react-best-practices/VALIDATION.json +0 -12
  199. package/.agents/core/skills/react-best-practices/skill.yaml +0 -10
  200. package/.agents/core/skills/redesign-audit/SKILL.md +0 -117
  201. package/.agents/core/skills/redesign-audit/VALIDATION.json +0 -12
  202. package/.agents/core/skills/redesign-audit/skill.yaml +0 -8
  203. package/.agents/core/skills/soft-design/SKILL.md +0 -108
  204. package/.agents/core/skills/soft-design/VALIDATION.json +0 -12
  205. package/.agents/core/skills/soft-design/skill.yaml +0 -8
  206. package/.agents/core/skills/state-management/EXAMPLES.md +0 -56
  207. package/.agents/core/skills/state-management/SKILL.md +0 -48
  208. package/.agents/core/skills/state-management/TROUBLESHOOTING.md +0 -18
  209. package/.agents/core/skills/state-management/VALIDATION.json +0 -11
  210. package/.agents/core/skills/state-management/skill.yaml +0 -22
  211. package/.agents/core/skills/subagent-orchestrator/SKILL.md +0 -100
  212. package/.agents/core/skills/subagent-orchestrator/VALIDATION.json +0 -12
  213. package/.agents/core/skills/subagent-orchestrator/skill.yaml +0 -8
  214. package/.agents/core/skills/system-design/EXAMPLES.md +0 -75
  215. package/.agents/core/skills/system-design/SKILL.md +0 -419
  216. package/.agents/core/skills/system-design/TROUBLESHOOTING.md +0 -19
  217. package/.agents/core/skills/system-design/VALIDATION.json +0 -12
  218. package/.agents/core/skills/system-design/skill.yaml +0 -13
  219. package/.agents/core/skills/system-design/system-design.md +0 -112
  220. package/.agents/core/skills/testing/EXAMPLES.md +0 -71
  221. package/.agents/core/skills/testing/SKILL.md +0 -70
  222. package/.agents/core/skills/testing/TROUBLESHOOTING.md +0 -18
  223. package/.agents/core/skills/testing/VALIDATION.json +0 -11
  224. package/.agents/core/skills/testing/skill.yaml +0 -26
  225. package/.agents/core/skills/typescript/EXAMPLES.md +0 -64
  226. package/.agents/core/skills/typescript/SKILL.md +0 -112
  227. package/.agents/core/skills/typescript/TROUBLESHOOTING.md +0 -19
  228. package/.agents/core/skills/typescript/VALIDATION.json +0 -12
  229. package/.agents/core/skills/typescript/skill.yaml +0 -10
  230. package/.agents/core/skills/typescript/typescript.md +0 -71
  231. package/.agents/core/skills/ui-design/EXAMPLES.md +0 -21
  232. package/.agents/core/skills/ui-design/SKILL.md +0 -124
  233. package/.agents/core/skills/ui-design/TROUBLESHOOTING.md +0 -19
  234. package/.agents/core/skills/ui-design/VALIDATION.json +0 -12
  235. package/.agents/core/skills/ui-design/skill.yaml +0 -10
  236. package/.agents/core/skills/ui-design/ui.md +0 -88
  237. package/.agents/core/skills/ui-ux-pro/EXAMPLES.md +0 -62
  238. package/.agents/core/skills/ui-ux-pro/SKILL.md +0 -375
  239. package/.agents/core/skills/ui-ux-pro/TROUBLESHOOTING.md +0 -19
  240. package/.agents/core/skills/ui-ux-pro/VALIDATION.json +0 -12
  241. package/.agents/core/skills/ui-ux-pro/skill.yaml +0 -13
  242. package/.agents/core/skills/ux-design/EXAMPLES.md +0 -36
  243. package/.agents/core/skills/ux-design/SKILL.md +0 -116
  244. package/.agents/core/skills/ux-design/TROUBLESHOOTING.md +0 -19
  245. package/.agents/core/skills/ux-design/VALIDATION.json +0 -12
  246. package/.agents/core/skills/ux-design/skill.yaml +0 -10
  247. package/.agents/core/skills/ux-design/ux.md +0 -80
  248. package/.agents/core/skills/vercel-optimize/SKILL.md +0 -83
  249. package/.agents/core/skills/vercel-optimize/VALIDATION.json +0 -12
  250. package/.agents/core/skills/vercel-optimize/skill.yaml +0 -10
  251. package/.agents/core/skills/web-accessibility/EXAMPLES.md +0 -39
  252. package/.agents/core/skills/web-accessibility/SKILL.md +0 -170
  253. package/.agents/core/skills/web-accessibility/TROUBLESHOOTING.md +0 -19
  254. package/.agents/core/skills/web-accessibility/VALIDATION.json +0 -12
  255. package/.agents/core/skills/web-accessibility/accessibility.md +0 -63
  256. package/.agents/core/skills/web-accessibility/skill.yaml +0 -10
  257. package/.agents/generated/claude/skills/adapters/SKILL.md +0 -126
  258. package/.agents/generated/claude/skills/architecture-diagrams/SKILL.md +0 -101
  259. package/.agents/generated/claude/skills/brutalist-design/SKILL.md +0 -145
  260. package/.agents/generated/claude/skills/database/SKILL.md +0 -191
  261. package/.agents/generated/claude/skills/ddd/SKILL.md +0 -305
  262. package/.agents/generated/claude/skills/decisions/SKILL.md +0 -134
  263. package/.agents/generated/claude/skills/docker/SKILL.md +0 -135
  264. package/.agents/generated/claude/skills/fastapi/SKILL.md +0 -200
  265. package/.agents/generated/claude/skills/generators/SKILL.md +0 -133
  266. package/.agents/generated/claude/skills/graphify/SKILL.md +0 -198
  267. package/.agents/generated/claude/skills/impeccable-design/SKILL.md +0 -241
  268. package/.agents/generated/claude/skills/interview-me/SKILL.md +0 -90
  269. package/.agents/generated/claude/skills/microservices/SKILL.md +0 -218
  270. package/.agents/generated/claude/skills/minimalist-design/SKILL.md +0 -108
  271. package/.agents/generated/claude/skills/nestjs/SKILL.md +0 -195
  272. package/.agents/generated/claude/skills/nextjs/SKILL.md +0 -219
  273. package/.agents/generated/claude/skills/node/SKILL.md +0 -224
  274. package/.agents/generated/claude/skills/performance/SKILL.md +0 -121
  275. package/.agents/generated/claude/skills/react/SKILL.md +0 -227
  276. package/.agents/generated/claude/skills/react-best-practices/SKILL.md +0 -146
  277. package/.agents/generated/claude/skills/redesign-audit/SKILL.md +0 -112
  278. package/.agents/generated/claude/skills/soft-design/SKILL.md +0 -103
  279. package/.agents/generated/claude/skills/state-management/SKILL.md +0 -120
  280. package/.agents/generated/claude/skills/subagent-orchestrator/SKILL.md +0 -93
  281. package/.agents/generated/claude/skills/system-design/SKILL.md +0 -507
  282. package/.agents/generated/claude/skills/testing/SKILL.md +0 -157
  283. package/.agents/generated/claude/skills/typescript/SKILL.md +0 -192
  284. package/.agents/generated/claude/skills/ui-design/SKILL.md +0 -161
  285. package/.agents/generated/claude/skills/ui-ux-pro/SKILL.md +0 -451
  286. package/.agents/generated/claude/skills/ux-design/SKILL.md +0 -168
  287. package/.agents/generated/claude/skills/vercel-optimize/SKILL.md +0 -76
  288. package/.agents/generated/claude/skills/web-accessibility/SKILL.md +0 -225
  289. package/.agents/generated/gemini/skills/adapters/SKILL.md +0 -135
  290. package/.agents/generated/gemini/skills/architecture-diagrams/SKILL.md +0 -107
  291. package/.agents/generated/gemini/skills/brutalist-design/SKILL.md +0 -151
  292. package/.agents/generated/gemini/skills/database/SKILL.md +0 -200
  293. package/.agents/generated/gemini/skills/ddd/SKILL.md +0 -314
  294. package/.agents/generated/gemini/skills/decisions/SKILL.md +0 -143
  295. package/.agents/generated/gemini/skills/docker/SKILL.md +0 -144
  296. package/.agents/generated/gemini/skills/fastapi/SKILL.md +0 -209
  297. package/.agents/generated/gemini/skills/generators/SKILL.md +0 -142
  298. package/.agents/generated/gemini/skills/graphify/SKILL.md +0 -205
  299. package/.agents/generated/gemini/skills/impeccable-design/SKILL.md +0 -250
  300. package/.agents/generated/gemini/skills/interview-me/SKILL.md +0 -96
  301. package/.agents/generated/gemini/skills/microservices/SKILL.md +0 -227
  302. package/.agents/generated/gemini/skills/minimalist-design/SKILL.md +0 -114
  303. package/.agents/generated/gemini/skills/nestjs/SKILL.md +0 -204
  304. package/.agents/generated/gemini/skills/nextjs/SKILL.md +0 -298
  305. package/.agents/generated/gemini/skills/node/SKILL.md +0 -323
  306. package/.agents/generated/gemini/skills/performance/SKILL.md +0 -185
  307. package/.agents/generated/gemini/skills/react/SKILL.md +0 -332
  308. package/.agents/generated/gemini/skills/react-best-practices/SKILL.md +0 -152
  309. package/.agents/generated/gemini/skills/redesign-audit/SKILL.md +0 -118
  310. package/.agents/generated/gemini/skills/soft-design/SKILL.md +0 -109
  311. package/.agents/generated/gemini/skills/state-management/SKILL.md +0 -129
  312. package/.agents/generated/gemini/skills/subagent-orchestrator/SKILL.md +0 -99
  313. package/.agents/generated/gemini/skills/system-design/SKILL.md +0 -631
  314. package/.agents/generated/gemini/skills/testing/SKILL.md +0 -166
  315. package/.agents/generated/gemini/skills/typescript/SKILL.md +0 -275
  316. package/.agents/generated/gemini/skills/ui-design/SKILL.md +0 -170
  317. package/.agents/generated/gemini/skills/ui-ux-pro/SKILL.md +0 -460
  318. package/.agents/generated/gemini/skills/ux-design/SKILL.md +0 -177
  319. package/.agents/generated/gemini/skills/vercel-optimize/SKILL.md +0 -82
  320. package/.agents/generated/gemini/skills/web-accessibility/SKILL.md +0 -300
  321. package/.agents/mcp/runtime.py +0 -470
  322. package/.agents/mcp/server.mjs +0 -189271
  323. package/benchmarks/gemini-issues.js +0 -533
@@ -0,0 +1,106 @@
1
+ /**
2
+ * bin/lib/detector.js
3
+ * ContextOS — Full Stack & IDE Environment Detector
4
+ *
5
+ * Inspects the target repository to detect:
6
+ * 1. Project tech stack (Next.js, React, NestJS, FastAPI, etc.)
7
+ * 2. Active developer IDE / agent tools (Cursor, Claude, Zed, VSCode Copilot, Gemini)
8
+ * 3. Recommended profile and auto-export adapter targets
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+ const profiles = require('../../.agents/profiles.js');
16
+
17
+ /**
18
+ * Detects active IDEs and AI assistant configs in the project.
19
+ *
20
+ * @param {string} [projectDir=process.cwd()] - Project directory
21
+ * @returns {{ detected: string[], recommendedAgents: string[] }}
22
+ */
23
+ function detectIdeEnvironment(projectDir = process.cwd()) {
24
+ const detected = [];
25
+ const recommendedAgents = new Set();
26
+
27
+ // 1. Cursor
28
+ if (fs.existsSync(path.join(projectDir, '.cursor')) ||
29
+ fs.existsSync(path.join(projectDir, '.cursorrules')) ||
30
+ fs.existsSync(path.join(projectDir, '.cursor', 'rules'))) {
31
+ detected.push('Cursor');
32
+ recommendedAgents.add('cursor');
33
+ }
34
+
35
+ // 2. Claude Code
36
+ if (fs.existsSync(path.join(projectDir, 'CLAUDE.md')) ||
37
+ fs.existsSync(path.join(projectDir, '.claude'))) {
38
+ detected.push('Claude Code');
39
+ recommendedAgents.add('claude');
40
+ }
41
+
42
+ // 3. Zed
43
+ if (fs.existsSync(path.join(projectDir, '.zed'))) {
44
+ detected.push('Zed');
45
+ recommendedAgents.add('zed');
46
+ }
47
+
48
+ // 4. GitHub Copilot / VSCode
49
+ if (fs.existsSync(path.join(projectDir, '.github', 'copilot-instructions.md')) ||
50
+ fs.existsSync(path.join(projectDir, '.vscode'))) {
51
+ detected.push('GitHub Copilot');
52
+ recommendedAgents.add('copilot');
53
+ }
54
+
55
+ // 5. Aider
56
+ if (fs.existsSync(path.join(projectDir, '.aider.conf.yml')) ||
57
+ fs.existsSync(path.join(projectDir, 'CONVENTIONS.md'))) {
58
+ detected.push('Aider');
59
+ recommendedAgents.add('aider');
60
+ }
61
+
62
+ // 6. Gemini / Antigravity
63
+ if (fs.existsSync(path.join(projectDir, '.gemini')) ||
64
+ fs.existsSync(path.join(projectDir, 'GEMINI.md'))) {
65
+ detected.push('Google Gemini / Antigravity');
66
+ recommendedAgents.add('gemini');
67
+ }
68
+
69
+ // Default agent is gemini if none detected
70
+ if (recommendedAgents.size === 0) {
71
+ recommendedAgents.add('gemini');
72
+ }
73
+
74
+ return {
75
+ detected,
76
+ recommendedAgents: Array.from(recommendedAgents),
77
+ };
78
+ }
79
+
80
+ /**
81
+ * Performs unified tech stack and IDE environment detection.
82
+ *
83
+ * @param {string} [projectDir=process.cwd()] - Project directory
84
+ * @returns {Object} Full detection report
85
+ */
86
+ function detectProjectAttributes(projectDir = process.cwd()) {
87
+ const stack = profiles.detectStack(projectDir);
88
+ const ide = detectIdeEnvironment(projectDir);
89
+
90
+ return {
91
+ stack,
92
+ ide,
93
+ summary: {
94
+ technologies: stack.detected.length ? stack.detected : ['Generic JavaScript'],
95
+ ides: ide.detected.length ? ide.detected : ['Standard IDE'],
96
+ recommendedProfile: stack.recommendedProfile,
97
+ recommendedAgents: ide.recommendedAgents,
98
+ recommendedSkills: stack.recommendedSkills,
99
+ },
100
+ };
101
+ }
102
+
103
+ module.exports = {
104
+ detectIdeEnvironment,
105
+ detectProjectAttributes,
106
+ };
@@ -0,0 +1,253 @@
1
+ /**
2
+ * bin/lib/lockfile.js
3
+ * ContextOS Lockfile Engine & Provenance Tracking (schemaVersion: 1)
4
+ *
5
+ * Tracks files managed by ContextOS installations to ensure:
6
+ * - Zero data loss during updates (never overwrite user-modified files)
7
+ * - Safe uninstallation (never delete user-created files or modified managed files)
8
+ * - Transparent provenance for adapters and generated files
9
+ */
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ const crypto = require('crypto');
14
+
15
+ const LOCKFILE_REL_PATH = '.agents/contextos.lock.json';
16
+
17
+ /**
18
+ * Normalize a relative path to standard POSIX-style relative path without leading ./
19
+ * e.g. ".agents\\core\\skills" -> ".agents/core/skills"
20
+ */
21
+ function normalizePath(relPath) {
22
+ if (!relPath) return '';
23
+ return relPath
24
+ .replace(/\\/g, '/')
25
+ .replace(/^\.\//, '')
26
+ .replace(/^\//, '');
27
+ }
28
+
29
+ /**
30
+ * Compute SHA-256 hash of a string or buffer.
31
+ * Automatically normalizes CRLF line endings to LF to ensure cross-platform reproducibility.
32
+ */
33
+ function computeHash(content) {
34
+ if (content === null || content === undefined) return '';
35
+ const normalized = typeof content === 'string'
36
+ ? content.replace(/\r\n/g, '\n')
37
+ : content;
38
+ return crypto.createHash('sha256').update(normalized).digest('hex');
39
+ }
40
+
41
+ /**
42
+ * Read a file and compute its SHA-256 hash (with CRLF normalization).
43
+ * Returns null if file does not exist or cannot be read.
44
+ */
45
+ function computeFileHash(filePath) {
46
+ try {
47
+ if (!fs.existsSync(filePath)) return null;
48
+ const content = fs.readFileSync(filePath, 'utf8');
49
+ return computeHash(content);
50
+ } catch {
51
+ return null;
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Create a fresh lockfile data structure.
57
+ */
58
+ function createLockfileData(options = {}) {
59
+ return {
60
+ schemaVersion: 1,
61
+ installedPackage: options.installedPackage || 'contextos-agents',
62
+ version: options.version || '1.7.1',
63
+ selectedProfile: options.selectedProfile || 'default',
64
+ installedAt: options.installedAt || new Date().toISOString(),
65
+ managedFiles: options.managedFiles ? { ...options.managedFiles } : {},
66
+ };
67
+ }
68
+
69
+ /**
70
+ * Record a managed file entry in the lockfile data.
71
+ */
72
+ function recordManagedFile(lockData, relPath, contentOrHash) {
73
+ if (!lockData || !relPath) return;
74
+ const norm = normalizePath(relPath);
75
+ const hash = typeof contentOrHash === 'string' && contentOrHash.length === 64 && /^[0-9a-f]{64}$/i.test(contentOrHash)
76
+ ? contentOrHash.toLowerCase()
77
+ : computeHash(contentOrHash);
78
+
79
+ lockData.managedFiles[norm] = {
80
+ sha256: hash,
81
+ managed: true,
82
+ };
83
+ }
84
+
85
+ /**
86
+ * Load and parse the lockfile from target project directory.
87
+ * Returns null if lockfile does not exist or is invalid.
88
+ */
89
+ function loadLockfile(projectDir) {
90
+ try {
91
+ const lockfilePath = path.join(projectDir, LOCKFILE_REL_PATH);
92
+ if (!fs.existsSync(lockfilePath)) return null;
93
+
94
+ const raw = fs.readFileSync(lockfilePath, 'utf8');
95
+ const parsed = JSON.parse(raw);
96
+
97
+ if (parsed && parsed.schemaVersion === 1 && typeof parsed.managedFiles === 'object') {
98
+ return parsed;
99
+ }
100
+ return null;
101
+ } catch {
102
+ return null;
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Save lockfile data to target project directory atomically.
108
+ */
109
+ function saveLockfile(projectDir, lockData) {
110
+ const lockfilePath = path.join(projectDir, LOCKFILE_REL_PATH);
111
+ const lockfileDir = path.dirname(lockfilePath);
112
+
113
+ if (!fs.existsSync(lockfileDir)) {
114
+ fs.mkdirSync(lockfileDir, { recursive: true });
115
+ }
116
+
117
+ const tmpPath = `${lockfilePath}.tmp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
118
+ const content = JSON.stringify(lockData, null, 2) + '\n';
119
+
120
+ try {
121
+ fs.writeFileSync(tmpPath, content, 'utf8');
122
+ fs.renameSync(tmpPath, lockfilePath);
123
+ } catch (err) {
124
+ try {
125
+ if (fs.existsSync(tmpPath)) fs.unlinkSync(tmpPath);
126
+ } catch {}
127
+ const atomicError = new Error(`Atomic lockfile update failed; original lockfile was preserved: ${err.message}`);
128
+ atomicError.code = 'CTX_LOCKFILE_ATOMIC_WRITE_FAILED';
129
+ atomicError.cause = err;
130
+ throw atomicError;
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Check if a given relative path is tracked as a managed file in the lockfile.
136
+ */
137
+ function isManagedFile(lockData, relPath) {
138
+ if (!lockData || !lockData.managedFiles) return false;
139
+ const norm = normalizePath(relPath);
140
+ return Boolean(lockData.managedFiles[norm]?.managed);
141
+ }
142
+
143
+ /**
144
+ * Check if a managed file has been modified by the user compared to its recorded installation hash.
145
+ * Returns false if file is unmanaged or does not exist on disk.
146
+ */
147
+ function isFileModified(projectDir, relPath, lockData) {
148
+ if (!lockData || !lockData.managedFiles) return false;
149
+ const norm = normalizePath(relPath);
150
+ const entry = lockData.managedFiles[norm];
151
+
152
+ if (!entry || !entry.managed) return false;
153
+
154
+ const fullPath = path.join(projectDir, norm);
155
+ if (!fs.existsSync(fullPath)) return false;
156
+
157
+ const diskHash = computeFileHash(fullPath);
158
+ if (!diskHash) return false;
159
+
160
+ return diskHash !== entry.sha256;
161
+ }
162
+
163
+ /**
164
+ * Classify a file into an explicit lifecycle state:
165
+ * - 'UNMANAGED': File not present in lockfile (e.g. user-created skill or config)
166
+ * - 'MANAGED_CLEAN': File present in lockfile and content matches installation hash
167
+ * - 'MANAGED_MODIFIED': File present in lockfile but modified on disk by user
168
+ * - 'MISSING': File present in lockfile but not found on disk
169
+ */
170
+ function classifyFile(projectDir, relPath, lockData) {
171
+ const norm = normalizePath(relPath);
172
+ const fullPath = path.join(projectDir, norm);
173
+ const exists = fs.existsSync(fullPath);
174
+ const managed = isManagedFile(lockData, norm);
175
+
176
+ if (!managed) return 'UNMANAGED';
177
+ if (!exists) return 'MISSING';
178
+
179
+ return isFileModified(projectDir, norm, lockData) ? 'MANAGED_MODIFIED' : 'MANAGED_CLEAN';
180
+ }
181
+
182
+ /**
183
+ * Safe migration helper for existing installations that lack a lockfile.
184
+ * Recursively scans target project's .agents directory, compares each file
185
+ * against the distribution sourceDir.
186
+ *
187
+ * ONLY files whose content hash exactly matches the distribution source are
188
+ * claimed as managed. User custom skills or edited files are left unmanaged.
189
+ */
190
+ function migrateExistingInstallation(projectDir, sourceAgentsDir, options = {}) {
191
+ const targetAgentsDir = path.join(projectDir, '.agents');
192
+ const lockData = createLockfileData(options);
193
+
194
+ if (!fs.existsSync(targetAgentsDir)) {
195
+ if (!options.inMemory && !options.dryRun) {
196
+ saveLockfile(projectDir, lockData);
197
+ }
198
+ return lockData;
199
+ }
200
+
201
+ function walk(currentDir) {
202
+ let entries;
203
+ try {
204
+ entries = fs.readdirSync(currentDir, { withFileTypes: true });
205
+ } catch {
206
+ return;
207
+ }
208
+
209
+ for (const entry of entries) {
210
+ const fullPath = path.join(currentDir, entry.name);
211
+ if (entry.isDirectory()) {
212
+ walk(fullPath);
213
+ } else if (entry.isFile()) {
214
+ // Skip lockfile itself
215
+ if (entry.name === 'contextos.lock.json') continue;
216
+
217
+ const relToAgents = path.relative(targetAgentsDir, fullPath).replace(/\\/g, '/');
218
+ const relToProject = `.agents/${relToAgents}`;
219
+
220
+ const sourceFile = path.join(sourceAgentsDir, relToAgents);
221
+ if (fs.existsSync(sourceFile) && fs.statSync(sourceFile).isFile()) {
222
+ const targetHash = computeFileHash(fullPath);
223
+ const sourceHash = computeFileHash(sourceFile);
224
+
225
+ if (targetHash && sourceHash && targetHash === sourceHash) {
226
+ recordManagedFile(lockData, relToProject, targetHash);
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+
233
+ walk(targetAgentsDir);
234
+ if (!options.inMemory && !options.dryRun) {
235
+ saveLockfile(projectDir, lockData);
236
+ }
237
+ return lockData;
238
+ }
239
+
240
+ module.exports = {
241
+ LOCKFILE_REL_PATH,
242
+ normalizePath,
243
+ computeHash,
244
+ computeFileHash,
245
+ createLockfileData,
246
+ recordManagedFile,
247
+ loadLockfile,
248
+ saveLockfile,
249
+ isManagedFile,
250
+ isFileModified,
251
+ classifyFile,
252
+ migrateExistingInstallation,
253
+ };
@@ -0,0 +1,290 @@
1
+ /**
2
+ * bin/lib/safe-writer.js
3
+ * Safe Atomic File Writer & Conflict Management for ContextOS
4
+ *
5
+ * Implements non-destructive file writes and uninstalls:
6
+ * - Classified actions: CREATE, UPDATE, CONFLICT, SKIP, DELETE
7
+ * - Unmanaged user-created files are NEVER touched or deleted
8
+ * - User-modified managed files trigger sidecar (.contextos.new) without overwriting user work
9
+ * - Atomic write via temporary file + rename with rollback on failure
10
+ */
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const {
15
+ normalizePath,
16
+ computeHash,
17
+ computeFileHash,
18
+ classifyFile,
19
+ recordManagedFile,
20
+ isManagedFile,
21
+ } = require('./lockfile.js');
22
+
23
+ /**
24
+ * Atomically write content to a file with directory creation and rollback.
25
+ */
26
+ function atomicWriteFile(targetPath, content) {
27
+ const dir = path.dirname(targetPath);
28
+ if (!fs.existsSync(dir)) {
29
+ fs.mkdirSync(dir, { recursive: true });
30
+ }
31
+
32
+ const tmpPath = `${targetPath}.tmp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
33
+ try {
34
+ fs.writeFileSync(tmpPath, content, 'utf8');
35
+
36
+ let renamed = false;
37
+ let lastError = null;
38
+ const maxRetries = 3;
39
+ const delays = [10, 50, 100];
40
+
41
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
42
+ try {
43
+ fs.renameSync(tmpPath, targetPath);
44
+ renamed = true;
45
+ break;
46
+ } catch (renameErr) {
47
+ lastError = renameErr;
48
+ // Check for transient locking errors common on Windows (EPERM, EBUSY, EACCES)
49
+ const isTransient = renameErr.code === 'EPERM' || renameErr.code === 'EBUSY' || renameErr.code === 'EACCES';
50
+ if (isTransient && attempt < maxRetries) {
51
+ const waitMs = delays[attempt];
52
+ try {
53
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, waitMs);
54
+ } catch {
55
+ const start = Date.now();
56
+ while (Date.now() - start < waitMs) {}
57
+ }
58
+ } else {
59
+ break;
60
+ }
61
+ }
62
+ }
63
+
64
+ if (!renamed) {
65
+ throw lastError || new Error(`Failed to atomically rename ${tmpPath} to ${targetPath}`);
66
+ }
67
+ } catch (err) {
68
+ try {
69
+ if (fs.existsSync(tmpPath)) fs.unlinkSync(tmpPath);
70
+ } catch {}
71
+ throw err;
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Clean up empty parent directories up to the .agents boundary.
77
+ */
78
+ function cleanEmptyParentDirectories(filePath) {
79
+ let currentDir = path.dirname(filePath);
80
+ while (
81
+ currentDir &&
82
+ currentDir.includes('.agents') &&
83
+ !currentDir.endsWith('.agents') &&
84
+ !currentDir.endsWith('.agents/') &&
85
+ !currentDir.endsWith('.agents\\')
86
+ ) {
87
+ try {
88
+ const entries = fs.readdirSync(currentDir);
89
+ if (entries.length === 0) {
90
+ fs.rmdirSync(currentDir);
91
+ currentDir = path.dirname(currentDir);
92
+ } else {
93
+ break;
94
+ }
95
+ } catch {
96
+ break;
97
+ }
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Plan a file write operation against the current filesystem and lockfile state.
103
+ *
104
+ * Returns an ActionPlan:
105
+ * - 'CREATE': File does not exist on disk yet
106
+ * - 'SKIP': File exists and is either already identical ('UP_TO_DATE') or user-created ('UNMANAGED_USER_FILE')
107
+ * - 'UPDATE': Clean managed file with updated content
108
+ * - 'CONFLICT': Managed file that the user has customized; writes to .contextos.new
109
+ */
110
+ function planFileWrite({ projectDir, relPath, content, lockData, options = {} }) {
111
+ const normRel = normalizePath(relPath);
112
+ const fullPath = path.join(projectDir, normRel);
113
+ const newHash = computeHash(content);
114
+
115
+ if (!fs.existsSync(fullPath)) {
116
+ return {
117
+ action: 'CREATE',
118
+ relPath: normRel,
119
+ targetPath: fullPath,
120
+ newContent: content,
121
+ newHash,
122
+ reason: 'NEW_FILE',
123
+ };
124
+ }
125
+
126
+ const classification = classifyFile(projectDir, normRel, lockData);
127
+
128
+ if (classification === 'UNMANAGED') {
129
+ return {
130
+ action: 'SKIP',
131
+ relPath: normRel,
132
+ targetPath: fullPath,
133
+ reason: 'UNMANAGED_USER_FILE',
134
+ };
135
+ }
136
+
137
+ if (classification === 'MANAGED_MODIFIED') {
138
+ const conflictFullPath = `${fullPath}.contextos.new`;
139
+ const conflictRelPath = `${normRel}.contextos.new`;
140
+ return {
141
+ action: 'CONFLICT',
142
+ relPath: normRel,
143
+ targetPath: fullPath,
144
+ conflictFullPath,
145
+ conflictPath: conflictRelPath,
146
+ newContent: content,
147
+ newHash,
148
+ reason: 'USER_MODIFIED',
149
+ };
150
+ }
151
+
152
+ // MANAGED_CLEAN: check if content changed
153
+ const diskHash = computeFileHash(fullPath);
154
+ if (diskHash === newHash) {
155
+ return {
156
+ action: 'SKIP',
157
+ relPath: normRel,
158
+ targetPath: fullPath,
159
+ reason: 'UP_TO_DATE',
160
+ };
161
+ }
162
+
163
+ return {
164
+ action: 'UPDATE',
165
+ relPath: normRel,
166
+ targetPath: fullPath,
167
+ newContent: content,
168
+ oldHash: diskHash,
169
+ newHash,
170
+ reason: 'CONTENT_UPDATED',
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Execute a planned file write operation.
176
+ */
177
+ function executeFileWrite(planItem, lockData, { dryRun = false } = {}) {
178
+ if (dryRun) {
179
+ return { ...planItem, executed: false, dryRun: true };
180
+ }
181
+
182
+ if (planItem.action === 'SKIP') {
183
+ return { ...planItem, executed: false };
184
+ }
185
+
186
+ if (planItem.action === 'CREATE' || planItem.action === 'UPDATE') {
187
+ atomicWriteFile(planItem.targetPath, planItem.newContent);
188
+ if (lockData) {
189
+ recordManagedFile(lockData, planItem.relPath, planItem.newHash || planItem.newContent);
190
+ }
191
+ return { ...planItem, executed: true };
192
+ }
193
+
194
+ if (planItem.action === 'CONFLICT') {
195
+ const conflictTarget = planItem.conflictFullPath || `${planItem.targetPath}.contextos.new`;
196
+ atomicWriteFile(conflictTarget, planItem.newContent);
197
+ return {
198
+ ...planItem,
199
+ executed: true,
200
+ conflictPath: planItem.conflictPath || `${planItem.relPath}.contextos.new`,
201
+ };
202
+ }
203
+
204
+ return { ...planItem, executed: false };
205
+ }
206
+
207
+ /**
208
+ * Plan a file deletion operation during uninstall or cleanup.
209
+ *
210
+ * Returns ActionPlan:
211
+ * - 'DELETE': Managed file whose disk content matches installation hash (clean)
212
+ * - 'SKIP': File is unmanaged ('UNMANAGED_USER_FILE'), modified by user ('USER_MODIFIED_PRESERVED'),
213
+ * or already gone ('ALREADY_MISSING').
214
+ */
215
+ function planFileDelete({ projectDir, relPath, lockData, options = {} }) {
216
+ const normRel = normalizePath(relPath);
217
+ const fullPath = path.join(projectDir, normRel);
218
+ const classification = classifyFile(projectDir, normRel, lockData);
219
+
220
+ if (classification === 'UNMANAGED') {
221
+ return {
222
+ action: 'SKIP',
223
+ relPath: normRel,
224
+ targetPath: fullPath,
225
+ reason: 'UNMANAGED_USER_FILE',
226
+ };
227
+ }
228
+
229
+ if (classification === 'MANAGED_MODIFIED') {
230
+ return {
231
+ action: 'SKIP',
232
+ relPath: normRel,
233
+ targetPath: fullPath,
234
+ reason: 'USER_MODIFIED_PRESERVED',
235
+ };
236
+ }
237
+
238
+ if (classification === 'MISSING') {
239
+ return {
240
+ action: 'SKIP',
241
+ relPath: normRel,
242
+ targetPath: fullPath,
243
+ reason: 'ALREADY_MISSING',
244
+ };
245
+ }
246
+
247
+ return {
248
+ action: 'DELETE',
249
+ relPath: normRel,
250
+ targetPath: fullPath,
251
+ reason: 'MANAGED_CLEAN',
252
+ };
253
+ }
254
+
255
+ /**
256
+ * Execute a planned file deletion operation.
257
+ */
258
+ function executeFileDelete(planItem, lockData, { dryRun = false } = {}) {
259
+ if (dryRun) {
260
+ return { ...planItem, executed: false, dryRun: true };
261
+ }
262
+
263
+ if (planItem.action === 'DELETE') {
264
+ if (fs.existsSync(planItem.targetPath)) {
265
+ try {
266
+ fs.unlinkSync(planItem.targetPath);
267
+ } catch (err) {
268
+ return { ...planItem, executed: false, error: err.message };
269
+ }
270
+ }
271
+
272
+ if (lockData && lockData.managedFiles) {
273
+ delete lockData.managedFiles[planItem.relPath];
274
+ }
275
+
276
+ cleanEmptyParentDirectories(planItem.targetPath);
277
+ return { ...planItem, executed: true };
278
+ }
279
+
280
+ return { ...planItem, executed: false };
281
+ }
282
+
283
+ module.exports = {
284
+ atomicWriteFile,
285
+ planFileWrite,
286
+ executeFileWrite,
287
+ planFileDelete,
288
+ executeFileDelete,
289
+ cleanEmptyParentDirectories,
290
+ };