@trac3r/oh-my-god 2.2.11

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 (638) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/INSTALL-VERIFICATION-INDEX.md +51 -0
  3. package/LICENSE +21 -0
  4. package/OMG-setup.sh +2549 -0
  5. package/QUICK-REFERENCE.md +58 -0
  6. package/README.md +207 -0
  7. package/agents/__init__.py +1 -0
  8. package/agents/__pycache__/model_roles.cpython-313.pyc +0 -0
  9. package/agents/_model_roles.yaml +26 -0
  10. package/agents/designer.md +67 -0
  11. package/agents/explore.md +60 -0
  12. package/agents/model_roles.py +196 -0
  13. package/agents/omg-api-builder.md +23 -0
  14. package/agents/omg-architect-mode.md +41 -0
  15. package/agents/omg-architect.md +13 -0
  16. package/agents/omg-backend-engineer.md +41 -0
  17. package/agents/omg-critic.md +16 -0
  18. package/agents/omg-database-engineer.md +41 -0
  19. package/agents/omg-escalation-router.md +17 -0
  20. package/agents/omg-executor.md +12 -0
  21. package/agents/omg-frontend-designer.md +41 -0
  22. package/agents/omg-implement-mode.md +49 -0
  23. package/agents/omg-infra-engineer.md +41 -0
  24. package/agents/omg-qa-tester.md +16 -0
  25. package/agents/omg-research-mode.md +41 -0
  26. package/agents/omg-security-auditor.md +41 -0
  27. package/agents/omg-testing-engineer.md +41 -0
  28. package/agents/plan.md +80 -0
  29. package/agents/quick_task.md +64 -0
  30. package/agents/reviewer.md +83 -0
  31. package/agents/task.md +71 -0
  32. package/bin/omg +41 -0
  33. package/commands/OMG:ai-commit.md +113 -0
  34. package/commands/OMG:api-twin.md +22 -0
  35. package/commands/OMG:arch.md +313 -0
  36. package/commands/OMG:browser.md +29 -0
  37. package/commands/OMG:ccg.md +22 -0
  38. package/commands/OMG:compat.md +57 -0
  39. package/commands/OMG:cost.md +181 -0
  40. package/commands/OMG:crazy.md +125 -0
  41. package/commands/OMG:create-agent.md +183 -0
  42. package/commands/OMG:deep-plan.md +18 -0
  43. package/commands/OMG:deps.md +248 -0
  44. package/commands/OMG:diagnose-plugins.md +33 -0
  45. package/commands/OMG:doctor.md +37 -0
  46. package/commands/OMG:domain-init.md +11 -0
  47. package/commands/OMG:escalate.md +52 -0
  48. package/commands/OMG:forge.md +103 -0
  49. package/commands/OMG:health-check.md +48 -0
  50. package/commands/OMG:init.md +134 -0
  51. package/commands/OMG:issue.md +56 -0
  52. package/commands/OMG:mode.md +44 -0
  53. package/commands/OMG:playwright.md +17 -0
  54. package/commands/OMG:preflight.md +26 -0
  55. package/commands/OMG:preset.md +49 -0
  56. package/commands/OMG:profile-review.md +58 -0
  57. package/commands/OMG:project-init.md +11 -0
  58. package/commands/OMG:ralph-start.md +43 -0
  59. package/commands/OMG:ralph-stop.md +23 -0
  60. package/commands/OMG:security-check.md +28 -0
  61. package/commands/OMG:session-branch.md +101 -0
  62. package/commands/OMG:session-fork.md +57 -0
  63. package/commands/OMG:session-merge.md +138 -0
  64. package/commands/OMG:setup.md +82 -0
  65. package/commands/OMG:ship.md +18 -0
  66. package/commands/OMG:stats.md +225 -0
  67. package/commands/OMG:teams.md +54 -0
  68. package/commands/OMG:theme.md +44 -0
  69. package/commands/OMG:validate.md +59 -0
  70. package/commands/__init__.py +1 -0
  71. package/docs/command-surface.md +55 -0
  72. package/docs/install/claude-code.md +53 -0
  73. package/docs/install/codex.md +45 -0
  74. package/docs/install/gemini.md +43 -0
  75. package/docs/install/github-action.md +81 -0
  76. package/docs/install/github-app-required-checks.md +107 -0
  77. package/docs/install/github-app.md +161 -0
  78. package/docs/install/kimi.md +43 -0
  79. package/docs/install/opencode.md +38 -0
  80. package/docs/proof.md +182 -0
  81. package/hooks/__init__.py +0 -0
  82. package/hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  83. package/hooks/__pycache__/_agent_registry.cpython-313.pyc +0 -0
  84. package/hooks/__pycache__/_analytics.cpython-313.pyc +0 -0
  85. package/hooks/__pycache__/_budget.cpython-313.pyc +0 -0
  86. package/hooks/__pycache__/_common.cpython-313.pyc +0 -0
  87. package/hooks/__pycache__/_compression_optimizer.cpython-313.pyc +0 -0
  88. package/hooks/__pycache__/_cost_ledger.cpython-313.pyc +0 -0
  89. package/hooks/__pycache__/_learnings.cpython-313.pyc +0 -0
  90. package/hooks/__pycache__/_memory.cpython-313.pyc +0 -0
  91. package/hooks/__pycache__/_post_write.cpython-313.pyc +0 -0
  92. package/hooks/__pycache__/_protected_context.cpython-313.pyc +0 -0
  93. package/hooks/__pycache__/_token_counter.cpython-313.pyc +0 -0
  94. package/hooks/__pycache__/branch_manager.cpython-313.pyc +0 -0
  95. package/hooks/__pycache__/budget_governor.cpython-313.pyc +0 -0
  96. package/hooks/__pycache__/circuit-breaker.cpython-313.pyc +0 -0
  97. package/hooks/__pycache__/compression_feedback.cpython-313.pyc +0 -0
  98. package/hooks/__pycache__/config-guard.cpython-313.pyc +0 -0
  99. package/hooks/__pycache__/context_pressure.cpython-313.pyc +0 -0
  100. package/hooks/__pycache__/credential_store.cpython-313.pyc +0 -0
  101. package/hooks/__pycache__/fetch-rate-limits.cpython-313.pyc +0 -0
  102. package/hooks/__pycache__/firewall.cpython-313.pyc +0 -0
  103. package/hooks/__pycache__/hashline-formatter-bridge.cpython-313.pyc +0 -0
  104. package/hooks/__pycache__/hashline-injector.cpython-313.pyc +0 -0
  105. package/hooks/__pycache__/hashline-validator.cpython-313.pyc +0 -0
  106. package/hooks/__pycache__/idle-detector.cpython-313.pyc +0 -0
  107. package/hooks/__pycache__/instructions-loaded.cpython-313.pyc +0 -0
  108. package/hooks/__pycache__/intentgate-keyword-detector.cpython-313.pyc +0 -0
  109. package/hooks/__pycache__/magic-keyword-router.cpython-313.pyc +0 -0
  110. package/hooks/__pycache__/policy_engine.cpython-313.pyc +0 -0
  111. package/hooks/__pycache__/post-tool-failure.cpython-313.pyc +0 -0
  112. package/hooks/__pycache__/post-write.cpython-313.pyc +0 -0
  113. package/hooks/__pycache__/post_write.cpython-313.pyc +0 -0
  114. package/hooks/__pycache__/pre-compact.cpython-313.pyc +0 -0
  115. package/hooks/__pycache__/pre-tool-inject.cpython-313.pyc +0 -0
  116. package/hooks/__pycache__/prompt-enhancer.cpython-313.pyc +0 -0
  117. package/hooks/__pycache__/quality-runner.cpython-313.pyc +0 -0
  118. package/hooks/__pycache__/query.cpython-313.pyc +0 -0
  119. package/hooks/__pycache__/secret-guard.cpython-313.pyc +0 -0
  120. package/hooks/__pycache__/secret_audit.cpython-313.pyc +0 -0
  121. package/hooks/__pycache__/security_validators.cpython-313.pyc +0 -0
  122. package/hooks/__pycache__/session-end-capture.cpython-313.pyc +0 -0
  123. package/hooks/__pycache__/session-start.cpython-313.pyc +0 -0
  124. package/hooks/__pycache__/setup_wizard.cpython-313.pyc +0 -0
  125. package/hooks/__pycache__/shadow_manager.cpython-313.pyc +0 -0
  126. package/hooks/__pycache__/state_migration.cpython-313.pyc +0 -0
  127. package/hooks/__pycache__/stop-gate.cpython-313.pyc +0 -0
  128. package/hooks/__pycache__/stop_dispatcher.cpython-313.pyc +0 -0
  129. package/hooks/__pycache__/tdd-gate.cpython-313.pyc +0 -0
  130. package/hooks/__pycache__/terms-guard.cpython-313.pyc +0 -0
  131. package/hooks/__pycache__/test-validator.cpython-313.pyc +0 -0
  132. package/hooks/__pycache__/test_generator_hook.cpython-313.pyc +0 -0
  133. package/hooks/__pycache__/todo-state-tracker.cpython-313.pyc +0 -0
  134. package/hooks/__pycache__/tool-ledger.cpython-313.pyc +0 -0
  135. package/hooks/__pycache__/trust_review.cpython-313.pyc +0 -0
  136. package/hooks/__pycache__/user-prompt-submit.cpython-313.pyc +0 -0
  137. package/hooks/_agent_registry.py +481 -0
  138. package/hooks/_analytics.py +291 -0
  139. package/hooks/_budget.py +31 -0
  140. package/hooks/_common.py +761 -0
  141. package/hooks/_compression_optimizer.py +119 -0
  142. package/hooks/_cost_ledger.py +176 -0
  143. package/hooks/_learnings.py +126 -0
  144. package/hooks/_memory.py +103 -0
  145. package/hooks/_post_write.py +46 -0
  146. package/hooks/_protected_context.py +150 -0
  147. package/hooks/_token_counter.py +221 -0
  148. package/hooks/branch_manager.py +255 -0
  149. package/hooks/budget_governor.py +326 -0
  150. package/hooks/circuit-breaker.py +270 -0
  151. package/hooks/compression_feedback.py +254 -0
  152. package/hooks/config-guard.py +193 -0
  153. package/hooks/context_pressure.py +119 -0
  154. package/hooks/credential_store.py +970 -0
  155. package/hooks/fetch-rate-limits.py +212 -0
  156. package/hooks/firewall.py +323 -0
  157. package/hooks/hashline-formatter-bridge.py +224 -0
  158. package/hooks/hashline-injector.py +273 -0
  159. package/hooks/hashline-validator.py +216 -0
  160. package/hooks/idle-detector.py +97 -0
  161. package/hooks/instructions-loaded.py +26 -0
  162. package/hooks/intentgate-keyword-detector.py +200 -0
  163. package/hooks/magic-keyword-router.py +195 -0
  164. package/hooks/policy_engine.py +767 -0
  165. package/hooks/post-tool-failure.py +19 -0
  166. package/hooks/post-write.py +233 -0
  167. package/hooks/pre-compact.py +470 -0
  168. package/hooks/pre-tool-inject.py +98 -0
  169. package/hooks/prompt-enhancer.py +879 -0
  170. package/hooks/quality-runner.py +191 -0
  171. package/hooks/query.py +512 -0
  172. package/hooks/secret-guard.py +120 -0
  173. package/hooks/secret_audit.py +144 -0
  174. package/hooks/security_validators.py +93 -0
  175. package/hooks/session-end-capture.py +505 -0
  176. package/hooks/session-start.py +261 -0
  177. package/hooks/setup_wizard.py +1101 -0
  178. package/hooks/shadow_manager.py +476 -0
  179. package/hooks/state_migration.py +228 -0
  180. package/hooks/stop-gate.py +7 -0
  181. package/hooks/stop_dispatcher.py +1259 -0
  182. package/hooks/tdd-gate.py +10 -0
  183. package/hooks/terms-guard.py +98 -0
  184. package/hooks/test-validator.py +462 -0
  185. package/hooks/test_generator_hook.py +123 -0
  186. package/hooks/todo-state-tracker.py +114 -0
  187. package/hooks/tool-ledger.py +165 -0
  188. package/hooks/trust_review.py +662 -0
  189. package/hooks/user-prompt-submit.py +12 -0
  190. package/hud/omg-hud.mjs +1571 -0
  191. package/lab/__init__.py +1 -0
  192. package/lab/__pycache__/__init__.cpython-313.pyc +0 -0
  193. package/lab/__pycache__/axolotl_adapter.cpython-313.pyc +0 -0
  194. package/lab/__pycache__/forge_runner.cpython-313.pyc +0 -0
  195. package/lab/__pycache__/gazebo_adapter.cpython-313.pyc +0 -0
  196. package/lab/__pycache__/isaac_gym_adapter.cpython-313.pyc +0 -0
  197. package/lab/__pycache__/mock_isaac_env.cpython-313.pyc +0 -0
  198. package/lab/__pycache__/pipeline.cpython-313.pyc +0 -0
  199. package/lab/__pycache__/policies.cpython-313.pyc +0 -0
  200. package/lab/__pycache__/pybullet_adapter.cpython-313.pyc +0 -0
  201. package/lab/axolotl_adapter.py +531 -0
  202. package/lab/forge_runner.py +103 -0
  203. package/lab/gazebo_adapter.py +168 -0
  204. package/lab/isaac_gym_adapter.py +190 -0
  205. package/lab/mock_isaac_env.py +47 -0
  206. package/lab/pipeline.py +712 -0
  207. package/lab/policies.py +52 -0
  208. package/lab/pybullet_adapter.py +192 -0
  209. package/package.json +61 -0
  210. package/plugins/README.md +78 -0
  211. package/plugins/__init__.py +1 -0
  212. package/plugins/__pycache__/__init__.cpython-313.pyc +0 -0
  213. package/plugins/advanced/commands/OMG-code-review.md +114 -0
  214. package/plugins/advanced/commands/OMG-deep-plan.md +266 -0
  215. package/plugins/advanced/commands/OMG-handoff.md +115 -0
  216. package/plugins/advanced/commands/OMG-learn.md +110 -0
  217. package/plugins/advanced/commands/OMG-maintainer.md +31 -0
  218. package/plugins/advanced/commands/OMG-ralph-start.md +43 -0
  219. package/plugins/advanced/commands/OMG-ralph-stop.md +23 -0
  220. package/plugins/advanced/commands/OMG-security-review.md +16 -0
  221. package/plugins/advanced/commands/OMG-sequential-thinking.md +20 -0
  222. package/plugins/advanced/commands/OMG-ship.md +46 -0
  223. package/plugins/advanced/commands/OMG:code-review.md +114 -0
  224. package/plugins/advanced/commands/OMG:deep-plan.md +266 -0
  225. package/plugins/advanced/commands/OMG:handoff.md +115 -0
  226. package/plugins/advanced/commands/OMG:learn.md +110 -0
  227. package/plugins/advanced/commands/OMG:maintainer.md +31 -0
  228. package/plugins/advanced/commands/OMG:ralph-start.md +43 -0
  229. package/plugins/advanced/commands/OMG:ralph-stop.md +23 -0
  230. package/plugins/advanced/commands/OMG:security-review.md +16 -0
  231. package/plugins/advanced/commands/OMG:sequential-thinking.md +20 -0
  232. package/plugins/advanced/commands/OMG:ship.md +46 -0
  233. package/plugins/advanced/plugin.json +104 -0
  234. package/plugins/core/plugin.json +204 -0
  235. package/plugins/dephealth/__init__.py +0 -0
  236. package/plugins/dephealth/__pycache__/__init__.cpython-313.pyc +0 -0
  237. package/plugins/dephealth/__pycache__/cve_scanner.cpython-313.pyc +0 -0
  238. package/plugins/dephealth/__pycache__/license_checker.cpython-313.pyc +0 -0
  239. package/plugins/dephealth/__pycache__/manifest_detector.cpython-313.pyc +0 -0
  240. package/plugins/dephealth/__pycache__/vuln_analyzer.cpython-313.pyc +0 -0
  241. package/plugins/dephealth/cve_scanner.py +279 -0
  242. package/plugins/dephealth/license_checker.py +135 -0
  243. package/plugins/dephealth/manifest_detector.py +423 -0
  244. package/plugins/dephealth/vuln_analyzer.py +176 -0
  245. package/plugins/testgen/__init__.py +0 -0
  246. package/plugins/testgen/__pycache__/__init__.cpython-313.pyc +0 -0
  247. package/plugins/testgen/__pycache__/codamosa_engine.cpython-313.pyc +0 -0
  248. package/plugins/testgen/__pycache__/edge_case_synthesizer.cpython-313.pyc +0 -0
  249. package/plugins/testgen/__pycache__/framework_detector.cpython-313.pyc +0 -0
  250. package/plugins/testgen/__pycache__/skeleton_generator.cpython-313.pyc +0 -0
  251. package/plugins/testgen/codamosa_engine.py +402 -0
  252. package/plugins/testgen/edge_case_synthesizer.py +184 -0
  253. package/plugins/testgen/framework_detector.py +271 -0
  254. package/plugins/testgen/skeleton_generator.py +219 -0
  255. package/plugins/viz/__init__.py +0 -0
  256. package/plugins/viz/__pycache__/__init__.cpython-313.pyc +0 -0
  257. package/plugins/viz/__pycache__/ast_parser.cpython-313.pyc +0 -0
  258. package/plugins/viz/__pycache__/diagram_generator.cpython-313.pyc +0 -0
  259. package/plugins/viz/__pycache__/graph_builder.cpython-313.pyc +0 -0
  260. package/plugins/viz/__pycache__/native_parsers.cpython-313.pyc +0 -0
  261. package/plugins/viz/__pycache__/regex_parser.cpython-313.pyc +0 -0
  262. package/plugins/viz/ast_parser.py +139 -0
  263. package/plugins/viz/diagram_generator.py +192 -0
  264. package/plugins/viz/graph_builder.py +444 -0
  265. package/plugins/viz/native_parsers.py +259 -0
  266. package/plugins/viz/regex_parser.py +112 -0
  267. package/pyproject.toml +143 -0
  268. package/registry/__init__.py +1 -0
  269. package/registry/__pycache__/__init__.cpython-313.pyc +0 -0
  270. package/registry/__pycache__/approval_artifact.cpython-313.pyc +0 -0
  271. package/registry/__pycache__/verify_artifact.cpython-313.pyc +0 -0
  272. package/registry/approval_artifact.py +236 -0
  273. package/registry/bundles/algorithms.yaml +45 -0
  274. package/registry/bundles/api-twin.yaml +48 -0
  275. package/registry/bundles/ast-pack.yaml +80 -0
  276. package/registry/bundles/claim-judge.yaml +49 -0
  277. package/registry/bundles/control-plane.yaml +192 -0
  278. package/registry/bundles/data-lineage.yaml +47 -0
  279. package/registry/bundles/delta-classifier.yaml +47 -0
  280. package/registry/bundles/eval-gate.yaml +47 -0
  281. package/registry/bundles/hash-edit.yaml +73 -0
  282. package/registry/bundles/health.yaml +45 -0
  283. package/registry/bundles/hook-governor.yaml +101 -0
  284. package/registry/bundles/incident-replay.yaml +47 -0
  285. package/registry/bundles/lsp-pack.yaml +80 -0
  286. package/registry/bundles/mcp-fabric.yaml +53 -0
  287. package/registry/bundles/plan-council.yaml +56 -0
  288. package/registry/bundles/preflight.yaml +48 -0
  289. package/registry/bundles/proof-gate.yaml +49 -0
  290. package/registry/bundles/remote-supervisor.yaml +49 -0
  291. package/registry/bundles/robotics.yaml +45 -0
  292. package/registry/bundles/secure-worktree-pipeline.yaml +69 -0
  293. package/registry/bundles/security-check.yaml +50 -0
  294. package/registry/bundles/terminal-lane.yaml +61 -0
  295. package/registry/bundles/test-intent-lock.yaml +49 -0
  296. package/registry/bundles/tracebank.yaml +47 -0
  297. package/registry/bundles/vision.yaml +45 -0
  298. package/registry/omg-capability.schema.json +378 -0
  299. package/registry/policy-packs/airgapped.lock.json +11 -0
  300. package/registry/policy-packs/airgapped.signature.json +10 -0
  301. package/registry/policy-packs/airgapped.yaml +16 -0
  302. package/registry/policy-packs/fintech.lock.json +11 -0
  303. package/registry/policy-packs/fintech.signature.json +10 -0
  304. package/registry/policy-packs/fintech.yaml +15 -0
  305. package/registry/policy-packs/locked-prod.lock.json +11 -0
  306. package/registry/policy-packs/locked-prod.signature.json +10 -0
  307. package/registry/policy-packs/locked-prod.yaml +18 -0
  308. package/registry/trusted_signers.json +44 -0
  309. package/registry/verify_artifact.py +493 -0
  310. package/runtime/__init__.py +36 -0
  311. package/runtime/__pycache__/__init__.cpython-313.pyc +0 -0
  312. package/runtime/__pycache__/adoption.cpython-313.pyc +0 -0
  313. package/runtime/__pycache__/agent_selector.cpython-313.pyc +0 -0
  314. package/runtime/__pycache__/api_twin.cpython-313.pyc +0 -0
  315. package/runtime/__pycache__/architecture_signal.cpython-313.pyc +0 -0
  316. package/runtime/__pycache__/artifact_parsers.cpython-313.pyc +0 -0
  317. package/runtime/__pycache__/asset_loader.cpython-313.pyc +0 -0
  318. package/runtime/__pycache__/background_verification.cpython-313.pyc +0 -0
  319. package/runtime/__pycache__/budget_envelopes.cpython-313.pyc +0 -0
  320. package/runtime/__pycache__/business_workflow.cpython-313.pyc +0 -0
  321. package/runtime/__pycache__/canonical_surface.cpython-313.pyc +0 -0
  322. package/runtime/__pycache__/canonical_taxonomy.cpython-313.pyc +0 -0
  323. package/runtime/__pycache__/claim_judge.cpython-313.pyc +0 -0
  324. package/runtime/__pycache__/cli_provider.cpython-313.pyc +0 -0
  325. package/runtime/__pycache__/compat.cpython-313.pyc +0 -0
  326. package/runtime/__pycache__/complexity_scorer.cpython-313.pyc +0 -0
  327. package/runtime/__pycache__/compliance_governor.cpython-313.pyc +0 -0
  328. package/runtime/__pycache__/config_transaction.cpython-313.pyc +0 -0
  329. package/runtime/__pycache__/context_compiler.cpython-313.pyc +0 -0
  330. package/runtime/__pycache__/context_engine.cpython-313.pyc +0 -0
  331. package/runtime/__pycache__/context_limits.cpython-313.pyc +0 -0
  332. package/runtime/__pycache__/contract_compiler.cpython-313.pyc +0 -0
  333. package/runtime/__pycache__/custom_agent_loader.cpython-313.pyc +0 -0
  334. package/runtime/__pycache__/data_lineage.cpython-313.pyc +0 -0
  335. package/runtime/__pycache__/defense_state.cpython-313.pyc +0 -0
  336. package/runtime/__pycache__/delta_classifier.cpython-313.pyc +0 -0
  337. package/runtime/__pycache__/dispatcher.cpython-313.pyc +0 -0
  338. package/runtime/__pycache__/doc_generator.cpython-313.pyc +0 -0
  339. package/runtime/__pycache__/domain_packs.cpython-313.pyc +0 -0
  340. package/runtime/__pycache__/ecosystem.cpython-313.pyc +0 -0
  341. package/runtime/__pycache__/equalizer.cpython-313.pyc +0 -0
  342. package/runtime/__pycache__/eval_gate.cpython-313.pyc +0 -0
  343. package/runtime/__pycache__/evidence_narrator.cpython-313.pyc +0 -0
  344. package/runtime/__pycache__/evidence_query.cpython-313.pyc +0 -0
  345. package/runtime/__pycache__/evidence_registry.cpython-313.pyc +0 -0
  346. package/runtime/__pycache__/evidence_requirements.cpython-313.pyc +0 -0
  347. package/runtime/__pycache__/exec_kernel.cpython-313.pyc +0 -0
  348. package/runtime/__pycache__/explainer_formatter.cpython-313.pyc +0 -0
  349. package/runtime/__pycache__/feature_registry.cpython-313.pyc +0 -0
  350. package/runtime/__pycache__/forge_agents.cpython-313.pyc +0 -0
  351. package/runtime/__pycache__/forge_contracts.cpython-313.pyc +0 -0
  352. package/runtime/__pycache__/forge_domains.cpython-313.pyc +0 -0
  353. package/runtime/__pycache__/forge_run_id.cpython-313.pyc +0 -0
  354. package/runtime/__pycache__/github_integration.cpython-313.pyc +0 -0
  355. package/runtime/__pycache__/github_review_bot.cpython-313.pyc +0 -0
  356. package/runtime/__pycache__/github_review_contract.cpython-313.pyc +0 -0
  357. package/runtime/__pycache__/github_review_formatter.cpython-313.pyc +0 -0
  358. package/runtime/__pycache__/guide_assert.cpython-313.pyc +0 -0
  359. package/runtime/__pycache__/hook_governor.cpython-313.pyc +0 -0
  360. package/runtime/__pycache__/host_parity.cpython-313.pyc +0 -0
  361. package/runtime/__pycache__/incident_replay.cpython-313.pyc +0 -0
  362. package/runtime/__pycache__/install_planner.cpython-313.pyc +0 -0
  363. package/runtime/__pycache__/interaction_journal.cpython-313.pyc +0 -0
  364. package/runtime/__pycache__/issue_surface.cpython-313.pyc +0 -0
  365. package/runtime/__pycache__/legacy_compat.cpython-313.pyc +0 -0
  366. package/runtime/__pycache__/mcp_config_writers.cpython-313.pyc +0 -0
  367. package/runtime/__pycache__/mcp_lifecycle.cpython-313.pyc +0 -0
  368. package/runtime/__pycache__/mcp_memory_server.cpython-313.pyc +0 -0
  369. package/runtime/__pycache__/memory_store.cpython-313.pyc +0 -0
  370. package/runtime/__pycache__/merge_writer.cpython-313.pyc +0 -0
  371. package/runtime/__pycache__/music_omr_testbed.cpython-313.pyc +0 -0
  372. package/runtime/__pycache__/mutation_gate.cpython-313.pyc +0 -0
  373. package/runtime/__pycache__/omc_compat.cpython-313.pyc +0 -0
  374. package/runtime/__pycache__/omg_browser_cli.cpython-313.pyc +0 -0
  375. package/runtime/__pycache__/omg_mcp_server.cpython-313.pyc +0 -0
  376. package/runtime/__pycache__/opus_plan.cpython-313.pyc +0 -0
  377. package/runtime/__pycache__/playwright_adapter.cpython-313.pyc +0 -0
  378. package/runtime/__pycache__/playwright_pack.cpython-313.pyc +0 -0
  379. package/runtime/__pycache__/plugin_diagnostics.cpython-313.pyc +0 -0
  380. package/runtime/__pycache__/plugin_interop.cpython-313.pyc +0 -0
  381. package/runtime/__pycache__/policy_pack_loader.cpython-313.pyc +0 -0
  382. package/runtime/__pycache__/preflight.cpython-313.pyc +0 -0
  383. package/runtime/__pycache__/profile_io.cpython-313.pyc +0 -0
  384. package/runtime/__pycache__/prompt_compiler.cpython-313.pyc +0 -0
  385. package/runtime/__pycache__/proof_chain.cpython-313.pyc +0 -0
  386. package/runtime/__pycache__/proof_gate.cpython-313.pyc +0 -0
  387. package/runtime/__pycache__/provider_parity_eval.cpython-313.pyc +0 -0
  388. package/runtime/__pycache__/release_artifact_audit.cpython-313.pyc +0 -0
  389. package/runtime/__pycache__/release_run_coordinator.cpython-313.pyc +0 -0
  390. package/runtime/__pycache__/release_surface_compiler.cpython-313.pyc +0 -0
  391. package/runtime/__pycache__/release_surface_registry.cpython-313.pyc +0 -0
  392. package/runtime/__pycache__/release_surfaces.cpython-313.pyc +0 -0
  393. package/runtime/__pycache__/remote_supervisor.cpython-313.pyc +0 -0
  394. package/runtime/__pycache__/repro_pack.cpython-313.pyc +0 -0
  395. package/runtime/__pycache__/rollback_manifest.cpython-313.pyc +0 -0
  396. package/runtime/__pycache__/router_critics.cpython-313.pyc +0 -0
  397. package/runtime/__pycache__/router_executor.cpython-313.pyc +0 -0
  398. package/runtime/__pycache__/router_selector.cpython-313.pyc +0 -0
  399. package/runtime/__pycache__/runtime_contracts.cpython-313.pyc +0 -0
  400. package/runtime/__pycache__/runtime_profile.cpython-313.pyc +0 -0
  401. package/runtime/__pycache__/security_check.cpython-313.pyc +0 -0
  402. package/runtime/__pycache__/session_health.cpython-313.pyc +0 -0
  403. package/runtime/__pycache__/skill_evolution.cpython-313.pyc +0 -0
  404. package/runtime/__pycache__/skill_registry.cpython-313.pyc +0 -0
  405. package/runtime/__pycache__/subagent_dispatcher.cpython-313.pyc +0 -0
  406. package/runtime/__pycache__/subscription_tiers.cpython-313.pyc +0 -0
  407. package/runtime/__pycache__/team_router.cpython-313.pyc +0 -0
  408. package/runtime/__pycache__/test_intent_lock.cpython-313-pytest-9.0.2.pyc +0 -0
  409. package/runtime/__pycache__/test_intent_lock.cpython-313.pyc +0 -0
  410. package/runtime/__pycache__/tmux_session_manager.cpython-313.pyc +0 -0
  411. package/runtime/__pycache__/tool_fabric.cpython-313.pyc +0 -0
  412. package/runtime/__pycache__/tool_plan_gate.cpython-313.pyc +0 -0
  413. package/runtime/__pycache__/tool_relevance.cpython-313.pyc +0 -0
  414. package/runtime/__pycache__/tracebank.cpython-313.pyc +0 -0
  415. package/runtime/__pycache__/untrusted_content.cpython-313.pyc +0 -0
  416. package/runtime/__pycache__/validate.cpython-313.pyc +0 -0
  417. package/runtime/__pycache__/verdict_schema.cpython-313.pyc +0 -0
  418. package/runtime/__pycache__/verification_controller.cpython-313.pyc +0 -0
  419. package/runtime/__pycache__/verification_loop.cpython-313.pyc +0 -0
  420. package/runtime/__pycache__/vision_artifacts.cpython-313.pyc +0 -0
  421. package/runtime/__pycache__/vision_cache.cpython-313.pyc +0 -0
  422. package/runtime/__pycache__/vision_jobs.cpython-313.pyc +0 -0
  423. package/runtime/__pycache__/worker_watchdog.cpython-313.pyc +0 -0
  424. package/runtime/adapters/__init__.py +13 -0
  425. package/runtime/adapters/__pycache__/__init__.cpython-313.pyc +0 -0
  426. package/runtime/adapters/__pycache__/claude.cpython-313.pyc +0 -0
  427. package/runtime/adapters/__pycache__/gpt.cpython-313.pyc +0 -0
  428. package/runtime/adapters/__pycache__/local.cpython-313.pyc +0 -0
  429. package/runtime/adapters/claude.py +63 -0
  430. package/runtime/adapters/gpt.py +56 -0
  431. package/runtime/adapters/local.py +56 -0
  432. package/runtime/adoption.py +280 -0
  433. package/runtime/api_twin.py +450 -0
  434. package/runtime/architecture_signal.py +226 -0
  435. package/runtime/artifact_parsers.py +161 -0
  436. package/runtime/asset_loader.py +62 -0
  437. package/runtime/background_verification.py +178 -0
  438. package/runtime/budget_envelopes.py +398 -0
  439. package/runtime/business_workflow.py +234 -0
  440. package/runtime/canonical_surface.py +53 -0
  441. package/runtime/canonical_taxonomy.py +27 -0
  442. package/runtime/claim_judge.py +648 -0
  443. package/runtime/cli_provider.py +105 -0
  444. package/runtime/compat.py +2222 -0
  445. package/runtime/complexity_scorer.py +148 -0
  446. package/runtime/compliance_governor.py +505 -0
  447. package/runtime/config_transaction.py +304 -0
  448. package/runtime/context_compiler.py +131 -0
  449. package/runtime/context_engine.py +708 -0
  450. package/runtime/context_limits.py +363 -0
  451. package/runtime/contract_compiler.py +3664 -0
  452. package/runtime/custom_agent_loader.py +366 -0
  453. package/runtime/data_lineage.py +244 -0
  454. package/runtime/defense_state.py +261 -0
  455. package/runtime/delta_classifier.py +231 -0
  456. package/runtime/dispatcher.py +47 -0
  457. package/runtime/doc_generator.py +319 -0
  458. package/runtime/domain_packs.py +75 -0
  459. package/runtime/ecosystem.py +371 -0
  460. package/runtime/equalizer.py +268 -0
  461. package/runtime/eval_gate.py +96 -0
  462. package/runtime/evidence_narrator.py +147 -0
  463. package/runtime/evidence_query.py +303 -0
  464. package/runtime/evidence_registry.py +16 -0
  465. package/runtime/evidence_requirements.py +157 -0
  466. package/runtime/exec_kernel.py +267 -0
  467. package/runtime/explainer_formatter.py +82 -0
  468. package/runtime/feature_registry.py +109 -0
  469. package/runtime/forge_agents.py +915 -0
  470. package/runtime/forge_contracts.py +519 -0
  471. package/runtime/forge_domains.py +68 -0
  472. package/runtime/forge_run_id.py +86 -0
  473. package/runtime/guide_assert.py +135 -0
  474. package/runtime/hook_governor.py +156 -0
  475. package/runtime/host_parity.py +373 -0
  476. package/runtime/incident_replay.py +310 -0
  477. package/runtime/install_planner.py +617 -0
  478. package/runtime/interaction_journal.py +566 -0
  479. package/runtime/issue_surface.py +472 -0
  480. package/runtime/legacy_compat.py +7 -0
  481. package/runtime/mcp_config_writers.py +360 -0
  482. package/runtime/mcp_lifecycle.py +175 -0
  483. package/runtime/mcp_memory_server.py +220 -0
  484. package/runtime/memory_parsers/__init__.py +0 -0
  485. package/runtime/memory_parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  486. package/runtime/memory_parsers/__pycache__/chatgpt_parser.cpython-313.pyc +0 -0
  487. package/runtime/memory_parsers/__pycache__/claude_import.cpython-313.pyc +0 -0
  488. package/runtime/memory_parsers/__pycache__/export.cpython-313.pyc +0 -0
  489. package/runtime/memory_parsers/__pycache__/gemini_import.cpython-313.pyc +0 -0
  490. package/runtime/memory_parsers/__pycache__/kimi_import.cpython-313.pyc +0 -0
  491. package/runtime/memory_parsers/chatgpt_parser.py +257 -0
  492. package/runtime/memory_parsers/claude_import.py +107 -0
  493. package/runtime/memory_parsers/export.py +97 -0
  494. package/runtime/memory_parsers/gemini_import.py +91 -0
  495. package/runtime/memory_parsers/kimi_import.py +91 -0
  496. package/runtime/memory_store.py +1182 -0
  497. package/runtime/merge_writer.py +445 -0
  498. package/runtime/music_omr_testbed.py +336 -0
  499. package/runtime/mutation_gate.py +320 -0
  500. package/runtime/omc_compat.py +7 -0
  501. package/runtime/omg_browser_cli.py +95 -0
  502. package/runtime/omg_compat_contract_snapshot.json +936 -0
  503. package/runtime/omg_contract_snapshot.json +936 -0
  504. package/runtime/omg_mcp_server.py +306 -0
  505. package/runtime/playwright_adapter.py +39 -0
  506. package/runtime/playwright_pack.py +253 -0
  507. package/runtime/plugin_diagnostics.py +308 -0
  508. package/runtime/plugin_interop.py +1060 -0
  509. package/runtime/policy_pack_loader.py +147 -0
  510. package/runtime/preflight.py +135 -0
  511. package/runtime/profile_io.py +328 -0
  512. package/runtime/proof_chain.py +472 -0
  513. package/runtime/proof_gate.py +442 -0
  514. package/runtime/provider_parity_eval.py +109 -0
  515. package/runtime/providers/__init__.py +0 -0
  516. package/runtime/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  517. package/runtime/providers/__pycache__/codex_provider.cpython-313.pyc +0 -0
  518. package/runtime/providers/__pycache__/gemini_provider.cpython-313.pyc +0 -0
  519. package/runtime/providers/__pycache__/kimi_provider.cpython-313.pyc +0 -0
  520. package/runtime/providers/__pycache__/opencode_provider.cpython-313.pyc +0 -0
  521. package/runtime/providers/codex_provider.py +129 -0
  522. package/runtime/providers/gemini_provider.py +143 -0
  523. package/runtime/providers/kimi_provider.py +167 -0
  524. package/runtime/providers/opencode_provider.py +99 -0
  525. package/runtime/release_artifact_audit.py +556 -0
  526. package/runtime/release_run_coordinator.py +574 -0
  527. package/runtime/release_surface_compiler.py +643 -0
  528. package/runtime/release_surface_registry.py +283 -0
  529. package/runtime/release_surfaces.py +320 -0
  530. package/runtime/remote_supervisor.py +79 -0
  531. package/runtime/repro_pack.py +398 -0
  532. package/runtime/rollback_manifest.py +143 -0
  533. package/runtime/router_critics.py +229 -0
  534. package/runtime/router_executor.py +142 -0
  535. package/runtime/router_selector.py +99 -0
  536. package/runtime/runtime_contracts.py +292 -0
  537. package/runtime/runtime_profile.py +133 -0
  538. package/runtime/security_check.py +1094 -0
  539. package/runtime/session_health.py +546 -0
  540. package/runtime/skill_evolution.py +221 -0
  541. package/runtime/skill_registry.py +53 -0
  542. package/runtime/subagent_dispatcher.py +604 -0
  543. package/runtime/subscription_tiers.py +258 -0
  544. package/runtime/team_router.py +1399 -0
  545. package/runtime/test_intent_lock.py +543 -0
  546. package/runtime/tmux_session_manager.py +172 -0
  547. package/runtime/tool_fabric.py +570 -0
  548. package/runtime/tool_plan_gate.py +460 -0
  549. package/runtime/tracebank.py +125 -0
  550. package/runtime/untrusted_content.py +360 -0
  551. package/runtime/validate.py +293 -0
  552. package/runtime/verdict_schema.py +198 -0
  553. package/runtime/verification_controller.py +235 -0
  554. package/runtime/verification_loop.py +73 -0
  555. package/runtime/vision_artifacts.py +31 -0
  556. package/runtime/vision_cache.py +38 -0
  557. package/runtime/vision_jobs.py +92 -0
  558. package/runtime/worker_watchdog.py +526 -0
  559. package/scripts/__pycache__/audit-published-artifact.cpython-313.pyc +0 -0
  560. package/scripts/__pycache__/check-doc-parity.cpython-313.pyc +0 -0
  561. package/scripts/__pycache__/check-omg-standalone-clean.cpython-313.pyc +0 -0
  562. package/scripts/__pycache__/github_review_helpers.cpython-313.pyc +0 -0
  563. package/scripts/__pycache__/omg.cpython-313.pyc +0 -0
  564. package/scripts/__pycache__/prepare-release-proof-fixtures.cpython-313.pyc +0 -0
  565. package/scripts/__pycache__/sync-release-identity.cpython-313.pyc +0 -0
  566. package/scripts/__pycache__/validate-release-identity.cpython-313.pyc +0 -0
  567. package/scripts/audit-published-artifact.py +59 -0
  568. package/scripts/check-omg-compat-contract-snapshot.py +137 -0
  569. package/scripts/check-omg-contract-snapshot.py +12 -0
  570. package/scripts/check-omg-public-ready.py +273 -0
  571. package/scripts/check-omg-standalone-clean.py +133 -0
  572. package/scripts/emit_host_parity.py +72 -0
  573. package/scripts/legacy_to_omg_migrate.py +29 -0
  574. package/scripts/migrate-legacy.py +464 -0
  575. package/scripts/omc_to_omg_migrate.py +12 -0
  576. package/scripts/omg.py +2962 -0
  577. package/scripts/pre-release-check.sh +38 -0
  578. package/scripts/prepare-release-proof-fixtures.py +602 -0
  579. package/scripts/print-canonical-version.py +80 -0
  580. package/scripts/settings-merge.py +289 -0
  581. package/scripts/sync-release-identity.py +481 -0
  582. package/scripts/validate-release-identity.py +632 -0
  583. package/scripts/verify-no-omc.sh +5 -0
  584. package/scripts/verify-standalone.sh +35 -0
  585. package/settings.json +751 -0
  586. package/tools/__init__.py +2 -0
  587. package/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  588. package/tools/__pycache__/browser_consent.cpython-313.pyc +0 -0
  589. package/tools/__pycache__/browser_stealth.cpython-313.pyc +0 -0
  590. package/tools/__pycache__/browser_tool.cpython-313.pyc +0 -0
  591. package/tools/__pycache__/changelog_generator.cpython-313.pyc +0 -0
  592. package/tools/__pycache__/commit_splitter.cpython-313.pyc +0 -0
  593. package/tools/__pycache__/config_discovery.cpython-313.pyc +0 -0
  594. package/tools/__pycache__/config_merger.cpython-313.pyc +0 -0
  595. package/tools/__pycache__/dashboard_generator.cpython-313.pyc +0 -0
  596. package/tools/__pycache__/git_inspector.cpython-313.pyc +0 -0
  597. package/tools/__pycache__/lsp_client.cpython-313.pyc +0 -0
  598. package/tools/__pycache__/lsp_operations.cpython-313.pyc +0 -0
  599. package/tools/__pycache__/pr_generator.cpython-313.pyc +0 -0
  600. package/tools/__pycache__/python_repl.cpython-313.pyc +0 -0
  601. package/tools/__pycache__/python_sandbox.cpython-313.pyc +0 -0
  602. package/tools/__pycache__/session_snapshot.cpython-313.pyc +0 -0
  603. package/tools/__pycache__/ssh_manager.cpython-313.pyc +0 -0
  604. package/tools/__pycache__/theme_engine.cpython-313.pyc +0 -0
  605. package/tools/__pycache__/theme_selector.cpython-313.pyc +0 -0
  606. package/tools/__pycache__/web_search.cpython-313.pyc +0 -0
  607. package/tools/browser_consent.py +289 -0
  608. package/tools/browser_stealth.py +481 -0
  609. package/tools/browser_tool.py +448 -0
  610. package/tools/changelog_generator.py +347 -0
  611. package/tools/commit_splitter.py +749 -0
  612. package/tools/config_discovery.py +151 -0
  613. package/tools/config_merger.py +449 -0
  614. package/tools/dashboard_generator.py +300 -0
  615. package/tools/git_inspector.py +298 -0
  616. package/tools/lsp_client.py +275 -0
  617. package/tools/lsp_discovery.py +231 -0
  618. package/tools/lsp_operations.py +392 -0
  619. package/tools/pr_generator.py +404 -0
  620. package/tools/python_repl.py +712 -0
  621. package/tools/python_sandbox.py +768 -0
  622. package/tools/search_providers/__init__.py +77 -0
  623. package/tools/search_providers/__pycache__/__init__.cpython-313.pyc +0 -0
  624. package/tools/search_providers/__pycache__/brave.cpython-313.pyc +0 -0
  625. package/tools/search_providers/__pycache__/exa.cpython-313.pyc +0 -0
  626. package/tools/search_providers/__pycache__/jina.cpython-313.pyc +0 -0
  627. package/tools/search_providers/__pycache__/perplexity.cpython-313.pyc +0 -0
  628. package/tools/search_providers/__pycache__/synthetic.cpython-313.pyc +0 -0
  629. package/tools/search_providers/brave.py +115 -0
  630. package/tools/search_providers/exa.py +116 -0
  631. package/tools/search_providers/jina.py +104 -0
  632. package/tools/search_providers/perplexity.py +139 -0
  633. package/tools/search_providers/synthetic.py +74 -0
  634. package/tools/session_snapshot.py +851 -0
  635. package/tools/ssh_manager.py +912 -0
  636. package/tools/theme_engine.py +296 -0
  637. package/tools/theme_selector.py +137 -0
  638. package/tools/web_search.py +675 -0
@@ -0,0 +1,220 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import hashlib
6
+ from pathlib import Path
7
+ from collections.abc import AsyncIterator
8
+ from contextlib import asynccontextmanager
9
+ from datetime import datetime, timezone
10
+ from typing import Any
11
+
12
+ _MCP_IMPORT_ERROR: ModuleNotFoundError | None = None
13
+
14
+ try:
15
+ from fastmcp import FastMCP as FastMCPImpl
16
+ from starlette.requests import Request as RequestImpl
17
+ from starlette.responses import JSONResponse as JSONResponseImpl
18
+ except ModuleNotFoundError as exc:
19
+ _MCP_IMPORT_ERROR = exc
20
+ RequestImpl = Any
21
+
22
+ class JSONResponseFallback(dict):
23
+ def __init__(self, content: dict[str, Any]):
24
+ super().__init__(content)
25
+
26
+ def _passthrough_decorator(*_args: Any, **_kwargs: Any):
27
+ def decorator(func: Any) -> Any:
28
+ return func
29
+
30
+ return decorator
31
+
32
+ class FastMCPFallback: # type: ignore[override]
33
+ def __init__(self, *_args: Any, **_kwargs: Any) -> None:
34
+ self._import_error = _MCP_IMPORT_ERROR
35
+
36
+ custom_route = staticmethod(_passthrough_decorator)
37
+ tool = staticmethod(_passthrough_decorator)
38
+ resource = staticmethod(_passthrough_decorator)
39
+
40
+ def run(self, *_args: Any, **_kwargs: Any) -> None:
41
+ raise RuntimeError("fastmcp and starlette are required to run the OMG memory server") from self._import_error
42
+
43
+ FastMCPFallback.__module__ = "fastmcp"
44
+ FastMCPImpl = FastMCPFallback
45
+ JSONResponseImpl = JSONResponseFallback
46
+
47
+ from runtime.memory_store import MemoryStore, MemoryStoreFullError
48
+
49
+ _store = MemoryStore(store_path=str(Path.home() / ".omg" / "shared-memory" / "store.json"))
50
+
51
+
52
+ class _HybridExportBundle(list[dict[str, Any]]):
53
+ def __init__(self, items: list[dict[str, Any]], bundle: dict[str, Any]) -> None:
54
+ super().__init__(items)
55
+ self._bundle = bundle
56
+
57
+ def __getitem__(self, key: Any) -> Any:
58
+ if isinstance(key, str):
59
+ return self._bundle[key]
60
+ return super().__getitem__(key)
61
+
62
+ def get(self, key: str, default: Any = None) -> Any:
63
+ return self._bundle.get(key, default)
64
+
65
+ def __contains__(self, item: object) -> bool:
66
+ if isinstance(item, str):
67
+ return item in self._bundle
68
+ return super().__contains__(item)
69
+
70
+
71
+ def _load_state() -> None:
72
+ return None
73
+
74
+
75
+ def _save_state() -> None:
76
+ return None
77
+
78
+
79
+ @asynccontextmanager
80
+ async def lifespan(_: object) -> AsyncIterator[None]:
81
+ _load_state()
82
+ try:
83
+ yield
84
+ finally:
85
+ _save_state()
86
+
87
+
88
+ mcp = FastMCPImpl("OMG Memory Server", lifespan=lifespan)
89
+
90
+
91
+ @mcp.custom_route("/health", methods=["GET"])
92
+ async def health(_: Any) -> Any:
93
+ return JSONResponseImpl({"status": "ok", "version": "2.0.8"})
94
+
95
+
96
+ @mcp.tool()
97
+ def memory_store(
98
+ key: str,
99
+ content: str,
100
+ source_cli: str,
101
+ tags: list[str] | None = None,
102
+ namespace: str = "default",
103
+ retention_days: int | None = None,
104
+ ) -> dict[str, Any]:
105
+ try:
106
+ return _store.add(
107
+ key=key,
108
+ content=content,
109
+ source_cli=source_cli,
110
+ tags=tags,
111
+ namespace=namespace,
112
+ retention_days=retention_days,
113
+ )
114
+ except MemoryStoreFullError as exc:
115
+ return {"error": str(exc)}
116
+ except ValueError as exc:
117
+ return {"error": str(exc)}
118
+
119
+
120
+ @mcp.tool()
121
+ def memory_search(
122
+ query: str,
123
+ source_cli: str | None = None,
124
+ namespace: str | None = None,
125
+ ) -> list[dict[str, Any]]:
126
+ return _store.search(query=query, source_cli=source_cli, namespace=namespace)
127
+
128
+
129
+ @mcp.tool()
130
+ def memory_list(
131
+ source_cli: str | None = None,
132
+ namespace: str | None = None,
133
+ ) -> list[dict[str, Any]]:
134
+ return _store.list_all(source_cli=source_cli, namespace=namespace)
135
+
136
+
137
+ @mcp.tool()
138
+ def memory_delete(item_id: str) -> dict[str, Any]:
139
+ deleted = _store.delete(item_id)
140
+ return {"deleted": deleted, "id": item_id}
141
+
142
+
143
+ @mcp.tool()
144
+ def memory_import(items: list[dict[str, Any]]) -> dict[str, int]:
145
+ count = _store.import_items(items, quarantined=False)
146
+ return {"imported": count}
147
+
148
+
149
+ @mcp.tool()
150
+ def memory_import_bundle(bundle: dict[str, Any]) -> dict[str, Any]:
151
+ if str(bundle.get("format", "")) != "omg.memory.export.v1":
152
+ return {"imported": 0, "error": "bundle format is invalid"}
153
+ payload = str(bundle.get("encrypted_payload", ""))
154
+ integrity = bundle.get("integrity", {})
155
+ expected_sha = ""
156
+ if isinstance(integrity, dict):
157
+ expected_sha = str(integrity.get("sha256", ""))
158
+ if not payload or hashlib.sha256(payload.encode("utf-8")).hexdigest() != expected_sha:
159
+ return {"imported": 0, "error": "bundle integrity check failed"}
160
+ if not payload.startswith("enc:v1:"):
161
+ return {"imported": 0, "error": "bundle payload must be encrypted"}
162
+ decoded = _store._decrypt_text(payload, purpose="export-bundle") # noqa: SLF001
163
+ if not decoded:
164
+ return {"imported": 0, "error": "bundle decryption failed"}
165
+ try:
166
+ raw_items = json.loads(decoded)
167
+ except (TypeError, ValueError, json.JSONDecodeError):
168
+ return {"imported": 0, "error": "bundle payload is not valid JSON"}
169
+ if not isinstance(raw_items, list):
170
+ return {"imported": 0, "error": "bundle payload must be a list"}
171
+ count = _store.import_items(raw_items, quarantined=True)
172
+ return {"imported": count, "quarantined": count}
173
+
174
+
175
+ @mcp.tool()
176
+ def memory_export(namespace: str | None = None) -> list[dict[str, Any]] | dict[str, Any]:
177
+ items = _store.list_all(namespace=namespace)
178
+ serialized = json.dumps(items, separators=(",", ":"), ensure_ascii=True)
179
+ encrypted_payload = _store._encrypt_text(serialized, purpose="export-bundle") # noqa: SLF001
180
+ bundle = {
181
+ "format": "omg.memory.export.v1",
182
+ "encrypted_payload": encrypted_payload,
183
+ "integrity": {
184
+ "sha256": hashlib.sha256(encrypted_payload.encode("utf-8")).hexdigest(),
185
+ "algorithm": "sha256",
186
+ },
187
+ "metadata": {
188
+ "count": len(items),
189
+ "exported_at": datetime.now(timezone.utc).isoformat(),
190
+ "namespace": namespace,
191
+ },
192
+ }
193
+ return _HybridExportBundle(items, bundle)
194
+
195
+
196
+ @mcp.tool()
197
+ def memory_promote(item_id: str) -> dict[str, Any]:
198
+ promoted = _store.promote_item(item_id)
199
+ return {"promoted": promoted, "id": item_id}
200
+
201
+
202
+ @mcp.resource("memory://all")
203
+ def memory_all_resource() -> str:
204
+ return json.dumps(_store.list_all())
205
+
206
+
207
+ def get_host() -> str:
208
+ return os.environ.get("OMG_MEMORY_HOST", "127.0.0.1")
209
+
210
+
211
+ def get_port() -> int:
212
+ return int(os.environ.get("OMG_MEMORY_PORT", "8765"))
213
+
214
+
215
+ def run_server() -> None:
216
+ mcp.run(transport="http", host=get_host(), port=get_port())
217
+
218
+
219
+ if __name__ == "__main__":
220
+ run_server()
File without changes
@@ -0,0 +1,257 @@
1
+ """ChatGPT conversations.json parser for OMG shared memory import.
2
+
3
+ Parses the ChatGPT data export format (``conversations.json``) and converts
4
+ conversations into OMG memory items compatible with :class:`MemoryStore`.
5
+
6
+ Functions:
7
+ extract_linear_conversation — traverse mapping tree to ordered message list
8
+ parse_conversations_file — read + parse the export JSON file
9
+ conversations_to_memory_items — convert parsed conversations to memory items
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import json
15
+ import logging
16
+ import uuid
17
+ import warnings
18
+ from pathlib import Path
19
+ from typing import Any
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ # Maximum traversal depth to guard against circular parent references.
24
+ _MAX_DEPTH = 10_000
25
+
26
+ # Maximum content length per memory item (chars).
27
+ _MAX_CONTENT_LENGTH = 5_000
28
+
29
+
30
+ # ---------------------------------------------------------------------------
31
+ # extract_linear_conversation
32
+ # ---------------------------------------------------------------------------
33
+
34
+
35
+ def extract_linear_conversation(
36
+ mapping: dict[str, Any],
37
+ current_node: str,
38
+ ) -> list[dict[str, Any]]:
39
+ """Walk *current_node* back to root via ``parent`` pointers.
40
+
41
+ Returns a chronologically ordered list (root -> leaf) of message dicts::
42
+
43
+ {"role": str, "content": str, "timestamp": float | None}
44
+
45
+ * Skips nodes whose ``message`` is ``None`` or has empty text.
46
+ * Skips ``system`` role messages.
47
+ * Guards against circular references with a depth limit of 10 000.
48
+ """
49
+ if current_node not in mapping:
50
+ return []
51
+
52
+ # Collect nodes from current_node back to root.
53
+ chain: list[dict[str, Any]] = []
54
+ visited: set[str] = set()
55
+ node_id: str | None = current_node
56
+
57
+ depth = 0
58
+ while node_id is not None and depth < _MAX_DEPTH:
59
+ if node_id in visited:
60
+ break
61
+ visited.add(node_id)
62
+
63
+ node = mapping.get(node_id)
64
+ if node is None:
65
+ break
66
+
67
+ chain.append(node)
68
+ node_id = node.get("parent")
69
+ depth += 1
70
+
71
+ # Reverse so root comes first (chronological order).
72
+ chain.reverse()
73
+
74
+ messages: list[dict[str, Any]] = []
75
+ for node in chain:
76
+ msg = node.get("message")
77
+ if msg is None:
78
+ continue
79
+
80
+ author = msg.get("author") or {}
81
+ role = author.get("role", "")
82
+
83
+ # Skip system messages.
84
+ if role == "system":
85
+ continue
86
+
87
+ content_obj = msg.get("content") or {}
88
+ parts = content_obj.get("parts") or []
89
+ text = "".join(str(p) for p in parts).strip()
90
+
91
+ # Skip empty content.
92
+ if not text:
93
+ continue
94
+
95
+ timestamp = msg.get("create_time")
96
+
97
+ messages.append(
98
+ {
99
+ "role": role,
100
+ "content": text,
101
+ "timestamp": timestamp,
102
+ }
103
+ )
104
+
105
+ return messages
106
+
107
+
108
+ # ---------------------------------------------------------------------------
109
+ # parse_conversations_file
110
+ # ---------------------------------------------------------------------------
111
+
112
+
113
+ def parse_conversations_file(file_path: str) -> list[dict[str, Any]]:
114
+ """Read and parse a ChatGPT ``conversations.json`` export file.
115
+
116
+ For each conversation object, calls :func:`extract_linear_conversation`
117
+ to obtain an ordered message list.
118
+
119
+ Returns a list of conversation dicts::
120
+
121
+ {
122
+ "id": str,
123
+ "title": str,
124
+ "messages": list[dict],
125
+ "create_time": float | None,
126
+ "source": "chatgpt",
127
+ }
128
+
129
+ Gracefully handles:
130
+ * File not found -> empty list
131
+ * Invalid JSON -> empty list
132
+ * Malformed individual conversations -> logged warning, skipped
133
+ """
134
+ path = Path(file_path)
135
+ if not path.exists():
136
+ logger.warning("Conversations file not found: %s", file_path)
137
+ return []
138
+
139
+ try:
140
+ raw_text = path.read_text(encoding="utf-8")
141
+ except OSError as exc:
142
+ logger.warning("Failed to read conversations file: %s", exc)
143
+ return []
144
+
145
+ # Warn about potentially large files.
146
+ file_size = path.stat().st_size
147
+ if file_size > 50 * 1024 * 1024: # 50 MB
148
+ warnings.warn(
149
+ f"Large conversations file ({file_size / 1024 / 1024:.1f} MB). "
150
+ "Consider using streaming JSON parser (ijson) for better memory usage.",
151
+ ResourceWarning,
152
+ stacklevel=2,
153
+ )
154
+
155
+ try:
156
+ data = json.loads(raw_text)
157
+ except json.JSONDecodeError as exc:
158
+ logger.warning("Invalid JSON in conversations file: %s", exc)
159
+ return []
160
+
161
+ if not isinstance(data, list):
162
+ logger.warning("Expected JSON array, got %s", type(data).__name__)
163
+ return []
164
+
165
+ results: list[dict[str, Any]] = []
166
+
167
+ for conv in data:
168
+ try:
169
+ conv_id = conv["id"]
170
+ title = conv.get("title", "Untitled")
171
+ mapping = conv["mapping"]
172
+ current_node = conv["current_node"]
173
+ create_time = conv.get("create_time")
174
+
175
+ messages = extract_linear_conversation(mapping, current_node)
176
+
177
+ results.append(
178
+ {
179
+ "id": conv_id,
180
+ "title": title,
181
+ "messages": messages,
182
+ "create_time": create_time,
183
+ "source": "chatgpt",
184
+ }
185
+ )
186
+ except (KeyError, TypeError) as exc:
187
+ conv_id_str = conv.get("id", "<unknown>") if isinstance(conv, dict) else "<invalid>"
188
+ logger.warning(
189
+ "Skipping malformed conversation %s: %s", conv_id_str, exc
190
+ )
191
+
192
+ return results
193
+
194
+
195
+ # ---------------------------------------------------------------------------
196
+ # conversations_to_memory_items
197
+ # ---------------------------------------------------------------------------
198
+
199
+
200
+ def conversations_to_memory_items(
201
+ conversations: list[dict[str, Any]],
202
+ ) -> list[dict[str, Any]]:
203
+ """Convert parsed conversations to OMG memory item format.
204
+
205
+ Each conversation becomes ONE memory item with::
206
+
207
+ {
208
+ "key": "chatgpt-{id[:8]}",
209
+ "content": "# {title}\\n\\n**role**: content\\n\\n...",
210
+ "source_cli": "chatgpt",
211
+ "tags": ["chatgpt", "imported"],
212
+ }
213
+
214
+ * Conversations with no messages are skipped.
215
+ * Content is truncated to 5 000 chars max.
216
+ """
217
+ items: list[dict[str, Any]] = []
218
+
219
+ for conv in conversations:
220
+ messages = conv.get("messages", [])
221
+ if not messages:
222
+ continue
223
+
224
+ conv_id = conv.get("id", "unknown")
225
+ title = conv.get("title", "Untitled")
226
+
227
+ # Build content string.
228
+ parts = [f"# {title}", ""]
229
+ for msg in messages:
230
+ role = msg.get("role", "unknown")
231
+ content = msg.get("content", "")
232
+ parts.append(f"**{role}**: {content}")
233
+
234
+ full_content = "\n\n".join(parts)
235
+
236
+ # Truncate to max length.
237
+ if len(full_content) > _MAX_CONTENT_LENGTH:
238
+ full_content = full_content[:_MAX_CONTENT_LENGTH]
239
+
240
+ items.append(
241
+ {
242
+ "id": str(uuid.uuid4()),
243
+ "key": f"chatgpt-{conv_id[:8]}",
244
+ "content": full_content,
245
+ "source_cli": "chatgpt",
246
+ "tags": ["chatgpt", "imported"],
247
+ }
248
+ )
249
+
250
+ return items
251
+
252
+
253
+ __all__ = [
254
+ "extract_linear_conversation",
255
+ "parse_conversations_file",
256
+ "conversations_to_memory_items",
257
+ ]
@@ -0,0 +1,107 @@
1
+ """Claude.ai paste-based memory import."""
2
+
3
+ import re
4
+ from typing import TYPE_CHECKING, TypedDict
5
+
6
+ if TYPE_CHECKING:
7
+ from runtime.memory_store import MemoryStore
8
+
9
+
10
+ class MemoryItem(TypedDict):
11
+ """Memory item structure."""
12
+
13
+ key: str
14
+ content: str
15
+ source_cli: str
16
+ tags: list[str]
17
+
18
+
19
+ EXTRACTION_PROMPT = (
20
+ "List every memory you have stored about me. "
21
+ "Format each memory as a bullet point starting with '- '. "
22
+ "Include all preferences, facts, and context you remember."
23
+ )
24
+
25
+
26
+ def parse_claude_paste(text: str) -> list[MemoryItem]:
27
+ """Parse Claude.ai paste-based memory list into structured items.
28
+
29
+ Handles multiple formats:
30
+ - Bullet points: "- item", "* item", "• item"
31
+ - Numbered lists: "1. item", "2. item"
32
+ - Plain paragraphs: one per line
33
+
34
+ Args:
35
+ text: Freeform text pasted from Claude.ai memory list
36
+
37
+ Returns:
38
+ List of memory item dicts with keys: key, content, source_cli, tags
39
+ """
40
+ if not text or not text.strip():
41
+ return []
42
+
43
+ lines = text.split("\n")
44
+ items: list[MemoryItem] = []
45
+ item_index = 1
46
+
47
+ for line in lines:
48
+ stripped = line.strip()
49
+
50
+ if not stripped:
51
+ continue
52
+
53
+ content = stripped
54
+
55
+ if content.startswith("- "):
56
+ content = content[2:].strip()
57
+ elif content.startswith("* "):
58
+ content = content[2:].strip()
59
+ elif content.startswith("• "):
60
+ content = content[2:].strip()
61
+ elif re.match(r"^\d+\.\s", content):
62
+ content = re.sub(r"^\d+\.\s+", "", content).strip()
63
+
64
+ if not content:
65
+ continue
66
+
67
+ item: MemoryItem = {
68
+ "key": f"claude-memory-{item_index}",
69
+ "content": content,
70
+ "source_cli": "claude-web",
71
+ "tags": ["claude-web", "imported"],
72
+ }
73
+ items.append(item)
74
+ item_index += 1
75
+
76
+ return items
77
+
78
+
79
+ def import_from_paste(text: str, store: "MemoryStore") -> int:
80
+ """Import memories from Claude.ai paste into a MemoryStore.
81
+
82
+ Args:
83
+ text: Pasted memory list from Claude.ai
84
+ store: MemoryStore instance to add items to
85
+
86
+ Returns:
87
+ Count of items successfully added to store
88
+ """
89
+ items = parse_claude_paste(text)
90
+ count = 0
91
+
92
+ for item in items:
93
+ content = item.get("content", "")
94
+ if content: # Skip empty content
95
+ key = item.get("key", "")
96
+ source_cli = item.get("source_cli", "claude-web")
97
+ tags = item.get("tags", [])
98
+ if isinstance(key, str) and isinstance(source_cli, str) and isinstance(tags, list):
99
+ store.add(
100
+ key=key,
101
+ content=content,
102
+ source_cli=source_cli,
103
+ tags=tags,
104
+ )
105
+ count += 1
106
+
107
+ return count
@@ -0,0 +1,97 @@
1
+ """Export memory items to markdown format."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime, timezone
6
+ from pathlib import Path
7
+ from typing import Any
8
+
9
+
10
+ def export_to_markdown(items: list[dict[str, Any]]) -> str:
11
+ """Convert list of memory items to markdown string.
12
+
13
+ Args:
14
+ items: List of memory item dicts with keys: id, key, content, source_cli, tags, created_at, updated_at
15
+
16
+ Returns:
17
+ Markdown string with formatted memory items.
18
+ """
19
+ # Generate current timestamp in ISO format
20
+ now = datetime.now(timezone.utc).isoformat()
21
+
22
+ # Start with header
23
+ lines = [
24
+ "# OMG Shared Memory Export",
25
+ "",
26
+ f"Generated: {now}",
27
+ f"Total items: {len(items)}",
28
+ "",
29
+ "---",
30
+ "",
31
+ ]
32
+
33
+ # Add each item
34
+ for idx, item in enumerate(items, start=1):
35
+ key = item.get("key", "unknown")
36
+ content = item.get("content", "")
37
+ source_cli = item.get("source_cli", "unknown")
38
+ tags = item.get("tags", [])
39
+ created_at = item.get("created_at", "")
40
+ updated_at = item.get("updated_at", "")
41
+
42
+ # Format tags as comma-separated string
43
+ tags_str = ", ".join(tags) if tags else ""
44
+
45
+ lines.append(f"## Memory {idx}: {key}")
46
+ lines.append("")
47
+ lines.append(f"**Source**: {source_cli}")
48
+ lines.append(f"**Tags**: {tags_str}")
49
+ lines.append(f"**Created**: {created_at}")
50
+ lines.append(f"**Updated**: {updated_at}")
51
+ lines.append("")
52
+ lines.append(content)
53
+ lines.append("")
54
+ lines.append("---")
55
+ lines.append("")
56
+
57
+ return "\n".join(lines)
58
+
59
+
60
+ def export_to_file(items: list[dict[str, Any]], output_path: str) -> None:
61
+ """Write export_to_markdown(items) to the given file path.
62
+
63
+ Creates parent directories if missing. Overwrites if file exists.
64
+
65
+ Args:
66
+ items: List of memory item dicts
67
+ output_path: Path where to write the markdown file
68
+ """
69
+ path = Path(output_path)
70
+ path.parent.mkdir(parents=True, exist_ok=True)
71
+ markdown = export_to_markdown(items)
72
+ _ = path.write_text(markdown)
73
+
74
+
75
+ def export_from_store(store: Any, output_path: str | None = None) -> str: # pyright: ignore[reportExplicitAny]
76
+ """Export all items from a MemoryStore to markdown.
77
+
78
+ Gets all items from store.export_all(). If output_path is given, writes to file.
79
+ Always returns the markdown string.
80
+
81
+ Args:
82
+ store: MemoryStore instance
83
+ output_path: Optional path to write markdown file to
84
+
85
+ Returns:
86
+ Markdown string representation of all items
87
+ """
88
+ items = store.export_all()
89
+ markdown = export_to_markdown(items)
90
+
91
+ if output_path is not None:
92
+ export_to_file(items, output_path)
93
+
94
+ return markdown
95
+
96
+
97
+ __all__ = ["export_to_markdown", "export_to_file", "export_from_store"]